show network status inside tcptest.py in server mode
[tests.git] / system / tcptest.py
1 #!/usr/bin/env python
2
3 # Thierry Parmentelat <thierry.parmentelat@inria.fr>
4 # Copyright (C) 2010 INRIA 
5 #
6 import sys
7 import time
8 from optparse import OptionParser    
9 import socket
10 import SocketServer
11
12 def myprint(message):
13     now=time.strftime("%H:%M:%S", time.localtime())
14     print "*",now,'--',message
15
16 def show_network_status():
17     print "ip address show"
18     subprocess.call(['ip','address','show'])
19     print "ip route show"
20     subprocess.call(['ip','route','show'])
21
22 class EchoRequestHandler(SocketServer.StreamRequestHandler):
23     def handle(self):
24         line = self.rfile.readline()
25         self.wfile.write(line)
26
27 class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
28     def handle(self):
29         line = self.rfile.readline()
30         self.wfile.write(line.upper())
31
32 class Server:
33
34     def main(self):
35         import threading
36
37         parser=OptionParser()
38         parser.add_option("-p","--port", action="store", dest="port", type="int",
39                           default=10000, help="port number")
40         parser.add_option("-a","--address", action="store", dest="address", 
41                           default=socket.gethostname(), help="address")
42         parser.add_option("-t","--timeout", action="store", dest="timeout", type="int",
43                           default="0")
44         
45         (options, args) = parser.parse_args()
46         if len(args) != 0:
47             parser.print_help()
48             sys.exit(1)
49
50         show_network_status()
51
52         server = SocketServer.TCPServer((options.address, options.port),
53                                         UppercaseRequestHandler)
54
55         try:
56             if options.timeout:
57                 t = threading.Thread(target=server.serve_forever)
58                 t.setDaemon(True) # don't hang on exit
59                 t.start()
60                 time.sleep(options.timeout)
61                 sys.exit(0)
62             else:
63                 server.serve_forever()        
64         except KeyboardInterrupt as e:
65             print 'Bailing out on keyboard interrupt'
66             sys.exit(1)
67             
68 class Client:
69     def main(self):
70         from optparse import OptionParser    
71
72         parser=OptionParser()
73         parser.add_option("-p","--port", action="store", dest="port", type="int",
74                           default=10000, help="port number")
75         parser.add_option("-a","--address", action="store", dest="address", 
76                           default=socket.gethostname(), help="address")
77         parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
78                           default=1, help="sleep seconds")
79         parser.add_option("-l","--loops", action="store", dest="loops", type="int",
80                           default=1, help="iteration loops")
81         
82         (options, args) = parser.parse_args()
83         if len(args) != 0:
84             parser.print_help()
85             sys.exit(1)
86
87         result=True
88         for i in range(1,options.loops+1):
89             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
90             s.connect((options.address , options.port))
91             mout=i*'ping ' + '\n'
92             min=mout.upper()
93             if s.send(mout) != len(mout):
94                 myprint("cannot send %s"%mout.strip())
95                 result=False
96                 break
97             line=s.recv(len(min))
98             if line is not line:
99                 myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
100                 result=False
101             else:
102                 myprint("OK:%s"%mout.strip())
103             # leave the connection open, but the last one (so 1 iter returns fast)
104             if i != options.loops:
105                 time.sleep(options.sleep)
106             myprint("disconnecting")
107             s.close()
108         myprint("Done")
109         exit_return=0
110         if not result: exit_return=1
111         sys.exit(exit_return)
112
113 if __name__ == '__main__':
114     for argv in sys.argv[1:]:
115         if argv.find("client") >= 0:
116             sys.argv.remove(argv)
117             Client().main()
118         elif argv.find("server") >= 0:
119             sys.argv.remove(argv)
120             Server().main()
121     print 'you must specify either --client or --server'
122     sys.exit(1)