<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-cbc/+/22396">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cbc-apitool.py: Generalize, make parameters configurable<br><br>Do away with most of the hard-coded defaults and allow user to specify<br>a variety of parameters via the command line.  Also, start to use<br>argparse subparsers for better usability<br><br>Change-Id: Ib7b8121676bef9310f219affc6f3cc76b6986b2a<br>---<br>M contrib/cbc-apitool.py<br>1 file changed, 99 insertions(+), 72 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-cbc refs/changes/96/22396/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/cbc-apitool.py b/contrib/cbc-apitool.py</span><br><span>index 1b68386..c7ebcfa 100755</span><br><span>--- a/contrib/cbc-apitool.py</span><br><span>+++ b/contrib/cbc-apitool.py</span><br><span>@@ -1,6 +1,6 @@</span><br><span> #!/usr/bin/env python3</span><br><span> #</span><br><span style="color: hsl(0, 100%, 40%);">-# (C) 2020 by Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2020-2021 by Harald Welte <laforge@osmocom.org></span><br><span> #</span><br><span> # SPDX-License-Identifier: MIT</span><br><span> #</span><br><span>@@ -25,18 +25,89 @@</span><br><span>     if verbose:</span><br><span>         print("POST %s (%s)" % (url, str(js)))</span><br><span>     resp = requests.post(url, json=js)</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>     if not resp.ok:</span><br><span>         print("POST failed")</span><br><span style="color: hsl(120, 100%, 40%);">+    return resp</span><br><span> </span><br><span> def rest_delete(suffix, js = None):</span><br><span>     url = build_url(suffix)</span><br><span>     if verbose:</span><br><span>         print("DELETE %s (%s)" % (url, str(js)))</span><br><span>     resp = requests.delete(url, json=js)</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>     if not resp.ok:</span><br><span>         print("DELETE failed " + str(resp))</span><br><span style="color: hsl(120, 100%, 40%);">+    return resp</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def do_create_cbs(args):</span><br><span style="color: hsl(120, 100%, 40%);">+    js = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'cbe_name': "cbc_apitool",</span><br><span style="color: hsl(120, 100%, 40%);">+        'category': "normal",</span><br><span style="color: hsl(120, 100%, 40%);">+        'repetition_period': args.repetition_period,</span><br><span style="color: hsl(120, 100%, 40%);">+        'num_of_bcast': args.num_of_bcast,</span><br><span style="color: hsl(120, 100%, 40%);">+        'scope': {</span><br><span style="color: hsl(120, 100%, 40%);">+            'scope_plmn': { }</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+        'smscb_message': {</span><br><span style="color: hsl(120, 100%, 40%);">+            'message_id': args.msg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+            'serial_nr': {</span><br><span style="color: hsl(120, 100%, 40%);">+                'serial_nr_decoded': {</span><br><span style="color: hsl(120, 100%, 40%);">+                    'geo_scope': "plmn_wide",</span><br><span style="color: hsl(120, 100%, 40%);">+                    'msg_code': args.msg_code,</span><br><span style="color: hsl(120, 100%, 40%);">+                    'update_nr': args.update_nr</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%);">+            'payload': {</span><br><span style="color: hsl(120, 100%, 40%);">+                'payload_decoded': {</span><br><span style="color: hsl(120, 100%, 40%);">+                    'character_set': "gsm",</span><br><span style="color: hsl(120, 100%, 40%);">+                    #'language': 'en',</span><br><span style="color: hsl(120, 100%, 40%);">+                    'data_utf8': args.payload_data_utf8,</span><br><span style="color: hsl(120, 100%, 40%);">+                    #'data_utf8': "Mahlzeit1 Mahlzeit2 Mahlzeit3 Mahlzeit4 Mahlzeit5 Mahlzeit6 Mahlzeit7 Mahlzeit8"</span><br><span style="color: hsl(120, 100%, 40%);">+                    #'data_utf8': "Mahlzeit1 Mahlzeit2 Mahlzeit3 Mahlzeit4 Mahlzeit5 Mahlzeit6 Mahlzeit7 Mahlzeit8 Mahlzeit9 Mahlzeit10 Mahlzeti11 Mahlzeit12 Mahlzeit13 Mahlzeit14 Mahlzeit15 Mahlzeit16 Mahlzeit17 Mahlzeit18 Mahlzeit19 Mahlzeit20 Mahlzeit21 Mahlzeit22 Mahlzeit23 Mahlzeit24 Mahlzeit25 Mahlzeit26 Mahlzeit27 Mahlzeit28"</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%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_post("/message", js);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def do_create_etws(args):</span><br><span style="color: hsl(120, 100%, 40%);">+    js = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'cbe_name': "cbc_apitool",</span><br><span style="color: hsl(120, 100%, 40%);">+        'category': "normal",</span><br><span style="color: hsl(120, 100%, 40%);">+        'repetition_period': args.repetition_period,</span><br><span style="color: hsl(120, 100%, 40%);">+        'num_of_bcast': args.num_of_bcast,</span><br><span style="color: hsl(120, 100%, 40%);">+        'scope': {</span><br><span style="color: hsl(120, 100%, 40%);">+            'scope_plmn': { }</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+        'smscb_message': {</span><br><span style="color: hsl(120, 100%, 40%);">+            'message_id': args.msg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+            'serial_nr': {</span><br><span style="color: hsl(120, 100%, 40%);">+                'serial_nr_decoded': {</span><br><span style="color: hsl(120, 100%, 40%);">+                    'geo_scope': "plmn_wide",</span><br><span style="color: hsl(120, 100%, 40%);">+                    'msg_code': args.msg_code,</span><br><span style="color: hsl(120, 100%, 40%);">+                    'update_nr': args.update_nr</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%);">+            'payload': {</span><br><span style="color: hsl(120, 100%, 40%);">+                'payload_etws': {</span><br><span style="color: hsl(120, 100%, 40%);">+                    'warning_type': {</span><br><span style="color: hsl(120, 100%, 40%);">+                        'warning_type_decoded': 'earthquake'</span><br><span style="color: hsl(120, 100%, 40%);">+                    },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'emergency_user_alert': True,</span><br><span style="color: hsl(120, 100%, 40%);">+                    'popup_on_display': True</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%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_post("/message", js);</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%);">+def do_delete(args):</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_delete("/message/%u" % (args.msg_id))</span><br><span> </span><br><span> def main(argv):</span><br><span>     global server_port, server_host, verbose</span><br><span>@@ -46,83 +117,39 @@</span><br><span>     parser.add_argument("-p", "--port", help="TCP port to connect to", default=12345)</span><br><span>     parser.add_argument("-v", "--verbose", help="increase output verbosity", action='count', default=0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    group = parser.add_mutually_exclusive_group()</span><br><span style="color: hsl(0, 100%, 40%);">-    group.add_argument("-c", "--create-cbs", type=int, nargs=1, metavar=('msg_id'))</span><br><span style="color: hsl(0, 100%, 40%);">-    group.add_argument("-e", "--create-etws", type=int, nargs=1, metavar=('msg_id'))</span><br><span style="color: hsl(0, 100%, 40%);">-    group.add_argument("-d", "--delete", type=int, nargs=1, metavar=('msg_id'))</span><br><span style="color: hsl(120, 100%, 40%);">+    subparsers = parser.add_subparsers(required=True)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    args = parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs = subparsers.add_parser('create-cbs', help='Create a new CBS message')</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--msg-id", type=int, help='Message Identifier', required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--msg-code", type=int, help='Message Code', default=768)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--update-nr", type=int, help='Update Number', default=0)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--repetition-period", type=int, help='Repetition Period', default=5)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--num-of-bcast", type=int, help='Number of Broadcasts', default=999)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.add_argument("--payload-data-utf8", type=str, help='Payload Data in UTF8', required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_cbs.set_defaults(func=do_create_cbs)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws = subparsers.add_parser('create-etws', help='Create a new ETWS message')</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.add_argument("--msg-id", type=int, help='Message Identifier', required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.add_argument("--msg-code", type=int, help='Message Code', default=768)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.add_argument("--update-nr", type=int, help='Update Number', default=0)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.add_argument("--repetition-period", type=int, help='Repetition Period', default=5)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.add_argument("--num-of-bcast", type=int, help='Number of Broadcasts', default=999)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_c_etws.set_defaults(func=do_create_etws)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_delete = subparsers.add_parser('delete', help='Delete a message')</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_delete.add_argument("--msg-id", type=int, help='Message Identifier', required=True)</span><br><span style="color: hsl(120, 100%, 40%);">+    parser_delete.set_defaults(func=do_delete)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    argv = sys.argv</span><br><span style="color: hsl(120, 100%, 40%);">+    if len(sys.argv) == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+        argv = ['-h']</span><br><span style="color: hsl(120, 100%, 40%);">+    args = parser.parse_args(argv)</span><br><span> </span><br><span>     server_host = args.host</span><br><span>     server_port = args.port</span><br><span>     verbose = args.verbose</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if args.create_cbs:</span><br><span style="color: hsl(0, 100%, 40%);">-        js = {</span><br><span style="color: hsl(0, 100%, 40%);">-            'cbe_name': "cbc_apitool",</span><br><span style="color: hsl(0, 100%, 40%);">-            'category': "normal",</span><br><span style="color: hsl(0, 100%, 40%);">-            'repetition_period': 5,</span><br><span style="color: hsl(0, 100%, 40%);">-            'num_of_bcast': 888,</span><br><span style="color: hsl(0, 100%, 40%);">-            'scope': {</span><br><span style="color: hsl(0, 100%, 40%);">-                'scope_plmn': { }</span><br><span style="color: hsl(0, 100%, 40%);">-            },</span><br><span style="color: hsl(0, 100%, 40%);">-            'smscb_message': {</span><br><span style="color: hsl(0, 100%, 40%);">-                'message_id': int(args.create_cbs[0]),</span><br><span style="color: hsl(0, 100%, 40%);">-                'serial_nr': {</span><br><span style="color: hsl(0, 100%, 40%);">-                    'serial_nr_decoded': {</span><br><span style="color: hsl(0, 100%, 40%);">-                        'geo_scope': "plmn_wide",</span><br><span style="color: hsl(0, 100%, 40%);">-                        'msg_code': 768,</span><br><span style="color: hsl(0, 100%, 40%);">-                        'update_nr': 0</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                },</span><br><span style="color: hsl(0, 100%, 40%);">-                'payload': {</span><br><span style="color: hsl(0, 100%, 40%);">-                    'payload_decoded': {</span><br><span style="color: hsl(0, 100%, 40%);">-                        'character_set': "gsm",</span><br><span style="color: hsl(0, 100%, 40%);">-                        #'language': 'en',</span><br><span style="color: hsl(0, 100%, 40%);">-                        #'data_utf8': "Mahlzeit!"</span><br><span style="color: hsl(0, 100%, 40%);">-                        'data_utf8': "Mahlzeit1 Mahlzeit2 Mahlzeit3 Mahlzeit4 Mahlzeit5 Mahlzeit6 Mahlzeit7 Mahlzeit8"</span><br><span style="color: hsl(0, 100%, 40%);">-                        #'data_utf8': "Mahlzeit1 Mahlzeit2 Mahlzeit3 Mahlzeit4 Mahlzeit5 Mahlzeit6 Mahlzeit7 Mahlzeit8 Mahlzeit9 Mahlzeit10 Mahlzeti11 Mahlzeit12 Mahlzeit13 Mahlzeit14 Mahlzeit15 Mahlzeit16 Mahlzeit17 Mahlzeit18 Mahlzeit19 Mahlzeit20 Mahlzeit21 Mahlzeit22 Mahlzeit23 Mahlzeit24 Mahlzeit25 Mahlzeit26 Mahlzeit27 Mahlzeit28"</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        rest_post("/message", js);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    elif args.create_etws:</span><br><span style="color: hsl(0, 100%, 40%);">-        js = {</span><br><span style="color: hsl(0, 100%, 40%);">-            'cbe_name': "cbc_apitool",</span><br><span style="color: hsl(0, 100%, 40%);">-            'category': "normal",</span><br><span style="color: hsl(0, 100%, 40%);">-            'repetition_period': 5,</span><br><span style="color: hsl(0, 100%, 40%);">-            'num_of_bcast': 999,</span><br><span style="color: hsl(0, 100%, 40%);">-            'scope': {</span><br><span style="color: hsl(0, 100%, 40%);">-                'scope_plmn': { }</span><br><span style="color: hsl(0, 100%, 40%);">-            },</span><br><span style="color: hsl(0, 100%, 40%);">-            'smscb_message': {</span><br><span style="color: hsl(0, 100%, 40%);">-                'message_id': int(args.create_etws[0]),</span><br><span style="color: hsl(0, 100%, 40%);">-                'serial_nr': {</span><br><span style="color: hsl(0, 100%, 40%);">-                    'serial_nr_decoded': {</span><br><span style="color: hsl(0, 100%, 40%);">-                        'geo_scope': "plmn_wide",</span><br><span style="color: hsl(0, 100%, 40%);">-                        'msg_code': 768,</span><br><span style="color: hsl(0, 100%, 40%);">-                        'update_nr': 0</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                },</span><br><span style="color: hsl(0, 100%, 40%);">-                'payload': {</span><br><span style="color: hsl(0, 100%, 40%);">-                    'payload_etws': {</span><br><span style="color: hsl(0, 100%, 40%);">-                        'warning_type': {</span><br><span style="color: hsl(0, 100%, 40%);">-                            'warning_type_decoded': 'earthquake'</span><br><span style="color: hsl(0, 100%, 40%);">-                        },</span><br><span style="color: hsl(0, 100%, 40%);">-                        'emergency_user_alert': True,</span><br><span style="color: hsl(0, 100%, 40%);">-                        'popup_on_display': True</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        rest_post("/message", js);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    elif args.delete:</span><br><span style="color: hsl(0, 100%, 40%);">-        rest_delete("/message/%u" % (args.delete[0]))</span><br><span style="color: hsl(0, 100%, 40%);">-    else:</span><br><span style="color: hsl(0, 100%, 40%);">-        print("No operation?!");</span><br><span style="color: hsl(120, 100%, 40%);">+    args.func(args)</span><br><span> </span><br><span> </span><br><span> if __name__ == "__main__":</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-cbc/+/22396">change 22396</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/osmo-cbc/+/22396"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-cbc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ib7b8121676bef9310f219affc6f3cc76b6986b2a </div>
<div style="display:none"> Gerrit-Change-Number: 22396 </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-MessageType: newchange </div>