Выполнение скрипта после перезапуска фил
-
Доброго времени суток!
Собственно есть perl-скрипт, который динамически формирует aliasы (или таблицы) пакетного фильра на основе данных, хранящихся в DB. т.е. этот скрипт считывает данные из DB и заносит их в таблицы pf c определенной переодичностью. Проблема в том, что после добавления нового правила или применения конфигурации фильтра, эти таблицы очищаются.
Нужно сделать так, чтобы после применения правил пакетного фильтра автоматически стартовал данный скрипт. -
Ну что мне на ум приходит - добавить какой нибудь ключевой алиас в БД, а из крона раз в 1-2 минуты проверять скриптом наличие этого алиаса в таблице. При отсутствии - запускать скрипт апдейта.
-
Да я об этом тоже думал, но 1-2 минуты это довольно много, да и безсмысленных итераций…
Самый хороший вариант, нажал кнопку "Apply Changes", веб-конфигуратор перечитал файл настроек, обновил фильтр с помощью pfctl, выполнил скрипт.
Как вариант можно в php-файлик добавить пару строк вида $aus=shell_exec("cd /blablabla; ./123.pl");. Только вот в какой? )
С pfsense познакомился дня 2 назад, понял принцип его работы, что откуда читает, куда записывает, подправил .inc файлики под свои нужды, но видимо не доконца )
Как вариант можно подменить файлик pfctl своим скриптом, который анализировал переданные аргументы, и если это релоад конфига, то выполнить его, а затем скрипт, но это слишком грубый метод.Так что вот думаю как поступить, или обойтись малой кровью, сделать через крон, или разбираться в коде )
-
Решил пойти другим путем, и опять грабли… )
Через веб-конфигуратор создал алиас auth_users, с двумя адресами 10.0.1.1 и 10.0.1.2. Т.е. в файле /tmp/rules.debug (pf.conf в pfsense), появился новый список auth_users = {10.0.1.1, 10.0.1.2}. Далее в /etc/inc/filter.inc добавил пару строк:if ($alias['name'] == "auth_users") {
$aliases .= "table <auth_users>persist file "/usr/local/scripts/auth_users" \n";
} else {
$aliases .= "{$alias['name']} = "{ {$alias['address']}Далее мой скрипт сгенерил /usr/local/scripts/auth_users
Обновил правила фильтра, в файлике /tmp/rules.debug появилась строка типа table <auth_users>persist file "/usr/local/scripts/auth_users".
Проверяю: pfctl -t auth_users -T show
10.0.1.1
10.0.1.2
т.е. всего 2 ip, хотя в /usr/local/scripts/auth_users их 200 )Где ошибка? Не понимаю…</auth_users></auth_users>
-
Ну можно напрямую писать в конфиг /cf/config.xml алиас и потом вызывать функцию генерации правил.
-
Ну не удачное решение на самом деле, если учесть что алиас может меняться и один раз за час, а может и несколько раз на минуте. При таком разкладе, если учесть что генерация правил не тривиальная задача для системы, я боюсь предположить что получится.
Да и смысл? Как я понимаю filter.inc - скрипт, который парсит /cf/config.xml. -
Решил, кстати, проблему )
В filter.inc, сразу после функции загрузки вставил строку:
$rms = shell_exec("cd /usr/local/scripts; ./aus_reload.pl");
И все ок.
Хотя в этом filter.inc, сразу после релоада правил идут строки:/* run items scheduled for after filter configure run */
$fda = fopen("/tmp/commands.txt", "w");
foreach($after_filter_configure_run as $afcr)
fwrite($fda, $afcr . "\n");
fclose($fda);
if(file_exists("/tmp/commands.txt")) {
mwexec("sh /tmp/commands.txt &");
unlink("/tmp/commands.txt");
}т.е. можно закомментировать unlink("/tmp/commands.txt"); и в /tmp/commands.txt добавить нужные команды.
Может кому пригодится )