blob: 3a7964de62277df5913772fd280aa6a37141f878 [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
Daniel Willmann203d8652011-04-29 18:40:29 +02004from optparse import OptionParser
Maxbd33f542016-11-17 17:29:45 +01005from ipa import Ctrl
Daniel Willmann203d8652011-04-29 18:40:29 +02006import socket
Daniel Willmann203d8652011-04-29 18:40:29 +02007
8verbose = False
9
Daniel Willmann203d8652011-04-29 18:40:29 +020010def connect(host, port):
Max82caa3e2016-11-17 17:24:53 +010011 if verbose:
12 print "Connecting to host %s:%i" % (host, port)
Daniel Willmann203d8652011-04-29 18:40:29 +020013
Max82caa3e2016-11-17 17:24:53 +010014 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15 sck.setblocking(1)
16 sck.connect((host, port))
17 return sck
Daniel Willmann203d8652011-04-29 18:40:29 +020018
Maxdbb63922016-08-01 18:54:17 +020019def do_set_get(sck, var, value = None):
Maxbd33f542016-11-17 17:29:45 +010020 (r, c) = Ctrl().cmd(var, value)
21 sck.send(c)
22 answer = Ctrl().rem_header(sck.recv(4096))
23 return (answer,) + Ctrl().verify(answer, r, var, value)
Maxdbb63922016-08-01 18:54:17 +020024
25def set_var(sck, var, val):
Maxbd33f542016-11-17 17:29:45 +010026 (a, _, _) = do_set_get(sck, var, val)
27 return a
Maxdbb63922016-08-01 18:54:17 +020028
29def get_var(sck, var):
Maxbd33f542016-11-17 17:29:45 +010030 (_, _, v) = do_set_get(sck, var)
31 return v
32
Max47e17812017-01-11 15:10:16 +010033def _leftovers(sck, fl):
34 """
35 Read outstanding data if any according to flags
36 """
37 try:
38 data = sck.recv(1024, fl)
39 except socket.error as (s_errno, strerror):
40 return False
Maxbd33f542016-11-17 17:29:45 +010041 if len(data) != 0:
42 tail = data
43 while True:
44 (head, tail) = Ctrl().split_combined(tail)
45 print "Got message:", Ctrl().rem_header(head)
46 if len(tail) == 0:
47 break
48 return True
49 return False
Maxdbb63922016-08-01 18:54:17 +020050
Max3ed214c2016-07-29 18:19:25 +020051if __name__ == '__main__':
52 parser = OptionParser("Usage: %prog [options] var [value]")
53 parser.add_option("-d", "--host", dest="host",
54 help="connect to HOST", metavar="HOST")
55 parser.add_option("-p", "--port", dest="port", type="int",
56 help="use PORT", metavar="PORT", default=4249)
57 parser.add_option("-g", "--get", action="store_true",
58 dest="cmd_get", help="perform GET operation")
59 parser.add_option("-s", "--set", action="store_true",
60 dest="cmd_set", help="perform SET operation")
Max3ed214c2016-07-29 18:19:25 +020061 parser.add_option("-v", "--verbose", action="store_true",
62 dest="verbose", help="be verbose", default=False)
63 parser.add_option("-m", "--monitor", action="store_true",
64 dest="monitor", help="monitor the connection for traps", default=False)
Daniel Willmann203d8652011-04-29 18:40:29 +020065
Max3ed214c2016-07-29 18:19:25 +020066 (options, args) = parser.parse_args()
Daniel Willmann203d8652011-04-29 18:40:29 +020067
Max3ed214c2016-07-29 18:19:25 +020068 verbose = options.verbose
Daniel Willmann203d8652011-04-29 18:40:29 +020069
Max3ed214c2016-07-29 18:19:25 +020070 if options.cmd_set and options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +010071 parser.error("Get and set options are mutually exclusive!")
Daniel Willmann203d8652011-04-29 18:40:29 +020072
Max3ed214c2016-07-29 18:19:25 +020073 if not (options.cmd_get or options.cmd_set or options.monitor):
Max82caa3e2016-11-17 17:24:53 +010074 parser.error("One of -m, -g, or -s must be set")
Daniel Willmann203d8652011-04-29 18:40:29 +020075
Max3ed214c2016-07-29 18:19:25 +020076 if not (options.host):
Max82caa3e2016-11-17 17:24:53 +010077 parser.error("Destination host and port required!")
Daniel Willmann203d8652011-04-29 18:40:29 +020078
Max3ed214c2016-07-29 18:19:25 +020079 sock = connect(options.host, options.port)
Daniel Willmann203d8652011-04-29 18:40:29 +020080
Max3ed214c2016-07-29 18:19:25 +020081 if options.cmd_set:
Max82caa3e2016-11-17 17:24:53 +010082 if len(args) < 2:
83 parser.error("Set requires var and value arguments")
Max47e17812017-01-11 15:10:16 +010084 _leftovers(sock, socket.MSG_DONTWAIT)
Maxbd33f542016-11-17 17:29:45 +010085 print "Got message:", set_var(sock, args[0], ' '.join(args[1:]))
Daniel Willmann203d8652011-04-29 18:40:29 +020086
Max3ed214c2016-07-29 18:19:25 +020087 if options.cmd_get:
Max82caa3e2016-11-17 17:24:53 +010088 if len(args) != 1:
89 parser.error("Get requires the var argument")
Max47e17812017-01-11 15:10:16 +010090 _leftovers(sock, socket.MSG_DONTWAIT)
Maxbd33f542016-11-17 17:29:45 +010091 (a, _, _) = do_set_get(sock, args[0])
92 print "Got message:", a
Daniel Willmann203d8652011-04-29 18:40:29 +020093
Max3ed214c2016-07-29 18:19:25 +020094 if options.monitor:
Max82caa3e2016-11-17 17:24:53 +010095 while True:
Max47e17812017-01-11 15:10:16 +010096 if not _leftovers(sock, 0):
Max82caa3e2016-11-17 17:24:53 +010097 print "Connection is gone."
98 break
Max3ed214c2016-07-29 18:19:25 +020099 sock.close()