From 203d86531764d680cd73b71878263e29d1603a04 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Fri, 29 Apr 2011 18:40:29 +0200 Subject: Add example to communicate through the control interface --- openbsc/contrib/bsc_control.py | 100 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100755 openbsc/contrib/bsc_control.py (limited to 'openbsc/contrib') diff --git a/openbsc/contrib/bsc_control.py b/openbsc/contrib/bsc_control.py new file mode 100755 index 000000000..36c8e45cb --- /dev/null +++ b/openbsc/contrib/bsc_control.py @@ -0,0 +1,100 @@ +#!/usr/bin/python + +import sys,os +from optparse import OptionParser +import socket +import struct + +verbose = False + +def prefix_ipa_ctrl_header(data): + return struct.pack(">HBB", len(data)+1, 0xee, 0) + data + +def remove_ipa_ctrl_header(data): + if (len(data) < 4): + raise BaseException("Answer too short!") + (plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4]) + if (plen + 3 > len(data)): + print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3) + if (ipa_proto != 0xee or osmo_proto != 0): + raise BaseException("Wrong protocol in answer!") + + return data[4:plen+3], data[plen+3:] + +def connect(host, port): + if verbose: + print "Connecting to host %s:%i" % (host, port) + + sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sck.setblocking(1) + sck.connect((host, port)) + return sck + +def send(sck, data): + if verbose: + print "Sending \"%s\"" %(data) + data = prefix_ipa_ctrl_header(data) + sck.send(data) + +def do_set(var, value, id, sck): + setmsg = "SET %s %s %s" %(options.id, var, value) + send(sck, setmsg) + +def do_get(var, id, sck): + getmsg = "GET %s %s" %(options.id, var) + send(sck, getmsg) + +parser = OptionParser("Usage: %prog [options] var [value]") +parser.add_option("-d", "--host", dest="host", + help="connect to HOST", metavar="HOST") +parser.add_option("-p", "--port", dest="port", type="int", + help="use PORT", metavar="PORT", default=4249) +parser.add_option("-g", "--get", action="store_true", + dest="cmd_get", help="perform GET operation") +parser.add_option("-s", "--set", action="store_true", + dest="cmd_set", help="perform SET operation") +parser.add_option("-i", "--id", dest="id", default="1", + help="set id manually", metavar="ID") +parser.add_option("-v", "--verbose", action="store_true", + dest="verbose", help="be verbose", default=False) +parser.add_option("-m", "--monitor", action="store_true", + dest="monitor", help="monitor the connection for traps", default=False) + +(options, args) = parser.parse_args() + +verbose = options.verbose + +if options.cmd_set and options.cmd_get: + parser.error("Get and set options are mutually exclusive!") + +if not (options.cmd_get or options.cmd_set or options.monitor): + parser.error("One of -m, -g, or -s must be set") + +if not (options.host): + parser.error("Destination host and port required!") + +sock = connect(options.host, options.port) + +if options.cmd_set: + if len(args) < 2: + parser.error("Set requires var and value arguments") + do_set(args[0], ' '.join(args[1:]), options.id, sock) + +if options.cmd_get: + if len(args) != 1: + parser.error("Get requires the var argument") + do_get(args[0], options.id, sock) + +data = sock.recv(1024) +while (len(data)>0): + (answer, data) = remove_ipa_ctrl_header(data) + print "Got message:", answer + +if options.monitor: + while (True): + data = sock.recv(1024) + while (len(data)>0): + (answer, data) = remove_ipa_ctrl_header(data) + print "Got message:", answer + +sock.close() -- cgit v1.2.3