Вы посетили:
Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:base:services 2006/11/15 07:47 | ru:base:services 2006/11/20 12:00 текущий | ||
---|---|---|---|
Строка 8: | Строка 8: | ||
Также в меню //actions// можно видеть раздел //filegens//. //Filegens// это темплейты всех файлов, которые заливаются на сервер.\\ | Также в меню //actions// можно видеть раздел //filegens//. //Filegens// это темплейты всех файлов, которые заливаются на сервер.\\ | ||
== Filegens == | == Filegens == | ||
- | //Filegens// представляют из себя простой способ генерации любых конфигов прямо из базы, без написания лишнего кода. Для этого используется специально подготовленный //perl-hash//, называемый //datasource//. Его структура аналогична структуре базы.\\ | + | //Filegens// (генераторы) представляют из себя простой способ генерации любых конфигов прямо из базы, без написания лишнего кода. \\ |
Рассмотрим самый простой пример, генерация конфига //vhosts.conf// для веб-сервера apache.\\ | Рассмотрим самый простой пример, генерация конфига //vhosts.conf// для веб-сервера apache.\\ | ||
- | Для этого мы используем datasource //hosts_accounts//, в котором содержиться вся необходимая информация.\\ | + | Идем в //base/services//, добавляем к сервису webserver новый генератор test. \\ |
- | Идем в //base/filegens/add//\\ | + | |
- | //**Name**// - это имя //filegen//. Для практических целей не служит, только для удобства.\\ | + | //**Name**// - это имя //filegen//. При перестройке сервисов порядок вызова генератора определяется им.\\ |
- | //**Datasource**// - подходящий datasource. В нашем случае hosts_accounts.\\ | + | //**Filename**// - имя файла, куда будет сохраняться результат работы генератора. Если тип генератора //скрипт// и Filename не заполнено, используется временный файл, который потом удаляется \\ |
- | //**Service**// - к какому сервису будет привязан данный filegen, то есть при ребилде какого сервиса он будет активироваться и заливать свой генерированный файл.\\ | + | |
- | //**Filename**// - имя файла, куда будет сохраняться //filegen//. Может содержать переменные, определенные в //datasource// на первом уровне. ВСЕ filegens кладут файлы в ///opt/dedikit/fs//. То есть к началу имени файла в темплейте будет добавлен ///opt/dedikit/fs//. Чтобы изменять файлы, лежащие в других местах, например в ///etc// нужно сделать символическую ссылку из ///opt/dedikit/fs//. | + | |
- | //ln -s /etc/apache/vhosts.conf /opt/dedikit/fs/etc/apache/vhosts.conf//\\ | + | |
- | //**Loop over**// - какой цикл первого уровня использовать для заполнения темплейта (все циклы и переменные описаны в Структуре //datasources//)\\ | + | |
//**Start mark**// - если файл необходимо встраивать внутрь другого, то это отметка начала генерированной секции. Необходимо оставлять это поле пустым, если нужно заменять файл.\\ | //**Start mark**// - если файл необходимо встраивать внутрь другого, то это отметка начала генерированной секции. Необходимо оставлять это поле пустым, если нужно заменять файл.\\ | ||
//**End mark**// - аналогично //Start mark//. Не используется, если //Start mark// не определен.\\ | //**End mark**// - аналогично //Start mark//. Не используется, если //Start mark// не определен.\\ | ||
Строка 34: | Строка 29: | ||
ServerAlias <TMPL_LOOP aliases_loop><TMPL_VAR alias> </TMPL_LOOP> # one more embedded loop | ServerAlias <TMPL_LOOP aliases_loop><TMPL_VAR alias> </TMPL_LOOP> # one more embedded loop | ||
- | DocumentRoot <TMPL_VAR GLOBAL_clients_home>/<TMPL_VAR accounts_loop.login>/domains/<TMPL_VAR name>/html # LOOK, HERE IS backreference and globals vars! | + | # здесь используется backreferences и переменные из настроек |
+ | DocumentRoot <TMPL_VAR GLOBAL_clients_home>/<TMPL_VAR accounts_loop.login>/domains/<TMPL_VAR name>/html | ||
</VirtualHost> | </VirtualHost> | ||
Строка 42: | Строка 39: | ||
Начинаем разбирать наш пример.\\ | Начинаем разбирать наш пример.\\ | ||
Первым делом желательно прочитать документацию по //HTML::Template//, //template-engine//, использующуюся при построении файлов. Достаточно понимать значение //TMPL_LOOP//, //TMPL_VAR//. Документация расположена по адресу [[http://html-template.sourceforge.net/]].\\ | Первым делом желательно прочитать документацию по //HTML::Template//, //template-engine//, использующуюся при построении файлов. Достаточно понимать значение //TMPL_LOOP//, //TMPL_VAR//. Документация расположена по адресу [[http://html-template.sourceforge.net/]].\\ | ||
- | Темплейт **ВСЕГДА** должен начинаться и заканчиваться внешним //TMPL_LOOP LOOPNAME//, где //LOOPNAME// - это //loop_over// в параметрах до //template//.\\ | + | Каждый цикл индицируется названием //LOOPNAME_loop// и имеет ключ, к которому в темплейте можно обращаться как main_key. Например,\\ |
- | Это внешний цикл. Каждый цикл индицируется названием //LOOPNAME_loop// и имеет ключ, к которому в темплейте можно обращаться как main_key. Например,\\ | + | |
<code> | <code> | ||
<TMPL_LOOP accounts_loop> | <TMPL_LOOP accounts_loop> | ||
Строка 52: | Строка 48: | ||
Параметром может быть цикл, тогда он содержит поддерево данных, типа {//accounts_loop//}{//$account_id//}{//hosts_loop//}{$//host_id//}{//name//}.\\ | Параметром может быть цикл, тогда он содержит поддерево данных, типа {//accounts_loop//}{//$account_id//}{//hosts_loop//}{$//host_id//}{//name//}.\\ | ||
В примере с //apache_vhosts.conf// это видно на //hosts_loop// и //aliases_loop//.\\ | В примере с //apache_vhosts.conf// это видно на //hosts_loop// и //aliases_loop//.\\ | ||
- | Особый пример представляет строка //DocumentRoot//, в которой используется сразу два приема, //backreference// и //GLOBAL//.\\ | + | Особый пример представляет строка //DocumentRoot//, в которой используется сразу два приема, //backreference// и доступ к переменным из //настроек//.\\ |
//**backreference**// - это переменная, **НЕ ЛЕЖАЩАЯ** в текущей вложенности цикла. Как пример, мы приводим //accounts_loop.login//, который в //hosts_loop// не виден, так как хранится в //accounts_loop// (внешнем цикле).\\ | //**backreference**// - это переменная, **НЕ ЛЕЖАЩАЯ** в текущей вложенности цикла. Как пример, мы приводим //accounts_loop.login//, который в //hosts_loop// не виден, так как хранится в //accounts_loop// (внешнем цикле).\\ | ||
//**GLOBAL**// - способ обратиться к переменным в //configure//. Убирается из имени //GLOBAL_// и вытаскивается переменная.\\ | //**GLOBAL**// - способ обратиться к переменным в //configure//. Убирается из имени //GLOBAL_// и вытаскивается переменная.\\ | ||
- | == Деление темплейта на куски. == | + | == Использование нескольких одинаковых циклов. === |
- | Иногда необходимо сделать группу конфигурационных файлов. Как пример можно привести файлы зон //named// или виртуальных хостов //apache//. Самый простой способ деления - вставлять в темплейт метки начала деления //DK_CUT_HERE//. Пример: создаем файлы вирутальных хостов //apache//, по файлу на виртхост:\\ | + | В случае, если нужно использовать в одном уровне вложенности несколько одинаковых циклов применяется следующий путь: \\ |
+ | Пример (два цикла accounts_loop рядом): \\ | ||
<code> | <code> | ||
- | DK_CUT_HERE etc/vhosting/apache/conf.d/ | + | 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> | ||
+ | </code> | ||
+ | работать **НЕ БУДЕТ**, так как в темплейте два одинаковых внешних цикла accounts_loop и система будет пытаться присвоить переменные от одного цикла другому, что будет вызывать ошибку. \\ | ||
+ | Обходной путь - использовать номера в имени цикла. \\ | ||
+ | Правильный пример: \\ | ||
+ | <code> | ||
+ | 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> | ||
+ | </code> | ||
+ | Обратите внимание, что во втором случае вместо accounts_loop стоит 2_accounts_loop - будет браться цикл accounts_loop, но не возникнет коллизии имен. \\ | ||
+ | |||
+ | == Генерация нескольких файлов из одного темплейта. == | ||
+ | Иногда необходимо сделать группу конфигурационных файлов. Как пример можно привести файлы зон //named// или виртуальных хостов //apache//. Самый простой способ деления - вставлять в темплейт метки начала деления //DK_NEW_FILE//. Пример: создаем файлы вирутальных хостов //apache//, по файлу на виртхост:\\ | ||
+ | <code> | ||
+ | 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 | ||
- | ServerName | ||
- | ServerAlias | ||
- | DocumentRoot //domains//html | ||
</code> | </code> | ||
- | //DK_CUT_HERE// дает команду системе обработки темплейтов создать файл с именем, идущим после //DK_CUT_HERE// (//etc/vhosting/apache/conf.d/// в данном случае) и с содержимым от текущей метки до следующей или конца темплейта. | + | //DK_NEW_FILE// дает команду системе обработки темплейтов создать файл с именем, идущим после //DK_NEW_FILE// (/usr/local/apache/conf.d/<TMPL_VAR name> в данном случае) и с содержимым от текущей метки до следующей или конца темплейта. |
- | метка //DK_CUT_HERE// должна находится в начале строки.\\ | + | метка //DK_NEW_FILE// должна находится в начале строки.\\ |