Make config: відмінності між версіями
Sv (обговорення | внесок) Немає опису редагування |
Sv (обговорення | внесок) Немає опису редагування |
||
Рядок 30: | Рядок 30: | ||
{% for user in users %} | {% for user in users %} | ||
{% for con in user.connection %} | |||
{% for | {% if con.type eq 'static' && con.mac %} | ||
{% if | host host{{con.ipa}} { | ||
host host{{ | hardware ethernet {{con.mac|pretty_mac}}; | ||
hardware ethernet {{ | fixed-address {{con.ipa}}; | ||
fixed-address {{ | |||
} | } | ||
{% endif %} | {% endif %} | ||
{% endfor %} | {% endfor %} | ||
Рядок 48: | Рядок 46: | ||
* '''{% for user in users %}''' - в переменную user загрузить данные пользователя (сначала первого из users, затем второго и т.д).; | * '''{% for user in users %}''' - в переменную user загрузить данные пользователя (сначала первого из users, затем второго и т.д).; | ||
* | * ''{% for con in user.connection %}''' - в переменную con загрузить информацию информацию по первому подключению (затем второму и т.д); | ||
* '''{% if | * '''{% if con.type eq 'static' && con.mac %}''' - это проверка, что в соединение ip статический и к нему привязан не пустой мак-адрес; | ||
* '''<nowiki>{{ | * '''<nowiki>{{ con.ipa }}</nowiki>''' - в данное место будет вставлен ip адрес. Обратите внимание, что в базе данных ip хранятся в виде чисел (для сокращения объема), поэтому, чтобы ip был в виде xx.xx.xx.xx нужно использовать переменную ipa; | ||
* '''{{ | * '''{{ con.mac|pretty_mac }}''' - в данное место будет вставлен мак-адрес, при этом он будет приведен в удобочитаемую форму (вставлены разделители в виде двоеточия); | ||
Версія за 16:02, 18 березня 2019
Модуль ядра make config входит в базовую поставку и позволяет создавать конфигурационные файлы для программ, не входящих в NoDeny+. Например, с помощью make_config можно формировать конфиг для dhcp-сервера. Модуль можно использовать не только для создания конфига, но и экспорта данных пользователей, например, в cvs-файл. Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге.
make_config создает конфиг на основе шаблона. Шаблон - это рабочий конфиг для программы, в котором ключевые данные заменены на переменные. Допустим у нас есть конфигурационный файл для isc-dhcpd:
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; }
Здесь мы видим, что для двух абонентов прописана связка мак-адрес ↠ ip. Эта информация зависит от данных в биллинге, поэтому ее необходимо заменить на переменные. Создадим шаблон /usr/local/nodeny/kernel/make_config/dhcp.tmpl:
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 %}
Мы видим, что информация по связкам мак-ip была заменена на относительно непонятную конструкцию. Давайте разберемся в ней:
Все что находится внутри {% .. %} или {{ }} - это команды для шаблонизатора.
- {% for user in users %} - в переменную user загрузить данные пользователя (сначала первого из users, затем второго и т.д).;
- {% for con in user.connection %}' - в переменную con загрузить информацию информацию по первому подключению (затем второму и т.д);
- {% if con.type eq 'static' && con.mac %} - это проверка, что в соединение ip статический и к нему привязан не пустой мак-адрес;
- {{ con.ipa }} - в данное место будет вставлен ip адрес. Обратите внимание, что в базе данных ip хранятся в виде чисел (для сокращения объема), поэтому, чтобы ip был в виде xx.xx.xx.xx нужно использовать переменную ipa;
- Шаблон:Con.mac - в данное место будет вставлен мак-адрес, при этом он будет приведен в удобочитаемую форму (вставлены разделители в виде двоеточия);
Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Для формирования конфига isc-dhcpd он может быть таким:
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; }, }
Здесь:
- dhcp.tmpl - имя файла с шаблоном;
- /usr/local/etc/dhcpd.conf - имя файла, куда будет записан результат;
- переменная period указывает на период в секундах, с которым будут проверяться изменения данных в биллинге. Например, если period = 60 секундам, то при изменении ip какого-либо абонента, эти изменения отобразятся в конфиге dhcp максимум через 60 секунд (обычно раньше: от 1 до 60 сек);
- pretty_mac - функция, которая добавляет двоеточия в мак-адрес (в базе мак хранится в виде 001122334455)
Запустим с выводом результата на экран:
perl /usr/local/nodeny/nokernel.pl -v -m=make_config
Если конфиг сформирован правильно, добавим запуск make_config в автозагрузку:
echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=make_config -d &' >> /etc/rc.local
Можно запустить несколько копий модуля для формирования разных конфигов:
perl nokernel.pl -v -m=make_config -g=make_config_2
При этом необходимо создать файл /usr/local/nodeny/kernel/make_config_2.cfg
Пример шаблона для экспорта в 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 }} - вывод преобразованного значения (имени улицы)