views.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import os
  5. from django.http import StreamingHttpResponse
  6. from typing import TYPE_CHECKING
  7. from apilib.utils_json import JsonResponse
  8. from apps.web.api.models import DeviceVersionConfig
  9. from apps.web.device.models import Device
  10. logger = logging.getLogger(__name__)
  11. if TYPE_CHECKING:
  12. pass
  13. DEVICE_VERSION_BASE_PATH = '/var/www/uploaded/version'
  14. DEVICE_VERSION_BUFFER = dict()
  15. def get_firmware_upgrade_file(request):
  16. def file_iterator(file_name, chunk_size = 512):
  17. with open(file_name) as f:
  18. while True:
  19. c = f.read(chunk_size)
  20. if c:
  21. yield c
  22. else:
  23. break
  24. project_key = request.GET.get('project_key')
  25. dev_no = request.GET.get('imei')
  26. version = str(request.GET.get('version'))
  27. logger.debug('project key = {}; imei = {}; version = {}'.format(project_key, dev_no, version))
  28. dev = Device.get_dev(dev_no)
  29. if not dev:
  30. logger.debug('{} is not exists.'.format(dev_no))
  31. return JsonResponse({"payload": {}}, status = 404)
  32. if project_key not in ['vivostone', 'viveston']:
  33. logger.debug('project key {} is not mine.'.format(project_key))
  34. return JsonResponse({"payload": {}}, status = 404)
  35. tokens = version.split('.')
  36. match_version = '{}.{}.'.format(tokens[0], tokens[1])
  37. config = DeviceVersionConfig.objects(matchVersions = match_version,
  38. allowable = True).first() # type: DeviceVersionConfig
  39. if not config:
  40. logger.debug('config is not exits.')
  41. return JsonResponse({"payload": {}}, status = 404)
  42. version_path = '{}/{}'.format(DEVICE_VERSION_BASE_PATH, config.filePath).format(dev['driverCode'])
  43. if version_path not in DEVICE_VERSION_BUFFER:
  44. if not os.path.isfile(version_path):
  45. return JsonResponse({"payload": {}}, status = 404)
  46. content = file_iterator(version_path)
  47. DEVICE_VERSION_BUFFER[version_path] = content
  48. else:
  49. content = DEVICE_VERSION_BUFFER[version_path]
  50. response = StreamingHttpResponse(content)
  51. response['Content-Type'] = 'application/octet-stream'
  52. response['Content-Disposition'] = 'attachment;filename=%s' % version_path
  53. response['Content-Length'] = os.path.getsize(version_path)
  54. return response