Правка PHP скрипта, в роутере Asus, за вознаграждение?

Хабравчане, нахожусь в отчаянном состоянии, нужна как можно более быстрая помощь и нигде как тут быстро не помогут.

Ситуация вот в чем:
Есть роутер RT-N16 с прошивкой энтузиастов, на нем крутится скрипт который считает трафик юзеров. Ссылка на описание скрипта goo.gl/be2bE

С недавнего времени понадобилось ограничивать лимитом пользователей. Для этого в скрипте есть дополнительный функционал в виде php скрипта который проверяет нарушение юзерами лимитом и отключает их.
(как человек не разбирающийся ВООБЩЕ в PHP и почти не разбирающийся в линуксе подробнее не могу описать)
Проблема в том что скрипт работает на месячные лимиты, а мне нужно тоже самое, но только дневной лимит…

Кто сможет помочь готов заплатить n-ную сумму на Qiwi или WM кошелек.
Контакт скайп lfatal1ty

Пожалуйста помогите!
  • Вопрос задан
  • 3001 просмотр
Решения вопроса 1
lFaTaL1Ty
@lFaTaL1Ty Автор вопроса
Итак решение было найдено и работа оплачена, к сожалению человек даже не хабравчанин (все таки поразительно какое огромное сообщество может помочь учитывая что многие просто читают, а не только пишут.)

От автора
Изменения для того, что бы выключать пользователей по дневному лимиту:

В файле «FileExtractor.php» создадим дополнительную функцию «getUserTrafByThisDay» (чтобы особо не вдаваться, за основу возьмём уже готовую функцию «getUserTrafByDay» немного изменив её), получится:

FileExtractor.php
public function getUserTrafByThisDay(&$totalDay, &$totalIP) {
        $thisdate = date('Y-m-d');
        $handle1 = fopen($this->world.$thisdate, "r");
        $handle2 = fopen($this->city.$thisdate, "r");
        $sum['win'] = '0';
        $sum['wout'] = '0';
        $sum['cin'] = '0';
        $sum['cout'] = '0';
        while ($userinfo = fscanf($handle1, "%s\t%s\t%s\n")) {
             $userByIp[$userinfo[0]]['win'] = $userinfo[1];
              $userByIp[$userinfo[0]]['wout'] = $userinfo[2];
              $sum['win'] = bcadd($sum['win'], $userinfo[1]);
              $sum['wout'] = bcadd($sum['wout'], $userinfo[2]);
               if (isset($totalIP[$userinfo[0]])) {
                   $totalIP[$userinfo[0]]['win'] = bcadd($totalIP[$userinfo[0]]['win'], $userinfo[1]);
                   $totalIP[$userinfo[0]]['wout'] = bcadd($totalIP[$userinfo[0]]['wout'], $userinfo[2]);
               }
	   else {
                   $totalIP[$userinfo[0]]['win'] = $userinfo[1];
                   $totalIP[$userinfo[0]]['wout'] = $userinfo[2];
                   $totalIP[$userinfo[0]]['cin'] = '0';
                   $totalIP[$userinfo[0]]['cout'] = '0';
              }
        }
        while ($userinfo = fscanf($handle2, "%s\t%s\t%s\n")) {
             $userByIp[$userinfo[0]]['cin'] = $userinfo[1];
             $userByIp[$userinfo[0]]['cout'] = $userinfo[2];                    
             $sum['cin'] = bcadd($sum['cin'], $userinfo[1]);
             $sum['cout'] = bcadd($sum['cout'], $userinfo[2]);
              if (isset($totalIP[$userinfo[0]])) {
                  $totalIP[$userinfo[0]]['cin'] = bcadd($totalIP[$userinfo[0]]['cin'], $userinfo[1]);
                  $totalIP[$userinfo[0]]['cout'] = bcadd($totalIP[$userinfo[0]]['cout'], $userinfo[2]);
              }
              else {
                   $totalIP[$userinfo[0]]['cin'] = $userinfo[1];
                   $totalIP[$userinfo[0]]['cout'] = $userinfo[2];
              }
        }
        fclose($handle1);
        fclose($handle2);
        $trafByDay[$thisdate] = $userByIp;
        $totalDay[$thisdate] = $sum;
        unset ($userByIp);
        unset ($sum);
        return $trafByDay;
    }



Убрали сканирование файлов в директории, теперь считываем файл с именем в виде текущей даты.

Соответственно в скрипте, который устанавливает лимит «limit.php» меняем название функции, строка 31:

$trafByDay = $fe->getUserTrafByDay($totalDay, $totalIP);

на

$trafByDay = $fe->getUserTrafByThisDay($totalDay, $totalIP);


Если кому нибудь из пользователей не жалко поделитесь инвайтом с человеком.
У меня к сожалению такой возможности нет, а человек толковый. Его почта rvk@polly.com.ua
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
lFaTaL1Ty
@lFaTaL1Ty Автор вопроса
Сам скрипт
<?php class Limit { private $limitFile = "billing/limit"; private $users = "/usr/local/etc/ethers"; private $userMAC; private $userLimit; private function getLimit() { $handle = fopen($this->limitFile, "r"); while ($userinfo = fscanf($handle, "%s\t%s\t%s\t%s\n")) { $this->userLimit[$userinfo[0]]['in'] = $userinfo[1]; $this->userLimit[$userinfo[0]]['out'] = $userinfo[2]; $this->userLimit[$userinfo[0]]['total'] = $userinfo[3]; } fclose($handle); } private function getUserMAC() { $handle = fopen($this->users, "r"); while ($userinfo = fscanf($handle, "%s\t%s\n")) { $this->userMAC[$userinfo[1]] = $userinfo[0]; } fclose($handle); } public function disableUsers() { $this->getLimit(); $this->getUserMAC(); include_once("FileExtractor.php"); $fe = new FileExtractor(); $trafByDay = $fe->getUserTrafByDay($totalDay, $totalIP); foreach ($this->userLimit as $ip => $limit) { if (isset ($this->userMAC[$ip]) && isset ($totalIP[$ip]) && ( bccomp(bcdiv($totalIP[$ip]['win'], '1048576'), $limit['in']) == 1 || bccomp(bcdiv($totalIP[$ip]['wout'], '1048576'), $limit['out']) == 1 || bccomp(bcdiv(bcadd($totalIP[$ip]['win'], $totalIP[$ip]['wout']), '1048576'), $limit['total']) == 1 ) ){ shell_exec('iptables -D MAC_IP -s '.$ip.' -m mac --mac-source '.$this->userMAC[$ip].' -j RETURN'); } } } } $limit = new Limit(); $limit->disableUsers(); ?>
Ответ написан
Комментировать
difiso
@difiso
В параллельной вселенной я космонавт
Сам скрипт менять не надо. Достаточно поменять время сброса блокировки. Читайте статью до места
Все лимиты задаются целыми числами.
пользователю дано 1750МБ входящего, 275МБ исходящего трафик и 2010МБ суммарного трафика (входящий+исходящий). При достижении пользователем хотя бы одного из ограничений он будет отключен.
В этот файл можно не вписывать всех пользователей, если мы не хотим задавать для них лимит.

+ Необходимо настроить кроны:
В кронтаб добавить:

*/5 * * * * root cd /opt/share/www/statistic/ &&  /opt/bin/php ./limit.php > /dev/null 2>&1
1 0 1 * * root /user/local/sbin/makefilter


Необходимо поменять строку

1 0 1 * * root /user/local/sbin/makefilter


на ( для сброса в полночь)

0 0 * * * root /user/local/sbin/makefilter
Ответ написан
Dolios
@Dolios
Дайте скрипт в читаемом виде. Тегом «source» отформатированный исходник оберните. Разбираться в каше буковок лень
Ответ написан
difiso
@difiso
В параллельной вселенной я космонавт
Судя по скриптам, снятие снятие блокировки происходит удалением файлов биллинга, поэтому попробуйте

в коде файла billing.php измените строки

$yesterday = date("Y-m", time()-300);
if (date("Y-m") != $yesterday) {

на строки

$yesterday = date("Y-m-d", time()-300);
if (date("Y-m-d") != $yesterday) {

Обосную. В этом if выполняется удаление файлов с данными о использованном трафике. При их отсутствии должна сниматься блокировка. В данный блок можно попасть если только 5 минут назад было не тот же месяц и год, что сейчас (наступил следующий месяц). Поэтому для снятия блокировки ежедневно, необходимо проверять еще день. То есть "Y-m" надо заменить на "Y-m-d", что позволит выполнять удаление файлов каждый день. Ну и мой предыдущий ответ про cron тоже надо учесть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы