blob: 26a421d0b8c877e33c00abc6846827aa27a81eae [file] [log] [blame]
Daniel Willmann203d8652011-04-29 18:40:29 +02001#!/usr/bin/python
2
3import sys,os
4from optparse import OptionParser
5import socket
6import struct
7
8verbose = False
9
10def prefix_ipa_ctrl_header(data):
11 return struct.pack(">HBB", len(data)+1, 0xee, 0) + data
12
13def remove_ipa_ctrl_header(data):
14 if (len(data) < 4):
15 raise BaseException("Answer too short!")
16 (plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4])
17 if (plen + 3 > len(data)):
18 print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
19 if (ipa_proto != 0xee or osmo_proto != 0):
20 raise BaseException("Wrong protocol in answer!")
21
22 return data[4:plen+3], data[plen+3:]
23
24def connect(host, port):
25 if verbose:
26 print "Connecting to host %s:%i" % (host, port)
27
28 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
29 sck.setblocking(1)
30 sck.connect((host, port))
31 return sck
32
33def send(sck, data):
34 if verbose:
35 print "Sending \"%s\"" %(data)
36 data = prefix_ipa_ctrl_header(data)
37 sck.send(data)
38
39def do_set(var, value, id, sck):
40 setmsg = "SET %s %s %s" %(options.id, var, value)
41 send(sck, setmsg)
42
43def do_get(var, id, sck):
44 getmsg = "GET %s %s" %(options.id, var)
45 send(sck, getmsg)
46
Max3ed214c2016-07-29 18:19:25 +020047if __name__ == '__main__':
48 parser = OptionParser("Usage: %prog [options] var [value]")
49 parser.add_option("-d", "--host", dest="host",
50 help="connect to HOST", metavar="HOST")
51 parser.add_option("-p", "--port", dest="port", type="int",
52 help="use PORT", metavar="PORT", default=4249)
53 parser.add_option("-g", "--get", action="store_true",
54 dest="cmd_get", help="perform GET operation")
55 parser.add_option("-s", "--set", action="store_true",
56 dest="cmd_set", help="perform SET operation")
57 parser.add_option("-i", "--id", dest="id", default="1",
58 help="set id manually", metavar="ID")
59 parser.add_option("-v", "--verbose", action="store_true",
60 dest="verbose", help="be verbose", default=False)
61 parser.add_option("-m", "--monitor", action="store_true",
62 dest="monitor", help="monitor the connection for traps", default=False)
Daniel Willmann203d8652011-04-29 18:40:29 +020063
Max3ed214c2016-07-29 18:19:25 +020064 (options, args) = parser.parse_args()
Daniel Willmann203d8652011-04-29 18:40:29 +020065
Max3ed214c2016-07-29 18:19:25 +020066 verbose = options.verbose
Daniel Willmann203d8652011-04-29 18:40:29 +020067
Max3ed214c2016-07-29 18:19:25 +020068 if options.cmd_set and options.cmd_get:
69 parser.error("Get and set options are mutually exclusive!")
Daniel Willmann203d8652011-04-29 18:40:29 +020070
Max3ed214c2016-07-29 18:19:25 +020071 if not (options.cmd_get or options.cmd_set or options.monitor):
72 parser.error("One of -m, -g, or -s must be set")
Daniel Willmann203d8652011-04-29 18:40:29 +020073
Max3ed214c2016-07-29 18:19:25 +020074 if not (options.host):
75 parser.error("Destination host and port required!")
Daniel Willmann203d8652011-04-29 18:40:29 +020076
Max3ed214c2016-07-29 18:19:25 +020077 sock = connect(options.host, options.port)
Daniel Willmann203d8652011-04-29 18:40:29 +020078
Max3ed214c2016-07-29 18:19:25 +020079 if options.cmd_set:
80 if len(args) < 2:
81 parser.error("Set requires var and value arguments")
82 do_set(args[0], ' '.join(args[1:]), options.id, sock)
Daniel Willmann203d8652011-04-29 18:40:29 +020083
Max3ed214c2016-07-29 18:19:25 +020084 if options.cmd_get:
85 if len(args) != 1:
86 parser.error("Get requires the var argument")
87 do_get(args[0], options.id, sock)
Daniel Willmann203d8652011-04-29 18:40:29 +020088
Max3ed214c2016-07-29 18:19:25 +020089 data = sock.recv(1024)
90 while (len(data)>0):
91 (answer, data) = remove_ipa_ctrl_header(data)
92 print "Got message:", answer
Daniel Willmann203d8652011-04-29 18:40:29 +020093
Max3ed214c2016-07-29 18:19:25 +020094 if options.monitor:
95 while (True):
96 data = sock.recv(1024)
97 if len(data) == 0:
98 print "Connection is gone."
99 break
Daniel Willmann7c3298a2011-07-28 19:04:57 +0200100
Max3ed214c2016-07-29 18:19:25 +0200101 while (len(data)>0):
102 (answer, data) = remove_ipa_ctrl_header(data)
103 print "Got message:", answer
Daniel Willmann203d8652011-04-29 18:40:29 +0200104
Max3ed214c2016-07-29 18:19:25 +0200105 sock.close()