OTAEquipment.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. from zlib import crc32
  2. from Ansjer.settings import *
  3. from django.core import serializers
  4. from wsgiref.util import FileWrapper
  5. import traceback, hashlib
  6. from Ansjer.settings import SERVER_DOMAIN
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.views.generic import TemplateView
  9. from django.utils.decorators import method_decorator
  10. from Model.models import Equipment_Version
  11. from Model.models import Device_User
  12. from Service.TokenManager import JSONTokenManager
  13. from Service.ModelService import ModelService
  14. from Service.CommonService import CommonService
  15. from Service.ResponseService import *
  16. import time
  17. def getEquipmentVersion(code):
  18. if code == '31162001A':
  19. return ResponseFormal(0,{'softwareVersion': '1.4.3'})
  20. try:
  21. equipmentValid = Equipment_Version.objects.filter(code = code,status=1).order_by('-data_joined')
  22. except Exception as e:
  23. errorInfo = traceback.format_exc()
  24. print('查询数据库错误: %s' % errorInfo)
  25. return ResponseFormal(500,{'details':repr(e)})
  26. else:
  27. if equipmentValid:
  28. equipment = equipmentValid[0]
  29. return ResponseFormal(0, {'softwareVersion': equipment.softwareVersion})
  30. else:
  31. return ResponseFormal(900)
  32. def getUrl(filePath,http_host):
  33. urls = []
  34. server_dm = 'http://'+http_host
  35. filePaths = filePath.split(',')
  36. if len(filePaths) > 0:
  37. for path in filePaths:
  38. if path.find('static/Upgrade/') != -1:
  39. path = path.replace('static/Upgrade/', '').replace('\\', '/')
  40. url = SERVER_DOMAIN + '/OTA/downloads/' + path+'?time='+str(time.time())
  41. urls.append(url)
  42. else:
  43. url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/')
  44. urls.append(url)
  45. return urls
  46. else:
  47. return ''
  48. def getUpdataFileUrl(code,http_host):
  49. try:
  50. equipmentValid = Equipment_Version.objects.filter(code=code,status=1).order_by('-data_joined')
  51. except Exception as e:
  52. errorInfo = traceback.format_exc()
  53. print('查询数据库错误: %s' % errorInfo)
  54. return ResponseFormal(500,{'details':repr(e)})
  55. else:
  56. if equipmentValid:
  57. equipment = equipmentValid[0]
  58. file_path = equipment.filePath
  59. url = getUrl(file_path,http_host)
  60. https_url = getOTAHttps(file_path,http_host)
  61. if len(url) > 0:
  62. return ResponseFormal(0,{
  63. "urlCount": len(url),
  64. "url": url,
  65. 'https_url':https_url,
  66. "fileSize": equipment.fileSize,
  67. "Description": equipment.Description,
  68. })
  69. else:
  70. return ResponseFormal(901)
  71. else:
  72. return ResponseFormal(902)
  73. def getOTAHttps(filePath,http_host):
  74. urls = ''
  75. server_dm = 'https://' + http_host
  76. if filePath.find('static/Upgrade/') != -1:
  77. path = filePath.replace('static/Upgrade/', '').replace('\\', '/')
  78. urls = server_dm + '/OTA/downloads/' + path + '?time=' + str(time.time())
  79. return urls
  80. def getDir(fileType, fileName, fileCode, fileVersion):
  81. try:
  82. if fileCode != None and fileVersion != None:
  83. path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
  84. else:
  85. if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
  86. path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
  87. if not os.path.exists(path):
  88. os.makedirs(path)
  89. file_name = path + str(fileName)
  90. if os.path.exists(file_name):
  91. os.remove(file_name)
  92. destination = open(file_name, 'wb+')
  93. for chunk in fileName.chunks():
  94. destination.write(chunk)
  95. destination.close()
  96. else:
  97. file_name = path + str(fileName)
  98. if os.path.exists(file_name):
  99. os.remove(file_name)
  100. destination = open(file_name, 'wb+')
  101. for chunk in fileName.chunks():
  102. destination.write(chunk)
  103. destination.close()
  104. except Exception as e:
  105. errorInfo = traceback.format_exc()
  106. print('上传文件错误: %s' % errorInfo)
  107. return ResponseFormal(700,{'details':repr(e)})
  108. else:
  109. index = file_name.find('static/')
  110. filePath = file_name[index:]
  111. return ResponseFormal(0,{'filePath':filePath})
  112. def addNewEquipmentVersion(deviceContent,token):
  113. """
  114. :param deviceContent:
  115. :return:
  116. """
  117. if token is None:
  118. return ResponseJSON(311)
  119. tokenManager = JSONTokenManager()
  120. error_code = tokenManager.verify_AToken(token)
  121. if error_code == 0:
  122. pass
  123. else:
  124. return tokenManager.errorCodeInfo(error_code)
  125. userID = tokenManager.accessDict.get('userID', None)
  126. own_permission = ModelService.check_permission(userID=userID, permID=220)
  127. if own_permission is not True:
  128. # pass
  129. return ResponseFormal(404)
  130. try:
  131. # print(deviceContent)
  132. deviceData = json.loads(deviceContent)
  133. print('----------')
  134. print(deviceData)
  135. except Exception as e:
  136. return ResponseFormal(803)
  137. else:
  138. version = deviceData.get('version', None)
  139. if version != None:
  140. eVersionValid = Equipment_Version.objects.filter(version = version)
  141. # if eVersionValid:
  142. # return ResponseFormal(904)
  143. else:
  144. return ResponseFormal(806)
  145. try:
  146. filePath = deviceData.get('filePath', None)
  147. if filePath == None:
  148. return ResponseFormal(806)
  149. deviceData['filePath'] = ','.join(filePath)
  150. equipmentVersion = Equipment_Version(eid = CommonService.getUserID(getUser=False, setOTAID=True), **deviceData)
  151. equipmentVersion.save()
  152. except Exception as e:
  153. errorInfo = traceback.format_exc()
  154. print('添加设备错误: %s ' % errorInfo)
  155. return ResponseFormal(806,{'details':repr(e)})
  156. else:
  157. sqlJSON = serializers.serialize('json', [equipmentVersion])
  158. sqlList = json.loads(sqlJSON)
  159. sqlDict =dict(zip(["datas"], [sqlList]))
  160. return ResponseFormal(0,sqlDict)
  161. def downloadUrl(fileType, fileCode, fileVersion, fileName):
  162. fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
  163. if fileType == 'IPC':
  164. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  165. elif fileType == 'DVR':
  166. Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  167. elif fileType == 'NVR':
  168. Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  169. elif fileType == 'XVR':
  170. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  171. else:
  172. if fileType == 'CHM':
  173. Path = fileName
  174. else:
  175. Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
  176. if os.path.isfile(Path):
  177. try:
  178. JSON = json.dumps(
  179. {
  180. "result_code": 0,
  181. "reason": 'Success',
  182. "result": {},
  183. "error_code": 0,
  184. }, ensure_ascii=False
  185. )
  186. wrapper = FileWrapper(open(Path, 'rb'))
  187. response = HttpResponse(wrapper, content_type="application/octet-stream")
  188. response['Content-Length'] = os.path.getsize(Path)
  189. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
  190. response['Content-MD5'] = getMD5orSHA265(Path)
  191. response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
  192. response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
  193. response['Content-Error'] = JSON
  194. return response
  195. except Exception as e:
  196. errorJSON = ResponseFormal(906,{'details':repr(e)})
  197. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  198. response['Content-Error'] = errorJSON
  199. return response
  200. else:
  201. errorJSON = ResponseFormal(907)
  202. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  203. response['Content-Error'] = errorJSON
  204. return response
  205. @csrf_exempt
  206. def downloadUpdataFileUrl(request, *callback_args, **callback_kwargs):
  207. if request.method == 'GET':
  208. request_dict = request.GET
  209. elif request.method == 'POST':
  210. request_dict = request.POST
  211. else:
  212. errorJSON = ResponseFormal(801)
  213. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  214. response['Content-Error'] = errorJSON
  215. return response
  216. fileType = request_dict.get('fileType', None)
  217. fileCode = request_dict.get('fileCode', None)
  218. fileVersion = request_dict.get('fileVersion', None)
  219. fileName = request_dict.get('fileName', None)
  220. if fileType != None and fileCode != None and fileVersion != \
  221. None and fileName != None:
  222. response = downloadUrl(fileType, fileCode, fileVersion, fileName)
  223. return response
  224. else:
  225. errorJSON = ResponseFormal(800)
  226. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  227. response['Content-Error'] = errorJSON
  228. return response
  229. '''
  230. http://192.168.136.40:8077/OTA/getEquipmentVersion?31AX162001A
  231. '''
  232. @csrf_exempt
  233. def getEquipmentVersionInterface(request,
  234. *callback_args, **callback_kwargs):
  235. if request.method == "POST":
  236. request.encoding ='utf-8'
  237. code = request.POST.get('code', None)
  238. if code is not None:
  239. response = HttpResponse(getEquipmentVersion(code))
  240. return response
  241. else:
  242. return ResponseJSON(800)
  243. elif request.method == "GET":
  244. request.encoding = 'gb2312'
  245. code = request.GET.get('code', None)
  246. if code is not None:
  247. response = HttpResponse(getEquipmentVersion(code))
  248. return response
  249. else:
  250. return ResponseJSON(800)
  251. else:
  252. return ResponseJSON(801)
  253. @csrf_exempt
  254. def getUpdataFileUrlInterface(request,
  255. *callback_args, **callback_kwargs):
  256. if request.method == "POST":
  257. request.encoding = 'utf-8'
  258. request_dict = request.POST
  259. elif request.method == "GET":
  260. request.encoding = 'utf-8'
  261. request_dict = request.GET
  262. else:
  263. return ResponseJSON(801)
  264. code = request_dict.get('code', None)
  265. http_host = request.META.get('HTTP_HOST', None)
  266. if code is not None:
  267. return HttpResponse(getUpdataFileUrl(code,http_host))
  268. else:
  269. return ResponseJSON(800)
  270. @csrf_exempt
  271. def downloadUpdataFileUrlInterface(request, fileType, fileName,
  272. *callback_args, **callback_kwargs):
  273. if fileType is not None and fileName is not None:
  274. fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
  275. if fileType == 'IPC':
  276. fullPath += 'IPC/' + fileName
  277. elif fileType == 'DVR':
  278. fullPath += 'DVR/' + fileName
  279. elif fileType == 'NVR':
  280. fullPath += 'NVR/' + fileName
  281. elif fileType == 'XVR':
  282. fullPath += 'XVR/' + fileName
  283. elif fileType == 'User':
  284. fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
  285. fullPath += 'User/' + fileName
  286. elif fileType == 'ADCloud':
  287. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  288. fullPath += 'ADCloud/' + fileName
  289. elif fileType == 'ACCloud':
  290. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  291. fullPath += 'ACCloud/' + fileName
  292. else:
  293. fullPath += 'Other/' + fileName
  294. print(fullPath)
  295. if os.path.isfile(fullPath):
  296. try:
  297. JSON = ResponseFormal(0)
  298. if fileType != 'User':
  299. wrapper = FileWrapper(open(fullPath, 'rb'))
  300. response = HttpResponse(wrapper, content_type="application/octet-stream")
  301. response['Content-Length'] = os.path.getsize(fullPath)
  302. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  303. response['Content-MD5'] = getMD5orSHA265(fullPath)
  304. #校验文件md5值
  305. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  306. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  307. response['Content-Error'] = JSON
  308. return response
  309. else:
  310. Imagedata = open(fullPath, 'rb').read()
  311. response = HttpResponse(Imagedata, content_type="image/jpeg")
  312. return response
  313. except Exception as e:
  314. errorJSON = ResponseFormal(906)
  315. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  316. response['Content-Error'] = errorJSON
  317. return response
  318. else:
  319. errorJSON = ResponseFormal(907)
  320. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  321. response['Content-Error'] = errorJSON
  322. return response
  323. else:
  324. errorJSON = ResponseFormal(800)
  325. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  326. response['Content-Error'] = errorJSON
  327. return response
  328. class getUploadFiletoDirView(TemplateView):
  329. @method_decorator(csrf_exempt)
  330. def dispatch(self, *args, **kwargs):
  331. return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
  332. def post(self, request, *args, **kwargs):
  333. request.encoding = 'utf-8'
  334. token = request.POST.get('token', None)
  335. fileType = request.POST.get('fileType', None)
  336. fileCode = request.POST.get('fileCode', None)
  337. fileVersion = request.POST.get('fileVersion', None)
  338. fileName = request.FILES.get('fileName', None)
  339. return self.ValidationError(token, fileType, fileName,
  340. filefileCode=fileCode, fileVersion=fileVersion)
  341. def get(self, request, *args, **kwargs):
  342. request.encoding = 'gb2312'
  343. token = request.GET.get('token', None)
  344. fileType = request.GET.get('fileType', None)
  345. fileCode = request.GET.get('fileCode', None)
  346. fileVersion = request.GET.get('fileVersion', None)
  347. fileName = request.FILES.get('fileName', None)
  348. return self.ValidationError(token, fileType, fileName,filefileCode=fileCode, fileVersion=fileVersion)
  349. def ValidationError(self, token, fileType, fileName, *args, **kwargs):
  350. if fileName != None and fileType != None and token != None:
  351. tM = JSONTokenManager()
  352. error_code = tM.verify_AToken(token)
  353. if error_code == 0:
  354. userID = tM.accessDict.get('userID', None)
  355. if userID:
  356. own_permission = ModelService.check_permission(userID=userID, permID=210)
  357. if own_permission is True:
  358. fileCode = kwargs.get('fileCode', None)
  359. fileVersion = kwargs.get('fileVersion', None)
  360. if fileVersion != None and fileCode != None:
  361. response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName,
  362. fileCode, fileVersion=fileVersion))
  363. return response
  364. else:
  365. response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName))
  366. return response
  367. else:
  368. return ResponseJSON(404)
  369. else:
  370. return ResponseJSON(310)
  371. else:
  372. response = HttpResponse(tM.errorCodeInfo(error_code))
  373. return response
  374. else:
  375. return ResponseJSON(800)
  376. def getUploadFiletoDir(self, userID, fileType, fileName, *args, **kwargs):
  377. """
  378. 将上传的文件写入服务器对应目录下
  379. :param Type: equipment type
  380. :param fileName: File name of upgrade file.
  381. :return: filePath
  382. """
  383. try:
  384. User = Device_User.objects.filter(userID = userID)
  385. except Exception as e:
  386. errorInfo = traceback.format_exc()
  387. print('查询数据库错误: %s' % errorInfo)
  388. return ResponseFormal(500,{'details':repr(e)})
  389. else:
  390. if not User:
  391. return ResponseFormal(113)
  392. own_perm = ModelService.check_permission(userID,permID=210)
  393. if own_perm is not True:
  394. return ResponseFormal(605)
  395. updataFile = fileName.name
  396. updataFile = updataFile.replace(' ', '+')
  397. versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
  398. codeIndex = versionIndex + 12
  399. if codeIndex != -1 and versionIndex != -1:
  400. fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
  401. fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
  402. updataFile[versionIndex + 1: codeIndex] or None
  403. if fileCode is not None and fileVersion is not None:
  404. return getDir(fileType, fileName, fileCode, fileVersion)
  405. else:
  406. fileCode = kwargs.get('fileCode', None)
  407. fileVersion = kwargs.get('fileVersion', None)
  408. print(fileCode, fileVersion)
  409. if fileCode != None and fileVersion != None:
  410. return getDir(fileType, fileName, fileCode, fileVersion)
  411. else:
  412. return ResponseFormal(903)
  413. else:
  414. fileCode = kwargs.get('fileCode', None)
  415. fileVersion = kwargs.get('fileVersion', None)
  416. if fileCode != None and fileVersion != None:
  417. return getDir(fileType, fileName, fileCode, fileVersion)
  418. else:
  419. return ResponseFormal(903)
  420. @csrf_exempt
  421. def addNewEquipmentVersionInterface(request, *callback_args,
  422. **callback_kwargs):
  423. if request.method == "POST":
  424. request.encoding = 'utf-8'
  425. deviceContent = request.POST.get('content', None).encode('utf-8')
  426. token = request.POST.get('token', None)
  427. deviceContent = str(deviceContent, encoding='utf-8')
  428. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  429. print(deviceContent, type(deviceContent))
  430. if deviceContent is not None:
  431. response = HttpResponse(addNewEquipmentVersion(deviceContent,token))
  432. return response
  433. else:
  434. return ResponseJSON(800)
  435. elif request.method == "GET":
  436. request.encoding = 'gb2312'
  437. deviceContent = request.GET.get('content', None).encode('gb2312')
  438. deviceContent = str(deviceContent, encoding='gb2312')
  439. token = request.GET.get('token', None)
  440. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  441. if deviceContent is not None:
  442. response = HttpResponse(addNewEquipmentVersion(deviceContent,token))
  443. return response
  444. else:
  445. return ResponseJSON(800)
  446. else:
  447. return ResponseJSON(801)
  448. @csrf_exempt
  449. def showAllEquipmentVersion(userID):
  450. try:
  451. userValid = Device_User.objects.filter(userID = userID).order_by('-data_joined')
  452. except Exception as e:
  453. errorInfo = traceback.format_exc()
  454. print('查询数据库错误: %s' % errorInfo)
  455. return ResponseFormal(500)
  456. else:
  457. if userValid:
  458. own_permission = ModelService.check_permission(userID=userID, permID=240)
  459. if own_permission:
  460. sqlJSON = serializers.serialize('json', Equipment_Version.objects.all()) # .order_by('-data_joined'))
  461. sqlList = json.loads(sqlJSON)
  462. print(sqlList, sqlJSON)
  463. sqlDict = dict(zip(["datas"], [sqlList]))
  464. return ResponseFormal(0,sqlDict)
  465. else:
  466. return ResponseFormal(604)
  467. else:
  468. return ResponseFormal(113)
  469. @csrf_exempt
  470. def showAllEquipmentVersionInterface(request, *callback_args,
  471. **callback_kwargs):
  472. if request.method == 'POST':
  473. token = request.POST.get('token', None)
  474. if token != None:
  475. tM = JSONTokenManager()
  476. error_code = tM.verify_AToken(token)
  477. if error_code == 0:
  478. userID = tM.accessDict.get('userID', None)
  479. if userID:
  480. response = HttpResponse(showAllEquipmentVersion(userID))
  481. return response
  482. else:
  483. return ResponseJSON(310)
  484. else:
  485. response = HttpResponse(tM.errorCodeInfo(error_code))
  486. return response
  487. else:
  488. return ResponseJSON(800)
  489. elif request.method == 'GET':
  490. token = request.GET.get('token', None)
  491. if token != None:
  492. tM = JSONTokenManager()
  493. error_code = tM.verify_AToken(token)
  494. if error_code == 0:
  495. userID = tM.accessDict.get('userID', None)
  496. if userID:
  497. response = HttpResponse(showAllEquipmentVersion(userID))
  498. return response
  499. else:
  500. return ResponseJSON(310)
  501. else:
  502. response = HttpResponse(tM.errorCodeInfo(error_code))
  503. return response
  504. else:
  505. return ResponseJSON(800)
  506. import zlib
  507. @csrf_exempt
  508. def getCRC32(filePath):
  509. print(filePath)
  510. block_size = 1024 * 1024
  511. crc = 0
  512. try:
  513. fd = open(filePath, 'rb')
  514. while True:
  515. buffer = fd.read(block_size)
  516. if len(buffer) == 0: # EOF or file empty. return hashes
  517. fd.close()
  518. return crc # 返回的是十进制的值
  519. crc = zlib.crc32(buffer, crc)
  520. except Exception as e:
  521. return ResponseFormal(908,{'details':repr(e)})
  522. def getMD5orSHA265(fileName, encryptionType='MD5'):
  523. """
  524. :param filePath:
  525. :param encryptionType:
  526. :return:
  527. """
  528. if not os.path.isfile(fileName):
  529. return ''
  530. else:
  531. if encryptionType == 'MD5':
  532. encryption = hashlib.md5()
  533. elif encryptionType == 'SHA265':
  534. encryption = hashlib.sha256()
  535. elif encryptionType == 'CRC32':
  536. f = open(fileName, 'rb')
  537. chunk = f.read()
  538. return crc32(chunk)
  539. f = open(fileName, 'rb')
  540. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  541. while True:
  542. chunk = f.read(block_size)
  543. if not chunk:
  544. break
  545. encryption.update(chunk)
  546. f.close()
  547. return encryption.hexdigest()
  548. def CRC(fileName):
  549. fd = open(fileName, 'rb')
  550. dwSize = os.path.getsize(fileName)
  551. lpBuffer = fd.read()
  552. crc = -1
  553. CRC32Table = [0] * 256
  554. ulPolynomial = 0x04C11DB7
  555. len = dwSize
  556. buffer = lpBuffer
  557. for index in range(0xFF):
  558. value = 0
  559. ref = index
  560. for n in range(9):
  561. if ref & 1:
  562. value |= 1 << (8 - n)
  563. ref >>= 1
  564. CRC32Table[index] = value << 24
  565. for j in range(8):
  566. CRC32 = CRC32Table[index] & (1 << 31) and ulPolynomial or 0
  567. CRC32Table[index] = (CRC32Table[index] << 1) ^ CRC32
  568. value = 0
  569. ref = CRC32Table[index]
  570. for n in range(33):
  571. if ref & 1:
  572. value |= 1 << (32 - n)
  573. ref >>= 1
  574. CRC32Table[index] = value
  575. index = 0
  576. while len:
  577. len -= 1
  578. crc = (crc >> 8) ^ CRC32Table[(crc & 0xFF) ^ buffer[index]]
  579. index += 1
  580. print(crc ^ 0xffffffff)
  581. return crc ^ 0xffffffff