post_reboot_device.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import getopt
  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:], 'v:e:m:r:p:',
  12. ['version=', 'env=', 'platform-version=',
  13. 'platform='])
  14. except getopt.GetoptError as e:
  15. print(str(e))
  16. sys.exit()
  17. upgrade_version = ''
  18. system_env = 'testing'
  19. platform_version = ''
  20. platform = ''
  21. for name, value in options:
  22. if name in ('-v', '--version'):
  23. upgrade_version = value
  24. if name in ('-e', '--env'):
  25. system_env = value
  26. if name in ('-r', '--platform-version'):
  27. platform_version = value
  28. if name in ('-p', '--platform'):
  29. platform = value
  30. upgrade_soft_ver = 'v{version}'.format(version = upgrade_version)
  31. if platform == 'ASR1802':
  32. upgrade_core_ver = 'Luat_V{platform_version}_{platform}_720D'.format(
  33. platform_version = '{0:0>4}'.format(platform_version),
  34. platform = platform)
  35. else:
  36. upgrade_core_ver = 'Luat_V{platform_version}_{platform}_SSL'.format(
  37. platform_version = '{0:0>4}'.format(platform_version),
  38. platform = platform)
  39. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = system_env))
  40. from script.base import init_env
  41. init_env(interactive = False)
  42. from script.device_upgrade import DeviceUpgradeLog
  43. from apps.web.core.networking import MessageSender
  44. from apps.web.device.models import Device, DeviceDict
  45. update_key = DeviceUpgradeLog.make_update_key(upgrade_core_ver, upgrade_soft_ver)
  46. def get_device():
  47. return [item for item in
  48. DeviceUpgradeLog.objects(updateKey = update_key, status__ne = DeviceUpgradeLog.Status.INIT,
  49. reboot = False).all()]
  50. def reboot_device(item):
  51. devNo = item.devNo
  52. dev = Device.get_dev(devNo) # type: DeviceDict
  53. if not dev:
  54. print("dev {} is not exists.".format(devNo))
  55. item.reboot = True
  56. item.remark = 'noDev'
  57. item.save()
  58. return False, True, item
  59. if not dev.online:
  60. return False, False, item
  61. if item.afterSoftVer <= dev['softVer']:
  62. item.reboot = True
  63. item.status = DeviceUpgradeLog.Status.SUCCESS
  64. item.save()
  65. return True, True, item
  66. server = dev.get("server", '120.27.251.159:1883')
  67. ip1, port = server.split(":")
  68. print server
  69. result = MessageSender.send(dev, 202, {
  70. "IMEI": devNo,
  71. "addr_set": {
  72. "ip1": ip1,
  73. "port": port
  74. }
  75. }, timeout = 30)
  76. if result.get("rst") != 0:
  77. return False, False, item
  78. else:
  79. return True, False, item
  80. def main():
  81. # 获取所有的需要重启的设备
  82. items = get_device()
  83. with ThreadPoolExecutor(max_workers = 20) as executor:
  84. toDo = list()
  85. for item in items:
  86. future = executor.submit(reboot_device, item)
  87. toDo.append(future)
  88. for f in as_completed(toDo):
  89. success, has_done, item = f.result()
  90. print 'dev = {}, success = {}, has_done = {}'.format(item.devNo, success, has_done)
  91. if success and not has_done:
  92. item.reboot = True
  93. item.save()
  94. print "ok, all tasks has been done!!!"
  95. if __name__ == '__main__':
  96. main()