from zlib import crc32 from django.core import serializers from wsgiref.util import FileWrapper import traceback, hashlib from Ansjer.config import SERVER_DOMAIN from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView from django.utils.decorators import method_decorator from Model.models import Equipment_Version from Model.models import Device_User from Service.ModelService import ModelService from Service.CommonService import CommonService import time, os, simplejson as json from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from django.http import HttpResponse from Ansjer.settings import BASE_DIR def addNewEquipmentVersion(deviceContent, token, response): """ :param deviceContent: :return: """ if token is not None: tko = TokenObject(token) tko.valid() # 设置语言 response.lang = tko.lang if tko.code == 0: userID = tko.userID own_permission = ModelService.check_permission(userID=userID, permID=220) if own_permission is True: try: print(deviceContent) print(type(deviceContent)) deviceData = json.loads(deviceContent) except Exception as e: return response.json(803, repr(e)) else: version = deviceData.get('version', None) if version is not None: filePath = deviceData.get('filePath', None) if filePath is not None: try: deviceData['filePath'] = ','.join(filePath) equipmentVersion = Equipment_Version( eid=CommonService.getUserID(getUser=False, setOTAID=True), **deviceData) equipmentVersion.save() except Exception as e: errorInfo = traceback.format_exc() print('添加设备错误: %s ' % errorInfo) return response.json(806, repr(e)) else: res = CommonService.qs_to_dict([equipmentVersion]) return response.json(0, res) else: return response.json(806) else: return response.json(806) else: return response.json(404) else: return response.json(309) def downloadUrl(fileType, fileCode, fileVersion, fileName): fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/') if fileType == 'IPC': Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/') elif fileType == 'DVR': Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/') elif fileType == 'NVR': Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/') elif fileType == 'XVR': Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/') else: if fileType == 'CHM': Path = fileName else: Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/') if os.path.isfile(Path): try: JSON = json.dumps( { "result_code": 0, "reason": 'Success', "result": {}, "error_code": 0, }, ensure_ascii=False ) wrapper = FileWrapper(open(Path, 'rb')) response = HttpResponse(wrapper, content_type="application/octet-stream") response['Content-Length'] = os.path.getsize(Path) response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path) response['Content-MD5'] = getMD5orSHA265(Path) response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265') response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32') response['Content-Error'] = JSON return response except Exception as e: res = ResponseObject() errorJSON = res.formal(906, {'details': repr(e)}) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: res = ResponseObject() errorJSON = res.formal(907) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response def getMD5orSHA265(fileName, encryptionType='MD5'): """ :param filePath: :param encryptionType: :return: """ if not os.path.isfile(fileName): return '' else: if encryptionType == 'MD5': encryption = hashlib.md5() elif encryptionType == 'SHA265': encryption = hashlib.sha256() elif encryptionType == 'CRC32': f = open(fileName, 'rb') chunk = f.read() return crc32(chunk) f = open(fileName, 'rb') block_size = 8192 # why is 8192 | 8192 is fast than 2048 while True: chunk = f.read(block_size) if not chunk: break encryption.update(chunk) f.close() return encryption.hexdigest() @csrf_exempt def downloadUpdataFileUrl(request): response = ResponseObject() if request.method == 'GET': request_dict = request.GET elif request.method == 'POST': request_dict = request.POST else: errorJSON = response.formal(801) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response fileType = request_dict.get('fileType', None) fileCode = request_dict.get('fileCode', None) fileVersion = request_dict.get('fileVersion', None) fileName = request_dict.get('fileName', None) if fileType != None and fileCode != None and fileVersion != \ None and fileName != None: return downloadUrl(fileType, fileCode, fileVersion, fileName, response) else: errorJSON = response.formal(800) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response ''' http://192.168.136.40:8077/OTA/getEquipmentVersion?31AX162001A ''' @csrf_exempt def getEquipmentVersionInterface(request): response = ResponseObject() if request.method == "POST": request.encoding = 'utf-8' code = request.POST.get('code', None) elif request.method == "GET": request.encoding = 'gb2312' code = request.GET.get('code', None) else: return response.json(801) if code is not None: try: equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang=0).order_by('-data_joined') except Exception as e: errorInfo = traceback.format_exc() print('查询数据库错误: %s' % errorInfo) return response.json(500, {'details': repr(e)}) else: if equipmentValid: equipment = equipmentValid[0] return response.json(0, {'softwareVersion': equipment.softwareVersion}) else: return response.json(900) else: return response.json(800) @csrf_exempt def getUpdataFileUrlInterface(request): response = ResponseObject() if request.method == "POST": request.encoding = 'utf-8' request_dict = request.POST elif request.method == "GET": request.encoding = 'utf-8' request_dict = request.GET else: return response.json(801) code = request_dict.get('code', None) # http_host = request.META.get('HTTP_HOST', None) if code: equipmentValid = Equipment_Version.objects.filter(code=code, status=1,lang=0).order_by('-data_joined') # 判断是否有版本存在 if equipmentValid.exists(): equipment = equipmentValid[0] file_path = equipment.filePath urls = [] if file_path: if file_path.find('static/Upgrade/') != -1: path = file_path.replace('static/Upgrade/', '').replace('\\', '/') url = SERVER_DOMAIN + '/OTA/downloads/' + path + '?time=' + str(time.time()) urls.append(url) if file_path.find('static/otapack') != -1: url = SERVER_DOMAIN + '/OTA/downloadsPack/' + file_path + '?time=' + str(time.time()) urls.append(url) if len(urls) > 0: return response.json(0, { "urlCount": len(urls), "url": urls, "fileSize": equipment.fileSize, "Description": equipment.Description, }) else: return response.json(901) else: return response.json(902) else: return response.json(800) @csrf_exempt def downloadUpdataFileUrlInterface(request, fileType, fileName, *callback_args, **callback_kwargs): res = ResponseObject() if fileType is not None and fileName is not None: fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/') if fileType == 'IPC': fullPath += 'IPC/' + fileName elif fileType == 'DVR': fullPath += 'DVR/' + fileName elif fileType == 'NVR': fullPath += 'NVR/' + fileName elif fileType == 'XVR': fullPath += 'XVR/' + fileName elif fileType == 'User': fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/') fullPath += 'User/' + fileName elif fileType == 'ADCloud': fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/') fullPath += 'ADCloud/' + fileName elif fileType == 'ACCloud': fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/') fullPath += 'ACCloud/' + fileName else: fullPath += 'Other/' + fileName print(fullPath) if os.path.isfile(fullPath): try: JSON = res.formal(0) if fileType != 'User': wrapper = FileWrapper(open(fullPath, 'rb')) response = HttpResponse(wrapper, content_type="application/octet-stream") response['Content-Length'] = os.path.getsize(fullPath) response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath) response['Content-MD5'] = getMD5orSHA265(fullPath) # 校验文件md5值 response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265') response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32') response['Content-Error'] = JSON return response else: Imagedata = open(fullPath, 'rb').read() response = HttpResponse(Imagedata, content_type="image/jpeg") return response except Exception as e: errorJSON = res.formal(906) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: errorJSON = res.formal(907) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: errorJSON = res.formal(800) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response class getUploadFiletoDirView(TemplateView): @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' request_dict = request.POST fileName = request.FILES.get('fileName', None) return self.ValidationError(request_dict, fileName) def get(self, request, *args, **kwargs): request.encoding = 'gb2312' request_dict = request.GET fileName = request.FILES.get('fileName', None) return self.ValidationError(request_dict, fileName) def ValidationError(self, request_dict, fileName): response = ResponseObject() token = request_dict.get('token', None) fileType = request_dict.get('fileType', None) fileCode = request_dict.get('fileCode', None) fileVersion = request_dict.get('fileVersion', None) if fileName != None and fileType != None and token != None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: userID = tko.userID if userID is not None: own_permission = ModelService.check_permission(userID=userID, permID=210) if own_permission is True: if fileVersion != None and fileCode != None: return self.getUploadFiletoDir(userID, fileType, fileName, response, fileCode, fileVersion=fileVersion) else: return self.getUploadFiletoDir(userID, fileType, fileName, response) else: return response.json(404) else: return response.json(309) else: return response.json(tko.code) else: return response.json(800) def getUploadFiletoDir(self, userID, fileType, fileName, response, *args, **kwargs): """ 将上传的文件写入服务器对应目录下 :param Type: equipment type :param fileName: File name of upgrade file. :return: filePath """ try: User = Device_User.objects.filter(userID=userID) except Exception as e: errorInfo = traceback.format_exc() print('查询数据库错误: %s' % errorInfo) return response.json(500, {'details': repr(e)}) else: if not User: return response.json(113) own_perm = ModelService.check_permission(userID, permID=210) if own_perm is not True: return response.json(605) updataFile = fileName.name updataFile = updataFile.replace(' ', '+') versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1) codeIndex = versionIndex + 12 if codeIndex != -1 and versionIndex != -1: fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \ updataFile[versionIndex + 1: codeIndex] or None if fileCode is not None and fileVersion is not None: return self.getDir(fileType, fileName, fileCode, fileVersion, response) else: fileCode = kwargs.get('fileCode', None) fileVersion = kwargs.get('fileVersion', None) print(fileCode, fileVersion) if fileCode != None and fileVersion != None: return self.getDir(fileType, fileName, fileCode, fileVersion) else: return response.json(903) else: fileCode = kwargs.get('fileCode', None) fileVersion = kwargs.get('fileVersion', None) if fileCode != None and fileVersion != None: return self.getDir(fileType, fileName, fileCode, fileVersion, response) else: return response.json(903) def getDir(self, fileType, fileName, fileCode, fileVersion, response): try: if fileCode != None and fileVersion != None: path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/' else: if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR': path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/' if not os.path.exists(path): os.makedirs(path) file_name = path + str(fileName) if os.path.exists(file_name): os.remove(file_name) destination = open(file_name, 'wb+') for chunk in fileName.chunks(): destination.write(chunk) destination.close() else: file_name = path + str(fileName) if os.path.exists(file_name): os.remove(file_name) destination = open(file_name, 'wb+') for chunk in fileName.chunks(): destination.write(chunk) destination.close() except Exception as e: errorInfo = traceback.format_exc() print('上传文件错误: %s' % errorInfo) return response.json(700, {'details': repr(e)}) else: index = file_name.find('static/') filePath = file_name[index:] return response.json(0, {'filePath': filePath}) @csrf_exempt def addNewEquipmentVersionInterface(request): response = ResponseObject() if request.method == "POST": request.encoding = 'utf-8' request_dict = request.POST elif request.method == "GET": request.encoding = 'gb2312' request_dict = request.GET else: return response.json(801) deviceContent = request_dict.get('content', None).encode('utf-8') token = request_dict.get('token', None) deviceContent = str(deviceContent, encoding='utf-8') deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"') if deviceContent is not None: return addNewEquipmentVersion(deviceContent, token, response) else: return response.json(800) def showAllEquipmentVersion(userID, response): try: userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined') except Exception as e: errorInfo = traceback.format_exc() print('查询数据库错误: %s' % errorInfo) return response.json(500) else: if userValid: own_permission = ModelService.check_permission(userID=userID, permID=240) if own_permission: sqlJSON = serializers.serialize('json', Equipment_Version.objects.all()) # .order_by('-data_joined')) sqlList = json.loads(sqlJSON) print(sqlList, sqlJSON) sqlDict = dict(zip(["datas"], [sqlList])) return response.json(0, sqlDict) else: return response.json(612) else: return response.json(113) # 检测ota更新包 @csrf_exempt def getNewVerInterface(request): response = ResponseObject() if request.method == "POST": request.encoding = 'utf-8' code = request.POST.get('code', None) token = request.POST.get('token', None) lang = request.POST.get('lang', None) elif request.method == "GET": request.encoding = 'gb2312' code = request.GET.get('code', None) token = request.GET.get('token', None) # 利用语言包判断传递 lang = request.GET.get('lang', None) else: return response.json(801) if code is not None and token is not None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: try: if lang is not None and lang != '': equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang=lang).order_by( '-data_joined') else: equipmentValid = Equipment_Version.objects.filter(code=code, status=1,lang=0).order_by('-data_joined') except Exception as e: return response.json(500, {'details': repr(e)}) else: if equipmentValid.exists(): ver = equipmentValid[0].softwareVersion equipment = equipmentValid[0] file_path = equipment.filePath # path = file_path.replace('static/Upgrade/', '').replace('\\', '/') # url = SERVER_DOMAIN + '/OTA/downloads/' + path + '?time=' + str(time.time()) # 检测ip进行替换 serverip = '54.215.154.29' client_ip = CommonService.get_ip_address(request) if serverip == client_ip: url = 'http://54.215.154.29/OTA/downloadsPack/' + file_path + '?time=' + str(time.time()) else: url = SERVER_DOMAIN + '/OTA/downloadsPack/' + file_path + '?time=' + str(time.time()) # get_ip_address = return response.json(0, { 'ver': ver, 'url': url, # "fileSize": equipment.fileSize, "Description": equipment.Description, }) else: return response.json(902) else: return response.json(tko.code) else: return response.json(444, 'token,code') # ota包上传 class uploadOTAInterfaceView(TemplateView): @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): return super(uploadOTAInterfaceView, self).dispatch(*args, **kwargs) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' token = request.POST.get('token', None) fileName = request.FILES.get('fileName', None) fileType = request.POST.get('fileType', None) language = request.POST.get('language', None) return self.validate(token, fileName, fileType, language) def get(self, request, *args, **kwargs): request.encoding = 'gb2312' token = request.GET.get('token', None) fileName = request.FILES.get('fileName', None) fileType = request.GET.get('fileType', None) language = request.GET.get('language', None) return self.validate(token, fileName, fileType, language) def validate(self, token, fileName, fileType, language): response = ResponseObject() print(token) print(fileName) if fileName is not None and token is not None and fileType is not None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: userID = tko.userID if userID is not None: own_permission = ModelService.check_permission(userID=userID, permID=210) if own_permission is True: return self.upload_ota_file(fileName, response, fileType, language) else: return response.json(404) else: return response.json(309) else: return response.json(tko.code) else: return response.json(800) def upload_ota_file(self, fileName, response,fileType,language): try: if not language: language = 0 path = '/'.join((BASE_DIR, 'static/otapack', fileType,str(language))).replace('\\', '/') + '/' if not os.path.exists(path): os.makedirs(path) file_name = path + str(fileName) if os.path.exists(file_name): os.remove(file_name) destination = open(file_name, 'wb+') for chunk in fileName.chunks(): destination.write(chunk) destination.close() else: file_name = path + str(fileName) if os.path.exists(file_name): os.remove(file_name) destination = open(file_name, 'wb+') for chunk in fileName.chunks(): destination.write(chunk) destination.close() except Exception as e: errorInfo = traceback.format_exc() print('上传文件错误: %s' % errorInfo) return response.json(700, {'details': repr(e)}) else: index = file_name.find('static/') filePath = file_name[index:] return response.json(0, {'filePath': filePath}) # ota包下载 # class downloadOTAInterfaceView(TemplateView): @csrf_exempt def downloadOTAInterface(request, fullPath, *callback_args, **callback_kwargs): res = ResponseObject() print('fullPath:') print(fullPath) if fullPath: if os.path.isfile(fullPath): try: JSON = res.formal(0) wrapper = FileWrapper(open(fullPath, 'rb')) response = HttpResponse(wrapper, content_type="application/octet-stream") response['Content-Length'] = os.path.getsize(fullPath) response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath) response['Content-MD5'] = getMD5orSHA265(fullPath) # 校验文件md5值 response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265') response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32') response['Content-Error'] = JSON return response except Exception as e: return res.json(906, repr(e)) else: return res.json(907) else: return res.json(800)