diff options
Diffstat (limited to 'contrib/bsc_control.py')
-rwxr-xr-x | contrib/bsc_control.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/contrib/bsc_control.py b/contrib/bsc_control.py new file mode 100755 index 000000000..c1b09ce74 --- /dev/null +++ b/contrib/bsc_control.py @@ -0,0 +1,120 @@ +#!/usr/bin/python +# -*- mode: python-mode; py-indent-tabs-mode: nil -*- +""" +/* + * Copyright (C) 2016 sysmocom s.f.m.c. GmbH + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +""" + +from optparse import OptionParser +from ipa import Ctrl +import socket + +verbose = False + +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 do_set_get(sck, var, value = None): + (r, c) = Ctrl().cmd(var, value) + sck.send(c) + answer = Ctrl().rem_header(sck.recv(4096)) + return (answer,) + Ctrl().verify(answer, r, var, value) + +def set_var(sck, var, val): + (a, _, _) = do_set_get(sck, var, val) + return a + +def get_var(sck, var): + (_, _, v) = do_set_get(sck, var) + return v + +def _leftovers(sck, fl): + """ + Read outstanding data if any according to flags + """ + try: + data = sck.recv(1024, fl) + except socket.error as (s_errno, strerror): + return False + if len(data) != 0: + tail = data + while True: + (head, tail) = Ctrl().split_combined(tail) + print "Got message:", Ctrl().rem_header(head) + if len(tail) == 0: + break + return True + return False + +if __name__ == '__main__': + 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("-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") + _leftovers(sock, socket.MSG_DONTWAIT) + print "Got message:", set_var(sock, args[0], ' '.join(args[1:])) + + if options.cmd_get: + if len(args) != 1: + parser.error("Get requires the var argument") + _leftovers(sock, socket.MSG_DONTWAIT) + (a, _, _) = do_set_get(sock, args[0]) + print "Got message:", a + + if options.monitor: + while True: + if not _leftovers(sock, 0): + print "Connection is gone." + break + sock.close() |