# coding=utf-8 import getopt import _strptime import os, sys PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) import sys import os from concurrent.futures import ThreadPoolExecutor, as_completed try: options, args = getopt.getopt(sys.argv[1:], 'e:', ['env=']) except getopt.GetoptError as e: print(str(e)) sys.exit() system_env = 'testing' for name, value in options: if name in ('-e', '--env'): system_env = value os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = system_env)) from script.base import init_env init_env(interactive = False) from script.device_upgrade import DeviceUpgradeLog from apps.web.core.networking import MessageSender from apps.web.device.models import Device, DeviceDict def get_device(): return [item for item in DeviceUpgradeLog.objects(status__ne = DeviceUpgradeLog.Status.INIT, revertPulse = False).all()] def revert_device_pulse(item): devNo = item.devNo dev = Device.get_dev(devNo) # type: DeviceDict if not dev: print("dev {} is not exists.".format(devNo)) item.revertPulse = True item.remark = 'noDev' item.save() return False, True, item if not dev.online: return False, False, item if 'pulseWidth1' not in item.devInfo or 'pulseInterval1' not in item.devInfo or 'trapSwtich' not in item.devInfo: print("dev {} is lost.".format(devNo)) item.revertPulse = True item.save() return True, True, item if item.devInfo['pulseWidth1'] == dev['pulseWidth1'] and item.devInfo['pulseInterval1'] == dev['pulseInterval1'] and \ item.devInfo['trapSwtich'] == dev['trapSwtich']: print("dev {} is same.".format(devNo)) item.revertPulse = True item.save() return True, True, item if (item.devInfo['pulseWidth1'] == 50 or item.devInfo['pulseWidth1'] == 40) and item.devInfo[ 'pulseInterval1'] == 500 and item.devInfo['trapSwtich'] == 1: print("dev {} is default.".format(devNo)) item.revertPulse = True item.save() return True, True, item server = dev.get("server", '120.27.251.159:1883') ip1, port = server.split(":") print server result = MessageSender.send(dev, 202, { "IMEI": devNo, "pulse_set": { "pwm_wid": item.devInfo['pulseWidth1'], "pwm_inter": item.devInfo['pulseInterval1'], "pwm_idle": item.devInfo['trapSwtich'] } }, timeout = 30) MessageSender.async_send(dev, 201, { "IMEI": devNo }, timeout = 30) if result.get("rst") != 0: return False, False, item else: return True, False, item def main(): # 获取所有的需要重启的设备 items = get_device() # print items with ThreadPoolExecutor(max_workers = 20) as executor: toDo = list() for item in items: future = executor.submit(revert_device_pulse, item) toDo.append(future) for f in as_completed(toDo): success, has_done, item = f.result() print 'dev = {}, success = {}, has_done = {}'.format(item.devNo, success, has_done) if success and not has_done: item.revertPulse = True item.save() print "ok, all tasks has been done!!!" if __name__ == '__main__': main()