3 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
4 # Copyright (C) 2010 INRIA
7 # this is a small and simple standalone utility
8 # designed to run in slice-space
9 # we keep this in python2 for now until python3
10 # can be taken for granted in sliceimage
12 # pylint: disable=c0111, c0103, w0622, r0903, r0201, w0703
20 from argparse import ArgumentParser
23 def myprint(message, id='client'):
24 now = time.strftime("%H:%M:%S", time.localtime())
25 print("* {now} ({id}) -- {message}"
26 .format(now=now, id=id, message=message))
30 def show_network_status(id):
31 myprint("ip address show", id=id)
32 subprocess.call(['ip', 'address', 'show'])
33 myprint("ip route show", id=id)
34 subprocess.call(['ip', 'route', 'show'])
37 class EchoRequestHandler(socketserver.StreamRequestHandler):
39 line = self.rfile.readline()
40 self.wfile.write(line)
43 class UppercaseRequestHandler(socketserver.StreamRequestHandler):
45 line = self.rfile.readline()
46 self.wfile.write(line.upper())
51 A TCP server, running for some finite amount of time
54 parser = ArgumentParser()
55 parser.add_argument("-p", "--port", type=int, default=10000,
56 action="store", dest="port",
58 parser.add_argument("-a", "--address", action="store", dest="address",
59 default=socket.gethostname(), help="address")
60 parser.add_argument("-t", "--timeout", action="store", dest="timeout",
61 type=int, default="0")
62 args = parser.parse_args()
68 myprint("==================== tcptest.py server on {}:{}"
69 .format(args.address, args.port),
71 show_network_status(id='server')
72 server = socketserver.TCPServer((args.address, args.port),
73 UppercaseRequestHandler)
76 t = threading.Thread(target=server.serve_forever)
77 t.setDaemon(True) # don't hang on exit
79 time.sleep(args.timeout)
82 server.serve_forever()
83 except KeyboardInterrupt:
84 print('Bailing out on keyboard interrupt')
90 A utility that does exit(0) iff network as perceived
91 from the sliver is ready. Designed to be run before Server,
92 so one can wait for the right conditions.
95 parser = ArgumentParser()
96 # by default use another port so we don't run into
97 # the SO_LINGER kind of trouble
98 parser.add_argument("-p", "--port", action="store", dest="port",
99 type=int, default=9999, help="port number")
100 parser.add_argument("-a", "--address", action="store", dest="address",
101 default=socket.gethostname(), help="address")
102 args = parser.parse_args()
104 myprint("==================== tcptest.py ready", id='ready')
107 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
109 s.bind((args.address, args.port))
111 except Exception as e:
116 command = "ip address show eth0 | grep -q ' inet '"
117 return subprocess.check_call(command, shell=True) == 0
119 sys.exit(0 if can_bind() and eth0_has_ipv4() else 1)
124 Runs a client against a Server instance
127 parser = ArgumentParser()
128 parser.add_argument("-p", "--port", action="store", dest="port",
129 type=int, default=10000, help="port number")
130 parser.add_argument("-a", "--address", action="store", dest="address",
131 default=socket.gethostname(), help="address")
132 parser.add_argument("-s", "--sleep", action="store", dest="sleep",
133 type=int, default=1, help="sleep seconds")
134 parser.add_argument("-l", "--loops", action="store", dest="loops",
135 type=int, default=1, help="iteration loops")
137 args = parser.parse_args()
142 myprint("==================== tcptest.py client -> {}:{}"
143 .format(args.address, args.port),
146 for i in range(1, args.loops+1):
147 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
148 s.connect((args.address, args.port))
149 mout = i*b'ping_out ' + b'\n'
150 min = i*b'PING_in ' + b'\n'
151 if s.send(mout) != len(mout):
152 myprint("cannot send {}".format(mout.strip()))
155 line = s.recv(len(min))
157 myprint("unexpected reception\ngot:{}\nexpected: {}"
161 myprint("OK:{}".format(mout.strip()))
162 # leave the connection open, but the last (so 1 iter returns fast)
164 time.sleep(args.sleep)
165 myprint("disconnecting")
171 sys.exit(exit_return)
174 if __name__ == '__main__':
175 for arg in sys.argv[1:]:
176 if arg.find("client") >= 0:
179 elif arg.find("server") >= 0:
182 elif arg.find("ready") >= 0:
185 print('you must specify either --client or --server')