Сервисы это службы, управляющие обновлением конфигурации сервера. К каждому сервису принадлежит определенный набор файлов конфигурации (filegens), которые будут обновлены на выделенном сервере при изменении соответствующих пунктов в панели. Сервисы могут быть трех состояний:
Synced - данные в панели соответствуют конфигурации сервера;
Pending rebuild - были произведены изменения в панели и ожидается обновление конфигураци;
Rebuild blocked - при обновлении произошла ошибка, автоматическое обновление блокировано. Ошибка будет показываться в графе Error
Обновление конфигурации сервера происходит не моментально! Сразу после изменений в панели сервис должен находится в состоянии Pending rebuild. В течение минуты-двух он перейдет в состояние Synced, это означает, что необходимые изменений произведены на сервере.
Также в меню actions можно видеть раздел filegens. Filegens это темплейты всех файлов, которые заливаются на сервер.
Filegens (генераторы) представляют из себя простой способ генерации любых конфигов прямо из базы, без написания лишнего кода.
Рассмотрим самый простой пример, генерация конфига vhosts.conf для веб-сервера apache.
Идем в base/services, добавляем к сервису webserver новый генератор test.
Name - это имя filegen. При перестройке сервисов порядок вызова генератора определяется им.
Filename - имя файла, куда будет сохраняться результат работы генератора. Если тип генератора скрипт и Filename не заполнено, используется временный файл, который потом удаляется
Start mark - если файл необходимо встраивать внутрь другого, то это отметка начала генерированной секции. Необходимо оставлять это поле пустым, если нужно заменять файл.
End mark - аналогично Start mark. Не используется, если Start mark не определен.
File permissions - 4-х значный номер, обозначающий права на файл. Если не указан, используются права существующего на dedicated файла.
Template - сам темплейт конфига. Подробнее о структуре ниже.
Итак, пример построения apache_vhosts.conf:
<TMPL_LOOP accounts_loop> # HERE we loop over accounts # sites of account <TMPL_VAR login> <TMPL_LOOP hosts_loop> # embedded loop of bound to account hosts <VirtualHost *:80> ServerName <TMPL_VAR name> ServerAlias <TMPL_LOOP aliases_loop><TMPL_VAR alias> </TMPL_LOOP> # one more embedded loop # здесь используется backreferences и переменные из настроек DocumentRoot <TMPL_VAR GLOBAL_clients_home>/<TMPL_VAR accounts_loop.login>/domains/<TMPL_VAR name>/html </VirtualHost> </TMPL_LOOP> # closing hosts_loop </TMPL_LOOP> # closing accounts_loop
Начинаем разбирать наш пример.
Первым делом желательно прочитать документацию по HTML::Template, template-engine, использующуюся при построении файлов. Достаточно понимать значение TMPL_LOOP, TMPL_VAR. Документация расположена по адресу http://html-template.sourceforge.net/.
Каждый цикл индицируется названием LOOPNAME_loop и имеет ключ, к которому в темплейте можно обращаться как main_key. Например,
<TMPL_LOOP accounts_loop> Account <TMPL_VAR login> have ID <TMPL_VAR main_key> </TMPL_LOOP>
У каждого цикла есть параметры, в accounts_loop есть login, passwd и т.п.
Параметром может быть цикл, тогда он содержит поддерево данных, типа {accounts_loop}{$account_id}{hosts_loop}{$host_id}{name}.
В примере с apache_vhosts.conf это видно на hosts_loop и aliases_loop.
Особый пример представляет строка DocumentRoot, в которой используется сразу два приема, backreference и доступ к переменным из настроек.
backreference - это переменная, НЕ ЛЕЖАЩАЯ в текущей вложенности цикла. Как пример, мы приводим accounts_loop.login, который в hosts_loop не виден, так как хранится в accounts_loop (внешнем цикле).
GLOBAL - способ обратиться к переменным в configure. Убирается из имени GLOBAL_ и вытаскивается переменная.
В случае, если нужно использовать в одном уровне вложенности несколько одинаковых циклов применяется следующий путь:
Пример (два цикла accounts_loop рядом):
Accounts: <TMPL_LOOP accounts_loop><TMPL_VAR login> </TMPL_LOOP> Hosts: <TMPL_LOOP accounts_loop><TMPL_LOOP hosts_loop><TMPL_VAR name> </TMPL_LOOP></TMPL_LOOP>
работать НЕ БУДЕТ, так как в темплейте два одинаковых внешних цикла accounts_loop и система будет пытаться присвоить переменные от одного цикла другому, что будет вызывать ошибку.
Обходной путь - использовать номера в имени цикла.
Правильный пример:
Accounts: <TMPL_LOOP accounts_loop><TMPL_VAR login> </TMPL_LOOP> Hosts: <TMPL_LOOP 2_accounts_loop><TMPL_LOOP hosts_loop><TMPL_VAR name> </TMPL_LOOP></TMPL_LOOP>
Обратите внимание, что во втором случае вместо accounts_loop стоит 2_accounts_loop - будет браться цикл accounts_loop, но не возникнет коллизии имен.
Иногда необходимо сделать группу конфигурационных файлов. Как пример можно привести файлы зон named или виртуальных хостов apache. Самый простой способ деления - вставлять в темплейт метки начала деления DK_NEW_FILE. Пример: создаем файлы вирутальных хостов apache, по файлу на виртхост:
DK_NEW_FILE /usr/local/apache/conf.d/<TMPL_VAR name>.conf ServerName <TMPL_VAR name> ServerAlias <TMPL_LOOP aliases_loop><TMPL_VAR alias> </TMPL_LOOP> # one more embedded loop DocumentRoot <TMPL_VAR domain_htdocs_dir> # domain_htdocs_dir изменяется при каждой итерации цикла hosts_loop
DK_NEW_FILE дает команду системе обработки темплейтов создать файл с именем, идущим после DK_NEW_FILE (/usr/local/apache/conf.d/<TMPL_VAR name> в данном случае) и с содержимым от текущей метки до следующей или конца темплейта. метка DK_NEW_FILE должна находится в начале строки.