Шаблоны

Обновлено 25 января 2021

Введение

Шаблоны - поистине фантастический инструмент для настройки системы. Без шаблонов невозможно представить себе Calculate Linux. В процессе разработки шаблонов был использован весь многолетний опыт администрирования Linux/Unix систем, и то, что по прошествии 10 лет синтаксис не претерпел существенных изменений, говорит о правильно выбранном решении.

Какие задачи решают шаблоны?

  • Для пользователя
    Calculate Linux использует непрерывную модель обновления. Это значит, что, установив один раз систему, вы сможете её непрерывно обновлять в течение всего срока жизни. За это время пакеты могут сменить свои версии, названия и форматы конфигурационных файлов. Шаблоны утилит Calculate следят за тем, чтобы настройки в системе оставились актуальными при каждом обновлении.

  • Для администратора
    Настройка конфигурационных файлов часто сводится к изменению нескольких строк в множестве файлов. Выделить вносимые изменения, понять, для чего они были сделаны, с течением времени становится затруднительным. Кроме того, новые версии пакетов могут переписать ваши изменения. В итоге единственным способом сохранить систему в рабочем виде остаётся либо отказ от обновлений, либо полное замораживание настроек.

Шаблоны созданы для решения этих проблем. Они интегрированы с пакетным менеджером, участвуя в процессе формирования обновления конфигурационных файлов. Все изменения в системе легко читаются в шаблонах, т.к. последние содержат только отличия от базовых настроек. Утилиты Calculate объединяют ваши настройки с базовыми, учитывая при этом формат конфигурационных файлов.

Особенности

  • Интеграция с основными событиями операционной системы и действиями утилит Calculate.
  • Интеграция с пакетным менеджером.
  • Поддержка настройки как системных файлов, так и профилей пользователей.
  • Поддержка синтаксиса большинства популярных форматов конфигурационных файлов.
  • Поддержка переменных, функций, условных выражений.
  • Несколько способов записи в файлы, включая выборочное изменение настроек в конфигурационных файлах.
  • Множественное хранение путей к шаблонам: в подключённых оверлеях, заданных директориях и в /etc.

По формату шаблоны представляют из себя конфигурационные файлы с расширенным синтаксисом, включающим встроенные переменные, функции, условные выражения и параметры. Поддерживая основные форматы синтаксиса конфигурационных файлов, шаблоны могут менять заданные настройки, не переписывая файлы целиком. Шаблоны задействованы повсюду: они участвуют в процессе настройки системы во время сборки, установки, первого запуска, обновления, настраивают сеанс пользователя и даже формируют базу данных LDAP.

Шаблоны тесно интегрированы с системой. Они не просто настраивают файлы, но и связывают их с пакетами. Выполняя настройки сеанса пользователя, шаблоны учитывают установленные в системе пакеты, настраивая только их. При установке новых программ они также будут настроены в профиле пользователя. Настройки профиля выполняются гибко, учитывая версии настроенных программ. Вся логика работы описана в самих шаблонах.

Роль шаблонов сложно переоценить. Например, одно из ключевых отличий Calculate Linux от Gentoo - Исправления и миграция реализовано именно при помощи шаблонов. Во время обновления системы, сразу после завершения синхронизации портежей и оверлеев, выполняются шаблоны миграции. При этом система получит необходимые исправления ещё до установки пакетов. Этого достаточно, чтобы поддерживать систему всегда в рабочем состоянии и выполнять переходы между версиями.

Обработку шаблонов выполняют утилиты Calculate. Для определения событий вызова и получения значений шаблоны используют переменные. Использование параметров и условных выражений позволило избавиться от фиксированных путей в именах и путях шаблонов, делая структуру хранения гибкой, позволяя ей развиваться эволюционно. Это значит, что вы можете использовать несколько путей для сортировки различных шаблонов или использовать один путь, где все условия будут перечислены в заголовке шаблона.

Формат шаблонов

Первая строка шаблона может содержать заголовок, обозначенный # Calculate:

# Calculate

Далее могут следовать одиночные параметры, параметры со значениями и условные выражения, объединённые в один или несколько блоков условий "и" (&&) и "или" (||).

Шаблон может состоять и из одного заголовка:

# Calculate path=/usr/share/pixmaps name=faces link=/usr/share/pixmaps/calculate/breeze symbolic pkg(kde-plasma/breeze)!=&&mergepkg(x11-themes/calculate-icon-theme)>=15-r2

Выполнение этого шаблона приведёт к созданию символической ссылки из директории /usr/share/pixmaps/calculate/breeze в директорию /usr/share/pixmaps/faces в случае наличия в системе пакетов kde-plasma/breeze и x11-themes/calculate-icon-theme версии 15-r2 или выше и свяжет эту ссылку с пакетом x11-themes/calculate-icon-theme.

Пример №1. Простой шаблон

Для примера создадим шаблон настроек пакета sys-libs/ncurses. Для этого нужно создать шаблон ncurses.sh:

/var/calculate/templates/ncurses.sh

# Calculate env=install ac_install_merge==on&&mergepkg(sys-libs/ncurses)!= path=/etc/profile.d comment=#
export LDFLAGS="${LDFLAGS} -ltinfo"

Теперь переустановите пакет sys-libs/ncurses, выполнив:

emerge -a1 ncurses

Проверьте, что в директории /etc/profile.d создался файл ncurses.sh со следующим содержимым:

/etc/profile.d/ncurses.sh

#------------------------------------------------------------------------------
# Modified Calculate Utilities 3.6.4.2
# Processed template files:
# /var/calculate/templates/ncurses.sh
# For modify this file, create /etc/profile.d/ncurses.sh.clt template.
#------------------------------------------------------------------------------
export LDFLAGS="${LDFLAGS} -ltinfo"

Давайте подробней рассмотрим формат шаблона:

  • env=install
    Параметром "env" задаётся область действия имён переменных и функций. По умолчанию используются базовые переменные и функции модуля main из библиотеки утилит. Подключая модуль install, мы можем использовать дополнительно переменные настройки системы. Посмотреть список переменных можно, выполнив @cl-core-variables-show --filter install.@ (с точкой в конце). Если модуль отсутствует в системе, шаблон будет пропущен.
  • ac_install_merge==on&&mergepkg(sys-libs/ncurses)!=
    Два условных выражения, записанных без пробела и обязательных для выполнения шаблона:
  • ac_install_merge==on
    Проверка на выполнение действия по настройке пакета - обязательное условие выполнения шаблона.
  • mergepkg(sys-libs/ncurses)!=
    Проверка на выполнение установки пакета sys-libs/ncurses. При выполнении @cl-setup-system@ условие также даст положительный результат.
  • path=/etc/profile.d
    Путь к директории, где будет записан конфигурационный файл.
  • comment=#
    Так как мы не задавали формат конфигурационного файла, неплохо указать символ разделителя комментария, чтобы утилиты могли сохранить служебную информацию, в т.ч. путь к шаблону, которым был настроен файл. Впоследствии по этому заголовку утилита cl-backup сможет отыскать ваш настроенный файл.

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

equery f sys-libs/ncurses | grep ncurses.sh

/etc/profile.d/ncurses.sh

Здесь мы видим, что созданный шаблоном файл принадлежит пакету sys-libs/ncurses.

Проверьте изменение контрольной суммы файла:

qcheck sys-libs/ncurses

Checking sys-libs/ncurses-6.1-r2 ...
  * 4038 out of 4038 files are good

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

Пример №2. Группировка шаблонов

Попробуем немного усложнить пример. Для пересылки пакетов между сетями настроим /etc/sysctl.conf. Поскольку у нас уже есть один шаблон, сгруппируем их вместе, чтобы упростить синтаксис. Для этого в директории /var/calculate/templates создадим директорию с произвольным именем merge:

mkdir -p /var/calculate/templates/merge

В данном случае директория - это тоже шаблон, и он имеет свои свойства. Чтобы описать их, создайте файл .calculate_directory внутри директории со следующим содержимым:

/var/calculate/templates/merge/.calculate_directory

# Calculate append=skip env=install ac_install_merge==on

Здесь вы видите, что установка области действия переменных env=install и проверка значения переменной действия ac_install_merge==on были перенесены из шаблона первого примера. А это значит, что в шаблонах внутри этой директории эту проверку уже можно не выполнять. Помимо этого был добавлен новый параметр append=skip. Установка этого параметра говорит о том, что сама директория не будет создана в системе.

Перенесите шаблон из первого примера в общую директорию:

mv /var/calculate/templates/ncurses.sh /var/calculate/templates/merge/

и упростите его синтаксис:

/var/calculate/templates/merge/ncurses.sh

# Calculate mergepkg(sys-libs/ncurses)!= path=/etc/profile.d comment=#
export LDFLAGS="${LDFLAGS} -ltinfo"

Создайте новый шаблон sysctl.conf со следующим содержимым:

/var/calculate/templates/merge/sysctl.conf

# Calculate format=procmail mergepkg(sys-apps/baselayout)!= path=/etc
net.ipv4.ip_forward = 1

Обратите внимание, что шаблон связан с пакетом sys-apps/baselayot. Чтобы узнать, какому пакету принадлежит файл, выполните:

equery b /etc/sysctl.conf

 * Searching for /etc/sysctl.conf ... 
sys-apps/baselayout-2.6-r1 (/etc/sysctl.conf)

Для того, чтобы проверить работу шаблона, вы можете либо переустановить пакет sys-apps/baselayout, либо выполнить:

cl-core-setup --pkg-name=baselayout -v -T local

 * Конфигурация утилитами Calculate системных настроек baselayout ...
 * Утилиты Calculate изменили файлы:  
 *      /etc/sysctl.conf 

Обратите внимание, что в файле /etc/sysctl.conf был изменён только один параметр:

/etc/sysctl.conf

...
net.ipv4.ip_forward = 1
...

Аналогичным образом вы можете проверить работу шаблона ncurses.sh:

cl-core-setup --pkg-name=ncurses -v -T local

 * Конфигурация утилитами Calculate системных настроек ncurses ...
 * Утилиты Calculate изменили файлы:  
 *      /etc/profile.d/ncurses.sh  

Пример №3. Clt-шаблон

Для упрощения работы с шаблонами был создан новый тип - так называемые clt-шаблоны. Эти шаблоны размещаются не в специально выделенной директории, а непосредственно в директории /etc, и имеют расширение .clt. Удобство использования таких шаблонов заключается в предустановленных значениях путей и условий использования. При этом clt-шаблоны обладают всеми возможностями полноценных шаблонов.

Для примера давайте попробуем изменить размер консольного шрифта при помощи шаблона. Для этого создадим копию файла:

cp /etc/conf.d/consolefont /etc/conf.d/consolefont.clt

и отредактируем размер шрифта:

/etc/conf.d/consolefont.clt

...
consolefont="ter-v12n"
...

Теперь, чтобы увидеть результат, переустановите пакет sys-apps/openrc, которому принадлежит файл настроек:

emerge -a1 openrc

grep ^consolefont /etc/conf.d/consolefont

consolefont="ter-v12n"

Данный шаблон всегда будет полностью переписывать файл своими настройками. Причём он даже не будет сообщать о том, что файл был создан им. Поэтому мы рекомендуем использовать clt-шаблоны, задействуя хотя бы минимум возможностей. Вместо копирования всего файла целиком создайте шаблон, состоящий всего из двух строк:

/etc/conf.d/consolefont.clt

# Calculate format=openrc
consolefont="ter-v12n"

Этот шаблон выполнит все те же действия, только проще и эффективней. Давайте выполним обновление пакета, чтобы посмотреть результат:

emerge -a1 openrc

grep ^consolefont /etc/conf.d/consolefont

consolefont="ter-v12n"

В результате вы видите, что только одна строчка осталась без изменения, плюс в заголовке файла был добавлен путь к вашему шаблону. Безусловно, это удобно - ведь в шаблоне вы указываете только те параметры, которые вам нужно изменить.

Вы видите, что синтаксис clt-шаблона максимально упрощён. Это стало возможно благодаря тому, что следующие настройки были заданы по умолчанию: env=install, ac_install_merge=on, path=/etc/conf.d и name=consolefont.

Заключение

В этой статье вы смогли получить только общее представление о шаблонах утилит Calculate.