# -*- 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