<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/25484">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pySim-shell: refactor __main__ section<br><br>The code in __main__ which initalizes the reader and the card and<br>runtime state is not so well structured. Lets put the generation of the<br>card and rs (RuntimeState) object into a separate function. Also do not<br>wait indefinetly for a card. 3 seconds should be enough. If the card or<br>reader did not respond until then, then there will be a problem in any<br>case.<br><br>Change-Id: Id2a0f2012b84ce61f5c0c14404df559fca4ddfcd<br>---<br>M pySim-shell.py<br>1 file changed, 54 insertions(+), 32 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/84/25484/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-shell.py b/pySim-shell.py</span><br><span>index 244ad3c..5f45cf4 100755</span><br><span>--- a/pySim-shell.py</span><br><span>+++ b/pySim-shell.py</span><br><span>@@ -50,6 +50,41 @@</span><br><span> </span><br><span> from pySim.card_key_provider import CardKeyProviderCsv, card_key_provider_register, card_key_provider_get_field</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def init_card(sl):</span><br><span style="color: hsl(120, 100%, 40%);">+  """</span><br><span style="color: hsl(120, 100%, 40%);">+    Detect card in reader and setup card profile and runtime state. This</span><br><span style="color: hsl(120, 100%, 40%);">+  function must be called at least once on startup. The card and runtime</span><br><span style="color: hsl(120, 100%, 40%);">+        state object (rs) is required for all pySim-shell commands.</span><br><span style="color: hsl(120, 100%, 40%);">+   """</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Wait up to three seconds for a card in reader and try to detect</span><br><span style="color: hsl(120, 100%, 40%);">+     # the card type.</span><br><span style="color: hsl(120, 100%, 40%);">+      print("Waiting for card...")</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+          sl.wait_for_card(3);</span><br><span style="color: hsl(120, 100%, 40%);">+  except NoCardError:</span><br><span style="color: hsl(120, 100%, 40%);">+           print("No card detected!")</span><br><span style="color: hsl(120, 100%, 40%);">+          return None, None;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  card = card_detect("auto", scc)</span><br><span style="color: hsl(120, 100%, 40%);">+     if card is None:</span><br><span style="color: hsl(120, 100%, 40%);">+              print("Could not detect card type!")</span><br><span style="color: hsl(120, 100%, 40%);">+                return None, None;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Create runtime state with card profile</span><br><span style="color: hsl(120, 100%, 40%);">+      profile = CardProfileUICC()</span><br><span style="color: hsl(120, 100%, 40%);">+   profile.add_application(CardApplicationUSIM)</span><br><span style="color: hsl(120, 100%, 40%);">+  profile.add_application(CardApplicationISIM)</span><br><span style="color: hsl(120, 100%, 40%);">+  rs = RuntimeState(card, profile)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # FIXME: do this dynamically</span><br><span style="color: hsl(120, 100%, 40%);">+  rs.mf.add_file(DF_TELECOM())</span><br><span style="color: hsl(120, 100%, 40%);">+  rs.mf.add_file(DF_GSM())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # inform the transport that we can do context-specific SW interpretation</span><br><span style="color: hsl(120, 100%, 40%);">+      sl.set_sw_interpreter(rs)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return rs, card</span><br><span> </span><br><span> class PysimApp(cmd2.Cmd):</span><br><span>     CUSTOM_CATEGORY = 'pySim Commands'</span><br><span>@@ -472,44 +507,12 @@</span><br><span>   # Parse options</span><br><span>      opts = option_parser.parse_args()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   # Init card reader driver</span><br><span style="color: hsl(0, 100%, 40%);">-       sl = init_reader(opts)</span><br><span style="color: hsl(0, 100%, 40%);">-  if (sl == None):</span><br><span style="color: hsl(0, 100%, 40%);">-                exit(1)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Create command layer</span><br><span style="color: hsl(0, 100%, 40%);">-  scc = SimCardCommands(transport=sl)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     sl.wait_for_card();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     card_handler = card_handler(sl)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- card = card_detect("auto", scc)</span><br><span style="color: hsl(0, 100%, 40%);">-       if card is None:</span><br><span style="color: hsl(0, 100%, 40%);">-                print("No card detected!")</span><br><span style="color: hsl(0, 100%, 40%);">-            sys.exit(2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     profile = CardProfileUICC()</span><br><span style="color: hsl(0, 100%, 40%);">-     profile.add_application(CardApplicationUSIM)</span><br><span style="color: hsl(0, 100%, 40%);">-    profile.add_application(CardApplicationISIM)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    rs = RuntimeState(card, profile)</span><br><span style="color: hsl(0, 100%, 40%);">-        # inform the transport that we can do context-specific SW interpretation</span><br><span style="color: hsl(0, 100%, 40%);">-        sl.set_sw_interpreter(rs)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # FIXME: do this dynamically</span><br><span style="color: hsl(0, 100%, 40%);">-    rs.mf.add_file(DF_TELECOM())</span><br><span style="color: hsl(0, 100%, 40%);">-    rs.mf.add_file(DF_GSM())</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     # If a script file is specified, be sure that it actually exists</span><br><span>     if opts.script:</span><br><span>              if not os.access(opts.script, os.R_OK):</span><br><span>                      print("Invalid script file!")</span><br><span>                      sys.exit(2)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- app = PysimApp(card, rs, opts.script)</span><br><span style="color: hsl(0, 100%, 40%);">-   rs.select('MF', app)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         # Register csv-file as card data provider, either from specified CSV</span><br><span>         # or from CSV file in home directory</span><br><span>         csv_default = str(Path.home()) + "/.osmocom/pysim/card_data.csv"</span><br><span>@@ -518,6 +521,25 @@</span><br><span>    if os.path.isfile(csv_default):</span><br><span>              card_key_provider_register(CardKeyProviderCsv(csv_default))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       # Init card reader driver</span><br><span style="color: hsl(120, 100%, 40%);">+     sl = init_reader(opts)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (sl == None):</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Create command layer</span><br><span style="color: hsl(120, 100%, 40%);">+        scc = SimCardCommands(transport=sl)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ card_handler = card_handler(sl)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Detect and initalize the card in the reader. This may fail when there</span><br><span style="color: hsl(120, 100%, 40%);">+       # is no card in the reader or the card is unresponsive. PysimApp is</span><br><span style="color: hsl(120, 100%, 40%);">+   # able to tolerate and recover from that.</span><br><span style="color: hsl(120, 100%, 40%);">+     rs, card = init_card(sl)</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rs == None or card == None):</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1)</span><br><span style="color: hsl(120, 100%, 40%);">+       app = PysimApp(card, rs, opts.script)</span><br><span style="color: hsl(120, 100%, 40%);">+ rs.select('MF', app)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       # If the user supplies an ADM PIN at via commandline args authenticate</span><br><span>       # immediately so that the user does not have to use the shell commands</span><br><span>       pin_adm = sanitize_pin_adm(opts.pin_adm, opts.pin_adm_hex)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/25484">change 25484</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/25484"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id2a0f2012b84ce61f5c0c14404df559fca4ddfcd </div>
<div style="display:none"> Gerrit-Change-Number: 25484 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>