===== Сервисы ===== == Сервисы == {{ru:small_icons:services2_list.png|}} //Сервисы// это службы, управляющие обновлением конфигурации сервера. К каждому сервису принадлежит определенный набор файлов конфигурации (//filegens//), которые будут обновлены на выделенном сервере при изменении соответствующих пунктов в панели. Сервисы могут быть трех состояний:\\ //Synced// - данные в панели соответствуют конфигурации сервера;\\ //Pending rebuild// - были произведены изменения в панели и ожидается обновление конфигураци;\\ //Rebuild blocked// - при обновлении произошла ошибка, автоматическое обновление блокировано. Ошибка будет показываться в графе //Error// \\ Обновление конфигурации сервера происходит не моментально! Сразу после изменений в панели сервис должен находится в состоянии //Pending rebuild//. В течение минуты-двух он перейдет в состояние //Synced//, это означает, что необходимые изменений произведены на сервере.\\ Также в меню //actions// можно видеть раздел //filegens//. //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//:\\ # HERE we loop over accounts # sites of account # embedded loop of bound to account hosts ServerName ServerAlias # one more embedded loop # здесь используется backreferences и переменные из настроек DocumentRoot //domains//html # closing hosts_loop # closing accounts_loop Начинаем разбирать наш пример.\\ Первым делом желательно прочитать документацию по //HTML::Template//, //template-engine//, использующуюся при построении файлов. Достаточно понимать значение //TMPL_LOOP//, //TMPL_VAR//. Документация расположена по адресу [[http://html-template.sourceforge.net/]].\\ Каждый цикл индицируется названием //LOOPNAME_loop// и имеет ключ, к которому в темплейте можно обращаться как main_key. Например,\\ Account have ID У каждого цикла есть параметры, в //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: Hosts: работать **НЕ БУДЕТ**, так как в темплейте два одинаковых внешних цикла accounts_loop и система будет пытаться присвоить переменные от одного цикла другому, что будет вызывать ошибку. \\ Обходной путь - использовать номера в имени цикла. \\ Правильный пример: \\ Accounts: Hosts: Обратите внимание, что во втором случае вместо accounts_loop стоит 2_accounts_loop - будет браться цикл accounts_loop, но не возникнет коллизии имен. \\ == Генерация нескольких файлов из одного темплейта. == Иногда необходимо сделать группу конфигурационных файлов. Как пример можно привести файлы зон //named// или виртуальных хостов //apache//. Самый простой способ деления - вставлять в темплейт метки начала деления //DK_NEW_FILE//. Пример: создаем файлы вирутальных хостов //apache//, по файлу на виртхост:\\ DK_NEW_FILE /usr/local/apache/conf.d/.conf ServerName ServerAlias # one more embedded loop DocumentRoot # domain_htdocs_dir изменяется при каждой итерации цикла hosts_loop //DK_NEW_FILE// дает команду системе обработки темплейтов создать файл с именем, идущим после //DK_NEW_FILE// (/usr/local/apache/conf.d/ в данном случае) и с содержимым от текущей метки до следующей или конца темплейта. метка //DK_NEW_FILE// должна находится в начале строки.\\