Перейти до змісту

php + ipfw :) трабла


mix_forever

Рекомендовані повідомлення

Опшем ситуація наступна:
Є FreeBSD 10.1 + Apache + PHP + MySql.

Всьо паше супер, нарыкань нема. Реалізував я на цій машинці простенький Хотспот на ipfw

Людина конектиться до ві-фі, її дефолтом кидає на сторінку з кнопкою - "Отримати 30хв інтернета", після натискання на яку в таблицю ipfw добавляються правила на цей хост + в базу заноситься номер цих правил і таймкод початку юзанія інета. Інтет з"являється, людина щаслива.

Далі в кронтабі прописано шоб кожну хвилину виконувався php скрипт, який перевіряє базу на предмет того чи якийсь з отих таймкодів не перевизив ліміт в 30хв. Всьо логічно. При перевищенні запускається скрипт, який по ідеї мав би видаляти запис з бази і видаляти правила на хост, який вичерпав ліміт.

Трабл в тому, шо запис з бази видаляється, а вот з таблиці ipfw - НЄ.

Приклад скрипта осьо:

<?php

require_once('config.php');

//“ут из базы выбираютс¤ те пользователи, у которых привышен лимит по времени, и эти пользователи отключаютс¤ от интернета путем удалени¤ их правил из файрвола.

$sql = 'SELECT * FROM hotspot WHERE time_begin > 0 AND (TIME_TO_SEC(TIMEDIFF(NOW(), time_begin)) > '.CLIENTS_TIME.')';

$res = mysql_query($sql);
if ($res)
{
    while ($user = mysql_fetch_assoc($res))
        {
			$command = sprintf(RULE_DEL_IP, $user['rule_num']);
			exec($command);
			$command2 = sprintf(RULE_DEL_IP2, $user['rule_num']+100);
			exec($command2);
			$sql = 'DELETE FROM hotspot WHERE rule_num='.$user['rule_num'];
        mysql_query($sql);
        }
}


?>

RULE_DEL_IP задефайняно в config.php і виглядає так:

define('RULE_DEL_IP', '/usr/local/bin/sudo /sbin/ipfw delete %s');
define('RULE_DEL_IP2', '/usr/local/bin/sudo /sbin/ipfw delete %s');

Всьо логічно...

Но ніхера не работає... Другий день мозг ломаю...

Главне шо конструкція типу 

$command = sprintf(RULE_ADD_IP, $rule_num, $user_ip);

exec($command);

Де 

define('RULE_ADD_IP', '/usr/local/bin/sudo /sbin/ipfw add %s allow ip from any to %s via ed0');
define('RULE_ADD_IP2', '/usr/local/bin/sudo /sbin/ipfw add %s allow ip from %s to any via ed0');

Прєлєстно работає.

 

І да, в логах ошибок нема. Вопше. я вже даже варни на максимум виставив і нічого.

 

З.І. До правил прошу не домахуватись. То тіко тестова конструкція, для наглядності. В реалі потім буде всьо завернуто в таблиці з індивідуальними правилами для кожного хоста і пайпами для нарізки швидкості. Мені головне шоб воно тіко заработало )

З.І.І. Я не php прогер, пасєму конструкція можу бути і карявою, но то таке, мені главне шоб воно пахало

 

Вопшем глобальний вапрос - чого не удаляє правила з ipfw?)

Посилання на коментар
Поділитись на інші сайти

  • Адміністратори
/usr/local/etc/sudoers

шо там пише?

Посилання на коментар
Поділитись на інші сайти

www ALL=NOPASSWD:/etc/rc.d/ipfw, /sbin/ipfw

 
Посилання на коментар
Поділитись на інші сайти

НЕ удаляє... Варни пише, но не пише чого... 15 і 18 стрічки то якраз вивід варнів... Вот а фак?

ipfw2.jpg

ipfw.jpg

Посилання на коментар
Поділитись на інші сайти

І ше одна фігня дивна. В логи пише час на 3 години менший реального. по date видає вірний час і дату. вони по ntp синхроняться... Якого чорта в логах -3 години? ТАйм зон стоіть Кийов

Посилання на коментар
Поділитись на інші сайти

1800 то мій глюк, я не то в конфі прописав...

А 100 і 300 то всьо так і має бути. я ж правила потім вручну видаляю, вот вони і знов зі 100 починаються...

Опщем правила якраз ті... Чого не удаляє - неясно.

Посилання на коментар
Поділитись на інші сайти

коли з шела вручну виконую то само - паше. як із скрипта - нє...

Мля, вже сиджу видумую колстиль, який би замість бази створював автоматом скрипт з назвою - час додавання і автоматом в крон пхав би запис шоб через пів години його виконувало. В скрипт передати правила які мають видалитись в той момент і після них - команду ремува скріпта з крона ) ПОтім раз в годину будуть чиститись самі скрипти з т аймкодом більше півчаса...

Костиль знатний... Но вже реально хз як то всьо заставить пахать...

Посилання на коментар
Поділитись на інші сайти

В команду exec додай другий параметр, це буде змінна-масив, куди запишеться весь вивід команди (включаючи помилки). Після exec зроби print_r

 

Типу так:

<?php

$command = 'ls -la';
$output = array();

exec($command, $output);
print_r($output);

http://php.net/manual/en/function.exec.php

Посилання на коментар
Поділитись на інші сайти

Заархівовано

Ця тема знаходиться в архіві та закрита для подальших відповідей.



×
×
  • Створити...