88 lines
3.7 KiB
Python
88 lines
3.7 KiB
Python
#!/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 |