123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging
- import os
- from django.http import StreamingHttpResponse
- from typing import TYPE_CHECKING
- from apilib.utils_json import JsonResponse
- from apps.web.api.models import DeviceVersionConfig
- from apps.web.device.models import Device
- logger = logging.getLogger(__name__)
- if TYPE_CHECKING:
- pass
- DEVICE_VERSION_BASE_PATH = '/var/www/uploaded/version'
- DEVICE_VERSION_BUFFER = dict()
- def get_firmware_upgrade_file(request):
- def file_iterator(file_name, chunk_size = 512):
- with open(file_name) as f:
- while True:
- c = f.read(chunk_size)
- if c:
- yield c
- else:
- break
- project_key = request.GET.get('project_key')
- dev_no = request.GET.get('imei')
- version = str(request.GET.get('version'))
- logger.debug('project key = {}; imei = {}; version = {}'.format(project_key, dev_no, version))
- dev = Device.get_dev(dev_no)
- if not dev:
- logger.debug('{} is not exists.'.format(dev_no))
- return JsonResponse({"payload": {}}, status = 404)
- if project_key not in ['vivostone', 'viveston']:
- logger.debug('project key {} is not mine.'.format(project_key))
- return JsonResponse({"payload": {}}, status = 404)
- tokens = version.split('.')
- match_version = '{}.{}.'.format(tokens[0], tokens[1])
- config = DeviceVersionConfig.objects(matchVersions = match_version,
- allowable = True).first() # type: DeviceVersionConfig
- if not config:
- logger.debug('config is not exits.')
- return JsonResponse({"payload": {}}, status = 404)
- version_path = '{}/{}'.format(DEVICE_VERSION_BASE_PATH, config.filePath).format(dev['driverCode'])
- if version_path not in DEVICE_VERSION_BUFFER:
- if not os.path.isfile(version_path):
- return JsonResponse({"payload": {}}, status = 404)
- content = file_iterator(version_path)
- DEVICE_VERSION_BUFFER[version_path] = content
- else:
- content = DEVICE_VERSION_BUFFER[version_path]
- response = StreamingHttpResponse(content)
- response['Content-Type'] = 'application/octet-stream'
- response['Content-Disposition'] = 'attachment;filename=%s' % version_path
- response['Content-Length'] = os.path.getsize(version_path)
- return response
|