Alterator-manager (Иван Савин, OSSDEVCONF-2023) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) |
StasFomin (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
…и консольными фрейворками, которым предоставлен гибкий, расширяемых набор программных интерфейсов </blockquote> {{VideoSection}} {{vimeoembed|898210832|800|450}} {{youtubelink|}} |NRUJ250v4WY}} {{SlidesSection}} [[File:Alterator-manager (Иван Савин, OSSDEVCONF-2023).pdf|left|page=-|300px]] {{----}} == Thesis == Alterator-manager — это сервис для управления операционной системой через D-Bus. Его функционал реализуется в модулях, а интерфейс описывается в специальных конфигурационных файлах. === Как работает alterator-manager === Alterator-manager может быть запущен в двух режимах — обычном и пользовательском: <pre> $systemctl start alterator-manager.service </pre> или <pre> $systemctl --user start alterator-manager.service </pre> В первом случае сервис запускается с полномочиями суперпользователя (root) и регистрирует имя (<tt>ru.basealt.alterator</tt>) на системной шине D-Bus. Во втором случае сервис запускается от обычного пользователя и регистрирует имя на сессионной шине D-Bus. После запуска происходит считывание конфигурационных файлов из <tt>/usr/share/alterator/backends/</tt> и загрузка модулей из <tt>/usr/libexec/alterator/</tt>. Конфигурационные файлы — это glib-овские key-value файлы, они должны иметь расширение <tt>.backend</tt> для обычного режима работы и <tt>.user.backend</tt> для пользовательского. На их основе формируется интроспекция для D-Bus и правила polkit (только в обычном режиме). === Формат конфигурационных файлов === <pre> [Manager] module_name = executor node_name = example interface_name = example thread_limit = 5 [make_ls2] execute = ls -al {param} [make_ls3] execute = ls -al {param} [example] execute = ls -al {param} stdout_strings = enabled stdout_bytes = enabled stderr_strings = enabled stdout_signal_name = stdout_signal_example stderr_signal_name = stderr_signal_example stdout_byte_limit = 200000 stdout_strings_limit = 200000 stderr_strings_limit = 200000 thread_limit = 3 action_id = method-name </pre> Первая секция <tt>Manager</tt> обязательная, она имеет следующие пары ключ-значение: * <tt>module_name</tt> — имя модуля который будет обрабатывать запросы; * <tt>node_name</tt> — имя узла в поддереве D-Bus; * <tt>interface_name</tt> — имя интерфейса D-Bus; * <tt>thread_limit</tt> — максимальное число тредов для данного интерфейса. К <tt>interface_name</tt> автоматически добавляется префикс «<tt>ru.basealt.alterator.</tt»>. Имя интерфейса может содержать только <tt>[A-Z][a-z][0-9]_</tt>. Если оно состоит из нескольких секций, то они разделяются точкой. Пустые секции не допускаются. Из имени интерфейса формируется <tt>action_id</tt> (polkit) по умолчанию для методов интерфейса, для чего подчёркивания заменяются на тире. Опция <tt>thread_limit</tt> не обязательна. Если её явно не задать, то её значение будет равно 10 (максимальное число методов, выполняемых одновременно). Каждая следующая секция — это метод. Имя секции — имя метода. Имя метода может состоять только из латинских букв, цифр и символа подчёркивания. Пробелы не допускаются. Содержимое секции зависит от модуля, который будет обрабатывать запрос. В секции <tt>example</tt> приведены возможные опции метода для модуля <tt>executor</tt>. Поле <tt>execute</tt> — обязательное, остальные — нет. Поле <tt>execute</tt> содержит строку для <tt>bash</tt> с исполняемым файлом. Внутри фигурных скобок могут задаваться параметры для метода D-Bus. Параметров может не быть. Имя параметра может содержать только латинские буквы, цифры и символ подчёркивания. В примере выше метод <tt>make_ls2</tt> будет выполнять команду <tt>ls -al</tt> с параметром <tt>param</tt>, в который можно будет передать имя директории или файла. С помощью полей <tt>stdout_strings</tt>, <tt>stdout_bytes</tt> и <tt>stderr_strings</tt> можно включить возможность возврата массива строк или массива байт из <tt>stdout</tt> и массива строк из <tt>stderr</tt>. Для этого полю нужно задать значение <tt>enabled</tt>. Если включён возврат массива байт, то возврат строк из <tt>stdout</tt> отключается (в том числе сигналами). Максимальный размер в байтах для соответствующего массива можно задать с помощью полей <tt>stdout_byte_limit</tt>, <tt>stdout_strings_limit</tt> и <tt>stderr_strings_limit</tt>. Значение по умолчанию — 524288. Допустимый диапазон — от 0 до 2147483647. Вывод из <tt>stdout</tt> и <tt>stderr</tt> можно также получать с помощью сигналов. Имя сигнала получается путём конкатенации <tt>sender'</tt>а и значения соответствующего поля (<tt>stdout_signal_name</tt> или <tt>stderr_signal_name</tt>). В <tt>sender'е</tt> «<tt>:</tt»> и «<tt>.</tt»> заменяются на «<tt>_</tt>». Значения полей <tt>stdout_signal_name</tt> и <tt>stderr_signal_name</tt> могут содержать только латинские буквы, цифры и символ подчёркивания. Сигналы для <tt>stdout</tt> и <tt>stderr</tt> включены, если соответствующему полю задано значение. С помощью поля <tt>thread_limit</tt> можно задать ограничение на количество тредов для метода, т.е. сколько экземпляров этого метода можно запустить параллельно. Значение по умолчанию — 1. В поле <tt>action_id</tt> можно задать <tt>action_id</tt> polkit для метода. Поле может содержать только следующие символы <tt>[A-Z][a-z][0-9].-</tt>. К значению этого поля будет автоматически добавлен префикс сформированный из имени интерфейса. === Пример === Создадим <tt>example.backend</tt>: <pre> [Manager] module_name = executor node_name = example interface_name = example [hexdump] execute = hexdump -C {param} stdout_strings = enabled stdout_strings_limit = 7000000 thread_limit = 3 </pre> В этом примере мы получаем вывод (<tt>stdout</tt>) запускаемой команды массивом строк, но, как уже писалось выше, вывод мы можем получать и в виде массива байт. Запустим наш сервис и посмотрим на дерево D-Bus. [[File:2023-savin-img001.png|center|640px|Дерево D-Bus для ru.basealt.alterator]] Объект <tt>/ru/basealt/alterator/example</tt> Интерфейс <tt>ru.basealt.alterator.example</tt> Метод <tt>hexdump</tt> возвращает массив строк из <tt>stdout</tt>. Выполним метод hexdump. [[File:2023-savin-img002.png|center|640px|Выполнение метода hexdump]] Таким образом, можно сформировать <tt>backend</tt> для какого-либо приложения с API на D-Bus. {{----}} [[File:{{#setmainimage:Alterator-manager (Иван Савин, OSSDEVCONF-2023)!.jpg}}|center|640px]] {{LinksSection}} <!-- <blockquote>[©]</blockquote> --> <references/> [[Категория:OSSDEVCONF-2023]] [[Категория:Open-source projects]] [[Категория:Draft]] |
Текущая версия на 10:39, 27 июня 2024
- Докладчик
- Иван Савин
Доклад посвящён анализу текущего состояния разработки новой версии конфигуратора для операционных систем семейства «Альт», а также концептуальным особенностям и техническим возможностям его реализации на базе шины Dbus.
Раскрываются планы разработки на ближайшее будущее, включающие смену стека технологий бекенда и предоставление возможности реализации фронтендов на различных языках программирования с различными графическими и консольными фрейворками, которым предоставлен гибкий, расширяемых набор программных интерфейсов
Содержание
Видео
Презентация
Thesis
Alterator-manager — это сервис для управления операционной системой через D-Bus. Его функционал реализуется в модулях, а интерфейс описывается в специальных конфигурационных файлах.
Как работает alterator-manager
Alterator-manager может быть запущен в двух режимах — обычном и пользовательском:
$systemctl start alterator-manager.service
или
$systemctl --user start alterator-manager.service
В первом случае сервис запускается с полномочиями суперпользователя (root) и регистрирует имя (ru.basealt.alterator) на системной шине D-Bus. Во втором случае сервис запускается от обычного пользователя и регистрирует имя на сессионной шине D-Bus. После запуска происходит считывание конфигурационных файлов из /usr/share/alterator/backends/ и загрузка модулей из /usr/libexec/alterator/. Конфигурационные файлы — это glib-овские key-value файлы, они должны иметь расширение .backend для обычного режима работы и .user.backend для пользовательского. На их основе формируется интроспекция для D-Bus и правила polkit (только в обычном режиме).
Формат конфигурационных файлов
[Manager] module_name = executor node_name = example interface_name = example thread_limit = 5 [make_ls2] execute = ls -al {param} [make_ls3] execute = ls -al {param} [example] execute = ls -al {param} stdout_strings = enabled stdout_bytes = enabled stderr_strings = enabled stdout_signal_name = stdout_signal_example stderr_signal_name = stderr_signal_example stdout_byte_limit = 200000 stdout_strings_limit = 200000 stderr_strings_limit = 200000 thread_limit = 3 action_id = method-name
Первая секция Manager обязательная, она имеет следующие пары ключ-значение:
- module_name — имя модуля который будет обрабатывать запросы;
- node_name — имя узла в поддереве D-Bus;
- interface_name — имя интерфейса D-Bus;
- thread_limit — максимальное число тредов для данного интерфейса.
К interface_name автоматически добавляется префикс
«ru.basealt.alterator.</tt»>. Имя интерфейса может содержать только <tt>[A-Z][a-z][0-9]_. Если оно состоит из нескольких секций, то они разделяются точкой. Пустые секции не допускаются. Из имени интерфейса формируется action_id (polkit) по умолчанию для методов интерфейса, для чего подчёркивания заменяются на тире.
Опция thread_limit не обязательна. Если её явно не задать, то её значение будет равно 10 (максимальное число методов, выполняемых одновременно).
Каждая следующая секция — это метод. Имя секции — имя метода. Имя метода может состоять только из латинских букв, цифр и символа подчёркивания. Пробелы не допускаются. Содержимое секции зависит от модуля, который будет обрабатывать запрос.
В секции example приведены возможные опции метода для модуля executor. Поле execute — обязательное, остальные — нет. Поле execute содержит строку для bash с исполняемым файлом. Внутри фигурных скобок могут задаваться параметры для метода D-Bus. Параметров может не быть. Имя параметра может содержать только латинские буквы, цифры и символ подчёркивания. В примере выше метод make_ls2 будет выполнять команду ls -al с параметром param, в который можно будет передать имя директории или файла.
С помощью полей stdout_strings, stdout_bytes и
stderr_strings можно включить возможность возврата массива строк или массива байт из stdout и массива строк из stderr. Для этого полю нужно задать значение enabled. Если включён возврат массива байт, то возврат строк из stdout отключается (в том числе сигналами). Максимальный размер в байтах для соответствующего массива можно задать с помощью полей stdout_byte_limit, stdout_strings_limit и stderr_strings_limit. Значение по умолчанию — 524288. Допустимый диапазон — от 0 до 2147483647. Вывод из stdout и stderr можно также получать с помощью сигналов. Имя сигнала получается путём конкатенации sender'а и значения соответствующего поля (stdout_signal_name или stderr_signal_name). В sender'е «:</tt»> и «<tt>.</tt»> заменяются на «<tt>_».
Значения полей stdout_signal_name и stderr_signal_name могут содержать только латинские буквы, цифры и символ подчёркивания. Сигналы для stdout и stderr включены, если соответствующему полю задано значение. С помощью поля thread_limit можно задать ограничение на количество тредов для метода, т.е. сколько экземпляров этого метода можно запустить параллельно. Значение по умолчанию — 1. В поле action_id можно задать action_id polkit для метода. Поле может содержать только следующие символы [A-Z][a-z][0-9].-. К значению этого поля будет автоматически добавлен префикс сформированный из имени интерфейса.
Пример
Создадим example.backend:
[Manager] module_name = executor node_name = example interface_name = example [hexdump] execute = hexdump -C {param} stdout_strings = enabled stdout_strings_limit = 7000000 thread_limit = 3
В этом примере мы получаем вывод (stdout) запускаемой команды массивом строк, но, как уже писалось выше, вывод мы можем получать и в виде массива байт.
Запустим наш сервис и посмотрим на дерево D-Bus.
Объект /ru/basealt/alterator/example
Интерфейс ru.basealt.alterator.example
Метод hexdump возвращает массив строк из stdout.
Выполним метод hexdump.
Таким образом, можно сформировать backend для какого-либо приложения с API на D-Bus.