discovery.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #!/usr/bin/python
  2. from socket import *
  3. import sys, getopt
  4. import time
  5. dhcp_f = dhcp_f = gw_f = mask_f = serial_f = 0
  6. get_settings_f = 0
  7. req_ser = 0
  8. GET_TIMEOUT = 5
  9. find_tmout = 5
  10. broadcast_port = 49049
  11. broadcast_addr = '255.255.255.255'
  12. def usage():
  13. print "Usage\r\n\
  14. --help \t\t\tprint usage info\r\n\
  15. --timeout \t\tset scan timeout, sec\r\n\
  16. --find \t\t\tdiscover devices in the network\r\n\
  17. --req=<seral> \t\trequest settings from device\r\n\
  18. --serial=<serial> \tserial number of the device to apply settings to\r\n\
  19. --dhcp=<True|False> \tset dhcp option\r\n\
  20. --ip=<addr> \t\tset ip addr\r\n\
  21. --gw=<addr> \t\tset gatewauy addr\r\n\
  22. --mask=<addr> \t\tset netmask addr\r\n\
  23. --broadcast=<addr> \tbroadcast addr to use"
  24. def exit(found):
  25. if (found == 0):
  26. print "Not found"
  27. else:
  28. print "Found: ", found
  29. sys.exit(0)
  30. def find(tmout):
  31. cs=socket(AF_INET, SOCK_DGRAM)
  32. cs.settimeout(tmout)
  33. cs.bind(('',broadcast_port))
  34. found = 0
  35. ser_list = []
  36. mac_list = []
  37. print '%-*s%-*s%-*s%-*s%-*s' % (20, "Model", 15, "Serial", 15, "IP-address", 20, "MAC-address", 20, "FW version")
  38. timestamp = time.time()
  39. while (time.time() - timestamp < tmout):
  40. try:
  41. m=cs.recvfrom(broadcast_port)
  42. except timeout:
  43. exit(found)
  44. message = m[0]
  45. s=message.split(";")
  46. if len(s) > 1:
  47. model = s[0]
  48. serial = s[1]
  49. ip = m[1][0]
  50. mac = s[2]
  51. fw = s[3]
  52. if serial not in ser_list:
  53. ser_list.append(serial)
  54. mac_list.append(mac)
  55. elif mac not in mac_list:
  56. mac_list.append(mac)
  57. serial += " (dub)"
  58. else:
  59. break
  60. print '%-*s%-*s%-*s%-*s%-*s' % (20, model.decode('utf-8'), 15, serial, 15, ip, 20, mac, 20, fw)
  61. found+=1
  62. exit(found)
  63. def get_settings(serial):
  64. print "\r\nBroadcast request to: ", broadcast_addr
  65. timeout = 0
  66. found = 0
  67. cs=socket(AF_INET, SOCK_DGRAM)
  68. cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  69. cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  70. cs.settimeout(GET_TIMEOUT)
  71. cs.bind(('', broadcast_port))
  72. buf = '{"serno":"' + serial + '","dhcp":"","ipaddress":"","gateway":"","mask":""}'
  73. cs.sendto(buf, (broadcast_addr, broadcast_port))
  74. while (timeout < GET_TIMEOUT):
  75. m=cs.recvfrom(broadcast_port)
  76. if m[0] == buf:
  77. continue
  78. message = m[0]
  79. message = message.replace("{", "")
  80. message = message.replace("}", "")
  81. tags = message.split(",")
  82. if not tags[0]:
  83. continue
  84. values = tags[0].split(":")
  85. if not values[0]:
  86. continue
  87. if values[0] == '"serno"':
  88. resp_serial = values.pop().replace('"', '')
  89. if resp_serial == serial:
  90. resp_dhcp = tags[1].split(":").pop().replace('"', '')
  91. resp_ip = tags[2].split(":").pop().replace('"', '')
  92. resp_gw = tags[3].split(":").pop().replace('"', '')
  93. resp_netmask = tags[4].split(":").pop().replace('"', '')
  94. print "\r\nSeral number: \t", resp_serial
  95. print "DHCP: \t\t", resp_dhcp
  96. print "IP: \t\t", resp_ip
  97. print "Geteway: \t", resp_gw
  98. print "Netmask: \t", resp_netmask
  99. print "\r\nCommand to set settings: \r\n" + sys.argv[0] \
  100. + " --serial=" + resp_serial \
  101. + " --dhcp=" + resp_dhcp \
  102. + " --ip=" + resp_ip \
  103. + " --gw=" + resp_gw \
  104. + " --mask=" + resp_netmask \
  105. + " --broadcast=255.255.255.255"
  106. found = 1
  107. break
  108. timeout = timeout + 1;
  109. if not found:
  110. print "Not found"
  111. def set_settings():
  112. print "\r\nBroadcast request to: ", broadcast_addr
  113. print "\r\nSeral number: \t", serial_set
  114. print "DHCP: \t\t", dhcp_set
  115. print "IP: \t\t", ip_set
  116. print "Geteway: \t", gw_set
  117. print "Netmask: \t", mask_set
  118. cs=socket(AF_INET, SOCK_DGRAM)
  119. cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  120. cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  121. buf = '{"serno":"' + serial_set + '","dhcp":"' + dhcp_set + '","ipaddress":"' \
  122. + ip_set + '","gateway":"' + gw_set + '","mask":"' + mask_set + '"}'
  123. cs.sendto(buf, (broadcast_addr, broadcast_port))
  124. print "\r\nCommand to request settings: \r\n" + sys.argv[0] \
  125. + " --req=" + serial_set \
  126. + " --broadcast=255.255.255.255"
  127. find_tmout = 5
  128. try:
  129. opts, args = getopt.getopt(sys.argv[1:], "hb:ft:r:s:d:i:g:m:", \
  130. ["help", "broadcast=", "find", "timeout=", "req=", "serial=", "dhcp=", "ip=", "gw=", "mask="])
  131. except getopt.GetoptError:
  132. usage()
  133. sys.exit(2)
  134. for opt, arg in opts:
  135. if opt in ("-h", "--help"):
  136. usage()
  137. sys.exit()
  138. if opt in ("-b", "--broadcast"):
  139. broadcast_addr = arg
  140. if opt in ("-t", "--timeout"):
  141. if (arg.isdigit()):
  142. find_tmout = int(arg)
  143. if opt in ("-f", "--find"):
  144. find(find_tmout)
  145. elif opt in ("-r", "--req"):
  146. get_settings_f = 1
  147. req_ser = arg
  148. elif opt in ("-s", "--serial"):
  149. serial_set = arg
  150. serial_f = 1
  151. elif opt in ("-d", "--dhcp"):
  152. dhcp_set = arg
  153. dhcp_f = 1
  154. elif opt in ("-i", "--ip"):
  155. ip_set = arg
  156. ip_f = 1
  157. elif opt in ("-g", "--gw"):
  158. gw_set = arg
  159. gw_f = 1
  160. elif opt in ("-m", "--mask"):
  161. mask_set = arg
  162. mask_f = 1
  163. if get_settings_f == 1:
  164. get_settings(req_ser)
  165. sys.exit()
  166. elif (dhcp_f and dhcp_f and gw_f and mask_f and serial_f):
  167. set_settings()
  168. sys.exit()
  169. else:
  170. print "Error: Not enough parameters"
  171. usage()
  172. sys.exit(2)