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 getUrl(filePath, http_host): urls = [] server_dm = 'http://' + http_host filePaths = filePath.split(',') if len(filePaths) > 0: for path in filePaths: if path.find('static/Upgrade/') != -1: path = path.replace('static/Upgrade/', '').replace('\\', '/') url = SERVER_DOMAIN + '/OTA/downloads/' + path + '?time=' + str(time.time()) urls.append(url) else: url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/') urls.append(url) return urls else: return '' def getUpdataFileUrl(code, http_host, response): try: equipmentValid = Equipment_Version.objects.filter(code=code, status=1).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] file_path = equipment.filePath url = getUrl(file_path, http_host) https_url = getOTAHttps(file_path, http_host) if len(url) > 0: return response.json(0, { "urlCount": len(url), "url": url, 'https_url': https_url, "fileSize": equipment.fileSize, "Description": equipment.Description, }) else: return response.json(901) else: return response.json(902) def getOTAHttps(filePath, http_host): urls = '' server_dm = 'https://' + http_host if filePath.find('static/Upgrade/') != -1: path = filePath.replace('static/Upgrade/', '').replace('\\', '/') urls = server_dm + '/OTA/downloads/' + path + '?time=' + str(time.time()) return urls def addNewEquipmentVersion(deviceContent, token,response): """ :param deviceContent: :return: """ if token is not None: tko = TokenObject(token) tko.valid() # 设置语言 response.lang = tko.res.get('lang', None) if tko.code == 0: userID = tko.userID own_permission = ModelService.check_permission(userID=userID, permID=220) if own_permission is True: try: deviceData = json.loads(deviceContent) except Exception as e: print(deviceData) return response.json(803) 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(311) 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).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 is not None: return getUpdataFileUrl(code, http_host, response) 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(310) 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) 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(604) else: return response.json(113) @csrf_exempt def showAllEquipmentVersionInterface(request): response = ResponseObject() if request.method == 'POST': token = request.POST.get('token', None) elif request.method == 'GET': token = request.GET.get('token', None) if token is not None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: userID = tko.userID() if userID: return showAllEquipmentVersion(userID,response) else: return response.json(310) else: return response.json(tko.code) else: return response.json(800)