diff --git a/connect7.py b/connect7.py index 41c55ea..444380b 100644 --- a/connect7.py +++ b/connect7.py @@ -31,13 +31,13 @@ try: resp.raise_for_status() except: - raise ExploitNotWorked('Exploit "get_icon" not working!!! (API not founded)') - for chunk in resp.iter_content(chunk_size = 8192): + raise ExploitNotWorked('Exploit "get_icon" not working!!! (API not found)') + for chunk in resp.iter_content(chunk_size = 8192): if chunk.startswith(b'\x89PNG'): api_get_icon_status = 1 if api_get_icon_status <= 0: - raise ExploitNotWorked('Exploit "get_icon" not working!!! (api not founded)') + raise ExploitNotWorked('Exploit "get_icon" not working!!! (api not found)') import hashlib @@ -88,7 +88,7 @@ def get_python_exe(): if ':\\' in fn: return fn raise RuntimeError('Cannot get python executable filename!') - + def gen_rule_name(prefix, app): if not app: app = get_python_exe() @@ -102,7 +102,7 @@ def gen_rule_name(prefix, app): rule_name = gen_rule_name(srv_fw_rule, rule_app) txt = get_firewall_rule(rule_name) if not txt or f' {rule_name}\n' not in txt: - print('WARN: Firewall rule for XMiR-Patcher not founded!') + print('WARN: Firewall rule for XMiR-Patcher not found!') print('INFO: Try add new rule to Windows Firewall...') add_firewall_rule(rule_name, rule_app) time.sleep(0.5) @@ -119,7 +119,7 @@ def gen_rule_name(prefix, app): class XmirHttpServer(HTTPServer): timeout = 3 retcode = 0 - + def server_bind(self): import ssl root_dir = os.path.dirname(os.path.abspath(__file__)) @@ -131,17 +131,17 @@ def server_bind(self): ctx.load_cert_chain(certfile = certfile, keyfile = keyfile) self.socket = ctx.wrap_socket(self.socket, server_side = True) super().server_bind() - + def server_activate(self): global srvInitEvent super().server_activate() print(f'SERVER: start and wait request from client...') srvInitEvent.set() - + def handle_timeout(self): print(f"SERVER: Timed out! (timeout = {self.timeout})") self.retcode = -1 - + def __del__(self): global srvInitEvent print(f'SERVER: destroy with retcode = {self.retcode}') @@ -153,7 +153,7 @@ class HttpHandler(BaseHTTPRequestHandler): def __init__(self, *args, **kwargs): http_server.BaseHTTPRequestHandler.__init__(self, *args, **kwargs) - + def do_GET(self): print(f'SERVER: get request = {self.path}') if self.server.action_path not in self.path: @@ -239,7 +239,7 @@ def install_exploit(api = 'API/xqsystem/get_icon'): global gw, srv_ip_addr, srv_port, srvInitEvent from threading import Thread srv_timeout = 3 - ret_code = [ None ] + ret_code = [ None ] srvInitEvent.clear() server = Thread(target = wait_req_and_send_resp, args = [ payload_name, payload_body, srv_ip_addr, ret_code, srv_timeout ]) server.start() @@ -253,7 +253,7 @@ def install_exploit(api = 'API/xqsystem/get_icon'): except Exception: raise ExploitNotWorked(f'Exploit "get_icon" not working!!! Cannot transfer Payload to router!') resp_body = b'' - for chunk in resp.iter_content(chunk_size = 8192): + for chunk in resp.iter_content(chunk_size = 8192): resp_body += chunk print(f'Readed response size = {len(resp_body)} bytes') server.join(timeout = 10) diff --git a/install_fw.py b/install_fw.py index dca269b..c5b7743 100644 --- a/install_fw.py +++ b/install_fw.py @@ -54,13 +54,13 @@ class Image(): data2 = None # unpacked kernel image dtb = None # device-tree cmd = None - + def __init__(self, type): self.type = type - + def get_data_size(self, KB = False): return 0 if self.data is None else len(self.data) - + data_size = property(get_data_size) def extract_str(data, offset = 0, maxlen = 256, encoding = 'UTF8'): @@ -122,7 +122,7 @@ def found_all_images(self): img.type = None if data[:4] == b'HDR1' or data[:4] == b'HDR2': img.type = 'stock' - if data[:4] == UIMAGE_MAGIC: # uImage + if data[:4] == UIMAGE_MAGIC: # uImage img.type = 'factory' if data[:4] == FDT_MAGIC: # factory squashfs image img.type = 'factory' @@ -230,7 +230,7 @@ def parse_image(self, image, img_name): if image[:4] == b'cs6c': print(f'Images "cs6c" not supported!') return hr - + def parse_stock_image(self, image): data = image if data[:4] == b'HDR2': @@ -270,15 +270,15 @@ def parse_stock_image(self, image): self.current_image_pos = img.offset + hdr_size #print('offset = {} header = {}'.format("%08X" % (img.offset + hdr_size), img.data[:4])) imglst.append(img) - + if not imglst: die('Incorrect stock image! (5)') - + self.img_stock = True self.img_stock_names = { } for i, img in enumerate(imglst): self.img_stock_names[img.name] = img.size - + print(f'Stock image list: {self.img_stock_names}') self.img_stock_names = { } for i, img in enumerate(imglst): @@ -292,17 +292,17 @@ def parse_stock_image(self, image): if len(img.data) < 1*1024*1024: # skip uboot and other files continue hr = self.parse_image(img.data, img.name) - + print(f'Stock image list: {self.img_stock_names}') if not self.fw_img.data: if not self.kernel.data: if not self.rootfs.data: die('Stock image is empty!') - + if self.rootfs.data: if not self.fw_img.data and not self.kernel.data: die('Stock image not contain kernel!') - + if not self.kernel.data: die('Stock: Kernel section not found!') @@ -398,8 +398,8 @@ def parse_uimage(self, image, offset = 0, footer = True): if hr >= 1: return 2 return 1 - - def get_fdt_node(self, dt, path): + + def get_fdt_node(self, dt, path): plist = [ path ] if '*' in path: plist = [ ] @@ -412,7 +412,7 @@ def get_fdt_node(self, dt, path): except ValueError: pass return None - + def get_fdt_node_by_name(self, dt, name, compatible = None): res = [ ] for path, nodes, props in dt.walk(): @@ -427,7 +427,7 @@ def get_fdt_node_by_name(self, dt, name, compatible = None): continue # go to next node res.append(path) return res - + def get_fdt_part_list(self, dt, partlist): res = [ ] if isinstance(partlist, str): @@ -441,13 +441,13 @@ def get_fdt_part_list(self, dt, partlist): readonly = True res.append( { 'addr': addr, 'size': size, 'name': name, 'ro': readonly } ) return res - + def get_dtb_part_info(self, partlist, name): for i, part in enumerate(partlist): if part['name'] == name: return part return None - + def parse_fit(self, image, offset = 0, footer = True): kernel = self.kernel rootfs = self.rootfs @@ -491,23 +491,23 @@ def parse_fit(self, image, offset = 0, footer = True): def_cfg = fit_dt.get_node(f'/configurations/{def_cfg_name}') def_cfg_desc = def_cfg.get_property('description').value print(f'FIT: def_cfg desc = "{def_cfg_desc}"') - + ubi_loader = False fit_model = '' if 'xiaomi_' in def_cfg_desc: x = def_cfg_desc.find('xiaomi_') fit_model = 'xiaomi,' + def_cfg_desc[x+7:] print(f'FIT: model = "{fit_model}"') - + def_fdt = def_cfg.get_property('fdt') - + if not def_fdt: krn1 = self.get_fdt_node(fit_dt, '/images/kernel*1') krn1desc = krn1.get_property('description').value print(f'KRN: desc = "{krn1desc}"') if 'Linux-u-boot' not in krn1desc: die('FIT: Incorrect image (5)') - print(f'Linux-u-boot image founded! (detect ubi-loader)') + print(f'Linux-u-boot image found! (detect ubi-loader)') ubi_loader = True if not fit_model: die('FIT: Incorrect image (5)(1) ') @@ -545,21 +545,21 @@ def parse_fit(self, image, offset = 0, footer = True): print('FDT:', dt_compat) dt_model = dt.get_property('model').value print(f'FDT: model = "{dt_model}"') - + if ubi_loader: dt = None dt_compat = [ fit_model ] dt_model = None - + if not self.img_stock: cm = self.check_model(dt_compat, dt_model) if cm < 0: die(f'FIT: Loaded firmware not compatible with "{gw.device_name}" !!!') - + if dt: dt_part = self.get_fdt_node_by_name(dt, 'partitions', 'fixed-partitions') print(f'FDT: dt_part: {dt_part}') - + kernel.fit = True if self.img_stock: kernel.ostype = 'stock' @@ -568,14 +568,14 @@ def parse_fit(self, image, offset = 0, footer = True): kernel.ostype = 'openwrt' if not kernel.ostype: die('FIT: Currently supported only OpenWrt FIT images!') - + rootfs1 = self.get_fdt_node(fit_dt, '/images/rootfs*1') if rootfs1: - die('FIT: Founded "rootfs-1" node. Not supported!') - + die('FIT: Found "rootfs-1" node. Not supported!') + initrd1 = self.get_fdt_node(fit_dt, '/images/initrd*1') if initrd1: - print('FIT: Founded "initrd-1" node') + print('FIT: Found "initrd-1" node') iname = initrd1.get_property('description').value print(f'FIT: initrd image name: "{iname}"') if self.img_stock: @@ -587,7 +587,7 @@ def parse_fit(self, image, offset = 0, footer = True): if kernel.into_ubi: rootfs.into_ubi = True return 2 - + if not footer and krn_size > 6*1024*1024 and kernel.ostype == 'openwrt': print(f'FIT: detect initrd into kernel image') self.init_image(rootfs, b'0' * 1024, 'FIT: Found Second "rootfs" section! (InitRD)') @@ -596,13 +596,13 @@ def parse_fit(self, image, offset = 0, footer = True): if kernel.into_ubi: rootfs.into_ubi = True return 2 - + if footer: hr = self.parse_footer(image, offset + fit_size) if hr >= 1: return 2 return 1 - + def parse_footer(self, image, offset, init = True): if len(image) - offset < 1*1024*1024: return 0 @@ -637,25 +637,25 @@ def parse_ubifs(self, ubifs_image, init = True): from ubireader import settings from ubireader.ubi.defines import UBI_EC_HDR_MAGIC from ubireader.ubifs.defines import UBIFS_NODE_MAGIC - from ubireader.utils import guess_filetype, guess_start_offset, guess_leb_size, guess_peb_size + from ubireader.utils import guess_filetype, guess_start_offset, guess_leb_size, guess_peb_size settings.logging_on = False settings.logging_on_verbose = False settings.warn_only_block_read_errors = False settings.ignore_block_header_errors = False - settings.uboot_fix = False + settings.uboot_fix = False path = self.current_image_fn start_offset = self.current_image_pos - filetype = guess_filetype(path, start_offset) + filetype = guess_filetype(path, start_offset) print('UBI: filetype:', filetype) if filetype != UBI_EC_HDR_MAGIC: die('UBI: File does not look like UBI data.') block_size = guess_peb_size(path) if not block_size: - die('UBI: Block size could not be determined.') + die('UBI: Block size could not be determined.') ufile_obj = ubi_file(path, block_size, start_offset) - #ubi_obj = ubi_base(ufile_obj) - ubi_obj = ubi(ufile_obj) + #ubi_obj = ubi_base(ufile_obj) + ubi_obj = ubi(ufile_obj) print('UBI: Decoding UBIFS...') kernel_volume = None rootfs_volume = None @@ -699,7 +699,7 @@ def unpack_kernel(self): die("Can't unpack kernel image! (lzma loader)") if k1 > 0 and k2 > 0: k = min(k1, k2) - else: + else: k = k1 if k1 > 0 else k2 data2 = data2[k+1:] img_comp = 3 # IH_COMP_LZMA @@ -851,16 +851,16 @@ def prepare_data(self): dev.get_bootloader() if not dev.bl.img: die("Can't dump current bootloader!") - + dev.get_env_list() if not dev.env.fw.data or dev.env.fw.len <= 0: die("Can't dump current NVRAM params!") - + print(f"current flag_boot_rootfs = {dev.rootfs.num}") self.install_fw_num = None self.install_method = 0 - + kernel_num = dev.get_part_num("kernel") kernel0_num = dev.get_part_num("kernel0") kernel1_num = dev.get_part_num("kernel1") @@ -927,7 +927,7 @@ def prepare_data(self): print(f'install_method = {self.install_method}') if self.install_method <= 0: die('Cannot detect install method') - + if kernel.data[:4] == UIMAGE_MAGIC: self.unpack_kernel() @@ -938,7 +938,7 @@ def prepare_data(self): self.prepare_for_stock() else: self.install_fw_num = 0 - + if kernel.ostype == 'padavan': self.install_fw_num = None self.prepare_for_padavan() @@ -950,7 +950,7 @@ def prepare_data(self): self.save_all_images(req_cmd = False, prefix = "_") print("--------- prepare command lines -----------") - + if self.install_method == 100: if self.img_stock: kernel.partname = "kernel{}".format(self.install_fw_num) @@ -1010,7 +1010,7 @@ def prepare_data(self): die(f'Target partition "{fw_img.partname}" has readonly flag') self.save_all_images(req_cmd = True, prefix = "") - + def save_image_to_disk(self, image, req_cmd = True, prefix = ""): if image.data: if req_cmd and not image.cmd: @@ -1019,11 +1019,11 @@ def save_image_to_disk(self, image, req_cmd = True, prefix = ""): fname = os.path.basename(image.fn_local) with open(f'{dname}/{prefix}{fname}', "wb") as file: file.write(image.data) - + def save_all_images(self, req_cmd = True, prefix = ""): for i, (iname, img) in enumerate(self.imglst.items()): self.save_image_to_disk(img, req_cmd, prefix) - + def process_bootloader_env(self, fw_num): global gw dev = self.dev @@ -1044,7 +1044,7 @@ def process_bootloader_env(self, fw_num): elif self.img_write: if fw_num is not None: fw_addr = activate_boot.breed_boot_change(gw, dev, fw_num, None, None) - else: + else: fw_addr = activate_boot.breed_boot_change(gw, dev, None, kernel.addr, None) pass @@ -1059,7 +1059,7 @@ def flash(self): die("Flashing recipe unknown!") print("------------- flash images -------------") - + self.process_bootloader_env(self.install_fw_num) gw.set_timeout(12) @@ -1084,7 +1084,7 @@ def flash(self): if fw_img.cmd: self.flash_data_to_mtd('firmware', fw_img, timeout = 60) - + if kernel.cmd: self.flash_data_to_mtd('kernel', kernel, timeout = 34) diff --git a/xmir_base/fdt/__init__.py b/xmir_base/fdt/__init__.py index 2dfa8ac..4a7d67c 100644 --- a/xmir_base/fdt/__init__.py +++ b/xmir_base/fdt/__init__.py @@ -89,9 +89,9 @@ def info(self, props = False): return msg def get_node(self, path: str, create: bool = False) -> Node: - """ + """ Get node object from specified path - + :param path: Path as string :param create: If True, not existing nodes will be created """ @@ -114,9 +114,9 @@ def get_node(self, path: str, create: bool = False) -> Node: return node def get_property(self, name: str, path: str = '') -> Property: - """ + """ Get property object by name from specified path - + :param name: Property name :param path: Path to sub-node """ @@ -125,7 +125,7 @@ def get_property(self, name: str, path: str = '') -> Property: def set_property(self, name: str, value, path: str = '', create: bool = True): """ Set property object by name - + :param name: Property name :param value: Property value :param path: Path to subnode @@ -134,9 +134,9 @@ def set_property(self, name: str, value, path: str = '', create: bool = True): self.get_node(path, create).set_property(name, value) def exist_node(self, path: str) -> bool: - """ + """ Check if /node exist and return True - + :param path: path/node name :return True if /node exist else False """ @@ -148,36 +148,36 @@ def exist_node(self, path: str) -> bool: return True def exist_property(self, name: str, path: str = '') -> bool: - """ + """ Check if property exist - + :param name: Property name :param path: The path """ return self.get_node(path).exist_property(name) if self.exist_node(path) else False def remove_node(self, name: str, path: str = ''): - """ + """ Remove node obj by path/name. Raises ValueError if path/name doesn't exist - + :param name: Node name :param path: Path to sub-node """ self.get_node(path).remove_subnode(name) def remove_property(self, name: str, path: str = ''): - """ + """ Remove property obj by name. Raises ValueError if path/name doesn't exist - + :param name: Property name :param path: Path to subnode """ self.get_node(path).remove_property(name) def add_item(self, obj, path: str = '', create: bool = True): - """ + """ Add sub-node or property at specified path. Raises ValueError if path doesn't exist - + :param obj: The node or property object :param path: The path to subnode :param create: If True, not existing nodes will be created @@ -196,9 +196,9 @@ def add_label(self, label): return self.last_handle def search(self, name: str, itype: int = ItemType.ALL, path: str = '', recursive: bool = True) -> list: - """ - Search properties and/or nodes with specified name. Return list of founded items - + """ + Search properties and/or nodes with specified name. Return list of found items + :param name: The Property or Node name. If empty "", all nodes or properties will selected :param itype: Item type - NODE, PROP, PROP_BASE, PROP_WORDS, PROP_BYTES, PROP_STRINGS or ALL :param path: Path to root node @@ -234,9 +234,9 @@ def search(self, name: str, itype: int = ItemType.ALL, path: str = '', recursive return items def walk(self, path: str = '', relative: bool = False) -> list: - """ + """ Walk trough nodes and return relative/absolute path with list of sub-nodes and properties - + :param path: The path to root node :param relative: True for relative or False for absolute return path """ @@ -258,7 +258,7 @@ def walk(self, path: str = '', relative: bool = False) -> list: def merge(self, fdt_obj, replace: bool = True): """ Merge external FDT object into this object. - + :param fdt_obj: The FDT object which will be merged into this :param replace: True for replace existing items or False for keep old items """ @@ -302,7 +302,7 @@ def update_phandles(self): for node in no_phandle_nodes: if node.name != '/': - if node.path == '/': + if node.path == '/': phandle_value = self.add_label(node.name) else: phandle_value = self.add_label(node.path) @@ -402,7 +402,7 @@ def parse_dts(text: str, root_dir: str = '') -> FDT: Parse DTS text file and create FDT Object :param text: - :param root_dir: + :param root_dir: """ ver = get_version_info(text) text = strip_comments(text) @@ -437,7 +437,7 @@ def parse_dts(text: str, root_dir: str = '') -> FDT: new_node = Node(node_name) new_node.set_label(label) - + else: node_name = line.split()[0] new_node = Node(node_name) @@ -470,7 +470,7 @@ def parse_dts(text: str, root_dir: str = '') -> FDT: # just change ',' to ' ' -- to concatenate the values into single array if ',' in prop_value: prop_value = prop_value.replace(',', ' ') - + # keep the orginal references for phandles as a phantom # property if "&" in prop_value: @@ -545,7 +545,7 @@ def parse_dts(text: str, root_dir: str = '') -> FDT: def parse_dtb(data: bytes, offset: int = 0) -> FDT: """ Parse FDT Binary Blob and create FDT Object - + :param data: FDT Binary Blob in bytes :param offset: The offset of input data """ @@ -606,9 +606,9 @@ def parse_dtb(data: bytes, offset: int = 0) -> FDT: def diff(fdt1: FDT, fdt2: FDT) -> tuple: - """ + """ Compare two flattened device tree objects and return list of 3 objects (same in 1 and 2, specific for 1, specific for 2) - + :param fdt1: The object 1 of FDT :param fdt2: The object 2 of FDT """ diff --git a/xqimage.py b/xqimage.py index 2e4cdf4..d313ddb 100644 --- a/xqimage.py +++ b/xqimage.py @@ -22,7 +22,7 @@ class XQImgHdr(ctypes.Structure): class XQImgFile(ctypes.Structure): _fields_ = [("magic", ctypes.c_ushort), # BE BA - ("rsvd0", ctypes.c_ushort), + ("rsvd0", ctypes.c_ushort), ("addr", ctypes.c_uint), # Flash Address ("size", ctypes.c_uint), # size of file ("mtd", ctypes.c_short), # mtd number for flashing @@ -51,7 +51,7 @@ class XQImage(): align = 128*1024 padfill = b'\xFF' files = [] # list of files - + def __init__(self, model, type = 0, testmode = False): self.testmode = testmode self.model = model.upper() @@ -84,14 +84,14 @@ def add_file(self, data, name, mtd = None, align = 0, padfill = b'\xFF'): file.data = buf_align(data, align, padfill) file.header = XQImgFile() file.header.magic = int.from_bytes(b'\xBE\xBA', byteorder='little') - file.header.rsvd0 = 0 + file.header.rsvd0 = 0 file.header.addr = 0xFFFFFFFF file.header.size = len(file.data) file.header.mtd = 0xFFFF if mtd is None else mtd file.header.dummy = 0 file.header.name = name.encode('latin_1') self.files.append(file) - + def build_image(self, sign = None): self.data = None buf = bytearray() @@ -107,7 +107,7 @@ def build_image(self, sign = None): buf += bytes(f.header) buf += f.data self.header.sign = len(buf) - if sign: + if sign: buf += sign else: buf += self.build_sign() @@ -117,7 +117,7 @@ def build_image(self, sign = None): buf[:ctypes.sizeof(self.header)] = bytes(self.header) self.data = buf return buf - + def save_image(self, filename, sign = None): self.outfilename = filename data = self.build_image(sign) @@ -150,7 +150,7 @@ def i2b(value): DIE('HDR1 Payload is not defined for device "{}".'.format(self.model)) # add header of sign section (16 bytes) sign = i2b(poffset) + (b'\x00' * 12) - # add fake sign + # add fake sign size = poffset - len(payload) if self.testmode: for i in range(0, size, 4): @@ -189,15 +189,15 @@ def build_xq_openwrt(fwdir, model, outfilename): rootfs = None fit = None bl = None - fn_list = [f for f in os.listdir(fwdir) if os.path.isfile(os.path.join(fwdir, f))] + fn_list = [f for f in os.listdir(fwdir) if os.path.isfile(os.path.join(fwdir, f))] for i, fname in enumerate(fn_list): fname = fwdir + fname fsize = os.path.getsize(fname) if fsize < 80*1024: - continue + continue with open(fname, "rb") as file: - fdata = file.read() - if fdata[:4] == b"\x27\x05\x19\x56": # uImage + fdata = file.read() + if fdata[:4] == b"\x27\x05\x19\x56": # uImage print('Parse image file "{}" ...'.format(fname)) pos = 0x0C kernel_size = int.from_bytes(fdata[pos:pos+4], byteorder='big') @@ -205,7 +205,7 @@ def build_xq_openwrt(fwdir, model, outfilename): kernel_name = fdata[0x20:0x40] if kernel_name.find(b'Breed') == 0 or kernel_name.find(b'NAND Flash') == 0: if bl: - DIE('Second bootloader founded') + DIE('Second bootloader found') bl = types.SimpleNamespace() bl.data = fdata bl.type = 'breed' if kernel_name.find(b'Breed') == 0 else '' @@ -213,12 +213,12 @@ def build_xq_openwrt(fwdir, model, outfilename): DIE('Bootloader size is too large! (size: {} KB)'.format(len(fdata) // 1024)) continue if kernel: - DIE('Second kernel founded') + DIE('Second kernel found') if kernel_size < 0x100000: DIE('Kernel size is too small! (size: {} KB)'.format(kernel_size // 1024)) kernel = types.SimpleNamespace() kernel.ostype = '' - kernel.data = fdata[:kernel_size] + kernel.data = fdata[:kernel_size] if kernel_name[0:1] == b'\x03' or kernel_name[0:1] == b'\x04': # padavan kernel version if kernel_name[2:3] == b'\x03': # padavan fw version kernel.ostype = 'padavan' @@ -232,7 +232,7 @@ def build_xq_openwrt(fwdir, model, outfilename): if fdata[x+28:x+32] != b'\x04\x00\x00\x00': DIE('Rootfs not found in padavan firmware') if rootfs: - DIE('Second rootfs founded') + DIE('Second rootfs found') kernel.data = fdata[:x] if x > MAX_KERNEL_SIZE: DIE('Padavan kernel size is too large! (size: {} KB)'.format(x // 1024)) @@ -246,13 +246,13 @@ def build_xq_openwrt(fwdir, model, outfilename): x = data.find(b'UBI#\x01\x00\x00\x00') if x >= 0: if rootfs: - DIE('Second rootfs founded') + DIE('Second rootfs found') rootfs = types.SimpleNamespace() rootfs.data = data[x:] if fdata[:8] == b'UBI#\x01\x00\x00\x00': print('Parse image file "{}" ...'.format(fname)) if rootfs: - DIE('Second rootfs founded') + DIE('Second rootfs found') rootfs = types.SimpleNamespace() rootfs.data = fdata if bl and not kernel: @@ -265,14 +265,14 @@ def build_xq_openwrt(fwdir, model, outfilename): x = rootfs.data.find(b'\x01\x00\x00\x06' + b'kernel' + b'\x00') if x > 0x800 and x <= 0x4000: if kernel: - DIE('Second kernel founded into FIT image') + DIE('Second kernel found into FIT image') fit = rootfs rootfs = None if not kernel and not fit: DIE('Cannot found kernel image') if kernel.ostype == 'padavan': if not bl or (bl and bl.type != 'breed'): - DIE('Padavan firmware supported only with Breed bootloader') + DIE('Padavan firmware supported only with Breed bootloader') if bl: BREED_ENV_ADDR = 0x60000 BREED_ENV_OFFSET = BREED_ENV_ADDR @@ -282,9 +282,9 @@ def build_xq_openwrt(fwdir, model, outfilename): data = bl.data[:BREED_ENV_OFFSET] else: data = buf_align(bl.data, BREED_ENV_OFFSET, b'\xFF') - bl.data = data + bl.data = data env_file = fwdir + 'breed_env.txt' - if os.path.exists(env_file): + if os.path.exists(env_file): with open(env_file, 'r', encoding = 'latin_1') as file: env_data = file.read() print('Parse ENV file: "{}"'.format(env_file)) @@ -333,7 +333,7 @@ def build_xq_openwrt(fwdir, model, outfilename): size = 128*1024 data = None if len(sys.argv[5]) > 0: - data = sys.argv[5] + data = sys.argv[5] data = data.encode('latin_1').decode('unicode-escape').encode('latin_1') outfilename = sys.argv[6] create_xqimage(model, name, mtd, size, data, outfilename) @@ -342,7 +342,7 @@ def build_xq_openwrt(fwdir, model, outfilename): if len(sys.argv) == 3: model = sys.argv[1] fn = sys.argv[2] - build_xq_openwrt('firmware/', model, fn) + build_xq_openwrt('firmware/', model, fn) if fn: print("#### File '{}' created ####".format(fn))