| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641 | from zlib import crc32from Ansjer.settings import *from django.core import serializersfrom wsgiref.util import FileWrapperimport traceback, hashlibfrom Ansjer.settings import SERVER_DOMAINfrom django.views.decorators.csrf import csrf_exemptfrom django.views.generic import TemplateViewfrom django.utils.decorators import method_decoratorfrom Model.models import Equipment_Versionfrom Model.models import Device_Userfrom Service.TokenManager import JSONTokenManagerfrom Service.ModelService import ModelServicefrom Service.CommonService import CommonServicefrom 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 TemporaryUploadedFiledef 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_exemptdef 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_exemptdef 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_exemptdef 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_exemptdef 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 responseclass 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_exemptdef 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_exemptdef 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_exemptdef 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_exemptdef 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
 |