105 lines
2.9 KiB
Python
Executable File
105 lines
2.9 KiB
Python
Executable File
#!/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()
|