| #!/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) |
| if len(data) == 0: |
| print "Connection is gone." |
| break |
| |
| while (len(data)>0): |
| (answer, data) = remove_ipa_ctrl_header(data) |
| print "Got message:", answer |
| |
| sock.close() |