shell: add edit_{record,binary}_decoded shell commands

This allows the user to edit the file/record contents in its
JSON representation inside the standard system text editor.

Change-Id: Icf6a6e8529e7664c5645519fb4bdd55b35f34664
This commit is contained in:
Harald Welte 2021-04-08 20:34:13 +02:00
parent fe8a74490a
commit 4145d3c4af
2 changed files with 78 additions and 0 deletions

View File

@ -206,6 +206,24 @@ update_record_decoded
:func: LinFixedEF.ShellCommands.upd_rec_dec_parser :func: LinFixedEF.ShellCommands.upd_rec_dec_parser
edit_record_decoded
~~~~~~~~~~~~~~~~~~~
.. argparse::
:module: pySim.filesystem
:func: LinFixedEF.ShellCommands.edit_rec_dec_parser
This command will read the selected record, decode it to its JSON representation, save
that JSON to a temporary file on your computer, and launch your configured text editor.
You may then perform whatever modifications to the JSON representation, save + leave your
text editor.
Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
back to the record on the SIM card.
This allows for easy interactive modification of records.
Transparent EF commands Transparent EF commands
----------------------- -----------------------
@ -268,6 +286,19 @@ Th below example demonstrates this by modifying the ofm field within EF.AD:
} }
edit_binary_decoded
~~~~~~~~~~~~~~~~~~~
This command will read the selected binary EF, decode it to its JSON representation, save
that JSON to a temporary file on your computer, and launch your configured text editor.
You may then perform whatever modifications to the JSON representation, save + leave your
text editor.
Afterwards, the modified JSON will be re-encoded to the binary format, and the result written
to the SIM card.
This allows for easy interactive modification of file contents.
cmd2 settable parameters cmd2 settable parameters
------------------------ ------------------------

View File

@ -25,6 +25,7 @@ not the actual contents / runtime state of interacting with a given smart card.
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import code import code
import tempfile
import json import json
import cmd2 import cmd2
@ -433,6 +434,26 @@ class TransparentEF(CardEF):
if data: if data:
self._cmd.poutput_json(data) self._cmd.poutput_json(data)
def do_edit_binary_decoded(self, opts):
"""Edit the JSON representation of the EF contents in an editor."""
(orig_json, sw) = self._cmd.rs.read_binary_dec()
with tempfile.TemporaryDirectory(prefix='pysim_') as dirname:
filename = '%s/file' % dirname
# write existing data as JSON to file
with open(filename, 'w') as text_file:
json.dump(orig_json, text_file, indent=4)
# run a text editor
self._cmd._run_editor(filename)
with open(filename, 'r') as text_file:
edited_json = json.load(text_file)
if edited_json == orig_json:
self._cmd.poutput("Data not modified, skipping write")
else:
(data, sw) = self._cmd.rs.update_binary_dec(edited_json)
if data:
self._cmd.poutput_json(data)
def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None, parent:CardDF=None, def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None, parent:CardDF=None,
size={1,None}): size={1,None}):
""" """
@ -622,6 +643,32 @@ class LinFixedEF(CardEF):
if data: if data:
self._cmd.poutput(data) self._cmd.poutput(data)
edit_rec_dec_parser = argparse.ArgumentParser()
edit_rec_dec_parser.add_argument('record_nr', type=int, help='Number of record to be edited')
@cmd2.with_argparser(edit_rec_dec_parser)
def do_edit_record_decoded(self, opts):
"""Edit the JSON representation of one record in an editor."""
(orig_json, sw) = self._cmd.rs.read_record_dec(opts.record_nr)
dirname = tempfile.mkdtemp(prefix='pysim_')
try:
filename = '%s/file' % dirname
# write existing data as JSON to file
with open(filename, 'w') as text_file:
json.dump(orig_json, text_file, indent=4)
# run a text editor
self._cmd._run_editor(filename)
with open(filename, 'r') as text_file:
edited_json = json.load(text_file)
if edited_json == orig_json:
self._cmd.poutput("Data not modified, skipping write")
else:
(data, sw) = self._cmd.rs.update_record_dec(opts.record_nr, edited_json)
if data:
self._cmd.poutput_json(data)
finally:
shutil.rmtree(dirname)
def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None, def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None,
parent:Optional[CardDF]=None, rec_len={1,None}): parent:Optional[CardDF]=None, rec_len={1,None}):
""" """