# 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, reboot = False).all()] def reboot_device(item): devNo = item.devNo dev = Device.get_dev(devNo) # type: DeviceDict if not dev: print("dev {} is not exists.".format(devNo)) item.reboot = True item.remark = 'noDev' item.save() return False, True, item if item.afterSoftVer == dev['softVer']: item.reboot = True item.status = DeviceUpgradeLog.Status.SUCCESS item.save() return True, True, item server = '120.27.251.159:1883' ip1, port = server.split(":") print server result = MessageSender.send(dev, 202, { "IMEI": devNo, "addr_set": { 'restart': True, 'reboot': True } }, timeout = 15) if result.get("rst") != 0: return False, False, item else: return True, False, item def main(): # 获取所有的需要重启的设备 items = get_device() with ThreadPoolExecutor(max_workers = 20) as executor: toDo = list() for item in items: future = executor.submit(reboot_device, 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.reboot = True item.save() print "ok, all tasks has been done!!!" if __name__ == '__main__': main()