Alterator D-Bus bridge (deprecated)

Материал из ALT Linux Wiki


48px-Mail-mark-junk red.svg.png
Эта статья об устаревшей реализации.
Документация на новую реализацию на странице Alterator на D-Bus


Первая реализация службы, которая выставляет интерфейсы модулей Альтератора на шине D-Bus. Реализовано в виде программного моста, перенаправляющего запросы с шины D-Bus на шину woo-bus. Данная технология не получила развитие в силу того, что задать строгое API для некоторых модулей оказалось достаточно проблематичным. Новое руководство доступно на странице Alterator на D-Bus.

Правила написания xml файла описывающего модуль alterator'а для сервиса alterator-dbus.

При установке пакета с модулем alterator'а xml файл помещается в /usr/share/dbus-1/interfaces/.

Пример названия xml файла: 'ru.basealt.alterator.update-kernel.xml'. Последняя часть, это название модуля alterator'a - 'update-kernel'.

Методы, которые предоставляет backend модуля alterator'а описываются в тегах method.

Пример:

<method name="list__installed_modules">
    <arg name="instkernel" type="s" direction="in" />
    <arg name="name" type="as" direction="out" />
    <arg name="label" type="as" direction="out" />
</method>

Имя метода состоит из двух частей, которые разделены двойным подчёркиванием. Первая часть это префикс, он означает action - значение, которое передаётся backend'у в переменной in_action. Вторая часть это само имя, то которое передаётся backend'у в переменной in__objects.

Аргументы метода описываются в тегах 'arg' и могут иметь один из трёх типов: "s" - строка, "as" - массив строк, "b" - логический тип (boolean). Атрибут name - это имя аргумента, то что используется в backend'е. Атрибут direction может принимать значение "in" для аргументов отправляемых в backend и "out" для аргументов возвращаемых из backend'а.

Тип аргумента "as" используется в следующих случаях:

1) Возврат из backend'а значений для элементов checklist и т.п. (write_enum_item $var $var). В этом случае возвращается две последовательности (два массива) переменных, одна с именем name, другая c именем value. Для каждой из них создаётся аргумент с типом "as".

2) write_enum - аргументы создаются для каждого ключа и каждой метки.

3) write_table_item <параметр1> <значение1> <параметр2> <значение2> ... - аргументы создаются для каждого параметра. Имя аргумента = имя параметра.

Пример:

       <arg name="параметр1" type="as" direction="out" />
       <arg name="параметр2" type="as" direction="out" />
       <arg name="параметр3" type="as" direction="out" />

4) Выделенные элементы для checklistbox. Они передаются из/в backend списком представленным строкой с разделителем ';', например "a;b;c;d". К имени такого аргумента добавляется префикс checklist#.

Пример:

      <method name="read__apt_inst_modules">
        <arg name="flavour" type="s" direction="in" />
        <arg name="checklist#instmodlist" type="as" direction="out" />
      </method>

Тип аргумента "s" используется для отправки и получения строки (write_string_param).

Тип аргумента "b" используется для отправки и получения значения переменной типа boolean (write_bool_param).

Разграничение прав доступа к методам модуля alterator'а

По умолчанию, для выполнения методов с action'ом write пользователь должен быть в группе wheel. Для методов с другими action'ми это не требуется.

Пример ru.basealt.alterator.policy:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
<policyconfig>
  <action id="ru.basealt.alterator.write">
    <description gettext-domain="some">Authorization</description>
    <message gettext-domain="some">Authentication is needed to perform this action.</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
  </action>

  <action id="ru.basealt.alterator.read">
    <description gettext-domain="some">Authorization</description>
    <message gettext-domain="some">Authentication is needed to perform this action.</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
  </action>
</policyconfig>

Пример ru.basealt.alterator.rules:

polkit.addRule(function(action, subject) {
    /* Allow administrators to read parental controls (for any account) without
     * needing an additional polkit authorisation dialogue. */

    if (action.id == "ru.basealt.alterator.read") {
        return "yes";
        }
    else if (action.id == "ru.basealt.alterator.write" && subject.isInGroup("wheel")) {
        /*return "yes";*/
        return polkit.Result.AUTH_SELF;
        }

    return polkit.Result.NOT_HANDLED;
});

При необходимости для конкретного модуля и для конкретного метода можно определить отдельное правило. action id формируется следующим образом: ru.basealt.alterator.<имя модуля>.<имя метода> для метода, ru.basealt.alterator.<имя модуля>.<write|read|list> для action'на.

Пример ru.basealt.alterator.update_kernel.policy:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
<policyconfig>
  <action id="ru.basealt.alterator.update_kernel.write__apt_update">
    <description gettext-domain="some">Authorization</description>
    <message gettext-domain="some">Authentication is needed to perform this action.</message>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
  </action>
</policyconfig>

Пример ru.basealt.alterator.update_kernel.rules:

polkit.addRule(function(action, subject) {
    /* Allow administrators to read parental controls (for any account) without
     * needing an additional polkit authorisation dialogue. */

    if (action.id == "ru.basealt.alterator.update_kernel.write__apt_update" && subject.isInGroup("wheel")) {
        return "yes";
        }
    return polkit.Result.NOT_HANDLED;
});