Difference between revisions of "TerrariumAssembler"

From Wiki4Intranet
Jump to: navigation, search
(Простой путь до конца .)
 
(23 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
=== Проблема. ===
 
=== Проблема. ===
==== Введение в проблему ====
 
{{Vimeoembed|408659991|800|450}}
 
https://vimeo.com/408659991/d1627a5c67
 
 
[[File:tesseract-expert.jpg|256px|right]]
 
[[File:tesseract-expert.jpg|256px|right]]
 
Околонаучные/высокотехнологичные приложения:  
 
Околонаучные/высокотехнологичные приложения:  
Line 21: 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 89: 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 97: 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

Проблема.

Tesseract-expert.jpg

Околонаучные/высокотехнологичные приложения:

  • Нет альтернативы — Numpy+Scipy+OpenCV+Keras…
    • gonum
  • Множество других фишек и батареек Python
  • Быстрый цикл экспериментов и разработки
  • Связь с бандлами приложений (Tesseract, Imagick)

Надо

  • Деплой на
    • Все версии Windows
    • Все версии Linux (включая очень странные)
  • Работало быстро
  • Секретные алгоритмы
    • On Impossibility of Obfuscation [1]
    • PYC-файлы, cx_freeze, py2exe — абсолютная открытость.

Смотри меня .

HTML-код включения <iframe src="http://player.vimeo.com/video/408659991?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

📹

Деплой на Linux. Стандартные варианты.

LotOfLinuxes.jpg

Нативная сборка под каждый дистрибутив

  • Ад. RPM. DEB. RPM v4, v5, v4+, RPM on APT.
  • Dependency hell. API/ABI hell.
  • Package policy hell. Deps
  • Сертифицированные дистрибутивы — все ископаемое.
  • Нет контроля над библиотеками.
    • «Ограниченная поддержка» — «мы только собрали, не помним как, а поддержка — »
  • Комбинаторный взрыв вариантов тестирования.
Maintaining-is-complex.png
  • Можно — но за отдельные деньги.


Деплой на Linux. Их слишком много.

Error creating thumbnail: File with dimensions greater than 25 MP

Деплой на Linux. Статическая линковка.

  • Одна утилита — ОК.
  • Надо пересобирать все.
  • Бандлы приложений
  • Нарушение LGPL/QT-лицензий.

Деплой на Linux. Контейнеры.


Стандартные контейнеры

  • Масса вариантов
  • Хорошая идея
  • Нет стандартов
  • Нет на ряде дистрибутивов
    • Нужны клиенты-демоны
      • AppImage — не обязательно.

Ожидания заказчика — «папка, копировать, просто работает, запускаем разные программы в ней, можно взаимодействовать с системой»

  • Intel X64 везде, ну ладно, пусть будет Win/Lin отдельно.

Деплой на Linux. Просто папка? .

  • «Нельзя просто взять и скопировать»©
  • Неочевидно для Windows-пользователей — «работает же с Win95…»
    • Там это специально добиваются, и это недешево. SxS
  • libc-совместимость → major-изменения в API каждые пару лет.

пересобирать все.

  • ld-image.so — базовый кирпич «в дженге»
  • ELF — все захардкожено жестко, по путям. «RPATH»…

Технически решаемо, но это не просто «скопировать».


TerrariumAssembler .

Casketassembler-ikea.png
  • Первый вариант CasketAssembler — вообще-то шкатулка.
    • но и увы, гроб.
Террариум с питонами.jpg
  • Условная герметичность и самодостаточность.
    • Не специальная изоляция для безопасности.

Секретный ингридиент — Nuitka.

Nuitka-4-Anuitka.png
  • Python/CPython для отладки
    • Производительность, декомпиляция
    • Куча IDE, REPL-цикл, Jupyter-ноутбуки, прототипы
  • http://nuitka.net/
  • Компиляция: Python —→ C/C++ → GCC/MSVC → .EXE + [.DLLS]
    • Долго
    • Не всегда успешно
  • Nuitka-компиляция
    • Крутейшая производительность. Заруливают Numba.
      • Есть проблемы
        • Куча проблем генерации-сборки модулей
        • Внешние модули и утилиты (tesseract/imagick и т.п.).

Смотри меня .

HTML-код включения <iframe src="http://player.vimeo.com/video/408659882?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

📹


Структура террариума .

lib64
Все запатченные библиотеки.
pbin
Все запатченные бинарники, которых можно загружать только используя свою ld.so, она же лежит тут.
ebin
Внешний интерфейс к террариуму — скрипты запуска чего-то изнутри.

Остальные папки опционально.

Смотри меня .

HTML-код включения <iframe src="http://player.vimeo.com/video/408659814?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

📹

YAML-файл спецификации .

HTML-код включения <iframe src="http://player.vimeo.com/video/408659719?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

Исходники .

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


HTML-код включения <iframe src="http://player.vimeo.com/video/408659644?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

Вызов утилиты .

[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/


Простой путь до конца .

HTML-код включения <iframe src="http://player.vimeo.com/video/408659549?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

Инсталляционный диск 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

HTML-код включения <iframe src="http://player.vimeo.com/video/408659432?byline=0&portrait=0" width="800" height="450" frameborder="0"></iframe>

Скачать → на странице видео на vimeo, кнопка «Download»

Возможные проблемы .

Концептуальные недостатки .

Очевидные проблемы «трагедии общин»

  • На порядок жирнее
  • Траты диска, памяти.
    • Каждую популярную софтину так нельзя.
  • Уязвимости надо отслеживать. «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"