Linux, Python 3.7. Распаковщик однопоточный, рекомендую PyPy 7.3.8.
git clone https://github.com/kotiq/vromfs
cd vromfs
pip install .Пример распаковщика src/vromfs/demo/vromfs_bin_unpacker.py.
Распаковщик работает в двух режимах: распаковка файлов и получение сводки о файлах в образе. В зависимости от режима, схема выходного параметра различается.
vromfs_bin_unpacker [-h]
--metadata
[--input_filelist MAYBE_IN_FILES]
[-o MAYBE_OUT_PATH]
inputАргументы:
-h, --helpПоказать справку.--metadataРежим получения сводки о файлах.--input_filelistФайл с JSON списком файлов,-для чтения изstdin. Если не указан, запросить сводку для всех файлов из образа.-о, --outputВыходной файл. Если не указан, вывести вstdout.inputФайл .vromfs.bin контейнера.
Пример запроса сводки о файлах config/wpcost.blk, version, nop из контейнера char.vromfs.bin.
Файл nop отсутствует в образе.
echo '["config/wpcost.blk", "version", "nop"]' |\
vromfs_bin_unpacker --metadata --input_filelist - ~/games/WarThunder/char.vromfs.bin |\
python -m json.toolВыходной файл:
versionВерсия схемы.filelistСловарь {Имя => SHA1 дайджест}.~filelistСписок отсутствующих файлов из входного списка.
{
"version": "1.1",
"filelist": {
"config/wpcost.blk": "c9fa212c3fcad93dd3fec78d80b084ee06dd7fe0",
"version": "91fd47a80f1984d65402a2c5de2031515d781c0c"
},
"~filelist": [
"nop"
]
}vromfs_bin_unpacker [--format {json,json_2,json_3,raw,strict_blk}]
[--sort]
[--input_filelist MAYBE_IN_FILES]
[-x]
[-o MAYBE_OUT_PATH]
[--loglevel {critical,error,warning,info,debug}]
inputАргументы:
--formatФормат выходного блока, не зависит от регистра.raw: распаковать как есть. По умолчаниюjson.--sortСортировать ключи для форматовjson,json_2,json_3.--minifyМинифицировать JSON*.--input_filelistФайл с JSON списком файлов,-для чтения изstdin. Если не указан, распаковать все файлы из образа.-x, --exitfirstЗакончить распаковку при первой ошибке.-o, --outputРодитель для выходной директории, выходная директория - имя контейнера. Если не указан,cwd, выходная директория - имя контейнера с постфиксом_u.--loglevelУровень сообщений изcritical,error,warning,info,debug. По умолчаниюinfo.inputФайл .vromfs.bin контейнера.
Пример распаковки файлов config/wpcost.blk, version, nop из контейнера char.vromfs.bin.
Файл nop отсутствует в образе.
echo '["config/wpcost.blk", "version", "nop"]' |\
vromfs_bin_unpacker --input_filelist - -o /tmp --format strict_blk ~/games/WarThunder/char.vromfs.bin1649101539.0282645 INFO Начало распаковки.
1649101539.0303192 ERROR [FAIL] '/home/kotiq/games/WarThunder/char.vromfs.bin'::'nop': "Нет FileInfo, содержащего путь 'nop'"
1649101550.4968865 DEBUG 'config/wpcost.blk': SLIM_ZST => STRICT_BLK
1649101550.5555458 DEBUG 'version'
1649101550.5556657 INFO Успешно распаковано: 2/3.
1649101550.5557013 ERROR Ошибка при обработке файлов.
Дерево файлов:
$ tree -s --metafirst /tmp/char.vromfs.bin[ 80] /tmp/char.vromfs.bin
[ 60] ├── config
[ 13003236] │ └── wpcost.blk
[ 9] └── version
Пример упаковщика src/vromfs/demo/vromfs_bin_packer.py.
Упаковщик приведен, главным образом, как генератор тестовых данных. Предполагается, что для файлов blk перевод в двоичный формат произведен заранее, если это необходимо.
vromfs_bin_packer [-h]
-v VERSION
[-o OUT_PATH]
in_pathАргументы:
-h, --helpПоказать справку.-v, --verВерсия архива x.y.z.w, где x, y, z, w из 0 .. 255.-o, --outputВыходной файл. По умолчанию./out.vromfs.bin.in_pathДиректория для упаковки.
В контейнер попадают файлы, перечисленные в директории, но не сама директория.
Пример упаковки файлов из директории /tmp/files в архив /tmp/out.vromfs.bin версии 1.2.3.4.
Дерево файлов:
tree -s --metafirst /tmp/files[ 80] /tmp/files
[ 60] ├── inner
[ 1061] │ └── fstab
[ 106] └── lsb-release
Формирование архива:
vromfs_bin_packer.py -v 1.2.3.4 -o /tmp/out.vromfs.bin /tmp/files1655019014.6393943 DEBUG /tmp/files => temp vromfs
1655019014.6394637 DEBUG Размер временного образа: 1296
1655019014.640162 DEBUG temp vromfs => /tmp/out.vromfs.bin
1655019014.640218 INFO /tmp/files => /tmp/out.vromfs.bin
Содержимое архива:
vromfs_bin_unpacker.py --metadata /tmp/out.vromfs.bin |\
python -m json.tool{
"version": "1.1",
"filelist": {
"inner/fstab": "a0940cb3f3298ae0cb9ba0a30e05e678e7f8c6f2",
"lsb-release": "792f608be04167807db067707a31a656aa687d0f"
}
}