shell: New 'read_records' and 'read_records_decoded' commands

Those commands can be used to read all the records available in the
selected file.

Change-Id: If457b4e02bde8aa6db8cc329411f94411c100bc9
This commit is contained in:
Harald Welte 2021-04-07 09:33:03 +02:00 committed by laforge
parent 0d4e98a2ac
commit 850b72ad58
2 changed files with 43 additions and 0 deletions

View File

@ -178,6 +178,20 @@ read_record_decoded
:func: LinFixedEF.ShellCommands.read_rec_dec_parser
read_records
~~~~~~~~~~~~
.. argparse::
:module: pySim.filesystem
:func: LinFixedEF.ShellCommands.read_recs_parser
read_records_decoded
~~~~~~~~~~~~~~~~~~~~
.. argparse::
:module: pySim.filesystem
:func: LinFixedEF.ShellCommands.read_recs_dec_parser
update_record
~~~~~~~~~~~~~
.. argparse::

View File

@ -568,6 +568,33 @@ class LinFixedEF(CardEF):
(data, sw) = self._cmd.rs.read_record_dec(opts.record_nr)
self._cmd.poutput_json(data, opts.oneline)
read_recs_parser = argparse.ArgumentParser()
@cmd2.with_argparser(read_recs_parser)
def do_read_records(self, opts):
"""Read all records from a record-oriented EF"""
num_of_rec = self._cmd.rs.selected_file_fcp['file_descriptor']['num_of_rec']
for recnr in range(1, 1 + num_of_rec):
(data, sw) = self._cmd.rs.read_record(recnr)
if (len(data) > 0):
recstr = str(data)
else:
recstr = "(empty)"
self._cmd.poutput("%03d %s" % (recnr, recstr))
read_recs_dec_parser = argparse.ArgumentParser()
read_recs_dec_parser.add_argument('--oneline', action='store_true',
help='No JSON pretty-printing, dump as a single line')
@cmd2.with_argparser(read_recs_dec_parser)
def do_read_records_decoded(self, opts):
"""Read + decode all records from a record-oriented EF"""
num_of_rec = self._cmd.rs.selected_file_fcp['file_descriptor']['num_of_rec']
# collect all results in list so they are rendered as JSON list when printing
data_list = []
for recnr in range(1, 1 + num_of_rec):
(data, sw) = self._cmd.rs.read_record_dec(recnr)
data_list.append(data)
self._cmd.poutput_json(data_list, opts.oneline)
upd_rec_parser = argparse.ArgumentParser()
upd_rec_parser.add_argument('record_nr', type=int, help='Number of record to be read')
upd_rec_parser.add_argument('data', help='Data bytes (hex format) to write')
@ -965,6 +992,8 @@ class RuntimeState(object):
select_resp = f.decode_select_response(data)
else:
select_resp = self.probe_file(name, cmd_app)
# store the decoded FCP for later reference
self.selected_file_fcp = select_resp
# register commands of new file
if cmd_app and self.selected_file.shell_commands: