#!/usr/bin/python import os from ubi_io import leb_virtual_file from ubifs import ubifs, walk, output from ubifs.defines import PRINT_UBIFS_KEY_HASH, PRINT_UBIFS_COMPR from ubi.defines import PRINT_VOL_TYPE_LIST, UBI_VTBL_AUTORESIZE_FLG output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'output') def extract_files(ubifs, out_path, perms = False): try: inodes = {} walk.index(ubifs, ubifs.master_node.root_lnum, ubifs.master_node.root_offs, inodes) for dent in inodes[1]['dent']: output.dents(ubifs, inodes, dent, out_path, perms) except Exception as e: import traceback ubifs.log.write('%s' % e) traceback.print_exc() def get_ubi_params(ubi): ubi_flags = {'min_io_size': '-m', 'max_bud_bytes': '-j', 'leb_size': '-e', 'default_compr': '-x', 'sub_page_size': '-s', 'fanout': '-f', 'key_hash': '-k', 'orph_lebs': '-p', 'log_lebs': '-l', 'max_leb_cnt': '-c', 'peb_size': '-p', 'sub_page_size': '-s', 'vid_hdr_offset': '-O', 'version': '-x', 'image_seq': '-Q', 'alignment': '-a', 'vol_id': '-n', 'name': '-N'} ubi_params = {} ubi_args = {} ini_params = {} for image in ubi.images: img_seq = image.image_seq ubi_params[img_seq] = {} ubi_args[img_seq] = {} ini_params[img_seq] = {} for volume in image.volumes: ubi_args[img_seq][volume] = {} ini_params[img_seq][volume] = {} ini_params[img_seq][volume]['vol_type'] = PRINT_VOL_TYPE_LIST[image.volumes[volume].vol_rec.vol_type] if image.volumes[volume].vol_rec.flags == UBI_VTBL_AUTORESIZE_FLG: ini_params[img_seq][volume]['vol_flags'] = 'autoresize' else: ini_params[img_seq][volume]['vol_flags'] = image.volumes[volume].vol_rec.flags ini_params[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id ini_params[img_seq][volume]['vol_name'] = image.volumes[volume].name.rstrip('\x00') ini_params[img_seq][volume]['vol_alignment'] = image.volumes[volume].vol_rec.alignment ini_params[img_seq][volume]['vol_size'] = image.volumes[volume].vol_rec.reserved_pebs * ubi.leb_size ufsfile = leb_virtual_file(ubi, image.volumes[volume]) uubifs = ubifs(ufsfile) for key, value in uubifs.superblock_node: if key == 'key_hash': value = PRINT_UBIFS_KEY_HASH[value] elif key == 'default_compr': value = PRINT_UBIFS_COMPR[value] if key in ubi_flags: ubi_args[img_seq][volume][key] = value for key, value in image.volumes[volume].vol_rec: if key == 'name': value = value.rstrip('\x00') if key in ubi_flags: ubi_args[img_seq][volume][key] = value ubi_args[img_seq][volume]['version'] = image.version ubi_args[img_seq][volume]['vid_hdr_offset'] = image.vid_hdr_offset ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] ubi_args[img_seq][volume]['image_seq'] = image.image_seq ubi_args[img_seq][volume]['peb_size'] = ubi.peb_size ubi_args[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id ubi_params[img_seq][volume] = {'flags': ubi_flags, 'args': ubi_args[img_seq][volume], 'ini': ini_params[img_seq][volume]} return ubi_params