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