<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/26086">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sim-rest-client: Add support for 'info' command to get IMSI+ICCID<br><br>Change-Id: Ia2a13033b1d3e009a841579184f4ad39101f94d0<br>---<br>M contrib/sim-rest-client.py<br>1 file changed, 49 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/sim-rest-client.py b/contrib/sim-rest-client.py</span><br><span>index 512765b..7da2363 100755</span><br><span>--- a/contrib/sim-rest-client.py</span><br><span>+++ b/contrib/sim-rest-client.py</span><br><span>@@ -73,10 +73,9 @@</span><br><span>         return False</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def build_url(suffix:str) -> str:</span><br><span style="color: hsl(120, 100%, 40%);">+def build_url(suffix:str, base_path="/sim-auth-api/v1") -> str:</span><br><span>     """Build an URL from global server_host, server_port, BASE_PATH and suffix."""</span><br><span style="color: hsl(0, 100%, 40%);">-    BASE_PATH= "/sim-auth-api/v1"</span><br><span style="color: hsl(0, 100%, 40%);">-    return "http://%s:%u%s%s" % (server_host, server_port, BASE_PATH, suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+    return "http://%s:%u%s%s" % (server_host, server_port, base_path, suffix)</span><br><span> </span><br><span> </span><br><span> def rest_post(suffix:str, js:Optional[dict] = None):</span><br><span>@@ -91,29 +90,29 @@</span><br><span>         print("POST failed")</span><br><span>     return resp</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def rest_get(suffix:str, base_path=None):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Perform a RESTful GET."""</span><br><span style="color: hsl(120, 100%, 40%);">+    url = build_url(suffix, base_path)</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("GET %s" % url)</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = requests.get(url)</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("-> %s" % (resp))</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("GET failed")</span><br><span style="color: hsl(120, 100%, 40%);">+    return resp</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def main(argv):</span><br><span style="color: hsl(0, 100%, 40%);">-    global server_port, server_host, verbose</span><br><span style="color: hsl(120, 100%, 40%);">+def main_info(args):</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = rest_get('/slot/%u' % args.slot_nr, base_path="/sim-info-api/v1")</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("<- ERROR %u: %s" % (resp.status_code, resp.text))</span><br><span style="color: hsl(120, 100%, 40%);">+        sys.exit(1)</span><br><span style="color: hsl(120, 100%, 40%);">+    resp_json = resp.json()</span><br><span style="color: hsl(120, 100%, 40%);">+    print("<- %s" % resp_json)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser = argparse.ArgumentParser()</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-H", "--host", help="Host to connect to", default="localhost")</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-p", "--port", help="TCP port to connect to", default=8000)</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-v", "--verbose", help="increase output verbosity", action='count', default=0)</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-n", "--slot-nr", help="SIM slot number", type=int, default=0)</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-c", "--count", help="Auth count", type=int, default=10)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-k", "--key", help="Secret key K (hex)", type=str, required=True)</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-o", "--opc", help="Secret OPc (hex)", type=str, required=True)</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-a", "--amf", help="AMF Field (hex)", type=str, default="0000")</span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_argument("-s", "--sqn", help="SQN Field (hex)", type=str, default="000000000000")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    args = parser.parse_args()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    server_host = args.host</span><br><span style="color: hsl(0, 100%, 40%);">-    server_port = args.port</span><br><span style="color: hsl(0, 100%, 40%);">-    verbose = args.verbose</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+def main_auth(args):</span><br><span>     #opc = bytes.fromhex('767A662ACF4587EB0C450C6A95540A04')</span><br><span>     #k = bytes.fromhex('876B2D8D403EE96755BEF3E0A1857EBE')</span><br><span>     opc = bytes.fromhex(args.opc)</span><br><span>@@ -154,5 +153,33 @@</span><br><span>             raise RuntimeError("Auth failure")</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def main(argv):</span><br><span style="color: hsl(120, 100%, 40%);">+    global server_port, server_host, verbose</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser = argparse.ArgumentParser()</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-H", "--host", help="Host to connect to", default="localhost")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-p", "--port", help="TCP port to connect to", default=8000)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-v", "--verbose", help="increase output verbosity", action='count', default=0)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-n", "--slot-nr", help="SIM slot number", type=int, default=0)</span><br><span style="color: hsl(120, 100%, 40%);">+    subp = parser.add_subparsers()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p = subp.add_parser('auth', help='UMTS AKA Authentication')</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.add_argument("-c", "--count", help="Auth count", type=int, default=10)</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.add_argument("-k", "--key", help="Secret key K (hex)", type=str, required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.add_argument("-o", "--opc", help="Secret OPc (hex)", type=str, required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.add_argument("-a", "--amf", help="AMF Field (hex)", type=str, default="0000")</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.add_argument("-s", "--sqn", help="SQN Field (hex)", type=str, default="000000000000")</span><br><span style="color: hsl(120, 100%, 40%);">+    auth_p.set_defaults(func=main_auth)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    info_p = subp.add_parser('info', help='Information about the Card')</span><br><span style="color: hsl(120, 100%, 40%);">+    info_p.set_defaults(func=main_info)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    args = parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+    server_host = args.host</span><br><span style="color: hsl(120, 100%, 40%);">+    server_port = args.port</span><br><span style="color: hsl(120, 100%, 40%);">+    verbose = args.verbose</span><br><span style="color: hsl(120, 100%, 40%);">+    args.func(args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if __name__ == "__main__":</span><br><span>     main(sys.argv)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/26086">change 26086</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/+/26086"/><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: Ia2a13033b1d3e009a841579184f4ad39101f94d0 </div>
<div style="display:none"> Gerrit-Change-Number: 26086 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: Jenkins Builder </div>
<div style="display:none"> Gerrit-MessageType: merged </div>