123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641 |
- 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
|