OTAEquipment.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. from zlib import crc32
  2. from django.core import serializers
  3. from wsgiref.util import FileWrapper
  4. import traceback, hashlib
  5. from Ansjer.config import SERVER_DOMAIN
  6. from django.views.decorators.csrf import csrf_exempt
  7. from django.views.generic import TemplateView
  8. from django.utils.decorators import method_decorator
  9. from Model.models import Equipment_Version
  10. from Model.models import Device_User
  11. from Service.ModelService import ModelService
  12. from Service.CommonService import CommonService
  13. import time, os,simplejson as json
  14. from Object.ResponseObject import ResponseObject
  15. from Object.TokenObject import TokenObject
  16. from django.http import HttpResponse
  17. from Ansjer.settings import BASE_DIR
  18. def getUrl(filePath, http_host):
  19. urls = []
  20. server_dm = 'http://' + http_host
  21. filePaths = filePath.split(',')
  22. if len(filePaths) > 0:
  23. for path in filePaths:
  24. if path.find('static/Upgrade/') != -1:
  25. path = path.replace('static/Upgrade/', '').replace('\\', '/')
  26. url = SERVER_DOMAIN + '/OTA/downloads/' + path + '?time=' + str(time.time())
  27. urls.append(url)
  28. else:
  29. url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/')
  30. urls.append(url)
  31. return urls
  32. else:
  33. return ''
  34. def getUpdataFileUrl(code, http_host, response):
  35. try:
  36. equipmentValid = Equipment_Version.objects.filter(code=code, status=1).order_by('-data_joined')
  37. except Exception as e:
  38. errorInfo = traceback.format_exc()
  39. print('查询数据库错误: %s' % errorInfo)
  40. return response.json(500, {'details': repr(e)})
  41. else:
  42. if equipmentValid:
  43. equipment = equipmentValid[0]
  44. file_path = equipment.filePath
  45. url = getUrl(file_path, http_host)
  46. https_url = getOTAHttps(file_path, http_host)
  47. if len(url) > 0:
  48. return response.json(0, {
  49. "urlCount": len(url),
  50. "url": url,
  51. 'https_url': https_url,
  52. "fileSize": equipment.fileSize,
  53. "Description": equipment.Description,
  54. })
  55. else:
  56. return response.json(901)
  57. else:
  58. return response.json(902)
  59. def getOTAHttps(filePath, http_host):
  60. urls = ''
  61. server_dm = 'https://' + http_host
  62. if filePath.find('static/Upgrade/') != -1:
  63. path = filePath.replace('static/Upgrade/', '').replace('\\', '/')
  64. urls = server_dm + '/OTA/downloads/' + path + '?time=' + str(time.time())
  65. return urls
  66. def addNewEquipmentVersion(deviceContent, token,response):
  67. """
  68. :param deviceContent:
  69. :return:
  70. """
  71. if token is not None:
  72. tko = TokenObject(token)
  73. tko.valid()
  74. # 设置语言
  75. response.lang = tko.res.get('lang', None)
  76. if tko.code == 0:
  77. userID = tko.userID
  78. own_permission = ModelService.check_permission(userID=userID, permID=220)
  79. if own_permission is True:
  80. try:
  81. deviceData = json.loads(deviceContent)
  82. except Exception as e:
  83. print(deviceData)
  84. return response.json(803)
  85. else:
  86. version = deviceData.get('version', None)
  87. if version is not None:
  88. filePath = deviceData.get('filePath', None)
  89. if filePath is not None:
  90. try:
  91. deviceData['filePath'] = ','.join(filePath)
  92. equipmentVersion = Equipment_Version(
  93. eid=CommonService.getUserID(getUser=False, setOTAID=True),
  94. **deviceData)
  95. equipmentVersion.save()
  96. except Exception as e:
  97. errorInfo = traceback.format_exc()
  98. print('添加设备错误: %s ' % errorInfo)
  99. return response.json(806, repr(e))
  100. else:
  101. res =CommonService.qs_to_dict([equipmentVersion])
  102. return response.json(0, res)
  103. else:
  104. return response.json(806)
  105. else:
  106. return response.json(806)
  107. else:
  108. return response.json(404)
  109. else:
  110. return response.json(311)
  111. def downloadUrl(fileType, fileCode, fileVersion, fileName):
  112. fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
  113. if fileType == 'IPC':
  114. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  115. elif fileType == 'DVR':
  116. Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  117. elif fileType == 'NVR':
  118. Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  119. elif fileType == 'XVR':
  120. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  121. else:
  122. if fileType == 'CHM':
  123. Path = fileName
  124. else:
  125. Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
  126. if os.path.isfile(Path):
  127. try:
  128. JSON = json.dumps(
  129. {
  130. "result_code": 0,
  131. "reason": 'Success',
  132. "result": {},
  133. "error_code": 0,
  134. }, ensure_ascii=False
  135. )
  136. wrapper = FileWrapper(open(Path, 'rb'))
  137. response = HttpResponse(wrapper, content_type="application/octet-stream")
  138. response['Content-Length'] = os.path.getsize(Path)
  139. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
  140. response['Content-MD5'] = getMD5orSHA265(Path)
  141. response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
  142. response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
  143. response['Content-Error'] = JSON
  144. return response
  145. except Exception as e:
  146. res =ResponseObject()
  147. errorJSON = res.formal(906, {'details': repr(e)})
  148. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  149. response['Content-Error'] = errorJSON
  150. return response
  151. else:
  152. res = ResponseObject()
  153. errorJSON = res.formal(907)
  154. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  155. response['Content-Error'] = errorJSON
  156. return response
  157. def getMD5orSHA265(fileName, encryptionType='MD5'):
  158. """
  159. :param filePath:
  160. :param encryptionType:
  161. :return:
  162. """
  163. if not os.path.isfile(fileName):
  164. return ''
  165. else:
  166. if encryptionType == 'MD5':
  167. encryption = hashlib.md5()
  168. elif encryptionType == 'SHA265':
  169. encryption = hashlib.sha256()
  170. elif encryptionType == 'CRC32':
  171. f = open(fileName, 'rb')
  172. chunk = f.read()
  173. return crc32(chunk)
  174. f = open(fileName, 'rb')
  175. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  176. while True:
  177. chunk = f.read(block_size)
  178. if not chunk:
  179. break
  180. encryption.update(chunk)
  181. f.close()
  182. return encryption.hexdigest()
  183. @csrf_exempt
  184. def downloadUpdataFileUrl(request):
  185. response = ResponseObject()
  186. if request.method == 'GET':
  187. request_dict = request.GET
  188. elif request.method == 'POST':
  189. request_dict = request.POST
  190. else:
  191. errorJSON = response.formal(801)
  192. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  193. response['Content-Error'] = errorJSON
  194. return response
  195. fileType = request_dict.get('fileType', None)
  196. fileCode = request_dict.get('fileCode', None)
  197. fileVersion = request_dict.get('fileVersion', None)
  198. fileName = request_dict.get('fileName', None)
  199. if fileType != None and fileCode != None and fileVersion != \
  200. None and fileName != None:
  201. return downloadUrl(fileType, fileCode, fileVersion, fileName,response)
  202. else:
  203. errorJSON = response.formal(800)
  204. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  205. response['Content-Error'] = errorJSON
  206. return response
  207. '''
  208. http://192.168.136.40:8077/OTA/getEquipmentVersion?31AX162001A
  209. '''
  210. @csrf_exempt
  211. def getEquipmentVersionInterface(request):
  212. response = ResponseObject()
  213. if request.method == "POST":
  214. request.encoding = 'utf-8'
  215. code = request.POST.get('code', None)
  216. elif request.method == "GET":
  217. request.encoding = 'gb2312'
  218. code = request.GET.get('code', None)
  219. else:
  220. return response.json(801)
  221. if code is not None:
  222. try:
  223. equipmentValid = Equipment_Version.objects.filter(code=code, status=1).order_by('-data_joined')
  224. except Exception as e:
  225. errorInfo = traceback.format_exc()
  226. print('查询数据库错误: %s' % errorInfo)
  227. return response.json(500, {'details': repr(e)})
  228. else:
  229. if equipmentValid:
  230. equipment = equipmentValid[0]
  231. return response.json(0, {'softwareVersion': equipment.softwareVersion})
  232. else:
  233. return response.json(900)
  234. else:
  235. return response.json(800)
  236. @csrf_exempt
  237. def getUpdataFileUrlInterface(request):
  238. response = ResponseObject()
  239. if request.method == "POST":
  240. request.encoding = 'utf-8'
  241. request_dict = request.POST
  242. elif request.method == "GET":
  243. request.encoding = 'utf-8'
  244. request_dict = request.GET
  245. else:
  246. return response.json(801)
  247. code = request_dict.get('code', None)
  248. http_host = request.META.get('HTTP_HOST', None)
  249. if code is not None:
  250. return getUpdataFileUrl(code, http_host, response)
  251. else:
  252. return response.json(800)
  253. @csrf_exempt
  254. def downloadUpdataFileUrlInterface(request, fileType, fileName,
  255. *callback_args, **callback_kwargs):
  256. res = ResponseObject()
  257. if fileType is not None and fileName is not None:
  258. fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
  259. if fileType == 'IPC':
  260. fullPath += 'IPC/' + fileName
  261. elif fileType == 'DVR':
  262. fullPath += 'DVR/' + fileName
  263. elif fileType == 'NVR':
  264. fullPath += 'NVR/' + fileName
  265. elif fileType == 'XVR':
  266. fullPath += 'XVR/' + fileName
  267. elif fileType == 'User':
  268. fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
  269. fullPath += 'User/' + fileName
  270. elif fileType == 'ADCloud':
  271. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  272. fullPath += 'ADCloud/' + fileName
  273. elif fileType == 'ACCloud':
  274. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  275. fullPath += 'ACCloud/' + fileName
  276. else:
  277. fullPath += 'Other/' + fileName
  278. print(fullPath)
  279. if os.path.isfile(fullPath):
  280. try:
  281. JSON = res.formal(0)
  282. if fileType != 'User':
  283. wrapper = FileWrapper(open(fullPath, 'rb'))
  284. response = HttpResponse(wrapper, content_type="application/octet-stream")
  285. response['Content-Length'] = os.path.getsize(fullPath)
  286. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  287. response['Content-MD5'] = getMD5orSHA265(fullPath)
  288. # 校验文件md5值
  289. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  290. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  291. response['Content-Error'] = JSON
  292. return response
  293. else:
  294. Imagedata = open(fullPath, 'rb').read()
  295. response = HttpResponse(Imagedata, content_type="image/jpeg")
  296. return response
  297. except Exception as e:
  298. errorJSON = res.formal(906)
  299. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  300. response['Content-Error'] = errorJSON
  301. return response
  302. else:
  303. errorJSON = res.formal(907)
  304. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  305. response['Content-Error'] = errorJSON
  306. return response
  307. else:
  308. errorJSON = res.formal(800)
  309. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  310. response['Content-Error'] = errorJSON
  311. return response
  312. class getUploadFiletoDirView(TemplateView):
  313. @method_decorator(csrf_exempt)
  314. def dispatch(self, *args, **kwargs):
  315. return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
  316. def post(self, request, *args, **kwargs):
  317. request.encoding = 'utf-8'
  318. request_dict = request.POST
  319. fileName = request.FILES.get('fileName', None)
  320. return self.ValidationError(request_dict,fileName)
  321. def get(self, request, *args, **kwargs):
  322. request.encoding = 'gb2312'
  323. request_dict = request.GET
  324. fileName = request.FILES.get('fileName', None)
  325. return self.ValidationError(request_dict,fileName)
  326. def ValidationError(self, request_dict,fileName):
  327. response = ResponseObject()
  328. token = request_dict.get('token', None)
  329. fileType = request_dict.get('fileType', None)
  330. fileCode = request_dict.get('fileCode', None)
  331. fileVersion = request_dict.get('fileVersion', None)
  332. if fileName != None and fileType != None and token != None:
  333. tko = TokenObject(token)
  334. tko.valid()
  335. response.lang = tko.lang
  336. if tko.code == 0:
  337. userID = tko.userID()
  338. if userID is not None:
  339. own_permission = ModelService.check_permission(userID=userID, permID=210)
  340. if own_permission is True:
  341. if fileVersion != None and fileCode != None:
  342. return self.getUploadFiletoDir(userID, fileType, fileName,response,fileCode, fileVersion=fileVersion)
  343. else:
  344. return self.getUploadFiletoDir(userID, fileType, fileName,response)
  345. else:
  346. return response.json(404)
  347. else:
  348. return response.json(310)
  349. else:
  350. return response.json(tko.code)
  351. else:
  352. return response.json(800)
  353. def getUploadFiletoDir(self, userID, fileType, fileName,response, *args, **kwargs):
  354. """
  355. 将上传的文件写入服务器对应目录下
  356. :param Type: equipment type
  357. :param fileName: File name of upgrade file.
  358. :return: filePath
  359. """
  360. try:
  361. User = Device_User.objects.filter(userID=userID)
  362. except Exception as e:
  363. errorInfo = traceback.format_exc()
  364. print('查询数据库错误: %s' % errorInfo)
  365. return response.json(500, {'details': repr(e)})
  366. else:
  367. if not User:
  368. return response.json(113)
  369. own_perm = ModelService.check_permission(userID, permID=210)
  370. if own_perm is not True:
  371. return response.json(605)
  372. updataFile = fileName.name
  373. updataFile = updataFile.replace(' ', '+')
  374. versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
  375. codeIndex = versionIndex + 12
  376. if codeIndex != -1 and versionIndex != -1:
  377. fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
  378. fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
  379. updataFile[versionIndex + 1: codeIndex] or None
  380. if fileCode is not None and fileVersion is not None:
  381. return self.getDir(fileType, fileName, fileCode, fileVersion)
  382. else:
  383. fileCode = kwargs.get('fileCode', None)
  384. fileVersion = kwargs.get('fileVersion', None)
  385. print(fileCode, fileVersion)
  386. if fileCode != None and fileVersion != None:
  387. return self.getDir(fileType, fileName, fileCode, fileVersion)
  388. else:
  389. return response.json(903)
  390. else:
  391. fileCode = kwargs.get('fileCode', None)
  392. fileVersion = kwargs.get('fileVersion', None)
  393. if fileCode != None and fileVersion != None:
  394. return self.getDir(fileType, fileName, fileCode, fileVersion,response)
  395. else:
  396. return response.json(903)
  397. def getDir(self,fileType, fileName, fileCode, fileVersion, response):
  398. try:
  399. if fileCode != None and fileVersion != None:
  400. path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
  401. else:
  402. if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
  403. path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
  404. if not os.path.exists(path):
  405. os.makedirs(path)
  406. file_name = path + str(fileName)
  407. if os.path.exists(file_name):
  408. os.remove(file_name)
  409. destination = open(file_name, 'wb+')
  410. for chunk in fileName.chunks():
  411. destination.write(chunk)
  412. destination.close()
  413. else:
  414. file_name = path + str(fileName)
  415. if os.path.exists(file_name):
  416. os.remove(file_name)
  417. destination = open(file_name, 'wb+')
  418. for chunk in fileName.chunks():
  419. destination.write(chunk)
  420. destination.close()
  421. except Exception as e:
  422. errorInfo = traceback.format_exc()
  423. print('上传文件错误: %s' % errorInfo)
  424. return response.json(700, {'details': repr(e)})
  425. else:
  426. index = file_name.find('static/')
  427. filePath = file_name[index:]
  428. return response.json(0, {'filePath': filePath})
  429. @csrf_exempt
  430. def addNewEquipmentVersionInterface(request):
  431. response = ResponseObject()
  432. if request.method == "POST":
  433. request.encoding = 'utf-8'
  434. request_dict = request.POST
  435. elif request.method == "GET":
  436. request.encoding = 'gb2312'
  437. request_dict = request.GET
  438. else:
  439. return response.json(801)
  440. deviceContent = request_dict.get('content', None).encode('utf-8')
  441. token = request_dict.get('token', None)
  442. deviceContent = str(deviceContent, encoding='utf-8')
  443. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  444. if deviceContent is not None:
  445. return addNewEquipmentVersion(deviceContent, token,response)
  446. else:
  447. return response.json(800)
  448. def showAllEquipmentVersion(userID,response):
  449. try:
  450. userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  451. except Exception as e:
  452. errorInfo = traceback.format_exc()
  453. print('查询数据库错误: %s' % errorInfo)
  454. return response.json(500)
  455. else:
  456. if userValid:
  457. own_permission = ModelService.check_permission(userID=userID, permID=240)
  458. if own_permission:
  459. sqlJSON = serializers.serialize('json', Equipment_Version.objects.all()) # .order_by('-data_joined'))
  460. sqlList = json.loads(sqlJSON)
  461. print(sqlList, sqlJSON)
  462. sqlDict = dict(zip(["datas"], [sqlList]))
  463. return response.json(0, sqlDict)
  464. else:
  465. return response.json(604)
  466. else:
  467. return response.json(113)
  468. @csrf_exempt
  469. def showAllEquipmentVersionInterface(request):
  470. response = ResponseObject()
  471. if request.method == 'POST':
  472. token = request.POST.get('token', None)
  473. elif request.method == 'GET':
  474. token = request.GET.get('token', None)
  475. if token is not None:
  476. tko = TokenObject(token)
  477. tko.valid()
  478. response.lang = tko.lang
  479. if tko.code == 0:
  480. userID = tko.userID()
  481. if userID:
  482. return showAllEquipmentVersion(userID,response)
  483. else:
  484. return response.json(310)
  485. else:
  486. return response.json(tko.code)
  487. else:
  488. return response.json(800)