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", id='server')
69 show_network_status(id='server')
70 server = socketserver.TCPServer((args.address, args.port),
71 UppercaseRequestHandler)
74 t = threading.Thread(target=server.serve_forever)
75 t.setDaemon(True) # don't hang on exit
77 time.sleep(args.timeout)
80 server.serve_forever()
81 except KeyboardInterrupt:
82 print('Bailing out on keyboard interrupt')
88 A utility that does exit(0) iff network as perceived
89 from the sliver is ready. Designed to be run before Server,
90 so one can wait for the right conditions.
93 parser = ArgumentParser()
94 # by default use another port so we don't run into
95 # the SO_LINGER kind of trouble
96 parser.add_argument("-p", "--port", action="store", dest="port",
97 type=int, default=9999, help="port number")
98 parser.add_argument("-a", "--address", action="store", dest="address",
99 default=socket.gethostname(), help="address")
100 args = parser.parse_args()
102 myprint("==================== tcptest.py ready", id='ready')
105 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
107 s.bind((args.address, args.port))
109 except Exception as e:
114 command = "ip address show eth0 | grep -q ' inet '"
115 return subprocess.check_call(command, shell=True) == 0
117 sys.exit(0 if can_bind() and eth0_has_ipv4() else 1)
122 Runs a client against a Server instance
125 parser = ArgumentParser()
126 parser.add_argument("-p", "--port", action="store", dest="port",
127 type=int, default=10000, help="port number")
128 parser.add_argument("-a", "--address", action="store", dest="address",
129 default=socket.gethostname(), help="address")
130 parser.add_argument("-s", "--sleep", action="store", dest="sleep",
131 type=int, default=1, help="sleep seconds")
132 parser.add_argument("-l", "--loops", action="store", dest="loops",
133 type=int, default=1, help="iteration loops")
135 args = parser.parse_args()
140 myprint("==================== tcptest.py client", id='client')
142 for i in range(1, args.loops+1):
143 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
144 s.connect((args.address, args.port))
145 mout = i*b'ping_out ' + b'\n'
146 min = i*b'PING_in ' + b'\n'
147 if s.send(mout) != len(mout):
148 myprint("cannot send {}".format(mout.strip()))
151 line = s.recv(len(min))
153 myprint("unexpected reception\ngot:{}\nexpected: {}"
157 myprint("OK:{}".format(mout.strip()))
158 # leave the connection open, but the last (so 1 iter returns fast)
160 time.sleep(args.sleep)
161 myprint("disconnecting")
167 sys.exit(exit_return)
170 if __name__ == '__main__':
171 for arg in sys.argv[1:]:
172 if arg.find("client") >= 0:
175 elif arg.find("server") >= 0:
178 elif arg.find("ready") >= 0:
181 print('you must specify either --client or --server')