3 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
4 # Copyright (C) 2010 INRIA
12 from optparse import OptionParser
14 def myprint(message, id='client'):
15 now=time.strftime("%H:%M:%S", time.localtime())
16 print "*",now,'(%s)' % id, '--',message
19 def show_network_status(id):
20 myprint("ip address show", id=id)
21 subprocess.call(['ip', 'address', 'show'])
22 myprint("ip route show", id=id)
23 subprocess.call(['ip', 'route', 'show'])
25 class EchoRequestHandler(SocketServer.StreamRequestHandler):
27 line = self.rfile.readline()
28 self.wfile.write(line)
30 class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
32 line = self.rfile.readline()
33 self.wfile.write(line.upper())
37 A TCP server, running for some finite amount of time
40 parser = OptionParser()
41 parser.add_option("-p", "--port", action="store", dest="port", type="int",
42 default=10000, help="port number")
43 parser.add_option("-a", "--address", action="store", dest="address",
44 default=socket.gethostname(), help="address")
45 parser.add_option("-t", "--timeout", action="store", dest="timeout", type="int",
47 (options, args) = parser.parse_args()
53 show_network_status(id='server')
54 server = SocketServer.TCPServer((options.address, options.port),
55 UppercaseRequestHandler)
58 t = threading.Thread(target=server.serve_forever)
59 t.setDaemon(True) # don't hang on exit
61 time.sleep(options.timeout)
64 server.serve_forever()
65 except KeyboardInterrupt as e:
66 print 'Bailing out on keyboard interrupt'
71 A utility that does exit(0) iff network as perceived
72 from the sliver is ready. Designed to be run before Server,
73 so one can wait for the right conditions.
76 parser = OptionParser()
77 # by default use another port so we don't run into
78 # the SO_LINGER kind of trouble
79 parser.add_option("-p", "--port", action="store", dest="port", type="int",
80 default=9999, help="port number")
81 parser.add_option("-a", "--address", action="store", dest="address",
82 default=socket.gethostname(), help="address")
83 (options, args) = parser.parse_args()
85 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
87 s.bind((options.address, options.port))
89 except Exception as e:
95 Runs a client against a Server instance
98 parser = OptionParser()
99 parser.add_option("-p","--port", action="store", dest="port", type="int",
100 default=10000, help="port number")
101 parser.add_option("-a","--address", action="store", dest="address",
102 default=socket.gethostname(), help="address")
103 parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
104 default=1, help="sleep seconds")
105 parser.add_option("-l","--loops", action="store", dest="loops", type="int",
106 default=1, help="iteration loops")
108 (options, args) = parser.parse_args()
114 for i in range(1,options.loops+1):
115 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
116 s.connect((options.address, options.port))
117 mout=i*'ping ' + '\n'
119 if s.send(mout) != len(mout):
120 myprint("cannot send %s"%mout.strip())
123 line=s.recv(len(min))
125 myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
128 myprint("OK:%s"%mout.strip())
129 # leave the connection open, but the last one (so 1 iter returns fast)
130 if i != options.loops:
131 time.sleep(options.sleep)
132 myprint("disconnecting")
138 sys.exit(exit_return)
140 if __name__ == '__main__':
141 for arg in sys.argv[1:]:
142 if arg.find("client") >= 0:
145 elif arg.find("server") >= 0:
148 elif arg.find("ready") >= 0:
151 print 'you must specify either --client or --server'