shell: Move dir,tree,export from ISO7816 to pySim commands

pySim has the notion of command categories.  The ISO7816 category
should only contain commands such as SELECT or CHV management
which really is ISO7816.  Custom commands like 'tree' or 'export'
are pySim specific and hence go into a different category.

Change-Id: Id38c8190c6279d037fe266c586065f1507a02932
diff --git a/pySim-shell.py b/pySim-shell.py
index ef76cb2..ae8a5a2 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -55,7 +55,7 @@
 class PysimApp(cmd2.Cmd):
 	CUSTOM_CATEGORY = 'pySim Commands'
 	def __init__(self, card, rs, script = None):
-		basic_commands = [Iso7816Commands()]
+		basic_commands = [Iso7816Commands(), PySimCommands()]
 		super().__init__(persistent_history_file='~/.pysim_shell_history', allow_cli_args=False,
 				 use_ipython=True, auto_load_commands=False, command_sets=basic_commands, startup_script=script)
 		self.intro = style('Welcome to pySim-shell!', fg=fg.red)
@@ -118,104 +118,11 @@
 		else:
 			self.poutput("no description available")
 
-
-@with_default_category('ISO7816 Commands')
-class Iso7816Commands(CommandSet):
+@with_default_category('pySim Commands')
+class PySimCommands(CommandSet):
 	def __init__(self):
 		super().__init__()
 
-	def do_select(self, opts):
-		"""SELECT a File (ADF/DF/EF)"""
-		if len(opts.arg_list) == 0:
-			path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
-			path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
-			self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
-			return
-
-		path = opts.arg_list[0]
-		fcp_dec = self._cmd.rs.select(path, self._cmd)
-		self._cmd.update_prompt()
-		self._cmd.poutput(json.dumps(fcp_dec, indent=4))
-
-	def complete_select(self, text, line, begidx, endidx) -> List[str]:
-		"""Command Line tab completion for SELECT"""
-		index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
-		return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
-
-	def get_code(self, code):
-		"""Use code either directly or try to get it from external data source"""
-		auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
-
-		if str(code).upper() not in auto:
-			return sanitize_pin_adm(code)
-
-		result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
-		result = sanitize_pin_adm(result)
-		if result:
-			self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
-		else:
-			self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
-		return result
-
-	verify_chv_parser = argparse.ArgumentParser()
-	verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(verify_chv_parser)
-	def do_verify_chv(self, opts):
-		"""Verify (authenticate) using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV verfication successful")
-
-	unblock_chv_parser = argparse.ArgumentParser()
-	unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
-	unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(unblock_chv_parser)
-	def do_unblock_chv(self, opts):
-		"""Unblock PIN code using specified PUK code"""
-		new_pin = self.get_code(opts.new_pin_code)
-		puk = self.get_code(opts.puk_code)
-		(data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
-		self._cmd.poutput("CHV unblock successful")
-
-	change_chv_parser = argparse.ArgumentParser()
-	change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-	change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(change_chv_parser)
-	def do_change_chv(self, opts):
-		"""Change PIN code to a new PIN code"""
-		new_pin = self.get_code(opts.new_pin_code)
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
-		self._cmd.poutput("CHV change successful")
-
-	disable_chv_parser = argparse.ArgumentParser()
-	disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(disable_chv_parser)
-	def do_disable_chv(self, opts):
-		"""Disable PIN code using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV disable successful")
-
-	enable_chv_parser = argparse.ArgumentParser()
-	enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(enable_chv_parser)
-	def do_enable_chv(self, opts):
-		"""Enable PIN code using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV enable successful")
-
 	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')
@@ -347,6 +254,104 @@
 			raise RuntimeError("unable to export %i file(s)" % context['ERR'])
 
 
+@with_default_category('ISO7816 Commands')
+class Iso7816Commands(CommandSet):
+	def __init__(self):
+		super().__init__()
+
+	def do_select(self, opts):
+		"""SELECT a File (ADF/DF/EF)"""
+		if len(opts.arg_list) == 0:
+			path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
+			path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
+			self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
+			return
+
+		path = opts.arg_list[0]
+		fcp_dec = self._cmd.rs.select(path, self._cmd)
+		self._cmd.update_prompt()
+		self._cmd.poutput(json.dumps(fcp_dec, indent=4))
+
+	def complete_select(self, text, line, begidx, endidx) -> List[str]:
+		"""Command Line tab completion for SELECT"""
+		index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
+		return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
+
+	def get_code(self, code):
+		"""Use code either directly or try to get it from external data source"""
+		auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
+
+		if str(code).upper() not in auto:
+			return sanitize_pin_adm(code)
+
+		result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
+		result = sanitize_pin_adm(result)
+		if result:
+			self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
+		else:
+			self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
+		return result
+
+	verify_chv_parser = argparse.ArgumentParser()
+	verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(verify_chv_parser)
+	def do_verify_chv(self, opts):
+		"""Verify (authenticate) using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV verfication successful")
+
+	unblock_chv_parser = argparse.ArgumentParser()
+	unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
+	unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(unblock_chv_parser)
+	def do_unblock_chv(self, opts):
+		"""Unblock PIN code using specified PUK code"""
+		new_pin = self.get_code(opts.new_pin_code)
+		puk = self.get_code(opts.puk_code)
+		(data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
+		self._cmd.poutput("CHV unblock successful")
+
+	change_chv_parser = argparse.ArgumentParser()
+	change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+	change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(change_chv_parser)
+	def do_change_chv(self, opts):
+		"""Change PIN code to a new PIN code"""
+		new_pin = self.get_code(opts.new_pin_code)
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
+		self._cmd.poutput("CHV change successful")
+
+	disable_chv_parser = argparse.ArgumentParser()
+	disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(disable_chv_parser)
+	def do_disable_chv(self, opts):
+		"""Disable PIN code using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV disable successful")
+
+	enable_chv_parser = argparse.ArgumentParser()
+	enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(enable_chv_parser)
+	def do_enable_chv(self, opts):
+		"""Enable PIN code using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV enable successful")
+
+
 def parse_options():
 
 	parser = OptionParser(usage="usage: %prog [options]")