OTAEquipment.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. import hashlib
  2. import os
  3. import simplejson as json
  4. import time
  5. import traceback
  6. from wsgiref.util import FileWrapper
  7. from zlib import crc32
  8. from django.http import HttpResponse
  9. from django.utils.decorators import method_decorator
  10. from django.views.decorators.csrf import csrf_exempt
  11. from django.views.generic import TemplateView
  12. from Ansjer.config import BASE_DIR
  13. from Ansjer.config import SERVER_DOMAIN
  14. from Ansjer.config import SERVER_TYPE
  15. from Model.models import Device_User, EquipmentVersionLimitModel, CountryIPModel
  16. from Model.models import Equipment_Version
  17. from Object.RedisObject import RedisObject
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. from Object.UrlTokenObject import UrlTokenObject
  21. from Service.CommonService import CommonService
  22. from Service.ModelService import ModelService
  23. def downloadUrl(fileType, fileCode, fileVersion, fileName):
  24. fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
  25. if fileType == 'IPC':
  26. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  27. elif fileType == 'DVR':
  28. Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  29. elif fileType == 'NVR':
  30. Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  31. elif fileType == 'XVR':
  32. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  33. else:
  34. if fileType == 'CHM':
  35. Path = fileName
  36. else:
  37. Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
  38. if os.path.isfile(Path):
  39. try:
  40. JSON = json.dumps(
  41. {
  42. "result_code": 0,
  43. "reason": 'Success',
  44. "result": {},
  45. "error_code": 0,
  46. }, ensure_ascii=False
  47. )
  48. wrapper = FileWrapper(open(Path, 'rb'))
  49. response = HttpResponse(wrapper, content_type="application/octet-stream")
  50. response['Content-Length'] = os.path.getsize(Path)
  51. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
  52. response['Content-MD5'] = getMD5orSHA265(Path)
  53. response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
  54. response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
  55. response['Content-Error'] = JSON
  56. return response
  57. except Exception as e:
  58. res = ResponseObject()
  59. errorJSON = res.formal(906, {'details': repr(e)})
  60. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  61. response['Content-Error'] = errorJSON
  62. return response
  63. else:
  64. res = ResponseObject()
  65. errorJSON = res.formal(907)
  66. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  67. response['Content-Error'] = errorJSON
  68. return response
  69. def getMD5orSHA265(fileName, encryptionType='MD5'):
  70. """
  71. :param filePath:
  72. :param encryptionType:
  73. :return:
  74. """
  75. if not os.path.isfile(fileName):
  76. return ''
  77. else:
  78. if encryptionType == 'MD5':
  79. encryption = hashlib.md5()
  80. elif encryptionType == 'SHA265':
  81. encryption = hashlib.sha256()
  82. elif encryptionType == 'CRC32':
  83. f = open(fileName, 'rb')
  84. chunk = f.read()
  85. return crc32(chunk)
  86. f = open(fileName, 'rb')
  87. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  88. while True:
  89. chunk = f.read(block_size)
  90. if not chunk:
  91. break
  92. encryption.update(chunk)
  93. f.close()
  94. return encryption.hexdigest()
  95. @csrf_exempt
  96. def downloadUpdataFileUrl(request):
  97. response = ResponseObject()
  98. if request.method == 'GET':
  99. request_dict = request.GET
  100. elif request.method == 'POST':
  101. request_dict = request.POST
  102. else:
  103. errorJSON = response.formal(444)
  104. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  105. response['Content-Error'] = errorJSON
  106. return response
  107. fileType = request_dict.get('fileType', None)
  108. fileCode = request_dict.get('fileCode', None)
  109. fileVersion = request_dict.get('fileVersion', None)
  110. fileName = request_dict.get('fileName', None)
  111. if fileType != None and fileCode != None and fileVersion != \
  112. None and fileName != None:
  113. return downloadUrl(fileType, fileCode, fileVersion, fileName, response)
  114. else:
  115. errorJSON = response.formal(444)
  116. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  117. response['Content-Error'] = errorJSON
  118. return response
  119. @csrf_exempt
  120. def getEquipmentVersionInterface(request):
  121. response = ResponseObject()
  122. if request.method == "POST":
  123. request.encoding = 'utf-8'
  124. request_dict = request.POST
  125. elif request.method == "GET":
  126. request.encoding = 'gb2312'
  127. request_dict = request.GET
  128. else:
  129. return response.json(444)
  130. code = request_dict.get('code', None)
  131. ov = request_dict.get('ov', None)
  132. if not code:
  133. return response.json(444, 'code')
  134. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  135. if not eqs.exists():
  136. return response.json(900)
  137. if ov is not None:
  138. # 判断大小
  139. nv = eqs[0].softwareVersion
  140. if ov > nv:
  141. return response.json(0, {'softwareVersion': ov})
  142. equipment = eqs[0]
  143. return response.json(0, {'softwareVersion': equipment.softwareVersion})
  144. @csrf_exempt
  145. def getUpdataFileUrlInterface(request):
  146. response = ResponseObject()
  147. request.encoding = 'utf-8'
  148. if request.method == "POST":
  149. code = request.POST.get('code', None)
  150. elif request.method == "GET":
  151. code = request.GET.get('code', None)
  152. else:
  153. return response.json(444)
  154. if not code:
  155. return response.json(444, 'code')
  156. eq = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  157. # 判断是否有版本存在
  158. if not eq.exists():
  159. return response.json(902)
  160. file_path = eq[0].filePath
  161. urls = []
  162. if file_path:
  163. if file_path.find('static/Upgrade/') != -1:
  164. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  165. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  166. urls.append(url)
  167. if file_path.find('static/otapack') != -1:
  168. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  169. urls.append(url)
  170. if len(urls) > 0:
  171. res = {
  172. "urlCount": len(urls),
  173. "url": urls,
  174. "fileSize": eq[0].fileSize,
  175. "Description": eq[0].Description,
  176. }
  177. return response.json(0, res)
  178. else:
  179. return response.json(901)
  180. @csrf_exempt
  181. def downloadUpdataFileUrlInterface(request, fileType, fileName,
  182. *callback_args, **callback_kwargs):
  183. res = ResponseObject()
  184. if fileType is not None and fileName is not None:
  185. fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
  186. if fileType == 'IPC':
  187. fullPath += 'IPC/' + fileName
  188. elif fileType == 'DVR':
  189. fullPath += 'DVR/' + fileName
  190. elif fileType == 'NVR':
  191. fullPath += 'NVR/' + fileName
  192. elif fileType == 'XVR':
  193. fullPath += 'XVR/' + fileName
  194. elif fileType == 'User':
  195. fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
  196. fullPath += 'User/' + fileName
  197. elif fileType == 'ADCloud':
  198. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  199. fullPath += 'ADCloud/' + fileName
  200. elif fileType == 'ACCloud':
  201. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  202. fullPath += 'ACCloud/' + fileName
  203. else:
  204. fullPath += 'Other/' + fileName
  205. print(fullPath)
  206. if os.path.isfile(fullPath):
  207. try:
  208. JSON = res.formal(0)
  209. if fileType != 'User':
  210. wrapper = FileWrapper(open(fullPath, 'rb'))
  211. response = HttpResponse(wrapper, content_type="application/octet-stream")
  212. response['Content-Length'] = os.path.getsize(fullPath)
  213. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  214. response['Content-MD5'] = getMD5orSHA265(fullPath)
  215. # 校验文件md5值
  216. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  217. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  218. response['Content-Error'] = JSON
  219. return response
  220. else:
  221. Imagedata = open(fullPath, 'rb').read()
  222. response = HttpResponse(Imagedata, content_type="image/jpeg")
  223. return response
  224. except Exception as e:
  225. errorJSON = res.formal(906)
  226. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  227. response['Content-Error'] = errorJSON
  228. return response
  229. else:
  230. errorJSON = res.formal(907)
  231. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  232. response['Content-Error'] = errorJSON
  233. return response
  234. else:
  235. errorJSON = res.formal(444)
  236. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  237. response['Content-Error'] = errorJSON
  238. return response
  239. class getUploadFiletoDirView(TemplateView):
  240. @method_decorator(csrf_exempt)
  241. def dispatch(self, *args, **kwargs):
  242. return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
  243. def post(self, request, *args, **kwargs):
  244. request.encoding = 'utf-8'
  245. request_dict = request.POST
  246. fileName = request.FILES.get('fileName', None)
  247. return self.ValidationError(request_dict, fileName)
  248. def get(self, request, *args, **kwargs):
  249. request.encoding = 'gb2312'
  250. request_dict = request.GET
  251. fileName = request.FILES.get('fileName', None)
  252. return self.ValidationError(request_dict, fileName)
  253. def ValidationError(self, request_dict, fileName):
  254. response = ResponseObject()
  255. token = request_dict.get('token', None)
  256. fileType = request_dict.get('fileType', None)
  257. fileCode = request_dict.get('fileCode', None)
  258. fileVersion = request_dict.get('fileVersion', None)
  259. if not fileName or not fileType:
  260. return response.json(444, 'fileName,fileType')
  261. tko = TokenObject(token)
  262. response.lang = tko.lang
  263. if tko.code != 0:
  264. return response.json(tko.code)
  265. userID = tko.userID
  266. if not userID:
  267. return response.json(104)
  268. own_perm = ModelService.check_perm(userID=userID, permID=210)
  269. if not own_perm:
  270. return response.json(404)
  271. if fileVersion != None and fileCode != None:
  272. return self.getUploadFiletoDir(userID, fileType, fileName, response, fileCode,
  273. fileVersion=fileVersion)
  274. else:
  275. return self.getUploadFiletoDir(userID, fileType, fileName, response)
  276. def getUploadFiletoDir(self, userID, fileType, fileName, response, *args, **kwargs):
  277. """
  278. 将上传的文件写入服务器对应目录下
  279. :param Type: equipment type
  280. :param fileName: File name of upgrade file.
  281. :return: filePath
  282. """
  283. User = Device_User.objects.filter(userID=userID)
  284. if not User:
  285. return response.json(104)
  286. own_perm = ModelService.check_perm(userID, permID=210)
  287. if own_perm is not True:
  288. return response.json(404)
  289. updataFile = fileName.name
  290. updataFile = updataFile.replace(' ', '+')
  291. versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
  292. codeIndex = versionIndex + 12
  293. if codeIndex != -1 and versionIndex != -1:
  294. fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
  295. fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
  296. updataFile[versionIndex + 1: codeIndex] or None
  297. if fileCode is not None and fileVersion is not None:
  298. return self.getDir(fileType, fileName, fileCode, fileVersion, response)
  299. else:
  300. fileCode = kwargs.get('fileCode', None)
  301. fileVersion = kwargs.get('fileVersion', None)
  302. print(fileCode, fileVersion)
  303. if fileCode != None and fileVersion != None:
  304. return self.getDir(fileType, fileName, fileCode, fileVersion)
  305. else:
  306. return response.json(903)
  307. else:
  308. fileCode = kwargs.get('fileCode', None)
  309. fileVersion = kwargs.get('fileVersion', None)
  310. if fileCode != None and fileVersion != None:
  311. return self.getDir(fileType, fileName, fileCode, fileVersion, response)
  312. else:
  313. return response.json(903)
  314. def getDir(self, fileType, fileName, fileCode, fileVersion, response):
  315. try:
  316. if fileCode != None and fileVersion != None:
  317. path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
  318. else:
  319. if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
  320. path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
  321. if not os.path.exists(path):
  322. os.makedirs(path)
  323. file_name = path + str(fileName)
  324. if os.path.exists(file_name):
  325. os.remove(file_name)
  326. destination = open(file_name, 'wb+')
  327. for chunk in fileName.chunks():
  328. destination.write(chunk)
  329. destination.close()
  330. else:
  331. file_name = path + str(fileName)
  332. if os.path.exists(file_name):
  333. os.remove(file_name)
  334. destination = open(file_name, 'wb+')
  335. for chunk in fileName.chunks():
  336. destination.write(chunk)
  337. destination.close()
  338. except Exception as e:
  339. errorInfo = traceback.format_exc()
  340. print('上传文件错误: %s' % errorInfo)
  341. return response.json(700, {'details': repr(e)})
  342. else:
  343. index = file_name.find('static/')
  344. filePath = file_name[index:]
  345. return response.json(0, {'filePath': filePath})
  346. @csrf_exempt
  347. def addNewEquipmentVersionInterface(request):
  348. request.encoding = 'utf-8'
  349. response = ResponseObject()
  350. if request.method == "POST":
  351. request_dict = request.POST
  352. elif request.method == "GET":
  353. request_dict = request.GET
  354. else:
  355. return response.json(444)
  356. deviceContent = request_dict.get('content', None).encode('utf-8')
  357. token = request_dict.get('token', None)
  358. file_s = request.FILES.get('file', None)
  359. deviceContent = str(deviceContent, encoding='utf-8')
  360. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  361. if deviceContent is None:
  362. return response.json(444, 'content')
  363. tko = TokenObject(token)
  364. response.lang = tko.lang
  365. if tko.code != 0:
  366. return response.json(tko.code)
  367. userID = tko.userID
  368. own_perm = ModelService.check_perm(userID=userID, permID=220)
  369. if own_perm is False:
  370. return response.json(404)
  371. try:
  372. deviceData = json.loads(deviceContent)
  373. version = deviceData.get('version', None)
  374. filePath = deviceData.get('filePath', None)
  375. code = deviceData.get('code', None)
  376. lang = deviceData.get('lang', None)
  377. if code and lang:
  378. try:
  379. Equipment_Version.objects.filter(code=code,lang=lang).delete()
  380. except Exception as e:
  381. pass
  382. if version is None or filePath is None:
  383. return response.json(444, 'content')
  384. deviceData['filePath'] = ','.join(filePath)
  385. paths = 'static/versions/image'
  386. if not os.path.exists(paths):
  387. os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
  388. # print ('该文件不存在')
  389. else:
  390. print ('该文件存在')
  391. print(file_s)
  392. if file_s is None:
  393. deviceData['img'] = ''
  394. else:
  395. rv_path = 'static/versions/image/' + code + '.png'
  396. try:
  397. as_path = os.path.join(BASE_DIR, rv_path)
  398. if os.path.exists(as_path):
  399. os.remove(as_path)
  400. with open(as_path, 'wb+') as destination:
  401. for chunk in file_s.chunks():
  402. destination.write(chunk)
  403. except Exception as e:
  404. pass
  405. else:
  406. deviceData['img'] = SERVER_DOMAIN + 'sysfile/' + rv_path
  407. ev_qs = Equipment_Version(
  408. eid=CommonService.getUserID(getUser=False, setOTAID=True),
  409. **deviceData)
  410. ev_qs.save()
  411. except Exception as e:
  412. return response.json(444, repr(e))
  413. else:
  414. res = CommonService.qs_to_dict([ev_qs])
  415. return response.json(0, res)
  416. def showAllEquipmentVersion(userID, response):
  417. userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  418. if not userValid.exists():
  419. return response.json(104)
  420. own_perm = ModelService.check_perm(userID=userID, permID=240)
  421. if not own_perm:
  422. return response.json(404)
  423. qs = Equipment_Version.objects.all()
  424. res = CommonService.qs_to_dict(qs)
  425. return response.json(0, res)
  426. # 检测ota更新包
  427. @csrf_exempt
  428. def getNewVerInterface(request):
  429. response = ResponseObject()
  430. if request.method == "POST":
  431. request_dict = request.POST
  432. elif request.method == "GET":
  433. request_dict = request.GET
  434. else:
  435. return response.json(404)
  436. code = request_dict.get('code', None)
  437. token = request_dict.get('token', None)
  438. lang = request_dict.get('lang', None)
  439. now_ver = request_dict.get('ver', None)
  440. uid = request_dict.get('uid', None)
  441. if not code or not now_ver:
  442. return response.json(902, {'param':'code,ver'})
  443. # return response.json(444, 'code,ver')
  444. tko = TokenObject(token)
  445. response.lang = tko.lang
  446. if tko.code != 0:
  447. return response.json(tko.code)
  448. if lang == 'zh-Hans' or lang == 'cn':
  449. equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang='zh-Hans').order_by(
  450. '-data_joined')
  451. else:
  452. equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by(
  453. '-data_joined')
  454. if equipmentValid.exists():
  455. equipment = equipmentValid[0]
  456. redisObject = RedisObject()
  457. key = 'limit_{eid}'.format(eid=equipment.eid)
  458. evl_qs = redisObject.get_data(key=key)
  459. if evl_qs:
  460. evl_qs = json.loads(evl_qs)
  461. else:
  462. evl_qs = EquipmentVersionLimitModel.objects.filter(equipment_version_id=equipment.eid, status=1).values()
  463. if evl_qs.exists():
  464. redisObject.set_data(key=key, val=json.dumps(list(evl_qs.values())), expire=600)
  465. if evl_qs and len(evl_qs) > 0:
  466. evl = evl_qs[0]
  467. if evl['type'] == 1: # uid限制
  468. uids = json.loads(evl['content'])
  469. if not uids.__contains__(uid):
  470. return response.json(902)
  471. elif evl['type'] == 2: # user限制
  472. users = json.loads(evl['content'])
  473. if not users.__contains__(tko.userID):
  474. return response.json(902)
  475. elif evl['type'] == 3: # 国家地区限制
  476. countries = json.loads(evl['content'])
  477. country_ip_qs = CountryIPModel.objects.filter(user_ex__userID=tko.userID)
  478. if country_ip_qs.exists():
  479. country = country_ip_qs[0].country
  480. else:
  481. country = CommonService.getAddr(CommonService.get_ip_address(request))
  482. if not countries.__contains__(country):
  483. return response.json(902)
  484. file_path = equipment.filePath
  485. ver = equipment.softwareVersion
  486. max_ver = equipment.max_ver
  487. print(now_ver <= max_ver)
  488. if now_ver <= max_ver:
  489. # 创建url的token
  490. tko = UrlTokenObject()
  491. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  492. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  493. print(url)
  494. # if SERVER_TYPE == 'Ansjer.formal_settings':
  495. # url = SERVER_DOMAIN + 'dlotapack/' + file_path
  496. # else:
  497. # 这里调用国内服务器进行下载,防止下载bug
  498. # if code == '18E201200CA' or code == '18E201200CZ':
  499. # url = 'http://www.zositech.xyz/dlotapack/' + file_path
  500. # else:
  501. # url = SERVER_DOMAIN + 'dlotapack/' + file_path
  502. return response.json(0, {
  503. 'ver': ver,
  504. 'url': url,
  505. "Description": equipment.Description,
  506. })
  507. else:
  508. return response.json(902)
  509. else:
  510. return response.json(902)
  511. # ota包上传
  512. class uploadOTAInterfaceView(TemplateView):
  513. @method_decorator(csrf_exempt)
  514. def dispatch(self, *args, **kwargs):
  515. return super(uploadOTAInterfaceView, self).dispatch(*args, **kwargs)
  516. def post(self, request, *args, **kwargs):
  517. request.encoding = 'utf-8'
  518. token = request.POST.get('token', None)
  519. fileName = request.FILES.get('fileName', None)
  520. fileType = request.POST.get('fileType', None)
  521. language = request.POST.get('language', None)
  522. return self.validate(token, fileName, fileType, language)
  523. def get(self, request, *args, **kwargs):
  524. request.encoding = 'gb2312'
  525. token = request.GET.get('token', None)
  526. fileName = request.FILES.get('fileName', None)
  527. fileType = request.GET.get('fileType', None)
  528. language = request.GET.get('language', None)
  529. return self.validate(token, fileName, fileType, language)
  530. def validate(self, token, fileName, fileType, language):
  531. response = ResponseObject()
  532. if not fileName or not fileType:
  533. return response.json(444, 'fileName,fileType')
  534. tko = TokenObject(token)
  535. response.lang = tko.lang
  536. if tko.code != 0:
  537. return response.json(tko.code)
  538. userID = tko.userID
  539. if not userID:
  540. return response.json(104)
  541. own_permission = ModelService.check_perm(userID=userID, permID=210)
  542. if own_permission is not True:
  543. return response.json(404)
  544. return self.upload_ota_file(fileName, response, fileType, language)
  545. def upload_ota_file(self, fileName, response, fileType, language):
  546. try:
  547. if not language:
  548. language = 0
  549. path = '/'.join((BASE_DIR, 'static/otapack', fileType, str(language))).replace('\\', '/') + '/'
  550. if not os.path.exists(path):
  551. os.makedirs(path)
  552. file_name = path + str(fileName)
  553. if os.path.exists(file_name):
  554. os.remove(file_name)
  555. destination = open(file_name, 'wb+')
  556. for chunk in fileName.chunks():
  557. destination.write(chunk)
  558. destination.close()
  559. else:
  560. file_name = path + str(fileName)
  561. if os.path.exists(file_name):
  562. os.remove(file_name)
  563. destination = open(file_name, 'wb+')
  564. for chunk in fileName.chunks():
  565. destination.write(chunk)
  566. destination.close()
  567. except Exception as e:
  568. errorInfo = traceback.format_exc()
  569. print('上传文件错误: %s' % errorInfo)
  570. return response.json(700, {'details': repr(e)})
  571. else:
  572. index = file_name.find('static/')
  573. filePath = file_name[index:]
  574. return response.json(0, {'filePath': filePath})
  575. # ota包下载
  576. @csrf_exempt
  577. def downloadOTAInterface(request, fullPath, *callback_args, **callback_kwargs):
  578. res = ResponseObject()
  579. print('fullPath:')
  580. print(fullPath)
  581. if fullPath:
  582. if os.path.isfile(fullPath):
  583. try:
  584. wrapper = FileWrapper(open(fullPath, 'rb'))
  585. response = HttpResponse(wrapper, content_type="application/octet-stream")
  586. response['Content-Length'] = os.path.getsize(fullPath)
  587. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  588. response['Content-MD5'] = getMD5orSHA265(fullPath)
  589. # 校验文件md5值
  590. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  591. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  592. response['Content-Error'] = res.formal(0)
  593. return response
  594. except Exception as e:
  595. return res.json(906, repr(e))
  596. else:
  597. return res.json(907)
  598. else:
  599. return res.json(444, 'fullPath')
  600. # ota包下载
  601. @csrf_exempt
  602. def downloadOTAInterfaceV2(request, fullPath, *callback_args, **callback_kwargs):
  603. res = ResponseObject()
  604. print('fullPath:')
  605. print(fullPath)
  606. # 解密url的token
  607. url_token = UrlTokenObject(fullPath)
  608. if ('' == url_token.Url):
  609. print('过期了')
  610. return res.json(907)
  611. else:
  612. print(url_token.Url)
  613. fp = url_token.Url
  614. fullPath = fp[14:]
  615. if fullPath:
  616. if os.path.isfile(fullPath):
  617. try:
  618. wrapper = FileWrapper(open(fullPath, 'rb'))
  619. response = HttpResponse(wrapper, content_type="application/octet-stream")
  620. response['Content-Length'] = os.path.getsize(fullPath)
  621. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  622. response['Content-MD5'] = getMD5orSHA265(fullPath)
  623. # 校验文件md5值
  624. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  625. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  626. response['Content-Error'] = res.formal(0)
  627. return response
  628. except Exception as e:
  629. return res.json(906, repr(e))
  630. else:
  631. return res.json(907)
  632. else:
  633. return res.json(444, 'fullPath')