<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>