Список примеров
Copyright (c) 2007 Connexion project, Peter V. Saveliev.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found on the GNU site[1].
Целью проекта Connexion является создание среды разработки приложений для управления операционной системой, среды достаточно дружелюбной как по отношению к пользователю, так и к разработчику. Поскольку управление операционной системой предполагает работу разнородных приложений, то необходимо обеспечить как лёгкое взаимодействие компонент, так и высокий процент повторного использования кода. Всего этого можно достичь лишь стабильными протоколами и программными интерфейсами в рамках достаточно общей модели.
Ниже перечислены конкретные цели, которые стоят перед проектом. Некоторые из них достигнуты, некоторые находятся в процессе реализации.
управление узлом (машиной), равно как и набором узлов (доменом управления)
многоинтерфейсный доступ (в пределах разумного -- веб, консоль)
возможность отката по ошибке в гарантированно рабочее состояние, либо выполнение заранее определённого кода в результате ошибки
подключение внутренних (нативных) модулей равно как и внешних (скрипты, исполняемые файлы)
разграничение доступа операторов к наборам модулей
Среда Connexion состоит из следующих компонент:
Ядро, программа под названием connexion, осуществляет связь между всеми компонентами системы и всю высокоуровневю логику работы, необходимую для функционирования модулей.
Программные компоненты, непосредственно реализующие логику работы с ОС. Инкапсулируя в себе конкретные вызовы утилит, они позволяют предоставить пользователю через интерфейс Connexion одинаковый набор команд для настройки одинаковой функциональности на разных системах.
Компоненты, осуществляющие взаимодействие ядра системы и пользователя. Благодаря стабильному и простому протоколу работы для интерфейсов, они могут быть реализованы для большинства моделей взаимодействия. При этом один и тот же набор модулей будет доступен через любой интерфейс.
Для представления данных Connexion использует дерево, где каждый узел образован
командой соответствующего ей модуля. Узлы могут быть уникальны в пределах всего
дерева (таков, например, интерфейс loopback
), могут быть уникальны в пределах
одной ветви (скорость работы интерфейса ethernet
), могут быть не уникальны (адреса
на интерфейсах). Ветвь дерева, в которой доступна команда, может быть строго
определена (все интерфейсы доступны в ветви interfaces
), а может
случиться так, что команда доступна в любой ветви (команда фильтрации on
).
Все эти свойства команд управляются модулями, в которых они описаны.
В общем случае, при обработке команд ядро Connexion рекурсивно обходит все узлы дерева, по пути формируя так называемое «окружение» и вызывая соответствующие методы команд. Каждый узел на пути обходчика дерева привносит что-либо в окружение, и это становится доступным или дочерним узлам, или родительским. Взаимодействуя друг с другом, узлы дерева формируют описание системы, которое, в итоге, принимает вид шелл-кода и исполняется сервисами. Результат выполнения может быть перенаправлен в пользовательский интерфейс.
Ниже приведён пример описания простых сетевых настроек. Ещё раз напомним, что за каждый
узел этого дерева отвечат своя команда и свой модуль. Это позволяет повторно использовать,
например, код обрабоки инструкций address
в разных интерфейсах, а код
поиска подходящего IP-пакета как в ветвях управления шейпингом, так и в ветвях брандмауэра.
Пример 1. Простые сетевые настройки
! ! Со знака "!" начинаются комментарии. На самом деле, ! знак "!" тоже является командой, описан в отдельном ! модуле и строка после него — это параметры команды. ! configure network ! interfaces ! ethernet 0 address 10.0.0.1/24 address 10.0.0.2/24 ! loopback enable ! routing table main route 192.168.0.0/16 via 10.0.0.127 route default via 10.0.0.128
Простота и стабильность протоколов и API. Для работы с интерфейсами Connexion использует XML-RPC, чрезвычайно простой протокол, реализованный для большинства языков программирования. Это означает, что интерфейс может быть написан на любом удобном разработчику языке, а стабильность RPC API гарантирует, что изменения ядра не потребуют переработки логики уже написанного кода. Помимо этого, планируется предоставление доступа к ядру через шину Dbus.
То же самое относится и к модулям. Высокий уровень абстракции и стабильность API позволяет писать модули, рассчитывая на их применение вне зависимости от изменений программ-интерфейсов.
Обобщённая модель данных. Хранение данных в дереве — давний и проверенный способ абстракции, позволяющий в случае Connexion рассчитывать на высокий процент повторного использования кода за счёт применений одних и тех же модулей в разных ветвях дерева.
Проверка типов данных. Ядро Connexion не просто хранит и обрабатывает данные, запуская соответствующие методы команд, образующих узлы дерева. Оно предоставляет механизм обработки параметров, переданных командам, а также автоматическую проверку соответствия типам данных. Команда, ожидающая увидеть в качестве первого параметра, например, IP-адрес, гарантировано получит именно IP-адрес. Все прочие значения будут отвергнуты ядром.