blob: ba869479ba76a04ceff30fbe7903aab2bef4ae44 [file] [log] [blame]
Daniel Willmann203d8652011-04-29 18:40:29 +02001#!/usr/bin/python
Max82caa3e2016-11-17 17:24:53 +01002# -*- mode: python-mode; py-indent-tabs-mode: nil -*-
Daniel Willmann203d8652011-04-29 18:40:29 +02003
Max2a63d012016-08-01 14:26:19 +02004import sys,os, random
Daniel Willmann203d8652011-04-29 18:40:29 +02005from optparse import OptionParser
6import socket
7import struct
8
9verbose = False
10
11def prefix_ipa_ctrl_header(data):
12 return struct.pack(">HBB", len(data)+1, 0xee, 0) + data
13
Maxdbb63922016-08-01 18:54:17 +020014def ipa_ctrl_header(header):
15 (plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", header)
16 return None if (ipa_proto != 0xee or osmo_proto != 0) else plen
17
Daniel Willmann203d8652011-04-29 18:40:29 +020018def remove_ipa_ctrl_header(data):
19 if (len(data) < 4):
20 raise BaseException("Answer too short!")
Maxdbb63922016-08-01 18:54:17 +020021 plen = ipa_ctrl_header(data[:4])
22 if (None == plen):
23 raise BaseException("Wrong protocol in answer!")
Daniel Willmann203d8652011-04-29 18:40:29 +020024 if (plen + 3 > len(data)):
25 print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
Daniel Willmann203d8652011-04-29 18:40:29 +020026 return data[4:plen+3], data[plen+3:]
27
28def connect(host, port):
Max82caa3e2016-11-17 17:24:53 +010029 if verbose:
30 print "Connecting to host %s:%i" % (host, port)
Daniel Willmann203d8652011-04-29 18:40:29 +020031
Max82caa3e2016-11-17 17:24:53 +010032 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
33 sck.setblocking(1)
34 sck.connect((host, port))
35 return sck
Daniel Willmann203d8652011-04-29 18:40:29 +020036
37def send(sck, data):
38 if verbose:
39 print "Sending \"%s\"" %(data)
40 data = prefix_ipa_ctrl_header(data)
41 sck.send(data)
42
Max2a63d012016-08-01 14:26:19 +020043def do_set(var, value, op_id, sck):
44 setmsg = "SET %s %s %s" %(op_id, var, value)
Daniel Willmann203d8652011-04-29 18:40:29 +020045 send(sck, setmsg)
46
Max2a63d012016-08-01 14:26:19 +020047def do_get(var, op_id, sck):
48 getmsg = "GET %s %s" %(op_id, var)
Daniel Willmann203d8652011-04-29 18:40:29 +020049 send(sck, getmsg)
50
Maxdbb63922016-08-01 18:54:17 +020051def do_set_get(sck, var, value = None):
52 r = random.randint(1, sys.maxint)
53 if (value != None):
54 s = 'SET_REPLY'
55 do_set(var, value, r, sck)
56 else:
57 s = 'GET_REPLY'
58 do_get(var, r, sck)
59 (answer, data) = remove_ipa_ctrl_header(sck.recv(4096))
60 x = answer.split()
61 if (s == x[0] and str(r) == x[1] and var == x[2]):
62 return None if ('SET_REPLY' == s and value != x[3]) else x[3]
63 return None
64
65def set_var(sck, var, val):
66 return do_set_get(sck, var, val)
67
68def get_var(sck, var):
69 return do_set_get(sck, var)
70
Max3ed214c2016-07-29 18:19:25 +020071if __name__ == '__main__':
Max2a63d012016-08-01 14:26:19 +020072 random.seed()
73
Max3ed214c2016-07-29 18:19:25 +020074 parser = OptionParser("Usage: %prog [options] var [value]")
75 parser.add_option("-d", "--host", dest="host",
76 help="connect to HOST", metavar="HOST")
77 parser.add_option("-p", "--port", dest="port", type="int",
78 help="use PORT", metavar="PORT", default=4249)
79 parser.add_option("-g", "--get", action="store_true",
80 dest="cmd_get", help="perform GET operation")
81 parser.add_option("-s", "--set", action="store_true",
82 dest="cmd_set", help="perform SET operation")
Max2a63d012016-08-01 14:26:19 +020083 parser.add_option("-i", "--id", dest="op_id", default=random.randint(1, sys.maxint),
Max3ed214c2016-07-29 18:19:25 +020084 help="set id manually", metavar="ID")
85 parser.add_option("-v", "--verbose", action="store_true",
86 dest="verbose", help="be verbose", default=False)
87 parser.add_option("-m", "--monitor", action="store_true",
88 dest="monitor", help="monitor the connection for traps", default=False)
Daniel Willmann203d8652011-04-29 18:40:29 +020089
Max3ed214c2016-07-29 18:19:25 +020090 (options, args) = parser.parse_args()
Daniel Willmann203d8652011-04-29 18:40:29 +020091
Max3ed214c2016-07-29 18:19:25 +020092 verbose = options.verbose
Daniel Willmann203d8652011-04-29 18:40:29 +020093
Max3ed214c2016-07-29 18:19:25 +020094 if options.cmd_set and options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +010095 parser.error("Get and set options are mutually exclusive!")
Daniel Willmann203d8652011-04-29 18:40:29 +020096
Max3ed214c2016-07-29 18:19:25 +020097 if not (options.cmd_get or options.cmd_set or options.monitor):
Max82caa3e2016-11-17 17:24:53 +010098 parser.error("One of -m, -g, or -s must be set")
Daniel Willmann203d8652011-04-29 18:40:29 +020099
Max3ed214c2016-07-29 18:19:25 +0200100 if not (options.host):
Max82caa3e2016-11-17 17:24:53 +0100101 parser.error("Destination host and port required!")
Daniel Willmann203d8652011-04-29 18:40:29 +0200102
Max3ed214c2016-07-29 18:19:25 +0200103 sock = connect(options.host, options.port)
Daniel Willmann203d8652011-04-29 18:40:29 +0200104
Max3ed214c2016-07-29 18:19:25 +0200105 if options.cmd_set:
Max82caa3e2016-11-17 17:24:53 +0100106 if len(args) < 2:
107 parser.error("Set requires var and value arguments")
Max2a63d012016-08-01 14:26:19 +0200108 do_set(args[0], ' '.join(args[1:]), options.op_id, sock)
Daniel Willmann203d8652011-04-29 18:40:29 +0200109
Max3ed214c2016-07-29 18:19:25 +0200110 if options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +0100111 if len(args) != 1:
112 parser.error("Get requires the var argument")
Max2a63d012016-08-01 14:26:19 +0200113 do_get(args[0], options.op_id, sock)
Daniel Willmann203d8652011-04-29 18:40:29 +0200114
Max3ed214c2016-07-29 18:19:25 +0200115 data = sock.recv(1024)
116 while (len(data)>0):
117 (answer, data) = remove_ipa_ctrl_header(data)
118 print "Got message:", answer
Daniel Willmann203d8652011-04-29 18:40:29 +0200119
Max3ed214c2016-07-29 18:19:25 +0200120 if options.monitor:
Max82caa3e2016-11-17 17:24:53 +0100121 while True:
122 data = sock.recv(1024)
123 if len(data) == 0:
124 print "Connection is gone."
125 break
Daniel Willmann7c3298a2011-07-28 19:04:57 +0200126
Max82caa3e2016-11-17 17:24:53 +0100127 while len(data) > 0:
128 (answer, data) = remove_ipa_ctrl_header(data)
129 print "Got message:", answer
Daniel Willmann203d8652011-04-29 18:40:29 +0200130
Max3ed214c2016-07-29 18:19:25 +0200131 sock.close()