kick_off.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import os
  4. import sys
  5. from concurrent.futures import ThreadPoolExecutor, Future
  6. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  7. sys.path.insert(0, PROJECT_ROOT)
  8. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.production')
  9. from script.base import init_env
  10. init_env(False)
  11. from django.conf import settings
  12. from apps.web.device.models import Device, DeviceDict
  13. from apps.web.device.define import DeviceChannelType
  14. from apps.web.core.mqtt_client import MqttClient
  15. from apps.web.core.sysparas import SysParas
  16. def is_online(devNo):
  17. return bool(Device.get_dev(devNo).online)
  18. def done_callback(f): # type:(Future) -> None
  19. debug, devNo, check_port = f.result()
  20. if debug:
  21. print('{} debug.'.format(devNo))
  22. else:
  23. with open("e:\\temp\\change_ip\\done_kick_off_{}.txt".format(check_port), "a") as f:
  24. f.write("{}\n".format(devNo))
  25. def operate_kick_off(devNo, port):
  26. try:
  27. mqttc = MqttClient(client_id = devNo)
  28. mqttc.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD)
  29. mqttc.connect(SysParas.get_private_ip(settings.MQTT_HOSTNAME), port, 60)
  30. finally:
  31. mqttc.disconnect()
  32. mqttc.close()
  33. def kick_off(devNo, debug, check_port):
  34. if debug:
  35. return debug, devNo, check_port
  36. else:
  37. device = Device.get_dev(devNo) # type: DeviceDict
  38. if device.channelType == DeviceChannelType.Channel_BT:
  39. return debug, devNo, check_port
  40. if len(devNo) < 15:
  41. return debug, devNo, check_port
  42. serverIp, curr_port = device.server.split(":")
  43. if serverIp != settings.MQTT_HOSTNAME:
  44. return debug, devNo, check_port
  45. if not device.online:
  46. operate_kick_off(devNo, check_port)
  47. return debug, device.devNo, check_port
  48. elif int(curr_port) == check_port:
  49. print('{} is in {}.'.format(device.devNo, check_port))
  50. return debug, devNo, check_port
  51. else:
  52. operate_kick_off(devNo, check_port)
  53. return debug, device.devNo, check_port
  54. def run(debug, devices, check_port):
  55. with ThreadPoolExecutor(max_workers = 20) as executor:
  56. for _dev in devices: # type: Device
  57. if not is_online(_dev.devNo):
  58. continue
  59. if 'DUMMY' in _dev.devNo:
  60. continue
  61. if 'LuaRTOS' in _dev.coreVer:
  62. print('{} is lua os'.format(_dev.devNo))
  63. continue
  64. executor.submit(kick_off, _dev.devNo, debug, check_port).add_done_callback(
  65. done_callback)
  66. if __name__ == '__main__':
  67. __list = []
  68. __done_list = []
  69. check_port = 1884
  70. try:
  71. with open("e:\\temp\\change_ip\\done_kick_off_{}.txt".format(check_port), "r") as f:
  72. lines = f.readlines()
  73. for line in lines:
  74. line = line.strip()
  75. __done_list.append(line)
  76. except Exception as e:
  77. pass
  78. try:
  79. with open("e:\\temp\\change_ip\\do_kick_off_{}.txt".format(check_port), "r") as f:
  80. lines = f.readlines()
  81. for line in lines:
  82. line = line.strip()
  83. if line not in __done_list:
  84. __list.append(line)
  85. except Exception as e:
  86. pass
  87. filter = {
  88. 'devNo': {'$in': __list}
  89. }
  90. devices = [dev for dev in Device.objects(__raw__ = filter)]
  91. run(debug = False, devices = devices, check_port = check_port)