post_revert_pulse.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # coding=utf-8
  2. import getopt
  3. import _strptime
  4. import os, sys
  5. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  6. sys.path.insert(0, PROJECT_ROOT)
  7. import sys
  8. import os
  9. from concurrent.futures import ThreadPoolExecutor, as_completed
  10. try:
  11. options, args = getopt.getopt(sys.argv[1:], 'e:', ['env='])
  12. except getopt.GetoptError as e:
  13. print(str(e))
  14. sys.exit()
  15. system_env = 'testing'
  16. for name, value in options:
  17. if name in ('-e', '--env'):
  18. system_env = value
  19. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = system_env))
  20. from script.base import init_env
  21. init_env(interactive = False)
  22. from script.device_upgrade import DeviceUpgradeLog
  23. from apps.web.core.networking import MessageSender
  24. from apps.web.device.models import Device, DeviceDict
  25. def get_device():
  26. return [item for item in
  27. DeviceUpgradeLog.objects(status__ne = DeviceUpgradeLog.Status.INIT, revertPulse = False).all()]
  28. def revert_device_pulse(item):
  29. devNo = item.devNo
  30. dev = Device.get_dev(devNo) # type: DeviceDict
  31. if not dev:
  32. print("dev {} is not exists.".format(devNo))
  33. item.revertPulse = True
  34. item.remark = 'noDev'
  35. item.save()
  36. return False, True, item
  37. if not dev.online:
  38. return False, False, item
  39. if 'pulseWidth1' not in item.devInfo or 'pulseInterval1' not in item.devInfo or 'trapSwtich' not in item.devInfo:
  40. print("dev {} is lost.".format(devNo))
  41. item.revertPulse = True
  42. item.save()
  43. return True, True, item
  44. if item.devInfo['pulseWidth1'] == dev['pulseWidth1'] and item.devInfo['pulseInterval1'] == dev['pulseInterval1'] and \
  45. item.devInfo['trapSwtich'] == dev['trapSwtich']:
  46. print("dev {} is same.".format(devNo))
  47. item.revertPulse = True
  48. item.save()
  49. return True, True, item
  50. if (item.devInfo['pulseWidth1'] == 50 or item.devInfo['pulseWidth1'] == 40) and item.devInfo[
  51. 'pulseInterval1'] == 500 and item.devInfo['trapSwtich'] == 1:
  52. print("dev {} is default.".format(devNo))
  53. item.revertPulse = True
  54. item.save()
  55. return True, True, item
  56. server = dev.get("server", '120.27.251.159:1883')
  57. ip1, port = server.split(":")
  58. print server
  59. result = MessageSender.send(dev, 202, {
  60. "IMEI": devNo,
  61. "pulse_set": {
  62. "pwm_wid": item.devInfo['pulseWidth1'],
  63. "pwm_inter": item.devInfo['pulseInterval1'],
  64. "pwm_idle": item.devInfo['trapSwtich']
  65. }
  66. }, timeout = 30)
  67. MessageSender.async_send(dev, 201, {
  68. "IMEI": devNo
  69. }, timeout = 30)
  70. if result.get("rst") != 0:
  71. return False, False, item
  72. else:
  73. return True, False, item
  74. def main():
  75. # 获取所有的需要重启的设备
  76. items = get_device()
  77. # print items
  78. with ThreadPoolExecutor(max_workers = 20) as executor:
  79. toDo = list()
  80. for item in items:
  81. future = executor.submit(revert_device_pulse, item)
  82. toDo.append(future)
  83. for f in as_completed(toDo):
  84. success, has_done, item = f.result()
  85. print 'dev = {}, success = {}, has_done = {}'.format(item.devNo, success, has_done)
  86. if success and not has_done:
  87. item.revertPulse = True
  88. item.save()
  89. print "ok, all tasks has been done!!!"
  90. if __name__ == '__main__':
  91. main()