from zlib import crc32 from Ansjer.settings import * from django.core import serializers from wsgiref.util import FileWrapper import traceback, hashlib from Ansjer.settings 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.TokenManager import JSONTokenManager from Service.ModelService import ModelService from Service.CommonService import CommonService from Service.ResponseService import * def getEquipmentVersion(code): if code == '31162001A': return ResponseFormal(0,{'softwareVersion': '1.4.3'}) 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 ResponseFormal(500,{'details':repr(e)}) else: if equipmentValid: equipment = equipmentValid[0] return ResponseFormal(0, {'softwareVersion': equipment.softwareVersion}) else: return ResponseFormal(900) def getUrl(filePath): urls = [] 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 urls.append(url) else: url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/') urls.append(url) return urls else: return '' def getUpdataFileUrl(code): 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 ResponseFormal(500,{'details':repr(e)}) else: if equipmentValid: equipment = equipmentValid[0] url = getUrl(equipment.filePath) if len(url) > 0: return ResponseFormal(0,{ "urlCount": len(url), "url": url, "fileSize": equipment.fileSize, "Description": equipment.Description, }) else: return ResponseFormal(901) else: return ResponseFormal(902) #from django.core.files.uploadedfile import TemporaryUploadedFile def getDir(fileType, fileName, fileCode, fileVersion): 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 ResponseFormal(700,{'details':repr(e)}) else: index = file_name.find('static/') filePath = file_name[index:] return ResponseFormal(0,{'filePath':filePath}) def addNewEquipmentVersion(deviceContent,token): """ :param deviceContent: :return: """ if token is None: return ResponseJSON(311) tokenManager = JSONTokenManager() error_code = tokenManager.verify_AToken(token) if error_code == 0: pass else: return tokenManager.errorCodeInfo(error_code) userID = tokenManager.accessDict.get('userID', None) own_permission = ModelService.check_permission(userID=userID, permID=220) if own_permission is not True: # pass return ResponseFormal(404) try: # print(deviceContent) deviceData = json.loads(deviceContent) print('----------') print(deviceData) except Exception as e: return ResponseFormal(803) else: version = deviceData.get('version', None) if version != None: eVersionValid = Equipment_Version.objects.filter(version = version) # if eVersionValid: # return ResponseFormal(904) else: return ResponseFormal(806) try: filePath = deviceData.get('filePath', None) if filePath == None: return ResponseFormal(806) 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 ResponseFormal(806,{'details':repr(e)}) else: sqlJSON = serializers.serialize('json', [equipmentVersion]) sqlList = json.loads(sqlJSON) sqlDict =dict(zip(["datas"], [sqlList])) return ResponseFormal(0,sqlDict) 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: errorJSON = ResponseFormal(906,{'details':repr(e)}) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: errorJSON = ResponseFormal(907) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response @csrf_exempt def downloadUpdataFileUrl(request, *callback_args, **callback_kwargs): if request.method == 'GET': request_dict = request.GET elif request.method == 'POST': request_dict = request.POST else: errorJSON = ResponseFormal(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: response = downloadUrl(fileType, fileCode, fileVersion, fileName) return response else: errorJSON = ResponseFormal(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, *callback_args, **callback_kwargs): if request.method == "POST": request.encoding ='utf-8' code = request.POST.get('code', None) if code is not None: response = HttpResponse(getEquipmentVersion(code)) return response else: return ResponseJSON(800) elif request.method == "GET": request.encoding = 'gb2312' code = request.GET.get('code', None) if code is not None: response = HttpResponse(getEquipmentVersion(code)) return response else: return ResponseJSON(800) else: return ResponseJSON(801) @csrf_exempt def getUpdataFileUrlInterface(request, *callback_args, **callback_kwargs): if request.method == "POST": request.encoding = 'utf-8' code = request.POST.get('code', None) if code is not None: response = HttpResponse(getUpdataFileUrl(code)) return response else: return ResponseJSON(800) elif request.method == "GET": request.encoding = 'utf-8' code = request.GET.get('code', None) if code is not None: response = HttpResponse(getUpdataFileUrl(code)) return response else: return ResponseJSON(800) else: return ResponseJSON(801) @csrf_exempt def downloadUpdataFileUrlInterface(request, fileType, fileName, *callback_args, **callback_kwargs): 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 = ResponseFormal(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值 # if response['Content-MD5'] == # print(response['Content-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 = ResponseFormal(906) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: errorJSON = ResponseFormal(907) response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8') response['Content-Error'] = errorJSON return response else: errorJSON = ResponseFormal(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' token = request.POST.get('token', None) fileType = request.POST.get('fileType', None) fileCode = request.POST.get('fileCode', None) fileVersion = request.POST.get('fileVersion', None) fileName = request.FILES.get('fileName', None) return self.ValidationError(token, fileType, fileName, filefileCode=fileCode, fileVersion=fileVersion) def get(self, request, *args, **kwargs): request.encoding = 'gb2312' token = request.GET.get('token', None) fileType = request.GET.get('fileType', None) fileCode = request.GET.get('fileCode', None) fileVersion = request.GET.get('fileVersion', None) fileName = request.FILES.get('fileName', None) return self.ValidationError(token, fileType, fileName,filefileCode=fileCode, fileVersion=fileVersion) def ValidationError(self, token, fileType, fileName, *args, **kwargs): if fileName != None and fileType != None and token != None: tM = JSONTokenManager() error_code = tM.verify_AToken(token) if error_code == 0: userID = tM.accessDict.get('userID', None) if userID: own_permission = ModelService.check_permission(userID=userID, permID=210) if own_permission is True: fileCode = kwargs.get('fileCode', None) fileVersion = kwargs.get('fileVersion', None) if fileVersion != None and fileCode != None: response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName, fileCode, fileVersion=fileVersion)) return response else: response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName)) return response else: return ResponseJSON(404) else: return ResponseJSON(310) else: response = HttpResponse(tM.errorCodeInfo(error_code)) return response else: return ResponseJSON(800) def getUploadFiletoDir(self, userID, fileType, fileName, *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 ResponseFormal(500,{'details':repr(e)}) else: if not User: return ResponseFormal(113) own_perm = ModelService.check_permission(userID,permID=210) if own_perm is not True: return ResponseFormal(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 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 getDir(fileType, fileName, fileCode, fileVersion) else: return ResponseFormal(903) else: fileCode = kwargs.get('fileCode', None) fileVersion = kwargs.get('fileVersion', None) if fileCode != None and fileVersion != None: return getDir(fileType, fileName, fileCode, fileVersion) else: return ResponseFormal(903) @csrf_exempt def addNewEquipmentVersionInterface(request, *callback_args, **callback_kwargs): if request.method == "POST": request.encoding = 'utf-8' deviceContent = request.POST.get('content', None).encode('utf-8') token = request.POST.get('token', None) deviceContent = str(deviceContent, encoding='utf-8') deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"') print(deviceContent, type(deviceContent)) if deviceContent is not None: response = HttpResponse(addNewEquipmentVersion(deviceContent,token)) return response else: return ResponseJSON(800) elif request.method == "GET": request.encoding = 'gb2312' deviceContent = request.GET.get('content', None).encode('gb2312') deviceContent = str(deviceContent, encoding='gb2312') token = request.GET.get('token', None) deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"') if deviceContent is not None: response = HttpResponse(addNewEquipmentVersion(deviceContent,token)) return response else: return ResponseJSON(800) else: return ResponseJSON(801) @csrf_exempt def showAllEquipmentVersion(userID): try: userValid = Device_User.objects.filter(userID = userID).order_by('-data_joined') except Exception as e: errorInfo = traceback.format_exc() print('查询数据库错误: %s' % errorInfo) return ResponseFormal(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 ResponseFormal(0,sqlDict) else: return ResponseFormal(604) else: return ResponseFormal(113) @csrf_exempt def showAllEquipmentVersionInterface(request, *callback_args, **callback_kwargs): if request.method == 'POST': token = request.POST.get('token', None) if token != None: tM = JSONTokenManager() error_code = tM.verify_AToken(token) if error_code == 0: userID = tM.accessDict.get('userID', None) if userID: response = HttpResponse(showAllEquipmentVersion(userID)) return response else: return ResponseJSON(310) else: response = HttpResponse(tM.errorCodeInfo(error_code)) return response else: return ResponseJSON(800) elif request.method == 'GET': token = request.GET.get('token', None) if token != None: tM = JSONTokenManager() error_code = tM.verify_AToken(token) if error_code == 0: userID = tM.accessDict.get('userID', None) if userID: response = HttpResponse(showAllEquipmentVersion(userID)) return response else: return ResponseJSON(310) else: response = HttpResponse(tM.errorCodeInfo(error_code)) return response else: return ResponseJSON(800) import zlib @csrf_exempt def getCRC32(filePath): print(filePath) block_size = 1024 * 1024 crc = 0 try: fd = open(filePath, 'rb') while True: buffer = fd.read(block_size) if len(buffer) == 0: # EOF or file empty. return hashes fd.close() return crc # 返回的是十进制的值 crc = zlib.crc32(buffer, crc) except Exception as e: return ResponseFormal(908,{'details':repr(e)}) 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() def CRC(fileName): fd = open(fileName, 'rb') dwSize = os.path.getsize(fileName) lpBuffer = fd.read() crc = -1 CRC32Table = [0] * 256 ulPolynomial = 0x04C11DB7 len = dwSize buffer = lpBuffer for index in range(0xFF): value = 0 ref = index for n in range(9): if ref & 1: value |= 1 << (8 - n) ref >>= 1 CRC32Table[index] = value << 24 for j in range(8): CRC32 = CRC32Table[index] & (1 << 31) and ulPolynomial or 0 CRC32Table[index] = (CRC32Table[index] << 1) ^ CRC32 value = 0 ref = CRC32Table[index] for n in range(33): if ref & 1: value |= 1 << (32 - n) ref >>= 1 CRC32Table[index] = value index = 0 while len: len -= 1 crc = (crc >> 8) ^ CRC32Table[(crc & 0xFF) ^ buffer[index]] index += 1 print(crc ^ 0xffffffff) return crc ^ 0xffffffff