Make config: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
Немає опису редагування
Немає опису редагування
 
(Не показано 20 проміжних версій цього користувача)
Рядок 1: Рядок 1:
Модуль ядра '''make config''' входит в базовую поставку и позволяет создавать конфигурационные файлы для программ, не входящих в NoDeny+. Например, с помощью make_config можно формировать конфиг для dhcp-сервера. Можно использовать не только для создания конфига, но и экспорта данных пользователей, например, в cvs-файл. Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге.
Модуль ядра '''make config''' входит в базовую поставку и позволяет создавать конфигурационные файлы '''на лету'''. Например, с помощью make_config можно формировать:
* [[dhcp-конфиг с помощью make config|конфиг для dhcp-сервера]]
* данные пользователей, например, в cvs-файле для экспорта во внешние программы.


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:
Пример шаблона для экспорта в csv:


<pre>
<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 user in users %}
    {% eval i = 0 %}
{{ user.name }};{{ user.show_data._adr_street }}
    {% for ip in user.ips %}
        {% if ip.type eq 'static' && user.mac.[i] %}
        host host{{ip.ipa}} {
            hardware ethernet {{user.mac.[i]|pretty_mac}};
            fixed-address {{ip.ipa}};
        }
        {% eval i = i + 1 %}
        {% endif %}
    {% endfor %}
{% endfor %}
{% endfor %}
</pre>
</pre>


Мы видим, что информация по связкам мак-ip была заменена на относительно непонятную конструкцию. Давайте разберемся в ней:
Здесь user.show_data._adr_street - вывод дополнительного поля  _adr_street.


Все что находится внутри {% .. %} или {{ }} - это команды для шаблонизатора.
Необходимо отметить, что в дополнительных данных есть тип поля "выпадающий список", при этом в самом поле может храниться код, а отображаемое значение будет находиться в таблице dictionary:
* '''<nowiki>{{ user.data._adr_street }}</nowiki>''' - вывод значения, которое хранится в поле _adr_street (т.е там может быть код улицы)
* '''<nowiki>{{ user.show_data._adr_street }}</nowiki>''' - вывод преобразованного значения (имени улицы)


* '''{% for user in users %}''' - эта конструкция означает следующее: в переменную user загрузить данные пользователя (сначала первого из users, затем второго и т.д).;
* '''{% for ip in user.ips %}''' - в переменную ip загрузить информацию по привязанному ip (их может быть несколько);
* '''{% if ip.type eq 'static' && user.mac.[i] %}''' - это проверка, что полученный ip статический и у него мак-адрес с номером i существует;
* '''{{''' '''ip.ipa }}''' - в данное место будет вставлен ip адрес. Обратите внимание, что в базе данных ip хранятся в виде чисел (для сокращения объема), поэтому, чтобы ip был в виде xx.xx.xx.xx нужно использовать переменную ipa;
* '''{{ user.mac.[i]|pretty_mac }}''' - в данное место будет вставлен мак-адрес с индексом i, при этом он будет приведен в удобочитаемую форму (вставлены разделители в виде двоеточия);
* '''{% eval i = i + 1 %}''' - к переменной i будет добавлена единица.


 
Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Он может быть таким:
Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Для формирования конфига isc-dhcpd он может быть таким:


<pre>
<pre>
Рядок 61: Рядок 28:
period  => 60,
period  => 60,
template  => {
template  => {
             'dhcp.tmpl' => {
             'users.tmpl' => {
                 # куда будет записан сформированный конфиг
                 # куда будет записан результат
                 file      => '/usr/local/etc/dhcpd.conf',
                 file      => '/tmp/users.csv',


                 # системная команда, которая будет выполнена перед записью конфига, можно ''
                 # системная команда, которая будет выполнена перед записью результата, можно ''
                 cmd_before => '',
                 cmd_before => '',


                 # системная команда, которая будет выполнена после записи конфига, можно ''
                 # системная команда, которая будет выполнена после записи результата, можно ''
                 cmd_after  => '/usr/local/etc/rc.d/isc-dhcpd forcestart >/dev/null',
                 cmd_after  => '',


                 # удалять пустые строки
                 # удалять пустые строки
                 pretty => 1,
                 pretty => 1,
            },
},
subs    => {
            pretty_mac => sub {
                my $mac = shift;
                $mac =~ s/(..)/$1:/g;
                chop $mac;
                return $mac;
             },
             },
}
}
</pre>
</pre>
Здесь dhcp.tmpl - имя файла с шаблоном. /usr/local/etc/dhcpd.conf - имя файла, куда будет записан результат.
Здесь:
* users.tmpl - имя файла с шаблоном;
* /tmp/users.csv - имя файла, куда будет записан результат;
* переменная period указывает на период в секундах, с которым будет формироваться результат.


Переменная period указывает на период в секундах, с которым будут проверяться изменения данных в биллинге. Например, если period = 60 секундам, то при изменении ip какого-либо абонента, эти изменения отобразятся в конфиге dhcp максимум через 60 секунд (обычно раньше: от 1 до 60 сек)
Запустим модуль make_config с выводом результата на экран:


Запустим с выводом результата на экран:
<pre>
perl /usr/local/nodeny/nokernel.pl -v -m=make_config
</pre>


perl /usr/local/nodeny/nokernel.pl -v -m=make_config
Если результат корректный, добавим запуск make_config в автозагрузку:
Если конфиг сформирован правильно, добавим запуск make_config в автозагрузку:


<pre>
echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=make_config -d &' >> /etc/rc.local
echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=make_config -d &' >> /etc/rc.local
</pre>

Поточна версія на 12:56, 19 березня 2019

Модуль ядра make config входит в базовую поставку и позволяет создавать конфигурационные файлы на лету. Например, с помощью make_config можно формировать:

Результат формируется динамически - это значит, что он будет переформирован при изменении данных в биллинге.


Пример шаблона для экспорта в csv:

{% 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 }} - вывод преобразованного значения (имени улицы)


Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Он может быть таким:

run     => 0,
period  => 60,
template  => {
            'users.tmpl' => {
                # куда будет записан результат
                file       => '/tmp/users.csv',

                # системная команда, которая будет выполнена перед записью результата, можно ''
                cmd_before => '',

                # системная команда, которая будет выполнена после записи результата, можно ''
                cmd_after  => '',

                # удалять пустые строки
                pretty => 1,
            },
}

Здесь:

  • users.tmpl - имя файла с шаблоном;
  • /tmp/users.csv - имя файла, куда будет записан результат;
  • переменная period указывает на период в секундах, с которым будет формироваться результат.

Запустим модуль make_config с выводом результата на экран:

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