mirror of
https://gitea.osmocom.org/sim-card/pysim.git
synced 2026-03-23 22:08:34 +03:00
pySim-shell: add "dir" command.
pysim-shell does not have a convinient way to list the files available in one directory. Tab completion currently is the only way to obtain a list of the available files. Lets add a dir command to print a file list. Change-Id: Ic06a60e0a0ec54d9bb26e151453ceb49d69e3df7 Related: OS#4963
This commit is contained in:
@@ -38,7 +38,7 @@ from pySim.exceptions import *
|
|||||||
from pySim.commands import SimCardCommands
|
from pySim.commands import SimCardCommands
|
||||||
from pySim.cards import card_detect, Card
|
from pySim.cards import card_detect, Card
|
||||||
from pySim.utils import h2b, swap_nibbles, rpad, h2s
|
from pySim.utils import h2b, swap_nibbles, rpad, h2s
|
||||||
from pySim.utils import dec_st, init_reader, sanitize_pin_adm
|
from pySim.utils import dec_st, init_reader, sanitize_pin_adm, tabulate_str_list
|
||||||
from pySim.card_handler import card_handler
|
from pySim.card_handler import card_handler
|
||||||
|
|
||||||
from pySim.filesystem import CardMF, RuntimeState
|
from pySim.filesystem import CardMF, RuntimeState
|
||||||
@@ -112,6 +112,35 @@ class Iso7816Commands(CommandSet):
|
|||||||
(data, sw) = self._cmd.card._scc.verify_chv(opts.chv_nr, opts.code)
|
(data, sw) = self._cmd.card._scc.verify_chv(opts.chv_nr, opts.code)
|
||||||
self._cmd.poutput(data)
|
self._cmd.poutput(data)
|
||||||
|
|
||||||
|
dir_parser = argparse.ArgumentParser()
|
||||||
|
dir_parser.add_argument('--fids', help='Show file identifiers', action='store_true')
|
||||||
|
dir_parser.add_argument('--names', help='Show file names', action='store_true')
|
||||||
|
dir_parser.add_argument('--apps', help='Show applications', action='store_true')
|
||||||
|
dir_parser.add_argument('--all', help='Show all selectable identifiers and names', action='store_true')
|
||||||
|
|
||||||
|
@cmd2.with_argparser(dir_parser)
|
||||||
|
def do_dir(self, opts):
|
||||||
|
"""Show a listing of files available in currently selected DF or MF"""
|
||||||
|
if opts.all:
|
||||||
|
flags = []
|
||||||
|
elif opts.fids or opts.names or opts.apps:
|
||||||
|
flags = ['PARENT', 'SELF']
|
||||||
|
if opts.fids:
|
||||||
|
flags += ['FIDS', 'AIDS']
|
||||||
|
if opts.names:
|
||||||
|
flags += ['FNAMES', 'ANAMES']
|
||||||
|
if opts.apps:
|
||||||
|
flags += ['ANAMES', 'AIDS']
|
||||||
|
else:
|
||||||
|
flags = ['PARENT', 'SELF', 'FNAMES', 'ANAMES']
|
||||||
|
selectables = list(self._cmd.rs.selected_file.get_selectable_names(flags = flags))
|
||||||
|
directory_str = tabulate_str_list(selectables, width = 79, hspace = 2, lspace = 1, align_left = True)
|
||||||
|
path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
|
||||||
|
self._cmd.poutput('/'.join(path_list))
|
||||||
|
path_list = self._cmd.rs.selected_file.fully_qualified_path(False)
|
||||||
|
self._cmd.poutput('/'.join(path_list))
|
||||||
|
self._cmd.poutput(directory_str)
|
||||||
|
self._cmd.poutput("%d files" % len(selectables))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -794,3 +794,25 @@ def sw_match(sw, pattern):
|
|||||||
else:
|
else:
|
||||||
sw_masked = sw_masked + sw_lower[i]
|
sw_masked = sw_masked + sw_lower[i]
|
||||||
return sw_masked == pattern
|
return sw_masked == pattern
|
||||||
|
|
||||||
|
def tabulate_str_list(str_list, width = 79, hspace = 2, lspace = 1, align_left = True):
|
||||||
|
"""Pretty print a list of strings into a tabulated form"""
|
||||||
|
if str_list == None:
|
||||||
|
return ""
|
||||||
|
if len(str_list) <= 0:
|
||||||
|
return ""
|
||||||
|
longest_str = max(str_list, key=len)
|
||||||
|
cellwith = len(longest_str) + hspace
|
||||||
|
cols = width // cellwith
|
||||||
|
rows = (len(str_list) - 1) // cols + 1
|
||||||
|
table = []
|
||||||
|
for i in iter(range(rows)):
|
||||||
|
str_list_row = str_list[i::rows]
|
||||||
|
if (align_left):
|
||||||
|
format_str_cell = '%%-%ds'
|
||||||
|
else:
|
||||||
|
format_str_cell = '%%%ds'
|
||||||
|
format_str_row = (format_str_cell % cellwith) * len(str_list_row)
|
||||||
|
format_str_row = (" " * lspace) + format_str_row
|
||||||
|
table.append(format_str_row % tuple(str_list_row))
|
||||||
|
return '\n'.join(table)
|
||||||
|
|||||||
Reference in New Issue
Block a user