Введение в шаблоны Calculate 2.2 часть 1 - Создание тестового шаблона


Наиболее важным изменением Calculate Linux 10.9 является переход на новый формат шаблонов. Шаблоны Calculate 2 уже более двух лет используются при настройке сервера и только сейчас появилась возможность использовать их для настройки системы.\
Я планирую в нескольких статьях описать возможности шаблонов так, чтобы вы смогли (и у вас появился интерес) использовать шаблоны для настройки своей системы.


{{TOC}}

Введение

Для настройки конфигурационных файлов программ, утилиты Calculate 2 используют шаблоны. Шаблоны это текстовые файлы, которые состоят как правило из заголовка и тела. Заголовок занимает одну или более строк, разделенных в конце символом обратной косой черты “\” и начинается с:

 # Calculate

Заголовок может содержать параметры и условия. Наиболее популярный параметр 'format' отражает формат конфигурационного файла, в соответствии с синтаксисом которого должно быть составлено тело файла шаблона. В теле файла шаблона могут использоваться переменные, функции и условия.

Пути хранения шаблонов

В утилитах Calculate 2.2 шаблоны всех приложений хранятся в общих путях. Таких путей несколько:

# /usr/share/calculate/templates/
По этому пути хранятся шаблоны пакета calculate-templates. Пакет содержит все шаблоны утилит Calculate 2.2. По примеру этих шаблонов вы можете создавать свои.
# /var/calculate/templates/
Путь для хранения локальных шаблонов. Используйте этот путь для хранения своих шаблонов.
# /var/calculate/remote/templates/
Путь хранения сетевых шаблонов. Используя этот путь для шаблонов, вы можете управлять настройкой приложений на всех Linux-десктопах, введенных в домен.

Структура шаблонов

Переменные

Шаблоны могут использовать внутренние переменные утилит Calculate. Переменные содержат различные значения, такие как: настройки системы, параметры выполнения программ, заданные действия и т.д. Переменные состоят из нескольких слов, разделенных знаком подчеркивания “_”. Вначале переменной следуют сокращенное обозначение её типа. Пример: 'cl' - служебная переменная утилит, 'os' - настройки системы, 'ur' - данные пользователя. Для обозначения типа значений, в конце имени переменной могут использоваться зарезервированные слова. Пример: 'path' - путь, 'set' - установка значения on/off, 'ip' - ip-адрес и т.д. Значения переменных можно посмотреть, добавив к любой команде утилит Calculate 2.2 параметр (–var/-v), пример:

 # cl-install -v --filter *ip
The list of variables:
  Variable name   Mode Value
----------------- --- ----------
os_install_net_ip [r] 10.0.0.50
os_net_ip         [r] 10.0.0.50
----------------- --- ----------

У каждого пакета утилит может быть свой набор переменных. Такие переменные после обозначения типа начинаются с имени пакета. Например переменная 'os_install_locale_lang' принадлежит пакету calculate-install и в отличие от 'os_locale_lang' обозначает язык не в текущей, а в устанавливаемой системе. В шаблонах следует использовать переменную 'os_install_locale_lang', т.к. если вы будете просто обновлять настройки, устанавливаемая система будет равна текущей. Две переменные обозначающие язык системы нужны для отображения выполненных изменений в процессе установки или обновления системы. Пример:

 # cl-install -v --filter *locale_lang
The list of variables:
    Variable name      Mode Value
---------------------- --- ----------
os_install_locale_lang [r] ru_RU
os_locale_lang         [r] ru_RU
---------------------- --- ----------

В теле шаблона вы можете подставить значение любой переменной. Для этого добавьте перед ней символы '#-' и в конце '-#'. Пример:

#-os_install_locale_lang-#

Функции

Функции позволяют вычислять значения на основании заданных параметров. В качестве примера можно привести функцию sum(), в которой осуществляются простые операции сложения, которые использовались при расчёте расположения иконок на рабочем столе plasma-desktop. Аналогично переменным, функции могут быть вставлены в тексте шаблона, при добавлении перед функцией символов '#-' и в конце '-#'. Пример:

#-sum(bt,bt+2,bt+35+2)-#

Функции, как и переменные могут участвовать в условных выражениях в заголовке шаблона, либо в условных блоках.

Условные выражения

В условных выражениях утилит Calculate 2.2 практически ничего не изменилось с первой версии, разве что добавилась поддержка функций. Вы можете выделить определенный текст, добавив к нему условие. При выполнении условия текст будет обработан. Пример:

 # cat kopeterc
[Behavior]
#подключаться автоматически
#?pkg(kde-base/kopete)<4.2#
autoConnect=true
#pkg#
#?pkg(kde-base/kopete)>=4.2#
initialStatus=Online
#pkg#

В приведенном примере используется функция pkg(). Функция возвращает версию установленного пакета. Условные выражения '<' и '>=' работают также как и аналогичные в языках программирования. Помимо сравнения чисел, могут сравниваться также и версии программ, когда в номере присутствуют более одной точки.

Работа с шаблонами

Долой теорию, приступим к практике!

Для начала обновите утилиты до последних версий, выполнив:

eix-sync
emerge calculate-install calculate-client calculate-desktop

Пример 1. Создадим для примера локальный шаблон

mkdir -p /var/calculate/templates 
touch /var/calculate/templates/test.conf

Добавим в него следующий текст:

 # Calculate append=after
hello

Параметр заголовка 'append' говорит о том, что тело шаблона должно дописываться в конец конфигурационного файла.

Для тестирования выполним наложение локальных шаблонов:

 # cl-template -l local
 * Package calculate-install-2.2.0.0 has changed files:
 *      /test.conf
 * Package calculate-client-2.2.0.0 has changed files:
 *      /test.conf
 * Package calculate-desktop-2.2.0.0 has changed files:
 *      /test.conf

В результате в корне файловой системы будет создан файл 'test.conf' со следующим содержимым:

 # cat /test.conf
hello
hello
hello

Из примера видно, что наложение шаблона поочередно было выполнено каждым пакетом утилит Calculate 2.2. Давайте проверим.

Пример 2. Изменим содержимое нашего шаблона, добавив переменную

 # Calculate append=after
#-cl_name-#

Выполним наложение локальных шаблонов:

 # cl-template -l local
 * Package calculate-install-2.2.0.0 has changed files:
 *      /test.conf
 * Package calculate-client-2.2.0.0 has changed files:
 *      /test.conf
 * Package calculate-desktop-2.2.0.0 has changed files:
 *      /test.conf

Проверим содержимое файла '/test.conf':

 # cat /test.conf
hello
hello
hello
calculate-install
calculate-client
calculate-desktop

Как видите, результат подтвердился, поочередно в конечный файл были добавлены названия пакетов утилит Calculate. Причина такого поведения кроется в хранении шаблонов. Если в Calculate 2 шаблоны разных утилит хранились в разных путях, то утилиты Calculate 2.2 используют несколько общих путей. То есть, забегая вперед, правильно используя шаблоны вы сможете настраивать как определенный системный файл, так и графическое приложение. Иными словами, размещая свой шаблон, вы должны позаботиться о том, какому пакету он будет принадлежать.

Пример 3. Добавим условие в файл шаблона

Утилиты Calculate 2.2 отличаются между собой составом переменных. Например calculate-install обладает исчерпывающей подборкой переменных настройки системы. Пакет calculate-desktop содержит необходимое количество переменных для настройки рабочего стола. Пакет calculate-client - переменные для работы десктопа в домене.

Добавим условие, при котором шаблон будет выполняться только пакетом calculate-install. Для этого отредактируем наш файл шаблона:

 # Calculate append=after cl_name==calculate-install
#-cl_name-#

Выполним наложение локальных шаблонов:

 # cl-template -l local
 * Package calculate-install-2.2.0.0 has changed files:
 *      /test.conf

Проверим то, что увидели:

 # cat /test.conf
hello
hello
hello
calculate-install
calculate-client
calculate-desktop
calculate-install

Отлично! Теперь мы смело можем использовать все переменные пакета calculate-install. Список доступных переменных можно получить выполнив:

cl-install -v

Пример 4. Пример рабочего шаблона

Наш тестовый шаблон создавал файл в корне файловой системы и дописывал в него строчки. Давайте попробуем при помощи этого же шаблона изменить какой-нибудь произвольный файл, например '/etc/samba/smb.conf'. Отредактируем test.conf:

 # Calculate cl_name==calculate-install format=samba path=/etc/samba name=smb.conf 
link=/etc/samba/smb.conf.default
[global]
workgroup = MYSERVER

Уже интересней?

На что хочется обратить ваше внимание:
# Здесь уже нет параметра 'append', т.к. мы явно указали формат файла (format=samba), а для формата 'samba' по умолчанию действует объединение (append=join).
# Параметром 'path' мы поменяли путь конечного файла.
# Параметр 'name' изменил имя нашего шаблона на 'smb.conf'.
# Ну и наконец 'links' взял за основу объединения файл примера /etc/samba/smb.conf.default.

Обратите внимание, что параметр 'workgroup' заключен в области видимости переменных 'global'. Это важно, т.к. все параметры конфигурационного файла smb.conf должны быть записаны исключительно в своих областях видимости. Здесь я использую термин “область”, не “секция” и т.п., следуя терминологии принятой в руководстве по шаблонам.

Выполним 'cl-template -l local' и посмотрим результат:

 # cl-template -l local
 * Package calculate-install-2.2.0.0 has changed files:
 *      /etc/samba/smb.conf

Что получилось:

 # cat /etc/samba/smb.conf
...
#======================= Global Settings =====================================
[global]

 # workgroup = NT-Domain-Name or Workgroup-Name, eg: MIDEARTH
workgroup = MYSERVER
...

Как вы видите, необходимый результат достигнут, мы поменяли параметр конфигурационного файла с произвольным путем, воспользовавшись файлом примера.

Итог

Из статьи вы узнали, что:
# Шаблоны теперь легко найти, т.к. все утилиты Calculate 2.2 используют общие пути для хранения шаблонов.
# О назначении переменных не сложно догадаться.
# Такие функции, как pkg() могут существенно расширить возможности шаблонов.
# Шаблоны накладываются несколькими пакетами из состава утилит Calculate 2 и для правильной работы неплохо бы добавить условие для проверки определенного пакета.
# Любой шаблон может менять произвольный файл в системе.

P.S. Начиная с версии пакета calculate-install-2.2.0.0_p20100910, первые два примера работать не будут. Тем не менее, я не убираю их из статьи, т.к. по ним можно увидеть логику работы утилиты.

часть 2