Difference between revisions of "TerrariumAssembler"
From Wiki4Intranet
(→Простой путь до конца .) |
|||
(24 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
<slideshow style="4intra" scaled="true" font="Calibri, Segoe Print, cursive" footer="" headingmark="." /> | <slideshow style="4intra" scaled="true" font="Calibri, Segoe Print, cursive" footer="" headingmark="." /> | ||
− | |||
− | |||
=== Проблема. === | === Проблема. === | ||
[[File:tesseract-expert.jpg|256px|right]] | [[File:tesseract-expert.jpg|256px|right]] | ||
Line 20: | Line 18: | ||
** {{@|On Impossibility of Obfuscation}} [https://www.iacr.org/archive/crypto2001/21390001.pdf] | ** {{@|On Impossibility of Obfuscation}} [https://www.iacr.org/archive/crypto2001/21390001.pdf] | ||
** PYC-файлы, cx_freeze, py2exe — абсолютная открытость. | ** PYC-файлы, cx_freeze, py2exe — абсолютная открытость. | ||
+ | |||
+ | ==== Смотри меня . ==== | ||
+ | {{Vimeoembed|408659991|800|450}} | ||
+ | [https://vimeo.com/408659991/d1627a5c67 📹] | ||
=== Деплой на Linux. Стандартные варианты. === | === Деплой на Linux. Стандартные варианты. === | ||
Line 88: | Line 90: | ||
** Не специальная изоляция для безопасности. | ** Не специальная изоляция для безопасности. | ||
+ | {{----}} | ||
+ | === Секретный ингридиент — Nuitka. === | ||
+ | [[File:Nuitka-4-Anuitka.png|256px|right]] | ||
+ | * Python/CPython для отладки | ||
+ | ** {{@|Производительность, декомпиляция}} | ||
+ | ** Куча IDE, REPL-цикл, Jupyter-ноутбуки, прототипы | ||
− | === Структура террариума === | + | * http://nuitka.net/ |
+ | * Компиляция: Python —→ C/C++ → GCC/MSVC → .EXE + [.DLLS] | ||
+ | ** {{@|Долго}} | ||
+ | ** {{@|Не всегда успешно}} | ||
+ | * Nuitka-компиляция | ||
+ | ** Крутейшая производительность. [https://pybenchmarks.org/u64q/benchmark.php?test=all&lang=nuitka&lang2=numba&data=u64q Заруливают Numba]. | ||
+ | *** {{@|Есть проблемы}} | ||
+ | **** Куча проблем генерации-сборки модулей | ||
+ | **** Внешние модули и утилиты (tesseract/imagick и т.п.). | ||
+ | |||
+ | ==== Смотри меня . ==== | ||
+ | {{vimeoembed|408659882|800|450}} [https://vimeo.com/408659882/c3e959604c 📹] | ||
+ | |||
+ | |||
+ | === Структура террариума . === | ||
;lib64: Все запатченные библиотеки. | ;lib64: Все запатченные библиотеки. | ||
;pbin: Все запатченные бинарники, которых можно загружать только используя свою <tt>ld.so</tt>, она же лежит тут. | ;pbin: Все запатченные бинарники, которых можно загружать только используя свою <tt>ld.so</tt>, она же лежит тут. | ||
Line 96: | Line 118: | ||
Остальные папки опционально. | Остальные папки опционально. | ||
+ | ==== Смотри меня . ==== | ||
+ | {{vimeoembed|408659814|800|450}} | ||
+ | |||
+ | [https://vimeo.com/408659814/0d0a98f7ff 📹] | ||
+ | |||
+ | === YAML-файл спецификации . === | ||
+ | |||
+ | {{vimeoembed|408659719|800|450}} | ||
+ | * [https://vimeo.com/408659719/1296dcc21e 📹] | ||
+ | |||
+ | ==== Исходники . ==== | ||
+ | |||
+ | ;src_dir: где размещать исходные файлы. | ||
+ | ---- | ||
+ | ;python_packages: Наполнение террариума «питонами» | ||
+ | ;pip: Просто список PIP-пакетов. | ||
+ | ;build: Список исходников для checkout, которые необходимы для сборки. | ||
+ | ;terra: Список исходников для checkout, которые необходимы в террариуме для работающего там питона. | ||
+ | |||
+ | Исходники можно задавать либо просто git-urlом, либо с указанием ветки или патча. | ||
+ | - git@gitlab.ispras.ru:fomin/komodo_python3_dbgp.git | ||
+ | - url: https://github.com/tomerfiliba/reedsolomon.git | ||
+ | branch: v1.5.3 | ||
+ | |||
+ | ----- | ||
+ | |||
+ | ;templates_dirs: Шаблон террариума (файлы обрабатываются «jinja-шаблонизатором») | ||
+ | |||
+ | ==== Пакеты для Linux OS . ==== | ||
+ | ;packages: Списки пакетов для ОС | ||
+ | :;build: Пакеты, небходимые только для сборки | ||
+ | :;terra: Пакеты, неоходимые для работы «террариума» | ||
+ | |||
+ | Каждый пакет может задаваться либо просто названием, либо названием и URLом | ||
+ | |||
+ | - name: unitedrpms | ||
+ | url: https://github.com/UnitedRPMs/unitedrpms/releases/download/17/unitedrpms-32-17.fc32.noarch.rpm | ||
+ | |||
+ | :;exclude_prefix: префиксы пакетов, которых нужно исключить при замыкании. | ||
+ | :;exclude_suffix: суффиксы пакетов, которых нужно исключить при замыкании. | ||
+ | |||
+ | ==== Компиляция . ==== | ||
+ | ;nuitka: | ||
+ | :;std_flags: стандартный набор флагов | ||
+ | :;force_packages: пакеты, которых точно нужно включить | ||
+ | :;force_modules: модули, которых точно нужно включить | ||
+ | :;block_packages: наоборот, пакеты, которых нужно избегать. | ||
+ | |||
+ | ---- | ||
+ | ;builds: список питон-исходников для компиляции | ||
+ | :;folder: папка, отнотельно каталога исходников. | ||
+ | :;utility: название к утилиты (без «.py») | ||
+ | |||
+ | |||
+ | ==== Сборка с патчингом . ==== | ||
+ | ;templates_dirs: Шаблон террариума (файлы обрабатываются «jinja-шаблонизатором») | ||
+ | |||
+ | ---- | ||
+ | ;bin_regexps: Регулярки, выделяющие необходимые террариуму бинарные файлы | ||
+ | :;need_patch: Утилиты, которые неоходимо вызывать снаружи террариума, и их нужно патчить. | ||
+ | :;just_copy: Бинарники, которых просто нужно скопировать. | ||
+ | |||
+ | === Установка . === | ||
+ | pip install terrarium-assembler | ||
+ | |||
+ | git clone https://github.com/belonesox/terrarium_assembler/ | ||
+ | … | ||
+ | python3 setup.py develop | ||
+ | |||
+ | |||
+ | {{vimeoembed|408659644|800|450}} | ||
+ | |||
+ | [https://vimeo.com/408659644/cc494093c1 ∞] | ||
+ | |||
+ | === Вызов утилиты . === | ||
+ | |||
+ | <pre> | ||
+ | [stas@stasbox64gb demo]$ terrarium_assembler --help | ||
+ | usage: terrarium_assembler [-h] [--debug] [--docs] [--stage-download-rpms] [--stage-download-sources-for-rpms] [--stage-checkout] [--stage-install-rpms] | ||
+ | [--stage-download-wheels] [--stage-build-wheels] [--stage-install-wheels] [--stage-build-nuitka] [--stage-make-isoexe] | ||
+ | [--stage-build-and-pack STAGE_BUILD_AND_PACK] [--stage-download-all] [--stage-all STAGE_ALL] [--stage-pack STAGE_PACK] | ||
+ | specfile | ||
+ | |||
+ | Create a portable linux folder-application | ||
+ | |||
+ | positional arguments: | ||
+ | specfile Specification File | ||
+ | |||
+ | optional arguments: | ||
+ | -h, --help show this help message and exit | ||
+ | --debug Debug version of release | ||
+ | --docs Output documentation version | ||
+ | --stage-download-rpms | ||
+ | Stage for download RPMs | ||
+ | --stage-download-sources-for-rpms | ||
+ | Stage for download SRPMs — sources packages for RPMS | ||
+ | --stage-checkout Stage for checkout sources | ||
+ | --stage-install-rpms Stage for install downloaded RPMS | ||
+ | --stage-download-wheels | ||
+ | Stage for download needed WHL-python packages | ||
+ | --stage-build-wheels Stage for compile wheels for our python sources | ||
+ | --stage-install-wheels | ||
+ | Stage for Install our and external Python wheels | ||
+ | --stage-build-nuitka Stage for Compile Python packages to executable | ||
+ | --stage-make-isoexe Stage for Also make self-executable install archive and ISO disk | ||
+ | --stage-build-and-pack STAGE_BUILD_AND_PACK | ||
+ | Install, build and pack | ||
+ | --stage-download-all Download all — sources, packages | ||
+ | --stage-all STAGE_ALL | ||
+ | Install, build and pack | ||
+ | --stage-pack STAGE_PACK | ||
+ | Stage pack to given destination directory | ||
+ | </pre> | ||
+ | |||
+ | === Этапы сборки . === | ||
+ | ==== Сценарии . ==== | ||
+ | * Просто собрать (однократно) | ||
+ | * Вытащить исходники и заморозить зависимости, чтобы можно было собрать в другом времени и месте (для аудита). | ||
+ | * Воспроизвести сборку по предоставленным исходникам для аудита. | ||
+ | * Введение нового разработчика | ||
+ | ** Сборочная среда с возможностью идемпотентного повторения отдельных этапов | ||
+ | *** Итеративное тестирование | ||
+ | *** Проблемы сборки — падения компиляторов, анализаторов и т.п. | ||
+ | |||
+ | ==== Группировка . ==== | ||
+ | |||
+ | ;--stage-all=: «Сделать все» | ||
+ | :;--stage-download-all: «Скачать все нужное» — пакеты, исходники | ||
+ | ::;--stage-download-rpms: Скачать RPM-пакеты | ||
+ | ::;--stage-checkout: Вытащить исходники | ||
+ | ::;--stage-download-wheels: Выкачать питон-пакеты, по зависимостям из исходников. | ||
+ | :;--stage-build-and-pack=: «Собрать все и упаковать» | ||
+ | ::;--stage-install-rpms: Установка RPM-пакетов | ||
+ | ::;--stage-build-wheels: Сборка WHL-питон пакетов | ||
+ | ::;--stage-install-wheels: Установка Python-пакетов. | ||
+ | ::;--stage-build-nuitka: Компиляция Python-утилит в выполняемый файл через NUITKA | ||
+ | ::;--stage-pack=: Упаковка всего в переносной «террариум» | ||
+ | :::;--stage-make-isoexe: Сделать ISO-диск с самораспаковывающимся shell-архивом. | ||
+ | |||
+ | === Shell-файлы для повторения . === | ||
+ | <pre> | ||
+ | 01-download-rpms.sh | ||
+ | 02-install-rpms.sh | ||
+ | 03-checkout.sh | ||
+ | 05-download-wheels.sh | ||
+ | 09-build-wheels.sh | ||
+ | 15-install-wheels.sh | ||
+ | 40-build-nuitkas.sh | ||
+ | build_technodemo.sh | ||
+ | 50-pack.sh | ||
+ | 90-download-sources-for-rpms.sh | ||
+ | </pre> | ||
+ | |||
+ | === Getting Started . === | ||
+ | git clone https://github.com/belonesox/terrarium_assembler/ | ||
+ | |||
+ | * https://github.com/belonesox/terrarium_assembler/tree/master/demo | ||
+ | * Простой пример | ||
+ | ** Vagrant-инфраструктура — виртуалка-сборщи (FC32), виртуалка-тестирования (Ubuntu12). | ||
+ | ** Утилита https://github.com/belonesox/terrarium_assembler/blob/master/demo/utility/technodemo.py — элементарная, но использует жирный стек. | ||
+ | ** Описание сборки https://github.com/belonesox/terrarium_assembler/blob/master/demo/release.yml | ||
+ | ** Шаблон террариума → https://github.com/belonesox/terrarium_assembler/tree/master/demo/template | ||
+ | *** Скрипт инсталляции → https://github.com/belonesox/terrarium_assembler/blob/master/demo/template/install.py | ||
+ | |||
+ | |||
+ | === Простой путь до конца . === | ||
+ | {{vimeoembed|408659549|800|450}} | ||
+ | [https://vimeo.com/408659549/1aeab7082b ∞] | ||
+ | |||
+ | ==== Инсталляционный диск technodemo . ==== | ||
+ | cd demo | ||
+ | |||
+ | vagrant up ta-builder | ||
+ | vagrant ssh ta-builder | ||
+ | |||
+ | sudo bash | ||
+ | cd /vagrant/demo | ||
+ | terrarium_assembler --stage-all=./out --stage-make-isoexe release.yml | ||
+ | |||
+ | |||
+ | ==== Проверка под альтернативным старым линуксом . ==== | ||
+ | vagrant up ta-test-ubuntu12; vagrant ssh ta-test-ubuntu12 | ||
− | + | {{vimeoembed|408659432|800|450}} | |
+ | [https://vimeo.com/408659432/39db5ee226 ∞] | ||
== Возможные проблемы . == | == Возможные проблемы . == |
Latest revision as of 17:35, 8 August 2020
- Title
- TerrariumAssembler
- Author
- Stas Fomin
- Subfooter
- Stas Fomin, 17:35, 8 August 2020
Contents
- 1 Проблема.
- 2 Деплой на Linux. Стандартные варианты.
- 3 Деплой на Linux. Их слишком много.
- 4 Деплой на Linux. Статическая линковка.
- 5 Деплой на Linux. Контейнеры.
- 6 Деплой на Linux. Просто папка? .
- 7 TerrariumAssembler .
- 8 Секретный ингридиент — Nuitka.
- 9 Структура террариума .
- 10 YAML-файл спецификации .
- 11 Установка .
- 12 Вызов утилиты .
- 13 Этапы сборки .
- 14 Shell-файлы для повторения .
- 15 Getting Started .
- 16 Простой путь до конца .
- 17 Возможные проблемы .
Проблема.
Околонаучные/высокотехнологичные приложения:
- Нет альтернативы — Numpy+Scipy+OpenCV+Keras…
- gonum
- Множество других фишек и батареек Python
- Быстрый цикл экспериментов и разработки
- Связь с бандлами приложений (Tesseract, Imagick)
Надо
- Деплой на
- Все версии Windows
- Все версии Linux (включая очень странные)
- Работало быстро
- Секретные алгоритмы
- On Impossibility of Obfuscation [1]
- PYC-файлы, cx_freeze, py2exe — абсолютная открытость.
Смотри меня .
Деплой на Linux. Стандартные варианты.
Нативная сборка под каждый дистрибутив
- Ад. RPM. DEB. RPM v4, v5, v4+, RPM on APT.
- Dependency hell. API/ABI hell.
- Package policy hell. Deps
- Сертифицированные дистрибутивы — все ископаемое.
- Нет контроля над библиотеками.
- «Ограниченная поддержка» — «мы только собрали, не помним как, а поддержка — »
- Комбинаторный взрыв вариантов тестирования.
- Можно — но за отдельные деньги.
Деплой на Linux. Их слишком много.
Деплой на Linux. Статическая линковка.
- Одна утилита — ОК.
- Надо пересобирать все.
- Бандлы приложений
- Нарушение LGPL/QT-лицензий.
Деплой на Linux. Контейнеры.
Стандартные контейнеры
- Масса вариантов
- Хорошая идея
- Нет стандартов
- Нет на ряде дистрибутивов
- Нужны клиенты-демоны
- AppImage — не обязательно.
- Нужны клиенты-демоны
Ожидания заказчика — «папка, копировать, просто работает, запускаем разные программы в ней, можно взаимодействовать с системой»
- Intel X64 везде, ну ладно, пусть будет Win/Lin отдельно.
Деплой на Linux. Просто папка? .
- «Нельзя просто взять и скопировать»©
- Неочевидно для Windows-пользователей — «работает же с Win95…»
- Там это специально добиваются, и это недешево. SxS
- libc-совместимость → major-изменения в API каждые пару лет.
- Да, с этим можно бороться → «эмуляция старого glibc» + bingcc, но это недешево,
пересобирать все.
- ld-image.so — базовый кирпич «в дженге»
- ELF — все захардкожено жестко, по путям. «RPATH»…
Технически решаемо, но это не просто «скопировать».
TerrariumAssembler .
- Первый вариант CasketAssembler — вообще-то шкатулка.
- но и увы, гроб.
- Условная герметичность и самодостаточность.
- Не специальная изоляция для безопасности.
Секретный ингридиент — Nuitka.
- Python/CPython для отладки
- Производительность, декомпиляция
- Куча IDE, REPL-цикл, Jupyter-ноутбуки, прототипы
- http://nuitka.net/
- Компиляция: Python —→ C/C++ → GCC/MSVC → .EXE + [.DLLS]
- Долго
- Не всегда успешно
- Nuitka-компиляция
- Крутейшая производительность. Заруливают Numba.
- Есть проблемы
- Куча проблем генерации-сборки модулей
- Внешние модули и утилиты (tesseract/imagick и т.п.).
- Есть проблемы
- Крутейшая производительность. Заруливают Numba.
Смотри меня .
Структура террариума .
- lib64
- Все запатченные библиотеки.
- pbin
- Все запатченные бинарники, которых можно загружать только используя свою ld.so, она же лежит тут.
- ebin
- Внешний интерфейс к террариуму — скрипты запуска чего-то изнутри.
Остальные папки опционально.
Смотри меня .
YAML-файл спецификации .
Исходники .
- src_dir
- где размещать исходные файлы.
- python_packages
- Наполнение террариума «питонами»
- pip
- Просто список PIP-пакетов.
- build
- Список исходников для checkout, которые необходимы для сборки.
- terra
- Список исходников для checkout, которые необходимы в террариуме для работающего там питона.
Исходники можно задавать либо просто git-urlом, либо с указанием ветки или патча.
- git@gitlab.ispras.ru:fomin/komodo_python3_dbgp.git - url: https://github.com/tomerfiliba/reedsolomon.git branch: v1.5.3
- templates_dirs
- Шаблон террариума (файлы обрабатываются «jinja-шаблонизатором»)
Пакеты для Linux OS .
- packages
- Списки пакетов для ОС
- build
- Пакеты, небходимые только для сборки
- terra
- Пакеты, неоходимые для работы «террариума»
Каждый пакет может задаваться либо просто названием, либо названием и URLом
- name: unitedrpms url: https://github.com/UnitedRPMs/unitedrpms/releases/download/17/unitedrpms-32-17.fc32.noarch.rpm
- exclude_prefix
- префиксы пакетов, которых нужно исключить при замыкании.
- exclude_suffix
- суффиксы пакетов, которых нужно исключить при замыкании.
Компиляция .
- nuitka
-
- std_flags
- стандартный набор флагов
- force_packages
- пакеты, которых точно нужно включить
- force_modules
- модули, которых точно нужно включить
- block_packages
- наоборот, пакеты, которых нужно избегать.
- builds
- список питон-исходников для компиляции
- folder
- папка, отнотельно каталога исходников.
- utility
- название к утилиты (без «.py»)
Сборка с патчингом .
- templates_dirs
- Шаблон террариума (файлы обрабатываются «jinja-шаблонизатором»)
- bin_regexps
- Регулярки, выделяющие необходимые террариуму бинарные файлы
- need_patch
- Утилиты, которые неоходимо вызывать снаружи террариума, и их нужно патчить.
- just_copy
- Бинарники, которых просто нужно скопировать.
Установка .
pip install terrarium-assembler
git clone https://github.com/belonesox/terrarium_assembler/ … python3 setup.py develop
Вызов утилиты .
[stas@stasbox64gb demo]$ terrarium_assembler --help usage: terrarium_assembler [-h] [--debug] [--docs] [--stage-download-rpms] [--stage-download-sources-for-rpms] [--stage-checkout] [--stage-install-rpms] [--stage-download-wheels] [--stage-build-wheels] [--stage-install-wheels] [--stage-build-nuitka] [--stage-make-isoexe] [--stage-build-and-pack STAGE_BUILD_AND_PACK] [--stage-download-all] [--stage-all STAGE_ALL] [--stage-pack STAGE_PACK] specfile Create a portable linux folder-application positional arguments: specfile Specification File optional arguments: -h, --help show this help message and exit --debug Debug version of release --docs Output documentation version --stage-download-rpms Stage for download RPMs --stage-download-sources-for-rpms Stage for download SRPMs — sources packages for RPMS --stage-checkout Stage for checkout sources --stage-install-rpms Stage for install downloaded RPMS --stage-download-wheels Stage for download needed WHL-python packages --stage-build-wheels Stage for compile wheels for our python sources --stage-install-wheels Stage for Install our and external Python wheels --stage-build-nuitka Stage for Compile Python packages to executable --stage-make-isoexe Stage for Also make self-executable install archive and ISO disk --stage-build-and-pack STAGE_BUILD_AND_PACK Install, build and pack --stage-download-all Download all — sources, packages --stage-all STAGE_ALL Install, build and pack --stage-pack STAGE_PACK Stage pack to given destination directory
Этапы сборки .
Сценарии .
- Просто собрать (однократно)
- Вытащить исходники и заморозить зависимости, чтобы можно было собрать в другом времени и месте (для аудита).
- Воспроизвести сборку по предоставленным исходникам для аудита.
- Введение нового разработчика
- Сборочная среда с возможностью идемпотентного повторения отдельных этапов
- Итеративное тестирование
- Проблемы сборки — падения компиляторов, анализаторов и т.п.
- Сборочная среда с возможностью идемпотентного повторения отдельных этапов
Группировка .
- --stage-all=
- «Сделать все»
- --stage-download-all
- «Скачать все нужное» — пакеты, исходники
- --stage-download-rpms
- Скачать RPM-пакеты
- --stage-checkout
- Вытащить исходники
- --stage-download-wheels
- Выкачать питон-пакеты, по зависимостям из исходников.
- --stage-build-and-pack=
- «Собрать все и упаковать»
- --stage-install-rpms
- Установка RPM-пакетов
- --stage-build-wheels
- Сборка WHL-питон пакетов
- --stage-install-wheels
- Установка Python-пакетов.
- --stage-build-nuitka
- Компиляция Python-утилит в выполняемый файл через NUITKA
- --stage-pack=
- Упаковка всего в переносной «террариум»
- --stage-make-isoexe
- Сделать ISO-диск с самораспаковывающимся shell-архивом.
Shell-файлы для повторения .
01-download-rpms.sh 02-install-rpms.sh 03-checkout.sh 05-download-wheels.sh 09-build-wheels.sh 15-install-wheels.sh 40-build-nuitkas.sh build_technodemo.sh 50-pack.sh 90-download-sources-for-rpms.sh
Getting Started .
git clone https://github.com/belonesox/terrarium_assembler/
- https://github.com/belonesox/terrarium_assembler/tree/master/demo
- Простой пример
- Vagrant-инфраструктура — виртуалка-сборщи (FC32), виртуалка-тестирования (Ubuntu12).
- Утилита https://github.com/belonesox/terrarium_assembler/blob/master/demo/utility/technodemo.py — элементарная, но использует жирный стек.
- Описание сборки https://github.com/belonesox/terrarium_assembler/blob/master/demo/release.yml
- Шаблон террариума → https://github.com/belonesox/terrarium_assembler/tree/master/demo/template
Простой путь до конца .
Инсталляционный диск technodemo .
cd demo
vagrant up ta-builder vagrant ssh ta-builder
sudo bash cd /vagrant/demo terrarium_assembler --stage-all=./out --stage-make-isoexe release.yml
Проверка под альтернативным старым линуксом .
vagrant up ta-test-ubuntu12; vagrant ssh ta-test-ubuntu12
Возможные проблемы .
Концептуальные недостатки .
Очевидные проблемы «трагедии общин»
- На порядок жирнее
- Траты диска, памяти.
- Каждую популярную софтину так нельзя.
- Уязвимости надо отслеживать. «Flatpak - a security nightmare»
- Не стоит для открытых сервисов.
Падения компиляции.
Вероятностное.
{standard input}: Assembler messages: {standard input}:1898: Warning: end of file not at end of a line; newline inserted {standard input}:3538: Error: number of operands mismatch for `movq' {standard input}: Error: open CFI at the end of file; missing .cfi_endproc directive gcc: fatal error: Killed signal terminated program cc1
Что можно сделать:
- Увеличить память в VagrantFile
v.memory = 16000
- Уменьшить «--jobs» в "build*.sh"