prepare_update_devices.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import getopt
  4. import os
  5. import sys
  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. try:
  9. options, args = getopt.getopt(sys.argv[1:], 'v:s:e:m:r:p:b:d:a:h:',
  10. ['version=', 'server=', 'env=', 'platform-version=',
  11. 'platform=', 'dealer=', 'agent=', 'hwVer='])
  12. except getopt.GetoptError as e:
  13. print(str(e))
  14. sys.exit()
  15. upgrade_version = ''
  16. system_env = 'testing'
  17. platform_version = ''
  18. platform = ''
  19. server = ''
  20. dealer = None
  21. agent = None
  22. hwVer = None
  23. def get_fw_url_tmpl(server, platform, platform_version, hwVer):
  24. if platform == '8955':
  25. if hwVer:
  26. fw_url_tmpl = 'http://{server}/uploaded/version/2g/SmartBox_{version}_Luat_V{platform_version}_{platform}_SSL_{hwVer}'.format(
  27. server = server,
  28. version = upgrade_version,
  29. platform_version = '{0:0>4}'.format(platform_version),
  30. platform = platform,
  31. hwVer = hwVer)
  32. else:
  33. fw_url_tmpl = 'http://{server}/uploaded/version/2g/SmartBox_{version}_Luat_V{platform_version}_{platform}_SSL'.format(
  34. server = server,
  35. version = upgrade_version,
  36. platform_version = '{0:0>4}'.format(platform_version),
  37. platform = platform)
  38. elif platform == 'ASR1802':
  39. if hwVer:
  40. fw_url_tmpl = 'http://{server}/uploaded/version/4g/SmartBox4G_{version}_Luat_V{platform_version}_{platform}_720D_{hwVer}'.format(
  41. server = server,
  42. version = upgrade_version,
  43. platform_version = '{0:0>4}'.format(platform_version),
  44. platform = platform,
  45. hwVer = hwVer)
  46. else:
  47. fw_url_tmpl = 'http://{server}/uploaded/version/4g/SmartBox4G_{version}_Luat_V{platform_version}_{platform}_720D'.format(
  48. server = server,
  49. version = upgrade_version,
  50. platform_version = '{0:0>4}'.format(platform_version),
  51. platform = platform)
  52. else:
  53. assert False, 'incorrect platform type.'
  54. fw_url_tmpl = fw_url_tmpl + '_{driver_code}'
  55. if platform == 'ASR1802':
  56. fw_url_tmpl = fw_url_tmpl + '_{full}'
  57. fw_url_tmpl = fw_url_tmpl + '.bin'
  58. return fw_url_tmpl
  59. for name, value in options:
  60. if name in ('-v', '--version'):
  61. upgrade_version = value
  62. if name in ('-e', '--env'):
  63. system_env = value
  64. if name in ('-r', '--platform-version'):
  65. platform_version = value
  66. if name in ('-p', '--platform'):
  67. platform = value
  68. if name in ('-s', '--server'):
  69. server = value
  70. if name in ('-d', '--dealer'):
  71. dealer = value
  72. if name in ('-a', '--agent'):
  73. agent = value
  74. if name in ('-h', '--hwVer'):
  75. hwVer = value
  76. if not server:
  77. print 'server is null.'
  78. sys.exit(2)
  79. if not platform_version or not platform:
  80. print 'not assign platform info.'
  81. sys.exit(2)
  82. if platform not in ('8955', 'ASR1802'):
  83. print 'incorrect platform type.'
  84. sys.exit(2)
  85. if not upgrade_version:
  86. print 'error version = {version}'.format(version = upgrade_version)
  87. sys.exit(2)
  88. master, major, minor = upgrade_version.split('.')
  89. if not master or not major or not minor:
  90. print 'error version = {version}'.format(version = upgrade_version)
  91. sys.exit(2)
  92. if not system_env:
  93. print 'error system env = {env}'.format(env = system_env)
  94. sys.exit(2)
  95. import os
  96. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env = system_env))
  97. from script.base import init_env
  98. init_env(interactive = False)
  99. from script.device_upgrade import DeviceUpgradeLog
  100. from apps.web.device.models import Device, DeviceDict
  101. from apps.web.constant import DeviceOnlineStatus
  102. from apps.web.dealer.models import Dealer
  103. version_regex = 'v{master}\.{major}\.'.format(master = master, major = major)
  104. version_check = 'v{master}.{major}.'.format(master = master, major = major)
  105. upgrade_soft_ver = 'v{version}'.format(version = upgrade_version)
  106. if platform == 'ASR1802':
  107. upgrade_core_ver = 'Luat_V{platform_version}_{platform}_720D'.format(
  108. platform_version = '{0:0>4}'.format(platform_version),
  109. platform = platform)
  110. else:
  111. upgrade_core_ver = 'Luat_V{platform_version}_{platform}_SSL'.format(
  112. platform_version = '{0:0>4}'.format(platform_version),
  113. platform = platform)
  114. fw_url_tmpl = get_fw_url_tmpl(server, platform, platform_version, hwVer)
  115. update_key = DeviceUpgradeLog.make_update_key(upgrade_core_ver, upgrade_soft_ver)
  116. print 'version regex is: {}'.format(version_regex)
  117. print 'version check is: {}'.format(version_check)
  118. print 'upgrade soft version is: {}'.format(upgrade_soft_ver)
  119. print 'fw url tmpl is: {}'.format(fw_url_tmpl)
  120. print 'update key is: {}'.format(update_key)
  121. exists_code = set()
  122. no_exists_code = set()
  123. try:
  124. if dealer:
  125. dealers = [dealer]
  126. elif agent:
  127. dealers = [dealer['_id'] for dealer in Dealer.get_collection().find({'agentId': agent})]
  128. else:
  129. dealers = None
  130. common_filter = {}
  131. if hwVer:
  132. if hwVer == 'v3':
  133. filter = {
  134. '$and': [
  135. {
  136. '$or': [{'hwVer': hwVer},
  137. {'softVer': {'$regex': 'v4\.0\.'}},
  138. {'softVer': {'$regex': 'v3\.0\.'}},
  139. {'softVer': {'$regex': 'v5\.15\.'}}]
  140. },
  141. {
  142. 'softVer': {'$ne': upgrade_soft_ver}
  143. }
  144. ]
  145. }
  146. filter.update(common_filter)
  147. else:
  148. raise Exception('暂时不支持')
  149. else:
  150. if version_check == 'v1.8.':
  151. filter = {
  152. '$and': [
  153. {
  154. '$or': [
  155. {'softVer': 'v1.5'},
  156. {'softVer': 'v1.7'},
  157. {'softVer': {'$regex': 'v1\.5\.'}},
  158. {'softVer': {'$regex': 'v1\.7.'}},
  159. {'softVer': {'$regex': version_regex}}]
  160. },
  161. {
  162. 'softVer': {'$ne': upgrade_soft_ver}
  163. }
  164. ]
  165. }
  166. filter.update(common_filter)
  167. elif version_check == 'v5.15.':
  168. filter = {
  169. '$and': [
  170. {
  171. '$or': [{'softVer': {'$regex': 'v4\.0\.'}},
  172. {'softVer': {'$regex': 'v3\.0\.'}},
  173. {'softVer': {'$regex': version_regex}}]
  174. },
  175. {
  176. 'softVer': {'$ne': upgrade_soft_ver}
  177. }
  178. ]
  179. }
  180. filter.update(common_filter)
  181. elif version_check == 'v5.13.':
  182. filter = {
  183. '$and': [
  184. {
  185. '$or': [{'softVer': {'$regex': 'v3\.1\.'}},
  186. {'softVer': {'$regex': 'v4\.1\.'}},
  187. {'softVer': {'$regex': version_regex}}]
  188. },
  189. {
  190. 'softVer': {'$ne': upgrade_soft_ver}
  191. }
  192. ]
  193. }
  194. filter.update(common_filter)
  195. elif version_check == 'v5.1.':
  196. filter = {
  197. '$and': [
  198. {
  199. '$or': [{'softVer': {'$regex': 'v40\.1\.'}}, {'softVer': {'$regex': version_regex}}]
  200. },
  201. {
  202. 'softVer': {'$ne': upgrade_soft_ver}
  203. }
  204. ]
  205. }
  206. filter.update(common_filter)
  207. elif version_check == 'v5.12.':
  208. filter = {
  209. '$and': [
  210. {
  211. '$or': [{'softVer': {'$regex': 'v4\.12\.'}}, {'softVer': {'$regex': version_regex}}]
  212. },
  213. {
  214. 'softVer': {'$ne': upgrade_soft_ver}
  215. }
  216. ]
  217. }
  218. filter.update(common_filter)
  219. else:
  220. filter = {
  221. '$and': [{'softVer': {'$regex': version_regex}}, {'softVer': {'$nin': [upgrade_soft_ver, 'v5.100.10']}}]
  222. }
  223. filter.update(common_filter)
  224. if dealers:
  225. filter.update({
  226. 'ownerId': {'$in': dealers}
  227. })
  228. exists_dev_list = [item.devNo for item in DeviceUpgradeLog.objects(updateKey = update_key)]
  229. if exists_dev_list:
  230. filter.update({
  231. 'devNo': {'$nin': exists_dev_list}
  232. })
  233. devNoList = []
  234. objs = Device.get_collection().find(filter)
  235. for obj in objs:
  236. if ':1883' not in obj['server']:
  237. continue
  238. now_soft_ver = str(obj['softVer'])
  239. dev_no = str(obj['devNo'])
  240. need_upgrade = True
  241. try:
  242. common_flag = (now_soft_ver.startswith(version_check) and now_soft_ver != upgrade_soft_ver)
  243. if hwVer:
  244. common_flag = common_flag or (obj['hwVer'] == hwVer)
  245. if hwVer == 'v3':
  246. if now_soft_ver.startswith('v4.0.') or \
  247. now_soft_ver.startswith('v3.0.') or \
  248. now_soft_ver.startswith("v5.15.") or \
  249. common_flag:
  250. devNoList.append(dev_no)
  251. continue
  252. else:
  253. raise Exception('unsupport hw version.')
  254. else:
  255. if version_check == 'v1.8.':
  256. if now_soft_ver.startswith('v1.7.') or now_soft_ver.startswith(
  257. 'v1.5.') or now_soft_ver == 'v1.7' or now_soft_ver == 'v1.5' or common_flag:
  258. devNoList.append(dev_no)
  259. continue
  260. elif version_check == 'v5.15.':
  261. if now_soft_ver.startswith('v4.0.') or now_soft_ver.startswith('v3.0.') or common_flag:
  262. devNoList.append(dev_no)
  263. continue
  264. elif version_check == 'v5.1.':
  265. if now_soft_ver.startswith('v40.1.') or common_flag:
  266. devNoList.append(dev_no)
  267. continue
  268. elif version_check == 'v5.12.':
  269. if now_soft_ver.startswith('v4.12.') or common_flag:
  270. devNoList.append(dev_no)
  271. continue
  272. elif version_check == 'v5.13.':
  273. if now_soft_ver.startswith('v3.1.') or now_soft_ver.startswith('v4.1.') or common_flag:
  274. devNoList.append(dev_no)
  275. continue
  276. else:
  277. if common_flag:
  278. devNoList.append(dev_no)
  279. continue
  280. need_upgrade = False
  281. finally:
  282. if not need_upgrade:
  283. print 'dev<devNo={},rCode={},code={}> version is: {}. no need to upgrade'.format(dev_no,
  284. obj.get('devType',
  285. {}).get(
  286. 'code', ''),
  287. obj.get(
  288. 'driverCode',
  289. ''),
  290. now_soft_ver)
  291. else:
  292. print 'dev<devNo={},rCode={},code={}> version is: {}. need to upgrade.'.format(dev_no,
  293. obj.get('devType',
  294. {}).get(
  295. 'code', None),
  296. obj.get('driverCode',
  297. ''),
  298. now_soft_ver)
  299. for devNo in devNoList:
  300. try:
  301. dev = Device.get_dev(devNo) # type: DeviceDict
  302. if upgrade_soft_ver == dev.softVer:
  303. print('{} is newest version'.format(dev.softVer))
  304. continue
  305. if version_check != 'v5.100.' and dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE:
  306. print '{} is offline.'.format(devNo)
  307. continue
  308. if version_check in ['v1.8.', 'v5.15.']:
  309. driver_code = '000000'
  310. else:
  311. devType = dev.devType
  312. devTypeCode = devType.get('code', None)
  313. print devTypeCode
  314. if devTypeCode and devTypeCode < '100100':
  315. driver_code = '100000'
  316. else:
  317. if 'driverCode' in dev and dev['driverCode']:
  318. driver_code = dev['driverCode']
  319. if driver_code == '100205':
  320. driver_code = '100210'
  321. else:
  322. print('{} has no driver code.'.format(devNo))
  323. driver_code = '100000'
  324. if platform == 'ASR1802':
  325. if upgrade_core_ver == dev['coreVer']:
  326. version_path = fw_url_tmpl.format(driver_code = driver_code, full = 'inc')
  327. else:
  328. version_path = fw_url_tmpl.format(driver_code = driver_code, full = 'full')
  329. else:
  330. version_path = fw_url_tmpl.format(driver_code = driver_code)
  331. print 'version path is: {}'.format(version_path)
  332. cmdPara = {'cmd': 202, 'IMEI': devNo, 'ota_set': {'fw_url': version_path}}
  333. print cmdPara
  334. try:
  335. log = DeviceUpgradeLog.new_log(dev = dev,
  336. coreVer = upgrade_core_ver,
  337. softVer = upgrade_soft_ver,
  338. driverCode = driver_code,
  339. updatePara = cmdPara)
  340. except Exception, e:
  341. print str(e)
  342. continue
  343. except Exception, e:
  344. print 'some exception =%s' % e
  345. finally:
  346. print('finished')