discovery.py 4.8 KB

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