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 myprint("==================== tcptest.py server", id='server')
54 show_network_status(id='server')
55 server = SocketServer.TCPServer((options.address, options.port),
56 UppercaseRequestHandler)
59 t = threading.Thread(target=server.serve_forever)
60 t.setDaemon(True) # don't hang on exit
62 time.sleep(options.timeout)
65 server.serve_forever()
66 except KeyboardInterrupt as e:
67 print 'Bailing out on keyboard interrupt'
72 A utility that does exit(0) iff network as perceived
73 from the sliver is ready. Designed to be run before Server,
74 so one can wait for the right conditions.
77 parser = OptionParser()
78 # by default use another port so we don't run into
79 # the SO_LINGER kind of trouble
80 parser.add_option("-p", "--port", action="store", dest="port", type="int",
81 default=9999, help="port number")
82 parser.add_option("-a", "--address", action="store", dest="address",
83 default=socket.gethostname(), help="address")
84 (options, args) = parser.parse_args()
86 myprint("==================== tcptest.py ready", id='ready')
88 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
90 s.bind((options.address, options.port))
92 except Exception as e:
97 command = "ip address show eth0 | grep -q ' inet '"
98 return subprocess.check_call(command, shell=True) == 0
100 sys.exit(0 if can_bind() and eth0_has_ipv4() else 1)
104 Runs a client against a Server instance
107 parser = OptionParser()
108 parser.add_option("-p","--port", action="store", dest="port", type="int",
109 default=10000, help="port number")
110 parser.add_option("-a","--address", action="store", dest="address",
111 default=socket.gethostname(), help="address")
112 parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
113 default=1, help="sleep seconds")
114 parser.add_option("-l","--loops", action="store", dest="loops", type="int",
115 default=1, help="iteration loops")
117 (options, args) = parser.parse_args()
122 myprint("==================== tcptest.py client", id='client')
124 for i in range(1,options.loops+1):
125 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
126 s.connect((options.address, options.port))
127 mout=i*'ping ' + '\n'
129 if s.send(mout) != len(mout):
130 myprint("cannot send %s"%mout.strip())
133 line=s.recv(len(min))
135 myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
138 myprint("OK:%s"%mout.strip())
139 # leave the connection open, but the last one (so 1 iter returns fast)
140 if i != options.loops:
141 time.sleep(options.sleep)
142 myprint("disconnecting")
148 sys.exit(exit_return)
150 if __name__ == '__main__':
151 for arg in sys.argv[1:]:
152 if arg.find("client") >= 0:
155 elif arg.find("server") >= 0:
158 elif arg.find("ready") >= 0:
161 print 'you must specify either --client or --server'