<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-cbc/+/22388">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add simplistic cbc-apitool.py as example on how to use the REST API<br><br>Change-Id: I6cbc30a3f8bf833fea785437488aed8b8af2fcbc<br>---<br>M contrib/Makefile.am<br>A contrib/cbc-apitool.py<br>2 files changed, 132 insertions(+), 0 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/88/22388/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/Makefile.am b/contrib/Makefile.am</span><br><span>index 3439c97..928af00 100644</span><br><span>--- a/contrib/Makefile.am</span><br><span>+++ b/contrib/Makefile.am</span><br><span>@@ -1 +1,4 @@</span><br><span> SUBDIRS = systemd</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = cbc-apitool.py \</span><br><span style="color: hsl(120, 100%, 40%);">+            $(NULL)</span><br><span>diff --git a/contrib/cbc-apitool.py b/contrib/cbc-apitool.py</span><br><span>new file mode 100755</span><br><span>index 0000000..1b68386</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/cbc-apitool.py</span><br><span>@@ -0,0 +1,129 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2020 by Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# SPDX-License-Identifier: MIT</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This is a simplistic program to show how the REST API of osmo-cbc can be used to</span><br><span style="color: hsl(120, 100%, 40%);">+# create and delete Cell Broadcast Messages</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# A lot of the parameters are currently hard-coded, see the 'js' variable definitions</span><br><span style="color: hsl(120, 100%, 40%);">+# below.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import sys</span><br><span style="color: hsl(120, 100%, 40%);">+import argparse</span><br><span style="color: hsl(120, 100%, 40%);">+import requests</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 build_url(suffix):</span><br><span style="color: hsl(120, 100%, 40%);">+    BASE_PATH= "/api/ecbe/v1"</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 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 rest_post(suffix, js = None):</span><br><span style="color: hsl(120, 100%, 40%);">+    url = build_url(suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("POST %s (%s)" % (url, str(js)))</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = requests.post(url, json=js)</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("POST failed")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def rest_delete(suffix, js = None):</span><br><span style="color: hsl(120, 100%, 40%);">+    url = build_url(suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("DELETE %s (%s)" % (url, str(js)))</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = requests.delete(url, json=js)</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("DELETE failed " + str(resp))</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%);">+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=12345)</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    group = parser.add_mutually_exclusive_group()</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-c", "--create-cbs", type=int, nargs=1, metavar=('msg_id'))</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-e", "--create-etws", type=int, nargs=1, metavar=('msg_id'))</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-d", "--delete", type=int, nargs=1, metavar=('msg_id'))</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%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.create_cbs:</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': 5,</span><br><span style="color: hsl(120, 100%, 40%);">+            'num_of_bcast': 888,</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': int(args.create_cbs[0]),</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': 768,</span><br><span style="color: hsl(120, 100%, 40%);">+                        'update_nr': 0</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': "Mahlzeit!"</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%);">+    elif args.create_etws:</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': 5,</span><br><span style="color: hsl(120, 100%, 40%);">+            'num_of_bcast': 999,</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': int(args.create_etws[0]),</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': 768,</span><br><span style="color: hsl(120, 100%, 40%);">+                        'update_nr': 0</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%);">+    elif args.delete:</span><br><span style="color: hsl(120, 100%, 40%);">+        rest_delete("/message/%u" % (args.delete[0]))</span><br><span style="color: hsl(120, 100%, 40%);">+    else:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("No operation?!");</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%);">+if __name__ == "__main__":</span><br><span style="color: hsl(120, 100%, 40%);">+    main(sys.argv)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-cbc/+/22388">change 22388</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/+/22388"/><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: I6cbc30a3f8bf833fea785437488aed8b8af2fcbc </div>
<div style="display:none"> Gerrit-Change-Number: 22388 </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>