Полное руководство по шаблонам Calculate
Обновлено 5 ноября 2026
Введение
Традиционно в ОС Linux настройки приложений хранятся в текстовых файлах, как правило в директории /etc, реже в /var. Форматы таких конфигурационных файлов различаются: от простых переменная=значение, до более сложных C-подобных конструкций, либо составленных в XML.
Простой на первый взгляд подход обеспечивает исключительную стабильность в работе приложений, так как за сохранность настроек отвечает исключительно файловая система.
Различные дистрибутивы Linux, как правило, предлагают свои программы настройки приложений. К сожалению, такой подход, имея неоспоримое преимущество в удобстве, имеет также ряд недостатков:
-
пользователь привязывается к определенной программе настройки (дистрибутиву);
-
количество настроек, как правило, ограничено интерфейсом программы;
-
прямое редактирование настроек становится затруднительным, т.к. программа переписывает файл при внесении изменений.
Особенности работы с шаблонами
В утилитах Calculate 2 и 3 подход к шаблонам был существенно переработан и обладает рядом отличий от первой версии:
-
Основной метод переноса шаблонов - объединение с конфигурационными файлами системы. При этом поддерживаются все популярные форматы файлов.
-
Объединение шаблона с конфигурационным файлом производится посредством конвертации в XML формат. При этом формат файла шаблона может отличаться от конфигурационного файла.
-
Файл шаблона может содержать заголовок, описывающий методы объединения.
-
Имена встроенных переменных переименованы согласно типу.
Шаблоны установки
Программа Calculate заменяет прямое редактирование файлов настроек на создание шаблонов.
Форматы файлов
Согласно методу хранения данных, файлы шаблонов могут иметь один из перечисленных форматов:
-
apache, kde, bind, postfix, proftpd, samba, procmail, ldap, dovecot, xml_xfce, xml_xfcepanel, xml_gconf, xml_gconf_tree, compiz, plasma, squid, dhcp, openrc, kernel, json, world - форматы файлов настроек распространенных приложений
-
bin - двоичный формат файлов
-
raw - сырой текст
-
patch - шаблон для применения регулярных выражений (использует специальный вид объединения patch).
-
diff - шаблон для наложения патчей, полученных командой diff
-
dconf - файл модификации настроек в пользовательской службе dconf
-
ldif - формат представления записей службы каталогов или их изменений в текстовой форме
-
contents - специализированный формат для изменения принадлежности файлов пакетам
-
backgrounds - специализированный формат для создания фоновых изображений
- sqlite - формат для изменения содержимого баз данных SQLite; движок этот формат принимает: тело шаблона исполняется как SQL-скрипт, поэтому некорректный запрос отдаётся предупреждением интерпретатора SQLite (например
near "BODY": syntax errorна телеSELECT 1;). Как и остальные исполняемые форматы, он требует объединенияpatch:# Calculate format=sqlite append=join …отклоняется.
Для формата kde не обрабатываются параметры '-','+' для элементов внутри области.
Названия параметров в openrc-формате нечувствительны к регистру букв.
Формат ldif доступен только при наличии ldap модуля Calculate утилит. Без env= с этим модулем заголовок не проходит: Неправильный параметр заголовка 'format=ldif'; при env=ldap на системе без модуля шаблон пропускается молча, без сообщения об ошибке.
Формат dconf доступен в шаблонах настройки пользовательского профиля, при наличии пакета gnome-base/dconf. Одного пакета мало: нужны также dbus-run-session и su, иначе шаблон завершается сообщением Формат 'dconf' недоступен.
Управляющие элементы
Помимо настроек сервисов, записанных в оригинальном формате программы, файлы шаблонов содержат служебные записи, которые условно можно разделить на несколько типов.
Переменная
Переменная - текстовый элемент в шаблоне, имеющий имя, который заменяется в соответствующем конфигурационном файле значением.
Переменная имеет имя, значение, область действия.
-
имя - латинские буквы и цифры
-
значение - текст для замены (создается в программе)
-
область действия - действует глобально для всех шаблонов или локально для одного
Переменные подразделяются на переменные шаблонов и переменные функций.
У переменных шаблонов глобальная область действия, то есть любая переменная шаблона, доступная программе, может быть использована в любом шаблоне. Значение переменной нельзя изменить в шаблоне.
Переменные функций могут быть созданы в шаблоне; также можно изменить значение переменной в шаблоне. Область действия переменной функции - текущий шаблон.
Для передачи значений переменных функций из текущего шаблона в другой шаблон используется стек переменных функций шаблонов (LIFO), в который при помощи функции шаблонов push() записывается значение из текущего шаблона, а функцией шаблона pop() получаем значение в другом шаблоне. Заметьте: в другой шаблон переходит только значение. Имя, которое создаёт pop(), принадлежит принимающему шаблону и в третьем шаблоне уже недоступно, поэтому читать стек нужно в том же файле, где собираетесь пользоваться переменной.
Стек переменных функций шаблонов
Стек (LIFO - "последним пришел, первым вышел") для хранения значений переменных функций. Доступен глобально для всех шаблонов, для работы используются функции шаблонов, push() - запись, pop() - чтение. Запись и чтение возможны как в одном шаблоне, так и в разных.
Заголовок
Заголовок - управляющая запись шаблона, определяющая методы переноса шаблона в систему. Заголовок шаблона записывается первой строкой файла и имеет следующий вид:
# Calculate параметр1=значение1 параметр2 [параметр3=значение3 ...]
Содержимое заголовка может быть разбито на строки. В этом случае в конце каждой строки заголовка, кроме последней, должен стоять знак "\" (обратная косая черта).
Если заголовок отсутствует, настройки файла шаблона определяются исходя из принятых значений по умолчанию.
Допустимые параметры:
Формат
-
format=[...] - формат файла шаблона (см. форматы файлов). По умолчанию формат файла шаблона определяется как
raw, илиbinдля файлов, содержащих двоичные данные. -
comment=[.] - обозначение начала строкового комментария (пример:
#).
Объединение
-
append=[join|before|after|replace|remove|skip|patch|clear] - способ объединения. По умолчанию способ объединения устанавливается в соответствии с форматом файла. Если
append=skip- шаблон пропускается. Еслиappend=clear, в случае шаблона файла конфигурационный файл будет очищен - длина файла 0, а в случае шаблона директории все файлы и директории внутри конфигурационной директории будут удалены. -
force - удалять существующие файлы перед записью конфигурационного файла. Правило действует по умолчанию, если указан параметр
symbolic. -
link=путь - файл, из которого берётся текст шаблона вместо самого файла шаблона: движок читает как шаблон указанный файл, а результат записывает в цель, заданную
pathиname. Поэтому собственные строки файла шаблона при указанномlink=не используются. По умолчанию содержимое берётся из самого шаблона. Поддержка параметра для шаблона директории: в созданный каталог будут скопированы все файлы, символические ссылки, и директории из указанной поlinkдиректории.linkдля директории поддерживает только два типаappend:joinиreplace. При использованииreplaceфайлы из целевой директории будут удалены перед копированием. Пример:link=/etc/conf.d/net.example -
path=путь - путь к директории, в которой будет находиться конфигурационный файл
-
name=имя - имя конфигурационного файла
-
mirror - выполнять объединение только в случае существования конфигурационного файла. Если конфигурационный файл задан параметром
linkи он не существует, файл назначения удаляется. -
protected - защитить файл при удалении пакета, которому он принадлежит.
-
symbolic - создать символическую ссылку на файл, указанный параметром
link. -
autoupdate - при установке любого пакета запускается специальный скрипт
cl-update-config, который применяет шаблоны для устанавливаемого пакета. Конфигурационные файлы устанавливаемого пакета защищены. Иными словами, при установке пакета, если такой же файл существует в системе и изменен, он не будет заменен. Замена конфигурационных файлов установленных пакетов производится командой dispatch-conf. Если в заголовке шаблона есть параметр autoupdate то после применения шаблона конфигурационный файл будет скопирован в систему. Если параметр отсутствует то для переноса измененного конфигурационного файла необходимо использовать dispatch-conf. -
run - оболочка для выполнения конфигурационного файла, полученного из шаблона. Сценарий выполняется сразу же после обработки этого шаблона. Пример:
run=/bin/bash -
exec - оболочка для выполнения конфигурационного файла, полученного из шаблона. Сценарий добавляется в очередь, которая выполняется после обработки всех неисполняемых шаблонов. Пример:
exec=/bin/bash. Очередь обрабатывается на втором проходе движка, поэтому при одном проходе сценарийexec=не выполняется; ниrun=, ниexec=не оставляют конфигурационный файл на диске. -
env - использовать в шаблоне переменные указанного модуля. Если модуль в системе отсутствует - шаблон будет пропущен. Пример:
env=install. Пропуск происходит молча, без сообщения об ошибке. Из допустимых параметров заголовка перечислены не все: принимается ещё иmodule=. -
subvolume - применять к шаблонам директорий: если конфигурационная директория отсутствует и создаётся, создать её как btrfs subvolume. Параметр указывается без значения. Родительские директории при этом создаются как обычные каталоги (рекурсивно), subvolume создаётся только для самой директории шаблона; вложенные директории-шаблоны с subvolume формируют вложенные subvolume. Пример: "# Calculate subvolume"
Действия
-
merge - выполнить в конце настройку перечисленных пакетов. Пример:
merge=openrc,grub(пакеты необходимо указывать вместе с категориейmerge=sys-apps/openrc,sys-boot/grub) -
postmerge - выполнить в конце настройку перечисленных пакетов. В отличие от merge пакеты будут настроены после
pkg_postinst()во время сборки пакета. Пример: "postmerge=sys-apps/openrc,sys-boot/grub" -
stop, start, restart - выполнить остановку/запуск/перезапуск указанных через запятую сервисов. Для шаблона файла действие с сервисом будет выполнено сразу после выполнения шаблона, для шаблона директории действие с сервисом будет выполнено сразу после обработки всех вложенных шаблонов. Пример:
restart=consolefont,keymap -
rebuild - понизить версию пакета, для последующей его пересборки во время обновления системы. Поддерживается указание слотов и версий пакетов.
Права доступа
-
chmod=XXX - права доступа к целевому файлу (пример: "644"). По умолчанию права соответствуют оригинальному файлу. Если его нет, права соответствуют файлу шаблона.
-
chown=user:group - владелец и/или группа целевого файла (пример: "root:root").
Условия
- переменная[>|<|==|!=|>=|<=]значение ... - условия переноса файла шаблона в систему. Арифметические операции могут объединяться условием "И" (&) (для версии calculate-lib>=2.2 условие "И" (&&)) и "ИЛИ" (||). Приоритет в данном случае будет отдаваться условию И. Несколько условий, разделённых пробелом будут объединяться условием "И", если одно из условий не будет выполнено - остальные вычисляться не будут. Таким образом
cl_ver>=3.5 os_linux_shortname==CLDX||os_linux_shortname==CLDобрабатывается какcl_ver>=3.5 И (os_linux_shortname==CLDX ИЛИ os_linux_shortname==CLD).
Метки
Вы можете настроить систему исходя из аппаратных требований компьютера, сетевых установок и прочих условий. Для этого в файле шаблона вы можете вместо постоянных значений устанавливать метки переменных.
Пример файла /etc/conf.d/hostname:
HOSTNAME="#-os_net_hostname-#"
Для использования переменных из другого модуля перед переменной, через точку указывается модуль:
Пример:
#-install.os_install_root_dev-#
Условные блоки
Файл шаблона может содержать условные блоки.
Условные блоки - выделенный текст шаблона, подставляемый в случае соответствия регулярного выражения.
Регулярное выражение - метод проверки значений выражений. В качестве значений могут применяться следующие типы данных:
-
переменные - встроенные переменные Calculate.
-
числа - целые и дробные числа, в качестве разделителя дробной части выступает точка ".".
-
строки - буквы, цифры, специальные символы.
-
номера версий - числа и одна или две точки, разделяющих номер версии (например, 8.5.1).
-
интервалы версий - два номера версий, разделённые запятой
Методом проверки выступает арифметическая операция >, <, ==, !=, >=, <= (больше, меньше, равно, не равно, больше либо равно, меньше либо равно). Тип данных определяется перед операцией сравнения.
Можно проверять вхождение версии в интервал. Для проверки используются следующие операторы:
-
== - версия
>=меньшего значению и версия<=большего значению -
<= - версия
>меньшего значению и версия<=большего значению -
=> - версия
>=меньшего значению и версия<большего значению -
<> - версия
>меньшего значению и версия<большего значению -
!= - версия не входит в указанный интервал
Пример:
версия утилит больше или равна 3.3 и меньше 4 #?pkg(sys-apps/calculate-utils)=>3.3,4#
Арифметические операции могут объединяться условием "И" (&) и "ИЛИ" (||). Приоритет в данном случае будет отдаваться условию "И".
У блока обязательна закрывающая метка, и для функции в условии это имя функции — #pkg#; без неё движок сообщает Cannot find closing tag #pkg# и файл остаётся пустым, поэтому пример выше неполон. С закрытием операторы ==, <=, =>, <> и != работают ровно так, как описано выше, в том числе в заголовке файла. Возможна и ветка «иначе»: между частями блока ставится #!pkg#.
Условный блок должен начинаться с метки "#?переменная1==значение1(...)#" и заканчивается "#переменная1#", записанными в начале строки.
Пример условного блока файла /etc/make.conf:
#?os_arch_march==i686&&os_linux_shortname==CLD# CFLAGS="-O2 -march=i686 -pipe" CHOST="i686-pc-linux-gnu" #os_arch_march#
В приведенном примере сравниваются переменные setup_march и setup_sys_shortname со строковыми значениями "i686" и "CLD" соответственно. В случае, если значения обоих переменных совпадают, текст блока будет подставлен в результирующий файл.
В таком виде блок не срабатывает: os_arch_march в контексте настройки системы не определена, движок сообщает Не найдена переменная os_arch_march и файл выходит пустым; переменных setup_march и setup_sys_shortname не существует вовсе. Та же конструкция работает на переменных, которые действительно есть: #?os_linux_shortname==CLD&&os_net_hostname==box# … #os_linux_shortname# подставляет текст блока.
Функции
Для формирования сложных файлов, требующих вычисления во время обработки, служат функции. Подобно переменным, функции вставляются в текст шаблона при помощи конструкции "#-функция()-#".
Функции, использующие в аргументах путь к файлу (path), могут использовать в качестве домашней директории пользователя ~
Помимо перечисленных, администратор может описать собственные функции — файлом в каталоге <location>/scripts/functions/, где <location> берётся из /etc/portage/repos.conf. Своя функция имеет приоритет над встроенной: при совпадении имени вызов уходит в ваш файл, а не в код утилит, поэтому перечень ниже описывает встроенные имена и не закрыт — если функция ведёт себя не так, как здесь сказано, проверьте, не подменена ли она (как писать — в Свои функции шаблонов в оверлее).
Доступные функции:
belong - (не используется) - назначение такое же как у merge, за исключением, что она работает только с именем пакета, не учитывая категорию.
merge([category/pkg_name]) - проверка имени устанавливаемого пакета, если выполняется установка пакета. В остальных случаях функция будет возвращать положительный результат.
category - категория пакета.
pkg_name - имя пакета.
Если у функции нет аргумента, то именем пакета становится имя шаблона (для директорий - имя директории), категорией - родительская директория. Причём если в имени категории или имени пакета есть версия и/или число для сортировки (20-mc,40-xfce-4.6), то они отбрасываются.
Примеры:
sys-apps/15-portage-2.2/.calculate_directory, category=sys-apps,pkg_name=portage
sys-fs/udev, (portage файл), category=sys-fs,pkg_name=udev
Результат зависит от значения переменной шаблона cl_merge_pkg (в версиях ниже 3.1.1 cl_belong_pkg)
-
значение
cl_merge_pkg- '' результат '1', независимо от того, есть или нет аргумент у функции -
значение
cl_merge_pkg- 'имя_пакета' если совпадают значенияcl_merge_pkgи аргумента функции, результат - '1' иначе '' -
если у функции нет аргумента то сравниваются значение
cl_merge_pkgи имя директории в которой находится шаблон с функциейmerge(), в случае совпадения результат - '1' иначе ''
При выполнении шаблонов для модификации исходного кода пакетов (ac_install_patch) функция в случае положительного результата возвращает номер версии вместо 1.
Пример. Заголовок шаблона1:
# Calculate merge(sys-auth/nss_ldap)!=
Заголовок шаблона2:
# Calculate merge(kde-libs/kdm)!=
-
Наложим шаблон для программы sys-auth/nss_ldap: Установим значение переменной
cl_merge_pkgравным sys-auth/nss_ldap. Будет применен только шаблон1 -
Наложим все шаблоны. Значение переменной
cl_merge_pkgпо умолчанию - ''. Будут применены шаблон1 и шаблон2.
Если параметром для merge указан (или определен по пути шаблона) не существующий пакет, то функция возвращает пустое значение.
merge() существования пакета не проверяет: #-merge(sys-auth/nosuchpkg)-# даёт 1 и при пустом cl_merge_pkg, и когда cl_merge_pkg равно тому же вымышленному имени; #-merge(x11-misc/nosuch)-# в директории 40-xfce-4.6 — тоже 1. Пустой результат бывает только от несовпадения со значением cl_merge_pkg. Существование пакета проверяет mergepkg(): #-mergepkg(cat/nosuchpkg)-# при cl_merge_pkg=["cat/nosuchpkg"] даёт пустое значение, а на установленном пакете возвращает версию — 2.18-r1 для sys-apps/baselayout.
mergepkg(category/package) - объединённый вызов merge и pkg. Возвращает версию установленного (или устанавливаемого) пакета в системе, если выполняется настройки именно этого пакета или перенастраивается вся система.
case(type,var) - вывод значения переменной шаблона с изменением регистра символов, где:
-
type - тип изменения регистра: upper - верхний регистр, lower - нижний регистр, capitalize - первая буква в верхнем регистре. Режим
capitalizeне только поднимает первую букву, но и понижает остальные:tESTbOXдаётTestbox. -
var - название переменной шаблона.
Пример. Выведем название хоста в верхнем регистре:
#-case(upper,os_net_hostname)-#
cut(number,delimiter,data) - разделяет строку на подстроки и возвращает указанную.
-
number - номер возвращаемой подстроки (от 0). Если функция вызывается без параметров, то номер равен 0.
-
delimiter - разделитель, если параметр указан, но пустой - то разделитель запятая. Если параметр не указан, то разделитель будут
-. -
data - строка, может быть результатом работы функции или значением переменной. Если параметр не указан, то будет использоваться значение переменной
cl_pass_file(имя файла шаблона).
Пример.
#os_audio_default содержит номер звуковой карты и номер устройства через запятую, получим номер устройства #-cut(1,,#-os_audio_default-#)-# #Получить номер из имени шаблона (05-rebuild_openrc) #-cut()-# #Получить имя шаблона без цифры #-cut(1)-#
disk(mount_point,name) - выводит значение параметра жесткого диска при установке системы.
Значение функция получает из переменной ('os_install_disk_' + name, если такой не существует, то 'os_disk_'+ name), для поиска нужного значения используется переменная os_install_disk_mount (точки монтирования при установке).
-
mount_point - точка монтирования при установке.
-
name - последний элемент переменных начинающихся на os_install_disk_/os_disk ('os_install_disk_'/'os_disk_' + name).
значения переменных
os_install_disk_mount = ['swap', '/', '', '', '/var/calculate']
os_disk_grub ['0,0', '0,1', '0,2', '0,3', '0,4']
функция
disk(/var/calculate,grub)
-
в переменной os_install_disk_mount находим /var/calculate, получаем индекс 4
-
в переменной os_disk_grub по индексу 4 получаем значение '0,4' результат функции disk(/var/calculate,grub) '0,4'
функция
disk(/boot,grub)
-
в переменной os_install_disk_mount /boot не найден, индекс отсутствует
-
если индекс отсутствует, в переменной os_disk_install находим /, получаем индекс 1
-
в переменной os_disk_grub по индексу 1 получаем значение '0,1' результат функции disk(/boot,grub) '0,1'
Пример. Выведем диск для загрузчика grub:
#-disk(/boot,grub)-#
получаем значение 0,1
Пример предполагает, что списки точек монтирования и соответствующий им список собраны согласованно.
Если их длины расходятся, наложение прерывается с ошибкой вида размер
install.os_install_disk_mount не равен размеру install.os_disk_grub и файл не создаётся: это
сообщение означает не опечатку в вызове, а неполный или рассогласованный набор переменных установки.
elog(pkg) - получить отметку времени (timestamp) установки указанного пакета. Если пакет не указан, возвращается время последнего установленного пакета. Информация извлекается из emerge.log. Функция используется для определения необходимости настройки профиля пользователя при входе его в сеанс.
где:
pkg - полное название пакета с категорией
env(module.var_name) - чтение значения переменной модуля из calculate.env файлов.
-
module - название модуля.
-
var_name - переменная сервиса. разделитель - '.' точка
-
прочитаем из calculate.env файлов имя домена, в который введена машина
#-env(client.os_remote_auth)-#
получаем значение например domain-server, если /etc/calculate/calculate.env содержит
[client] os_remote_auth = domain-server
exists(path,opt) - проверка существования файла или директории.
Если файл или директория существует, выводит '1', иначе ''. Вместо 1 возвращает обозначение типа файла:
-
d- директория -
f- файл -
l- символическая ссылка -
s- сокет -
b- буфферизованное блочное устройство -
c- небуфферизованное блочное устройство -
p- FIFO
path - путь в файловой системе.
opt - необязательная опция.
Возможные значения opt:
- root - путь к файлу не будет содержать chroot-пути. (Какой путь указан, такой будет в действительности - вне зависимости от переменных
cl_chroot_pathиcl_root_path)
Пример. Проверим существование директории /etc:
#-exists(/etc)-#
Результатом будет 'd'.
grep(file,regex) - получить значение из файла file, соответствующее регулярному выражению regex. Если в регулярном выражении используется группировка значений, функция возвращает содержимое первой группы.
Преобразовывается \xFF, где FF двузначный шестнадцатеричный код символа. Все пробелы вырезаются из аргумента ещё до разбора регулярного выражения, поэтому key = "(.*?)" и key="(.*?)" ведут себя одинаково и оба не находят строку key = "V1"; пробел в искомом тексте задают через \s, \s+, . или [\x20].
Пример. Получить значение nofscks из dracut.conf.
#-grep(/etc/dracut.conf,nofscks="(.*?)")-#
Специальные символы регулярного выражения (РВ):
"." - соответствует любому символу, исключая новую строку. При включённом режиме dotall соответствует любому символу.
"^" - соответствует началу файла. При включённом режиме multiline соответствует началу строки.
"$" - соответствует концу файла. При включённом режиме multiline соответствует концу строки.
"*" - соответствует 0 и более повторении предшествующего РВ. РВ будет соответствовать максимально возможной части текста.
"*?" - «не жадная» версия использования предыдущего символа. РВ будет соответствовать минимально возможной части текста.
"+" - соответствует 1 и более повторении предшествующего РВ. РВ будет соответствовать максимально возможной части текста.
"+?" - «не жадная» версия использования предыдущего символа. РВ будет соответствовать минимально возможной части текста.
"?" - соответствует 0 или 1 повторению предшествующего РВ. РВ будет соответствовать максимально возможной части текста.
"??" - «не жадная» версия использования предыдущего символа. РВ будет соответствовать минимально возможной части текста.
"{m,n}" - соответствует от m до n повторений предшествуеющего РВ.
"{m,n}?" - «не жадная» версия использования предыдущей конструкции. РВ будет соответствовать минимально возможной части текста.
"\" - экранирование спецсимволов
"[]" - соответствует любому символу из указанного набора.
"[^]" - соответствует любому символу не из указанного набора.
"A|B" - создать РВ, соответствующее либо А, либо В: (zz|CC) даёт CC, а (zz|aa11) — aa11.
"(...)" - группировка РВ с сохранением групп (grep возвращает содержимое первой группы)
"(?ims)" - устанавливает режимы РВ: регистронезависимый, multiline, dotall. Флаг действует, только если стоит в начале выражения: (?i)cc и (?m)^CC дают совпадение, а тот же флаг внутри группы (((?i)cc), ((?m)^CC)) приводит к Неправильное регулярное выражение и пустой подстановке.
"(?:...)" - группировка РВ без сохранения групп
"(?=...)" - проверка текста после РВ на совпадение.
"(?!...)" - проверка текста после РВ на не совпадение.
"(?<=...)" - проверка текста перед РВ на совпадение (это РВ должно быть фиксированной длины).
"(?<!...)" - проверка текста перед РВ на не совпадение (это РВ должно быть фиксированной длины).
"\w" - соответствует любому символу из набора [a-zA-Z0-9_]
"\W" - соответствует любому символу вне набора [a-zA-Z0-9_], то есть тому же, что [^a-zA-Z0-9_]; к ним относится и перевод строки
"\s" - соответствует любому пробельному символу
"\S" - соответствует любому не пробельному символу
"\d" - соответствует любой десятичной цифре [0-9]
"\D" - соответствует любому символу, не являющемуся десятичной цифрой [^0-9]
Поведение совпадает с Python: для текста, где строки aa11bb и CC22dd, \w+ даёт aa11bb, \d+ — 11, \D+ — aa, \W+ — перевод строки; для строки k1="a b c" \s+ даёт пробел, а \S+ — k1="a.
groups(group1,group2,..groupN) - проверка вхождения пользователя в группы group1,group2, ..groupN
Если пользователь входит хотя бы в одну из групп, выводит '1', иначе ''
group1 .. groupN - названия групп.
Пример. Проверим входит ли пользователь в группу wheel:
#-groups(wheel)-#
Если пользователь входит в группу wheel, результатом будет '1'.
ini(var, value, opt) - запись и чтение переменной из конфигурационного файла пользователя (~/.calculate/ini.env).
При настройке системы запись выполняется в <chroot>/var/lib/calculate/ini.env, а /etc/calculate/ini.env остаётся слоем чтения: после #-ini(mytest,42)-# значение появляется в var/lib/calculate/ini.env, файл etc/calculate/ini.env при этом не меняется.
-
var - имя переменной функции. Имя должно начинаться с буквы и может содержать латинские буквы и цифры, а также точку. Точка служит разделителем для раздела и имени переменной для размещения в конфигурационном файле.
-
value - значение переменной функции, значение присваивается переменной функции и записывается в конфигурационный файл (функция при этом возвращает пустое значение). При отсутствии второго аргумента переменная считывается из конфигурационного файла; при отсутствии названия переменной в конфигурационном файле в переменную записывается пустое значение. Если аргумент пустая строка без кавычек, то переменная удаляется. Если аргумент - пустая строка в кавычках, то значение переменной в ini-файле очищается.
-
opt - опция преобразования значения переменной, необязательный параметр; возможные значения url, purl, unicode, hexcode. При использовании этого аргумента второй аргумент функции должен быть пустым.
Примеры:
1. Создадим переменную "test" и присвоим ей значение 15, запишем в конфигурационный файл:
#-ini(test,15)-#
-
Считаем значение ранее записанной в конфигурационный файл переменной test, заменим функцию значением считанной переменной, в нашем случае "15":
#-ini(test)-#
-
Использование функции ini c тремя аргументами. Предположим, что в файле
~/.calculate/ini.envсуществует секция
[test] param = Тестовый параметр
тогда функция
#-ini(test.param,,unicode)-#
вернет
\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440
функция
#-ini(test.param,,hexcode)-#
вернет
\x422\x435\x441\x442\x43e\x432\x44b\x439 \x43f\x430\x440\x430\x43c\x435\x442\x440
функция
#-ini(test.param,,url)-#
вернет
%d0%a2%d0%b5%d1%81%d1%82%d0%be%d0%b2%d1%8b%d0%b9%20%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80
Опция purl отличается от url тем, что преобразует '/' в код '%2F'
В текущей реализации результат иной. Значение Тестовый параметр даёт: unicode → естовый параметр, hexcode → естовый параметр (без всякого экранирования \x422…), url → '%d0%a2%d0%b5%d1%81%d1%82%d0%be%d0%b2%d1%8b%d0%b9%20%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80, purl для /a/b/c → '%2fa%2fb%2fc. Причина — известный дефект текущей реализации: unicode и hexcode берут repr() значения и отрезают два первых символа, рассчитывая на префикс u'…' из Python 2, которого в Python 3 нет, поэтому срез съедает первый символ значения; url и purl режут repr() байтовой строки и оставляют ведущую одинарную кавычку, а purl кодирует слэш строчными буквами (%2f, а не %2F).
- помещение сервиса sshd в автозапуск с проверкой и отметкой в ini.env
# Calculate path=/etc/runlevels/default name=sshd link=/etc/init.d/sshd symbolic ini(runlevels.openssh)!=on&&ini(runlevels.openssh,on)==
livemenu(mode) - функция специального назначения для формирования мультизагрузочного меню для Flash. mode - режим работы функции, и может быть следующим:
-
submenu - возвращает список систем в следующем формате:
идентификатор системы; полное название в загрузочном меню; путь до ядра; параметры для загрузки; путь до initrd; параметры загрузки splash; Пример: cl-2; Calculate Linux Desktop Xfce; /boot/vmlinuz-2; root=live:LABEL=CALCULATE; /boot/initrd-2; splash;
-
xorg - возвращает список систем, в которых установлен xorg-server. Например
cl-1 cl-2 cl-3. -
video - возвращает список систем, в которых присутствуют проприетарные драйверы. Например
cl-2 cl-3
Функция используется в шаблонах 6_ac_builder_iso/0_bootmenu/desktop.config, а также для формирования gfxboot.cfg.
ls(dir,pattern) - получить список из указанной директории dir, и преобразовать согласно шаблону pattern. Если не указывать pattern - список будет выведен через пробел.
-
dir - директория или шаблон пути к файлам (
/etc/conf.dили/etc/*.conf) -
pattern - шаблон преобразования списка файлов из директории.
Если pattern содержит \1 то вместо имени файла будет выведен текст pattern, но вместо \1 будет имя файла.
Если же pattern не содержит \1, то он используется как разделитель между именами файлов.
\n преобразуется в перевод строки. Если же нужно вывести \n используется \\n. \\n даёт обратный слэш и настоящий перевод строки — разделителем получается net\ и новая строка, а не печатные два символа \n; получить их через ls() нельзя.
Пример.
#-ls(/etc/openldap/slapd.conf.d/*.conf,include \1\n)-#
При этом в
/etc/openldap/slapd.conf.d содержатся файлы unix.conf и samba.conf
include /etc/openldap/slapd.conf.d/unix.conf include /etc/openldap/slapd.conf.d/samba.conf
Функция выводит реальные пути файлов, то есть include /etc/openldap/slapd.conf.d/unix.conf и include /etc/openldap/slapd.conf.d/samba.conf. Порядок строк повторяет обход каталога и не сортируется, поэтому менять его местами не стоит — движок отдаёт файлы так, как их видит файловая система.
Пример 2
files = #-ls(/etc/conf.d,,)-#
При этом в
/etc/conf.d содержатся файлы net, modules, rootfiles = /etc/conf.d/net,/etc/conf.d/modules,/etc/conf.d/root
server(service.option,var) - чтение значения параметра сервиса. Информация получается путем обработки файла /var/calculate/remote/server.env,
-
service - название сервиса.
-
option - опция сервиса.
-
var - имя переменной функции(необязательный параметр). Разделитель service и option: '.' - точка. В случае использования var - имени переменной функции, полученное значение опции сервиса будет записана в переменную функции var. Если var не используется, полученное значение опции сервиса будет вставлено в текст конфигурационного файла.
-
прочитаем значение порта для соединения с jabber-сервисом
#-server(jabber.port)-#
получаем значение 5223
Разделитель между сервисом и опцией — точка: #-server(jabber,port)-# снимает шаблон с ошибкой ошибка, часть шаблона 'server(jabber,port)', а #-server(jabber.port)-# даёт 5223. Запятая разделяет аргументы функции.
- прочитаем значение порта для соединения с jabber-сервисом и поместим в переменную функции
jabber_port
#-server(jabber.port,jabber_port)-#
Читать #-jabber_port-# нужно в этом же файле шаблона: переменная, которую создаёт второй аргумент,
принадлежит текущему шаблону и в другом файле прогона недоступна.
Значение переменной функции jabber_port - 5223. Точечная форма работает и с именем переменной: #-server(jabber.port,jabber_port)-# записывает 5223 в переменную функции jabber_port, а сама метка заменяется пустой строкой; вариант с запятой в первом аргументе даёт ту же ошибку.
list(var,index) - вывод значения по индексу из переменной.
где:
-
var - название переменной функции или переменной шаблона (значение переменной должно быть списком).
-
index - индекс для поиска значения в переменной функции или переменной шаблона (первый элемент имеет индекс 0, и т.д.).
Пример. Значение переменной
os_disk_dev = ['/dev/sda1', '/dev/sda2', '/dev/sda3', '/dev/sda4', '/dev/sda5']
#-list(os_disk_dev,1)-#
Метка функции будет заменена на '/dev/sda2'.
Если запрошен элемент, отсутствующий в списке, функция возвращает пустую строку.
in(var,value1,value2...) - проверяет есть ли среди значений переменной var, хотя бы одно значение из value. Если значение найдено, то возвращает "1", иначе пустую строку. Переменная может быть как списком, так и строкой.
-
var - название переменной
-
valueX - список значений для сравнения
Пример:
Значение переменной строка
os_install_linux_shortname = CLDX
#-in(os_install_linux_shortname,CLDX,CLD,CLDG)-#
Пример 2:
Значение переменной список
os_linux_pkglist = CLDX,base
#-in(os_linux_pkglist,CLDX,CLD,CLDG)-#
Вернет 1, так как есть общее значение - CLDX.
Метка функции будет заменена на 1; значение CLDX в точку вставки не попадает.
kernel(kernel_opt) - получить значение параметра конфигурации ядра. Возвращает "y","m" или пустую строку. y - опция включена в ядро, m - модуль ядра, пустая строка - опция выключена.
kernel_opt - регистронезависимое название опции без префикса CONFIG_
Возвращается не только y/m/пусто: строковые опции отдаются без кавычек (CONFIG_LOCALVERSION="-calc" → -calc), а поиск идёт по подстроке, поэтому строка вида # CONFIG_EXT4_FS is not set, стоящая выше нужной, обрывает просмотр и даёт пустое значение.
Пример 1. Включен ли ext4:
kernel(ext4_fs)!=
Пример 2. reiserfs - модуль ядра, а ext4 - включен в ядро
kernel(reiserfs_fs)==m&&kernel(ext4_fs)==y
load(arg,path,opt) - отображение информации из файла.
где:
arg - тип содержимого файла;
path - путь к файлу;
opt - необязательная опция
- root - путь к файлу не будет содержать chroot-пути. (Какой путь указан, такой и будет в действительности, вне зависимости от переменных
cl_chroot_pathиcl_root_path.)
Возможные значения "arg":
-
ver - содержимое файла номер версии
-
num - содержимое файла число
-
char - содержимое файла строка
-
empty - результат, содержимое файла без закомментированных (комментарии # или ;) и пустых строк.
-
key - принят списком допустимых значений, но отдельной обработки не имеет: ведёт себя как char и возвращает содержимое файла как есть — для файла
/etc/g2со строкойk1="a b c"вызов#-load(key,/etc/g2)-#даётk1="a b c". Отличия в обработчике есть только у empty (строки-комментарии#и;и пустые строки выбрасываются) и у ver с num: пустой, состоящий из одних пробелов или отсутствующий файл даёт им0, тогда как char, key и empty на том же входе дают пустое значение.
Возможные значения path:
- path - абсолютный или относительный путь к файлу.
Пример. Выведем содержимое /proc/cpuinfo на место объявления функции:
#-load(char,/proc/cpuinfo)-#
module(module_name) - получить версию модуля Calculate утилит. Если модуль отсутствует -возвращает пустое значение. Если выполняются шаблоны для устанавливаемой системы, то функция вернёт наименьшую версию модуля.
«Наименьшую версию» функция возвращает только если в устанавливаемой системе существует каталог usr/lib/python3.10/site-packages/calculate/<модуль>/variables — номер Python зашит в путь, и на системе с другим Python проверка проваливается; версия пакета при этом ищется жёстко в слоте sys-apps/calculate-utils:3. Внутри chroot при таких условиях #-module(core)-# даёт пустое значение, вне chroot — версию утилит (3.7.6.8).
Пример. Запрос версии модуля client
#-module(client)-#
Если в системе установлены утилиты (например версии 3.5.0_alpha1) с модулем client, то вернёт 3.5.0_alpha1.
pkg (category/package) - вывод версии установленного пакета, если в системе установлено несколько версий этого пакета, выводится версия максимального слота.
где:
-
category - категория пакета
-
package - название пакета
-
Слот пакета можно указывать через двоеточие:
pkg(kde-base/kdelibs:4) -
Наличие USE флагов у пакета можно проверять. Проверяемые USE флаги указываются в квадратных скобках, через запятую. Указание "-" перед USE флагом означает, что флаг у пакета должен быть выключен.
В качестве совместимого режима можно указывать только название пакета; в этом случае скорость обработки шаблона будет ниже.
Пример. Выведем версию установленного пакета (например 4.2.4):
#-pkg(kde-base/kdelibs)-#
Значит, в системе установлен пакет kdelibs-4.2.4.
Пример использования USE. Вывести версию установленного пакета, если он собран с включенным desktop и выключенным client флагами.
#-pkg(sys-apps/calculate-utils[desktop,-client])-#
print (message) - вывод на экран информационного сообщения во время выполнения шаблона
warning (message) - вывод на экран предупреждающего сообщения во время выполнения шаблона
error (message) - вывод на экран сообщения об ошибке во время выполнения шаблона
push(var, value) - помещение значения переменной в стек переменных функций шаблонов.
-
var - имя переменной функции. Имя должно начинаться с буквы и может содержать латинские буквы и цифры. Переменная создается на время обработки конфигурационного файла.
-
value - значение переменной функции, значение присваивается переменной функции и заносится в стек переменных функций шаблонов. При отсутствии второго аргумента, в стек переменных функций шаблонов будет записано значение переменной.
-
Создадим переменную "test" и присвоим ей значение 15, запишем в стек переменных функций шаблонов.
#-push(test,15)-#
-
Запишем в стек переменных функций шаблонов значение ранее созданной переменной
test:
#-push(test)-#
Здесь «ранее созданной» означает в этом же шаблоне: переменная функции живёт только время обработки
одного файла, и без #-push(test,15)-# выше в том же файле метка снимет шаблон с ошибкой
ошибка, часть шаблона 'push(test)'.
pop(var) - извлечение значения из стека переменных функций шаблонов и присвоение его переменной.
-
var - имя переменной функции. Имя должно начинаться с буквы и может содержать латинские буквы и цифры. Переменная создается на время обработки конфигурационного файла.
-
Создадим переменную "test" и присвоим ей значение 15, запишем в стек переменных функций шаблонов.
#-push(test,15)-#
-
Получим значение из стека переменных функций шаблонов и присвоим его переменной
test2:
#-pop(test2)-#
Получить значение из стека переменных функций шаблонов возможно как в текущем шаблоне, так и в любом другом. После получения значения оно удаляется из стека.
Переменную, созданную pop(), читают другие функции шаблона — например list() или sum();обычная метка
#-имя-# её не увидит, потому что обращается к переменным шаблона, а не к переменным функций, и снимет
шаблон с ошибкой не найдена переменная.
replace(old, new, var) - замена в значении переменной var текста old на new.
где:
-
old - текст, каждое вхождение которого в значении переменной будет заменено на текст new
-
new - текст, на который в значении переменной будет заменен текст old
-
var - название переменной функции или переменной шаблона
Текст old и new должен быть заключен в двойные или одинарные кавычки.
В тексте в двойных кавычках обрабатываются управляющие символы (\', \", \n, \r, \t, \\). В двойных кавычках также обрабатывается \xFF, где FF двузначный шестнадцатеричный код символа. В одинарных кавычках текст не обрабатывается.
Пример. значение переменной шаблона ur_signature
Переменные вида ur_* появляются только при конвертировании /var/calculate/remote/calculate.env:
ur_signature берётся из поля signature сервиса mail. В событиях установки такой переменной нет, и
метка снимает шаблон с ошибкой не найдена переменная шаблонов 'ur_signature' — это не отказ replace(),
а обращение к переменной другого контекста.
Компания «Калкулэйт»\nРоссия, Санкт-Петербург, пл. Стачек, 4\nhttp://www.calculate.ru\n+7 812 3363632\n+7 495 7727678
при выполнении функции
#-replace('\n',"\n",ur_signature)-#
в точку вставки будет вставлен следующий текст (символ "\n" будет заменен на перевод строки)
Компания «Калкулэйт» Россия, Санкт-Петербург, пл. Стачек, 4 http://www.calculate.ru +7 812 3363632 +7 495 7727678
Ниже приведенный пример позволяет преобразовать пробел в значении hr_board_model в символ подчеркивания.
...
|main.hr_board_model | rs | |P8H77-V LE|
...
#?replace("\x20","_",main.hr_board_model)==P8H77-V_LE#
...
#replace#
rnd(type,len) - вывод случайной комбинации символов.
где:
-
type - используемые символы, возможные значения: num - числа, pas - числа и буквы, uuid - числа и буквы от a-f. Имя uuid переименовано в hex, а генерация uuid происходит согласно формату UUID. Переименование не отменило старое имя — работают оба, и ведут они себя по-разному:
hexдаёт плоскую строку из[0-9a-f], аuuid— форму UUID с дефисами, поэтому#-rnd(uuid,16)-#возвращает не 16, а 18 символов (cc842c8f-a93d-406c): дефисы тоже считаются длиной, а аргумент задаёт число hex-цифр, но не итоговую длину строки. Длинаuuidне может превышать 32 —rnd(uuid,40)отклоняется, аlenобязателен для всех типов, кромеuuid. -
len - количество символов (число). Можно не указывать при генерации uuid в утилитах 3.5.
Пример. Выведем три случайных числа (например 372):
#-rnd(num,3)-#
Пример для 3.5. Сгенерируем половину UUID и полный UUID.
#-rnd(uuid,16)-# #-rnd(uuid)-#
sum(var,sum_print, sum_out) - вычисляемые значения смещений. Функция разрабатывалась для настройки Plasma (KDE).
-
var - имя переменной функции "sum". Имя должно начинаться с буквы и может содержать латинские буквы и цифры. Переменная создается на время обработки конфигурационного файла.
-
sum_print - арифметическое выражение, результат которого будет отображен на месте объявления функции. При отсутствии аргумента значение выводиться не будет. Поддерживаются операции сложения "+" и вычитания "-", деления "/" и умножения "*". В арифметическом выражении могут участвовать другие переменные функции, а также переменные шаблона.
-
sum_out - арифметическое выражение, результат которого будет присвоен переменной "var" (первому аргументу функции). При отсутствии третьего аргумента переменной "var" будет присвоено вычисленное значение второго аргумента.
-
Создадим переменную "clock" и присвоим ей значение 15, не выводя результат.
#-sum(clock,,15)-#
-
Создадим переменную "bt", присвоим ей значение переменной "clock" и выведем значение.
#-sum(bt,clock)-#
-
Разместим кнопку на панели шириной "35" пикселов, оставив отступ в "4" пиксела по краям:
#-sum(bt,bt+2,bt+35+2)-#
wallpaper(resolution, wallpapers_path, file) - функция выбирает наиболее подходящее по указанному разрешению изображение из папки. Функция возвращает полный путь. Для получения имени файла используется третий параметр.
-
resolution - требуемое разрешение (текущее разрешение можно получить из переменных
os_x11_resolution,os_install_x11_resolution) -
wallpapers_path - путь, где находится изображение в разных разрешениях. Формат файлов:
разрешение.расширение. Например: 1024x768.jpg -
file - может принимать только
fileкак значение, при этом функция вернёт только имя файла.
wallpapers_path может быть указан файлом. В этом случае функция вернёт указанное изображение.
Пример:
Папка /usr/share/wallpapers/1 содержит следующие изображения:
-
1024x768.jpg
-
1280x1024.jpg
-
1680x1050.jpg
-
1920x1080.jpg
#-wallpaper(1280x720,/usr/share/wallpapers/1)-#
вернет /usr/share/wallpapers/1/1920x1080.jpg как наиболее подходящую по пропорциям
#-wallpaper(1280x720,/usr/share/wallpapers/1,file)-#
вернет 1920x1080.jpg
Для получения текущего разрешения можно использовать выше указанные переменные
#-wallpaper(#-install.os_install_x11_resolution-#,/usr/share/wallpapers/1)-#
profile() - функция используется при настройке пользовательского профиля и возвращает её состояние.
-
configured профиль настроен утилитами
-
empty профиль пустой, или содержит только файлы /etc/skel
-
custom профиль настроен не утилитами Calculate
Значения empty и custom используются только для первого определения состояния пользовательского профиля: в первом случае профиль будет настроен утилитами, во втором случае получит пометку в .calculate/ini.env о том, что профиль не нужно настраивать в дальнейшем. Профиль же содержащий .calculate/ini.env всегда configured.
world(category) - функция используется для формирования world файла. Возвращает список пакетов указанной категории, доступных для установки. Если категория не содержит пакетов для установки или указана неверно, будет выведено предупреждающее сообщение.
Пример:
#-world(dev-lang)-#
... dev-lang/orc:0 dev-lang/perl:0 dev-lang/php:8.2 ...
Способы объединения
Существует несколько способов объединения шаблона установки с исходным файлом системы:
-
join - основной способ объединения - методом слияния двух файлов. Подробно описан в «схеме объединения».
-
before - шаблон переписывается в начало оригинального файла
-
after - шаблон переписывается в конец оригинального файла
-
replace - шаблон переписывается заменяя оригинальный файл
-
delete - объединение не происходит, оригинальный файл удаляется
-
remove - вместо объединения происходит удаление оригинального файла
Изменение шаблона перед объединением, для способов объединения before, after, replace:
-
если существуют управляющие элементы, то они обрабатываются
-
если существует заголовок, то он обрабатывается
-
если существует параметр format в заголовке то происходит обработка управляющих символов: "+, -, !"
Правила по умолчанию
По умолчанию способ объединения устанавливается в соответствии с форматом файла. Для форматов файлов основных приложений samba, bind и т.п. по умолчанию действует объединение join, для формата raw и bin - объединение replace. Для пустого файла по умолчанию действует правило объединения delete - целевой файл удаляется из системы.
Есть и третий случай: для patch, diff, dconf, ldif, contents, sqlite, backgrounds по умолчанию действует объединение patch, и указать для них append=join нельзя — движок отвечает Неправильный параметр 'append=join' в шаблоне. Пустой шаблон файл не удаляет: у raw он усекается до нуля, у join-форматов (kde, samba) цель остаётся нетронутой, а значения append=delete у движка нет вовсе — такой заголовок отклоняется. Для удаления служит append=remove.
Правила объединения могут быть изменены установкой параметра append заголовка файла шаблона.
Расположение
Правила именования файлов
Имена файлов шаблона могут содержать условные операторы, определяющие правила, при выполнении которых файл шаблона будет перенесен в систему. Подобно ссылке на страницу сайта условия отделяются от имени знаком вопроса (?), после которого могут идти условные операторы, подробно описанные в условных блоках (см. выше).
Арифметические операции могут объединяться условием И (&) и ИЛИ (?). Приоритет в данном случае будет отдаваться условию И.
Одиночный & как «И» в заголовке не принимается: os_linux_shortname==CLD&cl_ver>=99 даёт неправильный заголовок шаблона; работает только &&, а || подчиняется ему по приоритету «И». Знак ? оператором ИЛИ не является: в имени файла он разделяет условия, каждое из которых должно выполниться, — grub.conf?os_linux_shortname==CDS?os_linux_shortname==CLD применяется при CLD и не применяется при CLDG.
Пример:
grub.conf?os_linux_shortname==CDS?os_linux_shortname==CLD
В приведенном примере файл шаблона выполнит настройки загрузчика как для систем Calculate Linux Desktop, так и для Calculate Directory Server.
При наличии условных операторов в заголовке файла шаблона для переноса файла шаблона в систему должны выполняться оба условных выражения.
Правила именования директорий
Правила именования директорий схожи с правилами именования файлов. При выполнении условий, заданных условными операторами, директория будет перенесена в систему; в противном случае директория вместе с содержимым будет пропущена.
Права доступа
Права доступа конфигурационного файла после объединения с файлом шаблона устанавливаются по следующим приоритетам:
-
при наличии конфигурационного файла в системе права будут сохранены неизменными;
-
в случае отсутствия оригинального конфигурационного файла, права будут выставлены как 644 для файла и 755 для директории;
-
в случае установки значения переменной
chmodилиchownзаголовка файла шаблона, права на конфигурационный файл будут изменены согласно установленному значению.
Символические ссылки
Для создания символических ссылок используйте параметры "link + symbolic" заголовка файла шаблона.
Если помимо заголовка файл шаблона будет содержать тело шаблона, оригинальный файл будет модифицирован согласно правилам объединения.
Calculate не будет переносить так называемые "битые ссылки" - ссылки, не ведущие ни на какой файл (директорию), если явно не указан параметр force.
Переносится и битая ссылка: директория-шаблон с link= копирует висячий симлинк в цель без всякого force, и symbolic с link= на несуществующий файл тоже создаёт ссылку, не ведущую никуда (resolves: False). При этом force в заголовке директории не принимается (неправильный параметр заголовка - 'force'), так что описанное исключение в этом случае выразить нечем.
Схема объединения
Объединение - изменение настроек оригинального файла настроек в соответствии с настройками файла шаблона.
В процессе объединения все записи оригинального файла и файла шаблона разбиваются на элементы: области, переменные, списки, разделённые списки, комментарии, управляющие элементы (см. ниже).
Файл шаблона должен быть составлен с применением синтаксиса оригинального файла. Расположение элементов оригинального файла при объединении сохраняется. Во время объединения комментарии из файла шаблона не переносятся.
Правила объединения
Над элементами могут происходить операции Объединение, Замена, Удаление:
Объединение
-
Отсутствующие в оригинальном файле элементы дописываются в конец области. При этом в случае наличия перевода строки перед вставляемым элементом перевод строки добавляется после вставляемого элемента. В противном случае перевод строки добавляется перед вставляемым элементом.
-
В случае объединения разделённого списка, отсутствующие элементы добавляются следом за последним элементом разделённого списка конфигурационного файла.
Замена
- Значение элементов заменяется на новое. При этом форматирование переносится из файла шаблона.
Удаление
- Элемент удаляется вместе с переводом строки, стоящим перед элементом.
Правила объединения, действующие по умолчанию
Правила объединения действуют на элементы с одним именем, расположенные в одной области шаблона.
При нахождении различий, по умолчанию действуют следующие правила:
-
Области - содержимое двух областей объединяется (+).
-
Переменные - значения переменных заменяются (-).
-
Списки - содержимое списков заменяется (-).
-
Разделённые списки - аналогично правилу объединения переменных - значения списков заменяются (-).
Изменение правил объединения
-
"+" - объединить элементы (для областей и списков); после объединения остаются только уникальные элементы
-
"-" - значение элемента заменяется
-
"!" - элемент удаляется. В CXmlConf описания файла шаблона эти правила описываются тэгом "
<action>".
Формат CXmlConf
Примечание. Раздел описывает исторический формат: в текущих утилитах реализация CXmlConf отсутствует и формат не поддерживается.
CXmlConf - универсальный формат описания конфигурационных файлов. Служит для выборочного изменения настроек большинства распространенных типов конфигурационных файлов ОС Linux/Unix.
XML файл описания настроек разбивает конфигурационный файл на логические структуры - элементы, пригодные для последующего объединения. После объединения файл может быть преобразован в первозданный вид за некоторыми исключениями (см. Схема объединения).
Описания элементов вкладываются в конструкцию:
<cxmlconf>
<head>
<ver>версия формата</ver>
<format>формат конфигурационного файла</format>
</head>
<body>
[<area>...</area>... <field>..</field>]
</body>
</cxmlconf>
-
ver - передает номер версии разметки
-
format - формат конфигурационного файла (определяется по распространенным программам).
Все элементы (см. ниже) помещаются внутрь элемента <body/>.
Области
Области конфигурационных файлов разграничивают пространство имен переменных. Области могут содержать логические структуры, в том числе другие области (пример: named.conf).
Области помещаются в конструкцию:
<area>
<caption>
<name>Заголовок области</name>
<action>join|replace|drop</action>
<quote>Начальная часть области (заголовок)</quote>
<quote>Завершающая часть описания области</quote>
</caption>
[<field></field>...]
</area>
Переменные
Переменные имеют запись в виде:
<field type="var"> <name>имя переменной</name> <value>значение переменной</value> <action>join|replace|drop</action> <quote>Оригинальный текст описания</quote> </field>
В некоторых конфигурационных файлах, например, /etc/openldap/slapd.conf, встречается конструкция:
index cn pres,sub,eq index sn pres,sub,eq index uid pres,sub,eq
В этом случае имя переменной состоит из первой и второй части, а значение - из третьей.
Строка
index cn pres,sub,eq
В XML это будет выглядеть так:
<field type="var"> <name>indexcn</name> <value>pres,sub,eq</value> <quote>index cn pres,sub,eq</quote> </field> <field type="br"/>
Списки
По примеру файла named.conf, блок "listen-on" может содержать одни значения - значения блока, а не переменных.
Для обозначения значений служит конструкция:
<field type="list"> <name>hostsallow</name> <value>192.168.0.0/24</value> <value>127.</value> <action>join|replace|drop</action> <quote>Оригинальный текст списка</quote> </field>
где внутри блока "<quote>" сохраняется оригинальный текст описания значения, без завершающего перевода строки.
Разделённые списки
Файл настроек веб-сервера Apache может содержать инструкцию "Include", позволяющую делать исходный файл модульным. Подобные случаи описываются в "CXmlConf", как "Разделённые списки".
Разделенные списки описываются следующей конструкцией:
<field type="seplist"> <name>Include</name> <value>/etc/apache2/modules.d/*.conf</value> <action>join|replace|drop</action> <quote>Оригинальный текст списка</quote> </field>
Комментарии
При объединении конфигурационных файлов комментарии оригинального файла сохраняются в неизменном виде.
Все типы комментариев помещаются в конструкцию "<comment>". В тексте, помещаемом в "<quote/>", сохраняются символы комментария и перевод строки:
<field type="comment"> <quote>Оригинальный текст комментария</quote> </field>
Комментарии не могут быть вложенными (быть описаны в других конструкциях комментариев).
Управляющие элементы
Для обозначения перевода строк служит конструкция:
<field type="br"> <quote>разделительные элементы (пробелы, табуляция)</quote> </field>
- "quote" содержит элементы форматирования (пробелы, табуляция)
Формат XML
Поддерживаемые форматы XML
В настоящее время реализована поддержка форматов xml_xfce (XML файл для конфигурирования оконного менеджера XFCE), xml_xfcepanel (XML файл для конфигурирования панелей оконного менеджера XFCE), xml_gconf (XML файл для конфигурирования GNOME); в текущей поставке есть и четвёртый — xml_gconf_tree (описан ниже).
Отличия от формата CXmlConf
-
XML файлы хранятся и обрабатываются без перевода их в другой формат.
-
Все правила, функции, переменные действуют на файл XML-шаблона аналогично обычному шаблону за исключением операций объединения элементов XML
Объединение элементов XML
Для объединения элементов XML в тексте XML шаблона используется атрибут XML-элемента - 'action'
Допустимые значения атрибута
-
action="join" - элементы объединяются (действует по умолчанию)
-
action="replace" - элемент шаблона замещает элемент файла
-
action="drop" - элемент файла удаляется
Формат xml_xfce
Формат состоит из элементов channel и property.
В атрибутах channel находится имя и версия файла.
Внутри элемента channel находятся элементы property.
Пример элемента "channel":
<channel name="xfwm4" version="1.0"> <property name="general" type="empty"> ..... </property> </channel>
Пример элемента "property":
<property name="wrap_workspaces" type="bool" value="false"/>
У каждого элемента property есть атрибут type.
Если type="array", то этот элемент и внутренние элементы будут заменены на элементы из шаблона. Иначе элементы будут объединены.
Пример type="array":
<property name="workspace_names" type="array"> <value type="string" value="Рабочее место 1"/> <value type="string" value="Рабочее место 2"/> <value type="string" value="Рабочее место 3"/> <value type="string" value="Рабочее место 4"/> </property>
Формат xml_xfcepanel
Формат состоит из следующих элементов: panels, panel, properties, property, items, item.
Если элемент items, то этот элемент и внутренние элементы будут заменены на элементы из шаблона. Иначе элементы будут объединены.
Пример элемента "items":
<items> <item name="xfce4-mixer-plugin" id="9"/> <item name="clock" id="10"/> <item name="separator" id="52"/> <item name="actions" id="12"/> </items>
Формат xml_gconf
Формат состоит из элементов entry.
Если у элемента entry есть атрибут ltype (список) или атрибут type="string" то этот элемент и внутренние элементы будут заменены на элементы из шаблона, в ином случае элементы будут объединены.
Замена происходит только для элементов без дочерних тегов: <entry name="dpi" type="float" value="96"/> в существующем файле получает value="86". Если в объединяемом конфигурационном файле уже есть <entry> с дочерним <stringvalue> (то есть случай type="string" или ltype), объединение прерывается с Не удалось объединить шаблон, и файл остаётся нетронутым. Это известный дефект текущей реализации формата; обходной путь, которым пользуется оверлей, — append=replace, при нём файл перезаписывается содержимым шаблона. Файл «с нуля» тем же шаблоном создаётся нормально, и mtime в нём заменяется текущим временем.
Атрибут элемента entry - mtime при изменении элемента entry показывает время, когда произошло изменение в секундах.
Пример шаблона xml_gconf:
# Calculate format=xml_gconf
<?xml version="1.0"?>
<gconf>
<entry name="rgba_order" mtime="1235158855" type="string">
<stringvalue>rgb</stringvalue>
</entry>
<entry name="dpi" mtime="1235162438" type="float" value="86">
</entry>
<entry name="hinting" mtime="1235266915" type="string">
<stringvalue>full</stringvalue>
</entry>
<entry name="antialiasing" mtime="1235266915" type="string">
<stringvalue>rgba</stringvalue>
</entry>
</gconf>
Формат xml_gconf_tree
Формат состоит из элементов dir и entry и их атрибутов.
Атрибуты элементов будут объединены в случае join-объединения.
При объединении шаблона и конфигурационного файла элементы entry конфигурационного файла будут заменены, соответствующими элементами entry шаблона.
Атрибут элемента entry - mtime при изменении элемента entry показывает время когда произошло изменение в секундах.
При объединении с уже существующим файлом действует тот же дефект, что и у xml_gconf: Не удалось объединить шаблон; работает append=replace, при котором в цели остаются только элементы шаблона. Пример ниже размечен корректно и разбирается как XML с корнем gconf. Если намеренно испортить закрывающий тег корня, оставив <gconf>, движок отвечает Текст шаблона не является XML; после возврата </gconf> пример снова разбирается и налагается.
Пример шаблона xml_gconf:
# Calculate format=xml_gconf_tree
<?xml version="1.0"?>
<gconf>
<dir name="desktop">
<dir name="gnome">
<dir name="volume_manager">
<entry name="percent_used" mtime="1285580987" schema="/schemas/desktop/gnome/volume_manager/percent_used"/>
</dir>
</dir>
</dir>
</gconf>
Примеры использования
Файл шаблона:
# Calculate format=xml_xfce
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-session" version="1.0">
<property name="general" type="empty" action="drop">
<property name="FailsafeSessionName" type="empty"/>
<property name="SessionName" type="string" value="Default"/>
<property name="SaveOnExit" type="bool" value="true"/>
</property>
</channel>
Строка <property name="general" type="empty" action="drop"> говорит о том, что этот элемент и все элементы внутри будут удалены.
Получившийся в результате файл имеет следующий вид:
<?xml version="1.0" encoding="UTF-8"?> <channel name="xfce4-session" version="1.0"> </channel>
Учтите: атрибут name у <channel> движок берёт не из шаблона, а из имени целевого файла — на файле
xfceplain.xml получится <channel name="xfceplain" version="1.0"> при том же тексте шаблона. Если имя
канала должно отличаться от имени файла, задавайте его отдельной записью property внутри канала.
Содержимое совпадает: элемент general с внутренними элементами удалён, action="drop" работает. Атрибут name у channel берётся из имени конфигурационного файла (xfce4-session.xml → name="xfce4-session", xf.xml → name="xf"), и в созданный файл добавляется заголовок происхождения Calculate (<!-- Modified Calculate Utilities … -->), которого в примере выше нет.
Формат 'patch'
Формат patch используется для обработки конфигурационных файлов при помощи регулярных выражений языка программирования Python.
Особенности.
Формат patch использует обработку конфигурационного файла на основании шаблона (тип объединения patch); при этом не происходит объединения шаблона и конфигурационного файла.
Обработка исходного файла происходит целиком, а не построчно, поэтому символы '^' и '$' означают соответственно начало и конец файла. Символ '.' означает любой символ исключая перевод строки.
В параметры заголовка для format=patch входят опции multiline и dotall. При включенном multiline '^' и '$' обозначают начало и конец строки. При включенном dotall '.' включает в себя перевод строки.
Обе опции принимаются только с format=patch: в заголовке format=raw multiline движок отвечает Параметр multiline должен быть использован только для format=patch, а format=raw dotall — Параметр dotall должен быть использован только для format=patch; с format=patch обе работают как описано.
Описание.
Шаблон формата patch:
# Calculate format=patch <reg>регулярное выражение python 1</reg> <text>текст 1 для замены регулярного выражения</text> <reg>регулярное выражение python 2</reg> <text>текст 2 для замены регулярного выражения</text> ...
В содержимом тегов reg и text символы &, <, > должны быть заменены на &, <, > соответственно.
Пример:
# Calculate format=patch <reg>TEXT&DATA</reg> <text>TEXT_CONFIG</text>
Этот шаблон заменит в конфигурационном файле TEXT&DATA на TEXT_CONFIG.
Формат 'diff'
Формат diff используется для наложения diff патчей на исходный код пакета. Сам файл в системе не создается, а полученное содержимое обрабатывается относительно каталога указанного в параметре path=.
path на поиск файла не влияет: патч накладывается из корня системы (cl_root_path внутри cl_chroot_path), куда движок передаёт cwd программе patch, подбирая уровень снятия путевых компонентов от -p0 до -p3. Файл должен лежать по пути из заголовков патча относительно корня: panel-plugin/xkb-cairo.c от корня патчится (Применение патча), а тот же патч при файле в usr/src/xfce/panel-plugin/xkb-cairo.c и path=/usr/src/xfce даёт Исправление не удалось.
Пример:
# Calculate format=diff --- panel-plugin/xkb-cairo.c 2012-07-17 16:23:24.997030066 +0400 +++ panel-plugin/xkb-cairo.c 2012-07-17 16:47:34.107054590 +0400 @@ -27,7 +27,7 @@ #include "xkb-util.h" #include "xfce4-xkb-plugin.h" -#define XKB_PREFERRED_FONT "Courier New, Courier 10 Pitch, Monospace Bold %d" +#define XKB_PREFERRED_FONT "Droid Sans, Courier New, Courier 10 Pitch, Monospace Bold %d"
Ханк обязан быть полным: заголовок @@ -27,7 +27,7 @@ означает семь строк до изменения — три контекстные
сверху, одна удаляемая и три контекстные снизу. Если завершающие контекстные строки опущены, patch
отклоняет ханк и наложение прерывается с Исправление не удалось; при полном ханке патч накладывается
(Применение патча), причём движок сам перебирает уровень снятия путей от -p0 до -p3.
Формат 'kernel'
Формат kernel используется для объединения конфигурационных файлов ядра без сохранения комментариев.
Пример:
# Calculate format=kernel CONFIG_XFS_FS=m CONFIG_REISERFS_FS=y # CONFIG_EXT3_FS is not set !CONFIG_EXT3_FS_POSIX_ACL= !CONFIG_EXT3_FS_SECURITY= !CONFIG_EXT3_FS_XATTR=
Формат 'dconf'
Формат dconf используется для модификации настроек пользователя, хранящихся в реестре dconf. Формат dconf поддерживает параметр заголовка dconfpath для возможности изменять базовый путь настроек.
Параметр заголовка называется dconf, как в примере ниже; написание dconfpath не принимается: # Calculate format=dconf dconfpath=/org/x/ … даёт неправильный параметр заголовка - 'dconfpath' (это имя внутреннего атрибута формата, а не параметра заголовка). dconf= разрешён только вместе с format=dconf, в другом заголовке он даёт Параметр dconf должен быть использован только для format=dconf.
Пример:
# Calculate format=dconf dconf=/org/gnome/eog/ [view] background-color='#000000' use-background-color=true [ui] statusbar=true toolbar=true sidebar=false
Для применения шаблонов формата dconf, утилиты используют пакет gnome-base/dconf.
Этот формат накладывается только в событии профиля пользователя. В дереве такие шаблоны лежат в 6_ac_desktop_profile/2-user/<категория>/<пакет>/…, где .calculate_directory каталога события содержит # Calculate env=desktop path=~ name= chown=#-main.ur_login-#:#-main.ur_group-# ac_desktop_profile==on, а .calculate_directory каталога 2-user — # Calculate append=skip ur_login!=root. Переменная действия обязана стоять на первом уровне: если положить шаблон глубже, а условие оставить во второй директории, движок отвечает Нет условий проверки значения переменной действия и показывает Пропущенные директории. Вызвать событие можно командой cl-core --method=desktop -u <пользователь>; созданная база лежит в ~/.config/dconf/user, принадлежит самому пользователю и читается командой su - <пользователь> -c 'dbus-run-session -- dconf dump /org/gnome/eog/'.
Формат недоступен, если не найдены /usr/bin/dconf, dbus-run-session и su: шаблон завершается сообщением Формат 'dconf' недоступен.
Формат 'json'
Формат json используется для модификации настроек в формате json (например Preferences пакета www-client/chromium).
Пример json
{"google": {"services": {"signin": {"LSID": "", "SID": ""}}},
"intl": {"accept_languages": "ru-RU,ru,en-US,en", "status": 1}}
При объединении значения верхнего уровня заменяются заданными, а одноимённая вложенная ветка из шаблона замещает ветку файла целиком: прочие ключи этой ветки исчезают. Если содержимое ветки нужно сохранить, указывайте её в шаблоне полностью.
Для изменения правил объединения действующих по умолчанию, в начале имени элемента в файле шаблона добавляется управляющие символы:
-
"-" - ветка заменяется
-
"!" - ветка удаляется
Оба символа работают только на верхнем уровне документа: {"!intl":""} удаляет ветку intl, {"-intl":{…}} замещает её, {"intl": 5} заменяет значение. На вложенном уровне префиксы не читаются: {"a": {"b": {"-c": ""}}} даёт ключ "-c" как есть. Записывается файл всегда с отступами в четыре пробела, компактная форма исходного файла не сохраняется.
Пример объединения
# Calculate format=json
{"intl":{"accept_languages": "en"}}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": {
"accept_languages": "en"
}
}
Пример удаления
# Calculate format=json
{"!intl":""}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
}
}
Пример замещения
# Calculate format=json
{"-intl":{"accept_languages": "en"}}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": {
"accept_languages": "en"
}
}
Ветка настроек также будет замещена если в шаблоне содержится значение.
Пример замещения
# Calculate format=json
{"intl": 5}
{
"google": {
"services": {
"signin": {
"LSID": "",
"SID": ""
}
}
},
"intl": 5
}
Формат 'contents'
Формат contents используется для модификации принадлежности файлов пакетам. Позволяет добавлять файлы пакету, удалять, а также менять пакет, которому принадлежит файл. Каждая строка шаблона является инструкцией, описывающей действие с файлами. Игнорируются пустые строки, а также строки-комментарии начинающиеся с #.
Добавление файла пакету.
<package> <path>
-
package - пакет к которому будет добавлен файл. Пакет может быть указан с версией или со слотом, для уточнения.
-
path - путь в файловой системе. Поддерживаются глобальные символы (*, [], [!], ?)
Добавление файла пакету происходит, даже если файл уже принадлежит другому пакету. Если в системе два пакета, а в правиле не указан слот, то файл будет добавлен пакету, у которого версия больше. Контрольная сумма по файлу вычисляется при добавлении.
Удаление принадлежности файла пакету.
!<package> <path>
При получении списка удаляемых файлов (использование глобальных символов) используется список файлов пакета, а не файловая система. Если в системе два пакета, а в правиле не указан слот, то файл будет удалён из обоих пакетов.
Перенос файла от одного пакета другому
<source>,<target> <path>
-
source - пакет из которому будет удалён файл
-
target - пакет к которому будет добавлен файл
-
path - путь в файловой системе. Поддерживаются глобальные символы (*, [], [!], ?)
При получении списка файлов, так же как и при удалении, используется список файлов пакета source, а не файловая система. Контрольная сумма файлов будет перенесена из пакета source. Таким образом, если файл редактировался пользователем, пока принадлежал пакету source, то после привязки его пакету target будет видим системой, как изменённый.
Примеры
# Calculate format=contents # добавить пакету openrc файлы из /etc/conf.d начинающиеся на dhcp sys-apps/openrc /etc/conf.d/dhcp* # добавить в пакет udisks, второй слот sys-fs/udisks:2 /etc/polkit-1/rules.d/60-* # добавить в пакет udisks с версией 1.0.5-r1 sys-fs/udisks-1.0.5-r1 /etc/polkit-1/rules.d/60-* # убрать принадлежность /etc/conf.d/hostname пакету openrc !sys-apps/openrc /etc/conf.d/hostname # перенести файлы принадлежащие sys-apps/baselayout из /etc/conf.d в пакет openrc sys-apps/baselayout,sys-apps/openrc /etc/conf.d/*
Формат 'backgrounds'
Для работы необходим пакет media-gfx/imagemagick.
Без media-gfx/imagemagick любой шаблон этого формата завершается сообщением Формат 'backgrounds' недоступен. Необходимо установить virtual/imagemagick-tools, изображения при этом не создаются. Параметры convert= и stretch приняты только здесь же: в другом заголовке движок отвечает Параметр convert должен быть использован только с format=backgrounds и Параметр stretch должен быть использован только с format=backgrounds.
Формат backgrounds используется для создания множества фоновых изображений разных разрешений из исходного.
Используются следующие параметры заголовка:
-
link= параметр, указывающий на исходное изображение, если параметр не указан или указан на несуществующий файл, то изображения не будут создаваться
-
convert= формат и расширение конечных фоновых изображений (
jpg,png,gif,gfxboot), по умолчанию формат исходного изображения тот же, что и расширение исходного файла. -
stretch создавать изображения, даже если исходное изображение меньше необходимого
-
mirror если исходное изображение отсутствует, то будут удалены все ранее созданные этим шаблоном изображения
-
path= каталог, в который будут помещены созданные изображения
-
name= префикс добавляемый к имени файла
Имена изображений формируются следующим образом: (prefix)(resolution).(format), где prefix — имя, получаемое из параметра name=, resolution - разрешение, создаваемого изображения, format - формат изображения (jpg, png, gif или gfxboot). Gfxboot - jpeg с определёнными параметрами, которые подходят для установки изображения в качестве фонового изображение syslinux-gfxboot.
Кроме изображений шаблон создаёт файл контрольной суммы: name=bg- даёт рядом bg.md5. Если name= оставлен пустым, файл контрольной суммы получает имя md5sum.
Содержимое формата - набор строк, содержащих разрешения создаваемых изображений. Если содержимое не указано, то будет использован список стандартных разрешений, указанных в переменной main.cl_resolutions.
Если разрешение исходного изображения меньше конечного, то изображение не будет создано, и будет выведено предупреждение. Если же указан параметр stretch - исходное изображение будет растянуто, до необходимого.
Для предотвращения повторного выполнения шаблона, используется файл с контрольной суммой исходного изображения.
Все созданные изображения (а также файл контрольной суммы) "привязываются" к настраиваемому шаблонами пакету.
Если указано только одно разрешение, то будет создан только один файл с требуемым разрешением, причём имя конечного файла будет состоять из path/name. Файл с контрольной суммой создан не будет.
Вместо разрешения можно указать original, что означает разрешение исходного изображения. Может быть использовано, например, для конвертации изображения из одного формата в другой.
Примеры.
Создать изображения в /usr/share/wallpapers/Calculate_Linux/images/contents/images, с именами вида 1920x1080.jpg из /usr/share/backgrounds/bg.png, не создавая изображения с разрешением больше, чем у исходного.
# Calculate format=backgrounds convert=jpg link=/usr/share/backgrounds/bg.png \ path=/usr/share/wallpapers/Calculate_Linux/images/contents/images name=
Создать изображения в /etc/splash/calculate/images, с именами вида silent-1920x1080.jpg из /usr/share/backgrounds/bg.png, при необходимости исходное изображение будет растянуто.
# Calculate format=backgrounds convert=jpg stretch \ link=/usr/share/backgrounds/bg.png path=/etc/splash/calculate/images name=silent-
Создать одно изображение /boot/grub/grub-calculate.png с разрешением 1920x1440.
# Calculate format=backgrounds path=/boot/grub name=grub-calculate.png \ link=/usr/share/backgrounds/bg.png stretch 1920x1440
Формат 'world'
Формат для модификации файла world. Содержит список пакетов, которые необходимо либо добавить в файл, либо удалить из него. Для удаления пакета из world используется синтаксис !<пакет>. Для удаления с проверкой (в случае отсутствия необходимого пакета будет выведено предупреждающее сообщение) - !!<пакет>. Если файл со списком назван так же как категория, то внутри можно не указывать категорию для пакетов.
Для удаления пакета во всех слотах используется синтаксис !<пакет>:*.
Синтаксис удаления: !sys-apps/foo убирает строку из world, а !!dev-db/postgresql:* при отсутствии пакета выдаёт предупреждение Пакет dev-db/postgresql:* не найден в world. Целевой файл задают парой path=/var/lib/portage name=world: если в path= указать сам файл world вместо каталога, движок обращается к файлу внутри каталога world, а сам world остаётся без изменений. Префикс категории берётся из имени файла шаблона, а не из name=: файл sys-apps с телом calculate-utils, portage, sed даёт sys-apps/calculate-utils, sys-apps/portage и sys-apps/sed, а файл с именем world даёт world/eix.
Примеры.
Добавить sys-apps/calculate-utils в world
# Calculate format=world path=/var/lib/portage name=world sys-apps/calculate-utils
Удалить все dev-db/postgresql из world с проверкой
# Calculate format=world path=/var/lib/portage name=world !!dev-db/postgresql:*
Добавить в calculate-utils, portage, sed из категории sys-apps
sys-apps
# Calculate format=world path=/var/lib/portage name=world calculate-utils portage sed
Строка sys-apps над третьим примером — это имя файла шаблона, а не его содержимое: именно из имени файла берётся префикс категории, поэтому в world строки попадают уже в виде sys-apps/calculate-utils, sys-apps/portage, sys-apps/sed.
Все три примера — это файл внутри каталога события, а не файл в корне дерева шаблонов. Переменную действия несёт .calculate_directory самого каталога: для примеров выше дерево выглядит так — каталог 7_ac_install_merge/ с файлом .calculate_directory, где написано # Calculate append=skip env=install ac_install_merge==on, и вложенный шаблон sys-apps/calculate-utils/world с одним из приведённых заголовков. Без такого файла движок сообщает Нет условий проверки значения переменной действия и ничего не создаёт. Так устроены и готовые шаблоны: 6_ac_install_config/dev-db/postgresql/world начинается со строки # Calculate protected format=world path=/var/lib/portage name=world, а ac_install_config==on стоит в .calculate_directory каталога 6_ac_install_config.
См. также
- Справочник форматов шаблонов — какой формат выбрать для конкретного вида конфига.
- Свои функции шаблонов в оверлее — пользовательские функции и их приоритет над встроенными.
- Переменные шаблонов — откуда берутся значения
#-…-#. - Шаблон рядом с файлом:
.clt— настройка одного файла без каталога шаблонов. - Шаблон молча не сработал: диагностика — что смотреть, когда наложение не произошло.