#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) import gateway from gateway import die gw = gateway.Gateway() if not gw.device_name: die("Устройство Xiaomi Mi Wi-Fi не найдено! (IP: {})".format(gateway.ip_addr)) fn_dir = 'firmware/' fn_dir2 = fn_dir + '/tmp/' fn_kernel = fn_dir2 + 'kernel.bin' fn_rootfs = fn_dir2 + 'rootfs.bin' os.makedirs(fn_dir2, exist_ok = True) fn_list = [f for f in os.listdir(fn_dir) if os.path.isfile(os.path.join(fn_dir, f))] if not fn_list: die("В папке {} прошивка не найдена!".format(fn_dir)) fn_local = fn_dir + fn_list[0] print("Считываю файл {}".format(fn_local)) with open(fn_local, "rb") as file: data = file.read() fw_type = None if data[:4] == b'HDR1' or data[:4] == b'HDR2': fw_type = 'stock' die("Стоковые прошивки Xiaomi не поддерживаются!") if data[:4] == b"\x27\x05\x19\x56": # uImage fw_type = 'factory' if data[:10] == b"sysupgrade": # TAR fw_type = 'sysupgrade' die("SysUpgrade прошивки (TAR-архивы) не поддерживаются!") if not fw_type: die("Неизвестный тип прошивки (header = {})".format(data[:16])) if data[:4] == b"\x27\x05\x19\x56": fw_type = 'factory' if fw_type == 'factory': pos = 0x0C kernel_size = int.from_bytes(data[pos:pos+4], byteorder='big') kernel_size += 0x40 if (kernel_size > len(data) - 1024): die("initramfs прошивки не поддерживаются!") rootfs_offset = data.find(b'UBI#', kernel_size) if (rootfs_offset <= 0): die("В прошивке не найден раздел rootfs!") #if (rootfs_offset < 4*1024*1024): # kernel_size = rootfs_offset kernel_data = data[:kernel_size] with open(fn_kernel, "wb") as file: file.write(kernel_data) with open(fn_rootfs, "wb") as file: file.write(data[rootfs_offset:]) sys.exit(0) hhjhjhhjhj print("Загружаем: " + fn_local) gw.upload(fn_local, fn_remote) for filename in [fn for fn in os.listdir(fn_dir) if fn.split(".")[-1] in ['lmo']]: print("Загружаем: " + filename) gw.upload(fn_dir + '/' + filename, '/tmp/' + filename) print("Загрузка файлов завершена") print ("Настраиваем...") gw.run_cmd("sh " + fn_remote) print("Готово! Языковые файлы установлены.")