#!/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()