mirror of https://gerrit.osmocom.org/pysim
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:
parent
fe8a74490a
commit
4145d3c4af
|
@ -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
|
||||||
------------------------
|
------------------------
|
||||||
|
|
|
@ -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}):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue