blob: cd2ba6dee7d9fe6385988cf59af1196b2b095c28 [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
Maxbd33f542016-11-17 17:29:45 +01004import random
Daniel Willmann203d8652011-04-29 18:40:29 +02005from optparse import OptionParser
Maxbd33f542016-11-17 17:29:45 +01006from ipa import Ctrl
Daniel Willmann203d8652011-04-29 18:40:29 +02007import socket
Daniel Willmann203d8652011-04-29 18:40:29 +02008
9verbose = False
10
Daniel Willmann203d8652011-04-29 18:40:29 +020011def connect(host, port):
Max82caa3e2016-11-17 17:24:53 +010012 if verbose:
13 print "Connecting to host %s:%i" % (host, port)
Daniel Willmann203d8652011-04-29 18:40:29 +020014
Max82caa3e2016-11-17 17:24:53 +010015 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
16 sck.setblocking(1)
17 sck.connect((host, port))
18 return sck
Daniel Willmann203d8652011-04-29 18:40:29 +020019
Maxdbb63922016-08-01 18:54:17 +020020def do_set_get(sck, var, value = None):
Maxbd33f542016-11-17 17:29:45 +010021 (r, c) = Ctrl().cmd(var, value)
22 sck.send(c)
23 answer = Ctrl().rem_header(sck.recv(4096))
24 return (answer,) + Ctrl().verify(answer, r, var, value)
Maxdbb63922016-08-01 18:54:17 +020025
26def set_var(sck, var, val):
Maxbd33f542016-11-17 17:29:45 +010027 (a, _, _) = do_set_get(sck, var, val)
28 return a
Maxdbb63922016-08-01 18:54:17 +020029
30def get_var(sck, var):
Maxbd33f542016-11-17 17:29:45 +010031 (_, _, v) = do_set_get(sck, var)
32 return v
33
34def _leftovers(sck):
35 data = sck.recv(1024)
36 if len(data) != 0:
37 tail = data
38 while True:
39 (head, tail) = Ctrl().split_combined(tail)
40 print "Got message:", Ctrl().rem_header(head)
41 if len(tail) == 0:
42 break
43 return True
44 return False
Maxdbb63922016-08-01 18:54:17 +020045
Max3ed214c2016-07-29 18:19:25 +020046if __name__ == '__main__':
Max2a63d012016-08-01 14:26:19 +020047 random.seed()
48
Max3ed214c2016-07-29 18:19:25 +020049 parser = OptionParser("Usage: %prog [options] var [value]")
50 parser.add_option("-d", "--host", dest="host",
51 help="connect to HOST", metavar="HOST")
52 parser.add_option("-p", "--port", dest="port", type="int",
53 help="use PORT", metavar="PORT", default=4249)
54 parser.add_option("-g", "--get", action="store_true",
55 dest="cmd_get", help="perform GET operation")
56 parser.add_option("-s", "--set", action="store_true",
57 dest="cmd_set", help="perform SET operation")
Max2a63d012016-08-01 14:26:19 +020058 parser.add_option("-i", "--id", dest="op_id", default=random.randint(1, sys.maxint),
Max3ed214c2016-07-29 18:19:25 +020059 help="set id manually", metavar="ID")
60 parser.add_option("-v", "--verbose", action="store_true",
61 dest="verbose", help="be verbose", default=False)
62 parser.add_option("-m", "--monitor", action="store_true",
63 dest="monitor", help="monitor the connection for traps", default=False)
Daniel Willmann203d8652011-04-29 18:40:29 +020064
Max3ed214c2016-07-29 18:19:25 +020065 (options, args) = parser.parse_args()
Daniel Willmann203d8652011-04-29 18:40:29 +020066
Max3ed214c2016-07-29 18:19:25 +020067 verbose = options.verbose
Daniel Willmann203d8652011-04-29 18:40:29 +020068
Max3ed214c2016-07-29 18:19:25 +020069 if options.cmd_set and options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +010070 parser.error("Get and set options are mutually exclusive!")
Daniel Willmann203d8652011-04-29 18:40:29 +020071
Max3ed214c2016-07-29 18:19:25 +020072 if not (options.cmd_get or options.cmd_set or options.monitor):
Max82caa3e2016-11-17 17:24:53 +010073 parser.error("One of -m, -g, or -s must be set")
Daniel Willmann203d8652011-04-29 18:40:29 +020074
Max3ed214c2016-07-29 18:19:25 +020075 if not (options.host):
Max82caa3e2016-11-17 17:24:53 +010076 parser.error("Destination host and port required!")
Daniel Willmann203d8652011-04-29 18:40:29 +020077
Max3ed214c2016-07-29 18:19:25 +020078 sock = connect(options.host, options.port)
Daniel Willmann203d8652011-04-29 18:40:29 +020079
Max3ed214c2016-07-29 18:19:25 +020080 if options.cmd_set:
Max82caa3e2016-11-17 17:24:53 +010081 if len(args) < 2:
82 parser.error("Set requires var and value arguments")
Maxbd33f542016-11-17 17:29:45 +010083 _leftovers(sock)
84 print "Got message:", set_var(sock, args[0], ' '.join(args[1:]))
Daniel Willmann203d8652011-04-29 18:40:29 +020085
Max3ed214c2016-07-29 18:19:25 +020086 if options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +010087 if len(args) != 1:
88 parser.error("Get requires the var argument")
Maxbd33f542016-11-17 17:29:45 +010089 _leftovers(sock)
90 (a, _, _) = do_set_get(sock, args[0])
91 print "Got message:", a
Daniel Willmann203d8652011-04-29 18:40:29 +020092
Max3ed214c2016-07-29 18:19:25 +020093 if options.monitor:
Max82caa3e2016-11-17 17:24:53 +010094 while True:
Maxbd33f542016-11-17 17:29:45 +010095 if not _leftovers(sock):
Max82caa3e2016-11-17 17:24:53 +010096 print "Connection is gone."
97 break
Max3ed214c2016-07-29 18:19:25 +020098 sock.close()