PcInfo.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. import hashlib
  2. import logging
  3. import shutil
  4. import time
  5. import traceback
  6. import os
  7. from urllib import request, parse
  8. import requests
  9. from django.http import HttpResponse
  10. from django.views.generic.base import View
  11. from Model.models import Pc_Info
  12. from Object.ResponseObject import ResponseObject
  13. from Object.TokenObject import TokenObject
  14. from Service.CommonService import CommonService
  15. from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, BASE_DIR
  16. import boto3
  17. import botocore
  18. from botocore import client
  19. from wsgiref.util import FileWrapper
  20. from zlib import crc32
  21. class PcInfo(View):
  22. def dispatch(self, requset, *args, **kwargs):
  23. return super(PcInfo, self).dispatch(requset, *args, **kwargs)
  24. def get(self, request, *args, **kwargs):
  25. operation = kwargs.get('operation')
  26. request.encoding = 'utf-8'
  27. return self.validation(request.GET, request, operation)
  28. def post(self, request, *args, **kwargs):
  29. operation = kwargs.get('operation')
  30. request.encoding = 'utf-8'
  31. return self.validation(request.POST, request, operation)
  32. def validation(self, request_dict, request, operation):
  33. response = ResponseObject()
  34. if not operation:
  35. return response.json(444, 'operation')
  36. else:
  37. if operation == 'query': # pc端调用查询
  38. return self.query(request_dict, response)
  39. elif operation == 's3addandupload':
  40. return self.s3addandupload(request_dict, response, request)
  41. elif operation == 's3download':
  42. return self.s3download(request_dict, response)
  43. elif operation == 's3delete':
  44. return self.s3delete(request_dict, response)
  45. elif operation == 'getnewversion': # 获取当前软件的最新版本
  46. return self.getnewversion(request_dict, response)
  47. elif operation == 'queryall': # 后台查询
  48. return self.queryall(request_dict, response)
  49. elif operation == 'addandupload': # 上传到服务器
  50. return self.addandupload(request_dict, response, request)
  51. elif operation == 'download': # 服务器下载
  52. return self.download(request_dict, response)
  53. elif operation == 'delete':
  54. return self.delete(request_dict, response)
  55. else:
  56. return response.json(414)
  57. def getnewversion(self, request_dict, response, ):
  58. pc_name = request_dict.get('pc_name', None)
  59. bundle_version = request_dict.get('bundle_version', None)
  60. pc_version = request_dict.get('pc_version', None)
  61. pc_test = request_dict.get('pc_test', None)
  62. param_flag = CommonService.get_param_flag(
  63. data=[pc_name, bundle_version, pc_version, pc_test])
  64. if param_flag is not True:
  65. return response.json(444)
  66. file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_test=pc_test)
  67. if not file:
  68. return response.json(173)
  69. app_list = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_test=pc_test)
  70. new_version = app_list.order_by('-add_time')[0].pc_version
  71. if pc_version == new_version:
  72. return response.json(10045)
  73. else:
  74. path = app_list.order_by('-add_time')[0].download_link
  75. print('path', path)
  76. aws_s3_guonei = boto3.client(
  77. 's3',
  78. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  79. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  80. config=botocore.client.Config(signature_version='s3v4'),
  81. region_name='cn-northwest-1')
  82. response_url = aws_s3_guonei.generate_presigned_url(
  83. ClientMethod='get_object',
  84. Params={'Bucket': 'pc-package', 'Key': path}, ExpiresIn=3600)
  85. res = {'pc_name': pc_name,
  86. 'new_version': new_version,
  87. 'path': path,
  88. 'response_url': response_url}
  89. return response.json(0, res)
  90. def query(self, request_dict, response):
  91. pc_name = request_dict.get('pc_name', None)
  92. package = request_dict.get('package', None)
  93. file_type = request_dict.get('file_type', None)
  94. if package is None and file_type is None and pc_name is None:
  95. queryset = Pc_Info.objects.all()
  96. elif package and file_type is None and pc_name is None:
  97. queryset = Pc_Info.objects.filter(package=package)
  98. elif file_type and package is None and pc_name is None:
  99. queryset = Pc_Info.objects.filter(file_type=file_type)
  100. elif pc_name and file_type and package is None:
  101. queryset = Pc_Info.objects.filter(pc_name=pc_name).filter(file_type=file_type)
  102. elif file_type and package and pc_name is None:
  103. queryset = Pc_Info.objects.filter(file_type=file_type).filter(package=package)
  104. count = queryset.count()
  105. res = queryset
  106. send_json = CommonService.qs_to_dict(res)
  107. send_json['count'] = count
  108. return response.json(0, send_json)
  109. def s3addandupload(self, request_dict, response, request):
  110. logger = logging.getLogger('info')
  111. logger.info('s3方式上传参数:')
  112. logger.info(request_dict)
  113. token = request_dict.get('token', None)
  114. tko = TokenObject(token)
  115. response.lang = tko.lang
  116. if tko.code != 0:
  117. return response.json(tko.code)
  118. userID = tko.userID
  119. if not userID:
  120. return response.json(104)
  121. pc_name = request_dict.get('pc_name', None)
  122. bundle_version = request_dict.get('bundle_version', None)
  123. pc_version = request_dict.get('pc_version', None)
  124. pc_test = request_dict.get('pc_test', None)
  125. lang = request_dict.get('lang', None)
  126. file_name = request.FILES.get('file_name', None)
  127. file_type = request_dict.get('file_type', None)
  128. package = request_dict.get('package', None)
  129. explain = request_dict.get('explain', '')
  130. logger.info('文件名字:')
  131. logger.info(file_name)
  132. param_flag = CommonService.get_param_flag(
  133. data=[pc_name, bundle_version, pc_version, pc_test, lang, file_name, file_type, package])
  134. if param_flag is not True:
  135. return response.json(444)
  136. else:
  137. file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version,
  138. pc_version=pc_version, pc_test=pc_test)
  139. if file:
  140. return response.json(174)
  141. try:
  142. logger.info('开始上传')
  143. # 把安装包上传到s3
  144. aws_s3_guonei = boto3.client(
  145. 's3',
  146. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  147. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  148. config=botocore.client.Config(signature_version='s3v4'),
  149. region_name='cn-northwest-1'
  150. )
  151. download_link = '{pc_name}/{pc_version}_{bundle_version}_{pc_test}_{file_s}'.format(
  152. pc_name=pc_name, pc_version=pc_version, bundle_version=bundle_version,
  153. pc_test=pc_test, file_s=str(file_name))
  154. response_url = aws_s3_guonei.generate_presigned_url(
  155. ClientMethod='put_object',
  156. Params={
  157. 'Bucket': 'pc-package',
  158. 'Key': download_link
  159. },
  160. ExpiresIn=3600
  161. )
  162. # 通过上传签名url对文件进行上传
  163. requests.put(response_url, data=file_name)
  164. logger.info('上传完成')
  165. add_time = time.time()
  166. create_dict = {
  167. 'pc_name': pc_name,
  168. 'bundle_version': bundle_version,
  169. 'pc_version': pc_version,
  170. 'pc_test': pc_test,
  171. 'lang': lang,
  172. 'download_link': download_link,
  173. 'add_time': add_time,
  174. 'update_time': add_time,
  175. 'file_type': file_type,
  176. 'package': package,
  177. 'explain': explain
  178. }
  179. pc_Info = Pc_Info(**create_dict)
  180. pc_Info.save()
  181. except Exception:
  182. errorInfo = traceback.format_exc()
  183. print(errorInfo)
  184. return response.json(500, {'details': errorInfo})
  185. else:
  186. if pc_Info.id:
  187. res = {'id': pc_Info.id,
  188. 'pc_name': pc_Info.pc_name,
  189. 'bundle_version': pc_Info.bundle_version,
  190. 'pc_version': pc_Info.pc_version,
  191. 'pc_test': pc_Info.pc_test,
  192. 'download_link': pc_Info.download_link,
  193. 'lang': pc_Info.lang,
  194. 'add_time': pc_Info.add_time,
  195. 'update_time': pc_Info.update_time,
  196. 'file_type': pc_Info.file_type,
  197. 'package': pc_Info.package,
  198. 'explain': pc_Info.explain
  199. }
  200. return response.json(0, res)
  201. else:
  202. return response.json(500)
  203. def s3download(self, request_dict, response):
  204. pc_name = request_dict.get('pc_name', None)
  205. bundle_version = request_dict.get('bundle_version', None)
  206. pc_version = request_dict.get('pc_version', None)
  207. pc_test = request_dict.get('pc_test', None)
  208. param_flag = CommonService.get_param_flag(
  209. data=[pc_name, bundle_version, pc_version, pc_test])
  210. if param_flag is not True:
  211. return response.json(444)
  212. path = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version,
  213. pc_test=pc_test).values('download_link')
  214. if not path:
  215. return response.json(173)
  216. path = path[0]['download_link']
  217. aws_s3_guonei = boto3.client(
  218. 's3',
  219. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  220. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  221. config=botocore.client.Config(signature_version='s3v4'),
  222. region_name='cn-northwest-1'
  223. )
  224. response_url = aws_s3_guonei.generate_presigned_url(
  225. ClientMethod='get_object',
  226. Params={
  227. 'Bucket': 'pc-package',
  228. 'Key': path
  229. },
  230. ExpiresIn=3600
  231. )
  232. res = {'path': path,
  233. 'response_url': response_url
  234. }
  235. return response.json(0, res)
  236. def s3delete(self, request_dict, response):
  237. global file
  238. token = request_dict.get('token', None)
  239. tko = TokenObject(token)
  240. response.lang = tko.lang
  241. if tko.code != 0:
  242. return response.json(tko.code)
  243. userID = tko.userID
  244. if not userID:
  245. return response.json(104)
  246. id = request_dict.get('id', None)
  247. package = request_dict.get('package', None)
  248. if id and package:
  249. return response.json(444)
  250. elif id and package is None:
  251. file = Pc_Info.objects.filter(id=id)
  252. elif package and id is None:
  253. file = Pc_Info.objects.filter(package=package)
  254. if not file.exists():
  255. return response.json(173)
  256. try:
  257. # 删除s3和数据库里的相应数据
  258. file_path = file[0].download_link
  259. print(file_path)
  260. aws_s3_guonei = boto3.client(
  261. 's3',
  262. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  263. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  264. config=botocore.client.Config(signature_version='s3v4'),
  265. region_name='cn-northwest-1'
  266. )
  267. aws_s3_guonei.delete_object(Bucket='pc-package', Key=file_path)
  268. file.delete()
  269. except Exception as e:
  270. return response.json(176, repr(e))
  271. else:
  272. return response.json(0)
  273. def queryall(self, request_dict, response):
  274. token = request_dict.get('token', None)
  275. tko = TokenObject(token)
  276. response.lang = tko.lang
  277. if tko.code != 0:
  278. return response.json(tko.code)
  279. userID = tko.userID
  280. if not userID:
  281. return response.json(104)
  282. page = int(request_dict.get('page', None))
  283. line = int(request_dict.get('line', None))
  284. if page is None or line is None:
  285. return response.json(444, 'page,line')
  286. queryset = Pc_Info.objects.all()
  287. if queryset.exists():
  288. count = queryset.count()
  289. res = queryset[(page - 1) * line:page * line]
  290. send_json = CommonService.qs_to_dict(res)
  291. send_json['count'] = count
  292. return response.json(0, send_json)
  293. else:
  294. return response.json(173)
  295. def addandupload(self, request_dict, response, request):
  296. token = request_dict.get('token', None)
  297. tko = TokenObject(token)
  298. response.lang = tko.lang
  299. if tko.code != 0:
  300. return response.json(tko.code)
  301. userID = tko.userID
  302. if not userID:
  303. return response.json(104)
  304. pc_name = request_dict.get('pc_name', None)
  305. bundle_version = request_dict.get('bundle_version', None)
  306. pc_version = request_dict.get('pc_version', None)
  307. pc_test = request_dict.get('pc_test', None)
  308. lang = request_dict.get('lang', None)
  309. file_name = request.FILES.get('file_name', None)
  310. param_flag = CommonService.get_param_flag(
  311. data=[pc_name, bundle_version, pc_version, pc_test, lang, file_name])
  312. if param_flag is not True:
  313. return response.json(444)
  314. else:
  315. file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version,
  316. pc_version=pc_version, pc_test=pc_test)
  317. if file:
  318. return response.json(174)
  319. try:
  320. # 安装包上传到服务器本地
  321. file_path = 'static/pc/' + pc_name
  322. if not os.path.exists(file_path):
  323. os.makedirs(os.path.join(BASE_DIR, file_path))
  324. a = os.path.splitext(str(file_name))[-1]
  325. if not a:
  326. return response.json(444, "文件无后缀")
  327. name = pc_version + '_' + bundle_version + '_' + pc_test + str(a)
  328. file_path = file_path + '/' + str(name)
  329. upload_path = os.path.join(BASE_DIR, file_path)
  330. print('upload_path:', upload_path)
  331. with open(upload_path, 'wb+') as destination:
  332. for chunk in file_name.chunks():
  333. destination.write(chunk)
  334. add_time = time.time()
  335. create_dict = {
  336. 'pc_name': pc_name,
  337. 'bundle_version': bundle_version,
  338. 'pc_version': pc_version,
  339. 'pc_test': pc_test,
  340. 'lang': lang,
  341. 'download_link': file_path,
  342. 'add_time': add_time,
  343. 'update_time': add_time
  344. }
  345. pc_Info = Pc_Info(**create_dict)
  346. pc_Info.save()
  347. except Exception:
  348. errorInfo = traceback.format_exc()
  349. print(errorInfo)
  350. return response.json(700, {'details': errorInfo})
  351. else:
  352. if pc_Info.id:
  353. res = {'pc_name': pc_Info.pc_name,
  354. 'bundle_version': pc_Info.bundle_version,
  355. 'pc_version': pc_Info.pc_version,
  356. 'pc_test': pc_Info.pc_test,
  357. 'download_link': pc_Info.download_link,
  358. 'lang': pc_Info.lang,
  359. 'add_time': pc_Info.add_time,
  360. 'update_time': pc_Info.update_time
  361. }
  362. return response.json(0, res)
  363. else:
  364. return response.json(500)
  365. def download(self, request_dict, response):
  366. pc_name = request_dict.get('pc_name', None)
  367. bundle_version = request_dict.get('bundle_version', None)
  368. pc_version = request_dict.get('pc_version', None)
  369. pc_test = request_dict.get('pc_test', None)
  370. param_flag = CommonService.get_param_flag(
  371. data=[pc_name, bundle_version, pc_version, pc_test])
  372. if param_flag is not True:
  373. return response.json(444)
  374. path = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version,
  375. pc_test=pc_test).values('download_link')
  376. if not path:
  377. return response.json(173)
  378. filepath = path[0]['download_link']
  379. fullPath = os.path.join(BASE_DIR, filepath)
  380. fullPath.replace('\\', '/')
  381. res = ResponseObject()
  382. print('fullPath:')
  383. print(fullPath)
  384. print(os.path.basename(fullPath))
  385. if fullPath:
  386. if os.path.isfile(fullPath):
  387. try:
  388. wrapper = FileWrapper(open(fullPath, 'rb'))
  389. response = HttpResponse(wrapper, content_type="application/octet-stream")
  390. response['Content-Length'] = os.path.getsize(fullPath)
  391. response['Content-Disposition'] = 'attachment; filename={}'.format(parse.quote_plus(os.path.basename(fullPath), encoding="utf-8"))
  392. response['Content-MD5'] = getMD5orSHA265(fullPath)
  393. # 校验文件md5值
  394. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  395. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  396. response['Content-Error'] = res.formal(0)
  397. return response
  398. except Exception as e:
  399. return res.json(906, repr(e))
  400. else:
  401. return res.json(907)
  402. else:
  403. return res.json(444, 'fullPath')
  404. def delete(self, request_dict, response):
  405. token = request_dict.get('token', None)
  406. tko = TokenObject(token)
  407. response.lang = tko.lang
  408. if tko.code != 0:
  409. return response.json(tko.code)
  410. userID = tko.userID
  411. if not userID:
  412. return response.json(104)
  413. id = request_dict.get('id', None)
  414. param_flag = CommonService.get_param_flag(data=[id])
  415. if param_flag is not True:
  416. return response.json(444)
  417. file = Pc_Info.objects.filter(id=id)
  418. if not file.exists():
  419. return response.json(173)
  420. try:
  421. # 删除文件,文件夹和数据库里的相应数据
  422. file_path = file[0].download_link
  423. file_path = os.path.join(BASE_DIR, file_path).replace('\\', '/')
  424. os.remove(file_path)
  425. # file_path = file_path.split("/")
  426. # file_path = [str(i) for i in file_path][:-1]
  427. # file_path = "/".join(file_path)
  428. # shutil.rmtree(file_path)
  429. file.delete()
  430. except Exception as e:
  431. return response.json(176, repr(e))
  432. else:
  433. return response.json(0)
  434. def getMD5orSHA265(fileName, encryptionType='MD5'):
  435. """
  436. :param filePath:
  437. :param encryptionType:
  438. :return:
  439. """
  440. if not os.path.isfile(fileName):
  441. return ''
  442. else:
  443. if encryptionType == 'MD5':
  444. encryption = hashlib.md5()
  445. elif encryptionType == 'SHA265':
  446. encryption = hashlib.sha256()
  447. elif encryptionType == 'CRC32':
  448. f = open(fileName, 'rb')
  449. chunk = f.read()
  450. return crc32(chunk)
  451. f = open(fileName, 'rb')
  452. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  453. while True:
  454. chunk = f.read(block_size)
  455. if not chunk:
  456. break
  457. encryption.update(chunk)
  458. f.close()
  459. return encryption.hexdigest()