Выполнение скрипта после перезапуска фил



  • Доброго времени суток!
    Собственно есть 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 добавить нужные команды.

    Может кому пригодится )


Locked