123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import getopt
- import os
- import sys
- PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
- sys.path.insert(0, PROJECT_ROOT)
- try:
- options, args = getopt.getopt(sys.argv[1:], 'v:s:e:m:r:p:b:d:a:h:',
- ['version=', 'server=', 'env=', 'platform-version=',
- 'platform=', 'dealer=', 'agent=', 'hwVer='])
- except getopt.GetoptError as e:
- print(str(e))
- sys.exit()
- upgrade_version = ''
- system_env = 'testing'
- platform_version = ''
- platform = ''
- server = ''
- dealer = None
- agent = None
- hwVer = None
- def get_fw_url_tmpl(server, platform, platform_version, hwVer):
- if platform == '8955':
- if hwVer:
- fw_url_tmpl = 'http://{server}/uploaded/version/2g/SmartBox_{version}_Luat_V{platform_version}_{platform}_SSL_{hwVer}'.format(
- server = server,
- version = upgrade_version,
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform,
- hwVer = hwVer)
- else:
- fw_url_tmpl = 'http://{server}/uploaded/version/2g/SmartBox_{version}_Luat_V{platform_version}_{platform}_SSL'.format(
- server = server,
- version = upgrade_version,
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform)
- elif platform == 'ASR1802':
- if hwVer:
- fw_url_tmpl = 'http://{server}/uploaded/version/4g/SmartBox4G_{version}_Luat_V{platform_version}_{platform}_720D_{hwVer}'.format(
- server = server,
- version = upgrade_version,
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform,
- hwVer = hwVer)
- else:
- fw_url_tmpl = 'http://{server}/uploaded/version/4g/SmartBox4G_{version}_Luat_V{platform_version}_{platform}_720D'.format(
- server = server,
- version = upgrade_version,
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform)
- else:
- assert False, 'incorrect platform type.'
- fw_url_tmpl = fw_url_tmpl + '_{driver_code}'
- if platform == 'ASR1802':
- fw_url_tmpl = fw_url_tmpl + '_{full}'
- fw_url_tmpl = fw_url_tmpl + '.bin'
- return fw_url_tmpl
- for name, value in options:
- if name in ('-v', '--version'):
- upgrade_version = value
- if name in ('-e', '--env'):
- system_env = value
- if name in ('-r', '--platform-version'):
- platform_version = value
- if name in ('-p', '--platform'):
- platform = value
- if name in ('-s', '--server'):
- server = value
- if name in ('-d', '--dealer'):
- dealer = value
- if name in ('-a', '--agent'):
- agent = value
- if name in ('-h', '--hwVer'):
- hwVer = value
- if not server:
- print 'server is null.'
- sys.exit(2)
- if not platform_version or not platform:
- print 'not assign platform info.'
- sys.exit(2)
- if platform not in ('8955', 'ASR1802'):
- print 'incorrect platform type.'
- sys.exit(2)
- if not upgrade_version:
- print 'error version = {version}'.format(version = upgrade_version)
- sys.exit(2)
- master, major, minor = upgrade_version.split('.')
- if not master or not major or not minor:
- print 'error version = {version}'.format(version = upgrade_version)
- sys.exit(2)
- if not system_env:
- print 'error system env = {env}'.format(env = system_env)
- sys.exit(2)
- import os
- 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.device.models import Device, DeviceDict
- from apps.web.constant import DeviceOnlineStatus
- from apps.web.dealer.models import Dealer
- version_regex = 'v{master}\.{major}\.'.format(master = master, major = major)
- version_check = 'v{master}.{major}.'.format(master = master, major = major)
- upgrade_soft_ver = 'v{version}'.format(version = upgrade_version)
- if platform == 'ASR1802':
- upgrade_core_ver = 'Luat_V{platform_version}_{platform}_720D'.format(
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform)
- else:
- upgrade_core_ver = 'Luat_V{platform_version}_{platform}_SSL'.format(
- platform_version = '{0:0>4}'.format(platform_version),
- platform = platform)
- fw_url_tmpl = get_fw_url_tmpl(server, platform, platform_version, hwVer)
- update_key = DeviceUpgradeLog.make_update_key(upgrade_core_ver, upgrade_soft_ver)
- print 'version regex is: {}'.format(version_regex)
- print 'version check is: {}'.format(version_check)
- print 'upgrade soft version is: {}'.format(upgrade_soft_ver)
- print 'fw url tmpl is: {}'.format(fw_url_tmpl)
- print 'update key is: {}'.format(update_key)
- exists_code = set()
- no_exists_code = set()
- try:
- if dealer:
- dealers = [dealer]
- elif agent:
- dealers = [dealer['_id'] for dealer in Dealer.get_collection().find({'agentId': agent})]
- else:
- dealers = None
- common_filter = {}
- if hwVer:
- if hwVer == 'v3':
- filter = {
- '$and': [
- {
- '$or': [{'hwVer': hwVer},
- {'softVer': {'$regex': 'v4\.0\.'}},
- {'softVer': {'$regex': 'v3\.0\.'}},
- {'softVer': {'$regex': 'v5\.15\.'}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- else:
- raise Exception('暂时不支持')
- else:
- if version_check == 'v1.8.':
- filter = {
- '$and': [
- {
- '$or': [
- {'softVer': 'v1.5'},
- {'softVer': 'v1.7'},
- {'softVer': {'$regex': 'v1\.5\.'}},
- {'softVer': {'$regex': 'v1\.7.'}},
- {'softVer': {'$regex': version_regex}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- elif version_check == 'v5.15.':
- filter = {
- '$and': [
- {
- '$or': [{'softVer': {'$regex': 'v4\.0\.'}},
- {'softVer': {'$regex': 'v3\.0\.'}},
- {'softVer': {'$regex': version_regex}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- elif version_check == 'v5.13.':
- filter = {
- '$and': [
- {
- '$or': [{'softVer': {'$regex': 'v3\.1\.'}},
- {'softVer': {'$regex': 'v4\.1\.'}},
- {'softVer': {'$regex': version_regex}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- elif version_check == 'v5.1.':
- filter = {
- '$and': [
- {
- '$or': [{'softVer': {'$regex': 'v40\.1\.'}}, {'softVer': {'$regex': version_regex}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- elif version_check == 'v5.12.':
- filter = {
- '$and': [
- {
- '$or': [{'softVer': {'$regex': 'v4\.12\.'}}, {'softVer': {'$regex': version_regex}}]
- },
- {
- 'softVer': {'$ne': upgrade_soft_ver}
- }
- ]
- }
- filter.update(common_filter)
- else:
- filter = {
- '$and': [{'softVer': {'$regex': version_regex}}, {'softVer': {'$nin': [upgrade_soft_ver, 'v5.100.10']}}]
- }
- filter.update(common_filter)
- if dealers:
- filter.update({
- 'ownerId': {'$in': dealers}
- })
- exists_dev_list = [item.devNo for item in DeviceUpgradeLog.objects(updateKey = update_key)]
- if exists_dev_list:
- filter.update({
- 'devNo': {'$nin': exists_dev_list}
- })
- devNoList = []
- objs = Device.get_collection().find(filter)
- for obj in objs:
- if ':1883' not in obj['server']:
- continue
- now_soft_ver = str(obj['softVer'])
- dev_no = str(obj['devNo'])
- need_upgrade = True
- try:
- common_flag = (now_soft_ver.startswith(version_check) and now_soft_ver != upgrade_soft_ver)
- if hwVer:
- common_flag = common_flag or (obj['hwVer'] == hwVer)
- if hwVer == 'v3':
- if now_soft_ver.startswith('v4.0.') or \
- now_soft_ver.startswith('v3.0.') or \
- now_soft_ver.startswith("v5.15.") or \
- common_flag:
- devNoList.append(dev_no)
- continue
- else:
- raise Exception('unsupport hw version.')
- else:
- if version_check == 'v1.8.':
- if now_soft_ver.startswith('v1.7.') or now_soft_ver.startswith(
- 'v1.5.') or now_soft_ver == 'v1.7' or now_soft_ver == 'v1.5' or common_flag:
- devNoList.append(dev_no)
- continue
- elif version_check == 'v5.15.':
- if now_soft_ver.startswith('v4.0.') or now_soft_ver.startswith('v3.0.') or common_flag:
- devNoList.append(dev_no)
- continue
- elif version_check == 'v5.1.':
- if now_soft_ver.startswith('v40.1.') or common_flag:
- devNoList.append(dev_no)
- continue
- elif version_check == 'v5.12.':
- if now_soft_ver.startswith('v4.12.') or common_flag:
- devNoList.append(dev_no)
- continue
- elif version_check == 'v5.13.':
- if now_soft_ver.startswith('v3.1.') or now_soft_ver.startswith('v4.1.') or common_flag:
- devNoList.append(dev_no)
- continue
- else:
- if common_flag:
- devNoList.append(dev_no)
- continue
- need_upgrade = False
- finally:
- if not need_upgrade:
- print 'dev<devNo={},rCode={},code={}> version is: {}. no need to upgrade'.format(dev_no,
- obj.get('devType',
- {}).get(
- 'code', ''),
- obj.get(
- 'driverCode',
- ''),
- now_soft_ver)
- else:
- print 'dev<devNo={},rCode={},code={}> version is: {}. need to upgrade.'.format(dev_no,
- obj.get('devType',
- {}).get(
- 'code', None),
- obj.get('driverCode',
- ''),
- now_soft_ver)
- for devNo in devNoList:
- try:
- dev = Device.get_dev(devNo) # type: DeviceDict
- if upgrade_soft_ver == dev.softVer:
- print('{} is newest version'.format(dev.softVer))
- continue
- if version_check != 'v5.100.' and dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE:
- print '{} is offline.'.format(devNo)
- continue
- if version_check in ['v1.8.', 'v5.15.']:
- driver_code = '000000'
- else:
- devType = dev.devType
- devTypeCode = devType.get('code', None)
- print devTypeCode
- if devTypeCode and devTypeCode < '100100':
- driver_code = '100000'
- else:
- if 'driverCode' in dev and dev['driverCode']:
- driver_code = dev['driverCode']
- if driver_code == '100205':
- driver_code = '100210'
- else:
- print('{} has no driver code.'.format(devNo))
- driver_code = '100000'
- if platform == 'ASR1802':
- if upgrade_core_ver == dev['coreVer']:
- version_path = fw_url_tmpl.format(driver_code = driver_code, full = 'inc')
- else:
- version_path = fw_url_tmpl.format(driver_code = driver_code, full = 'full')
- else:
- version_path = fw_url_tmpl.format(driver_code = driver_code)
- print 'version path is: {}'.format(version_path)
- cmdPara = {'cmd': 202, 'IMEI': devNo, 'ota_set': {'fw_url': version_path}}
- print cmdPara
- try:
- log = DeviceUpgradeLog.new_log(dev = dev,
- coreVer = upgrade_core_ver,
- softVer = upgrade_soft_ver,
- driverCode = driver_code,
- updatePara = cmdPara)
- except Exception, e:
- print str(e)
- continue
- except Exception, e:
- print 'some exception =%s' % e
- finally:
- print('finished')
|