|
|
Рядок 4: |
Рядок 4: |
|
| |
|
| Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге. | | Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге. |
|
| |
| make_config создает конфиг на основе шаблона. Шаблон - это рабочий конфиг для программы, в котором ключевые данные заменены на переменные. Допустим у нас есть конфигурационный файл для isc-dhcpd:
| |
|
| |
| <pre>
| |
| option domain-name-servers 1.1.1.1, 8.8.8.8;
| |
| default-lease-time 28800;
| |
| subnet 10.0.0.0 netmask 255.255.255.0 {
| |
| option subnet-mask 255.255.255.0;
| |
| option broadcast-address 10.0.0.255;
| |
| }
| |
| host host10.0.0.6 {
| |
| hardware ethernet 00:11:00:11:00:22;
| |
| fixed-address 10.0.0.6;
| |
| }
| |
| host host10.0.0.2 {
| |
| hardware ethernet 00:11:22:33:44:77;
| |
| fixed-address 10.0.0.2;
| |
| }
| |
| </pre>
| |
|
| |
| Здесь мы видим, что для двух абонентов прописана связка мак-адрес ↠ ip. Эта информация зависит от данных в биллинге, поэтому ее необходимо заменить на переменные. Создадим шаблон /usr/local/nodeny/kernel/make_config/dhcp.tmpl:
| |
|
| |
| <pre>
| |
| option domain-name-servers 1.1.1.1, 8.8.8.8;
| |
| subnet 10.0.0.0 netmask 255.255.255.0 {
| |
| option subnet-mask 255.255.255.0;
| |
| option broadcast-address 10.0.0.255;
| |
| }
| |
|
| |
| {% for user in users %}
| |
| {% for con in user.connection %}
| |
| {% if con.type eq 'static' && con.mac %}
| |
| host host{{con.ipa}} {
| |
| hardware ethernet {{con.mac|pretty_mac}};
| |
| fixed-address {{con.ipa}};
| |
| }
| |
| {% endif %}
| |
| {% endfor %}
| |
| {% endfor %}
| |
| </pre>
| |
|
| |
| Мы видим, что информация по связкам мак-ip была заменена на относительно непонятную конструкцию. Давайте разберемся в ней:
| |
|
| |
| Все что находится внутри {% .. %} или {{ }} - это команды для шаблонизатора.
| |
|
| |
| * '''{% for user in users %}''' - в переменную user загрузить данные пользователя (сначала первого из users, затем второго и т.д).;
| |
| * '''{% for con in user.connection %}''' - в переменную con загрузить информацию по первому подключению (затем второму и т.д);
| |
| * '''{% if con.type eq 'static' && con.mac %}''' - это проверка, что в соединении ip статический и к нему привязан не пустой мак-адрес;
| |
| * '''<nowiki>{{ con.ipa }}</nowiki>''' - в данное место будет вставлен ip адрес. Обратите внимание, что в базе данных ip хранятся в виде чисел (для сокращения объема), поэтому, чтобы ip был в виде xx.xx.xx.xx нужно использовать переменную ipa;
| |
| * '''<nowiki>{{ con.mac|pretty_mac }}</nowiki>''' - в данное место будет вставлен мак-адрес, при этом он будет приведен в удобочитаемую форму (вставлены разделители в виде двоеточия);
| |
|
| |
|
| |
|
| |
| Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Для формирования конфига isc-dhcpd он может быть таким:
| |
|
| |
| <pre>
| |
| run => 0,
| |
| period => 60,
| |
| template => {
| |
| 'dhcp.tmpl' => {
| |
| # куда будет записан сформированный конфиг
| |
| file => '/usr/local/etc/dhcpd.conf',
| |
|
| |
| # системная команда, которая будет выполнена перед записью конфига, можно ''
| |
| cmd_before => '',
| |
|
| |
| # системная команда, которая будет выполнена после записи конфига, можно ''
| |
| cmd_after => '/usr/local/etc/rc.d/isc-dhcpd forcestart >/dev/null',
| |
|
| |
| # удалять пустые строки
| |
| pretty => 1,
| |
| },
| |
| },
| |
| subs => {
| |
| pretty_mac => sub {
| |
| my $mac = shift;
| |
| $mac =~ s/(..)/$1:/g;
| |
| chop $mac;
| |
| return $mac;
| |
| },
| |
| }
| |
| </pre>
| |
| Здесь:
| |
| * dhcp.tmpl - имя файла с шаблоном;
| |
| * /usr/local/etc/dhcpd.conf - имя файла, куда будет записан результат;
| |
| * переменная period указывает на период в секундах, с которым будут проверяться изменения данных в биллинге. Например, если period = 60 секундам, то при изменении ip какого-либо абонента, эти изменения отобразятся в конфиге dhcp максимум через 60 секунд (обычно раньше: от 1 до 60 сек);
| |
| * pretty_mac - функция, которая добавляет двоеточия в мак-адрес (в базе мак хранится в виде 001122334455)
| |
|
| |
| Запустим с выводом результата на экран:
| |
|
| |
| <pre>
| |
| perl /usr/local/nodeny/nokernel.pl -v -m=make_config
| |
| </pre>
| |
|
| |
| Если конфиг сформирован правильно, добавим запуск make_config в автозагрузку:
| |
|
| |
| <pre>
| |
| echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=make_config -d &' >> /etc/rc.local
| |
| </pre>
| |
|
| |
|
| |
| ----
| |
|
| |
| Можно запустить несколько копий модуля для формирования разных конфигов:
| |
|
| |
| <pre>
| |
| perl nokernel.pl -v -m=make_config -g=make_config_2
| |
| </pre>
| |
| При этом необходимо создать файл /usr/local/nodeny/kernel/make_config_2.cfg
| |
|
| |
|
| ---- | | ---- |
Модуль ядра make config входит в базовую поставку и позволяет создавать конфигурационные файлы на лету. Например, с помощью make_config можно формировать:
Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге.
Пример шаблона для экспорта в cvs:
{% for user in users %}
{{ user.name }};{{ user.show_data._adr_street }}
{% endfor %}
Здесь user.show_data._adr_street - вывод дополнительного поля _adr_street.
Необходимо отметить, что в дополнительных данных есть тип поля "выпадающий список", при этом в самом поле может храниться код, а отображаемое значение будет находиться в таблице dictionary:
- {{ user.data._adr_street }} - вывод значения, которое хранится в поле _adr_street (т.е там может быть код улицы)
- {{ user.show_data._adr_street }} - вывод преобразованного значения (имени улицы)