❗️Toto je původní verze internetového fóra ISPforum.cz do února 2020 bez možnosti registrace nových uživatelů. Aktivní verzi fóra naleznete na adrese https://telekomunikace.cz

SNMP vraci nulu

Návody a problémy s konfigurací.
Uživatelský avatar
LordLojza
Příspěvky: 21
Registrován: 18 years ago
Kontaktovat uživatele:

SNMP vraci nulu

Příspěvekod LordLojza » 18 years ago

Ahoj, mám v php napsany script ktery mi podle udaju v databazi (oid_in, oid_out) vytahuje z SNMP mikrotiku (PC x86) odeslana a přijata data. Vsechno mi paradne funguje, az na jednu maličkost, občas se stane ze vrati vsechny hodnoty nulove. Nenapada nekoho cim to muze byt ?

zjednoduseny zapis zde:

Kód: Vybrat vše

while ($zaznam = MySQL_Fetch_Array($vysledek))
   {
   $zakaznik = $zaznam["zakaznik"];
   $oid_sq = snmpget($hostitel,$komunita,$zaznam["oid_sq"]);
   $oid_up = snmpget($hostitel,$komunita,$zaznam["oid_down"]);
   $oid_down = snmpget($hostitel,$komunita,$zaznam["oid_up"]);
   $oid_up = ($oid_up/1000000);
   $oid_down = ($oid_down/1000000);
   $insert = "UPDATE users SET data_out=".$oid_up.",data_in=".$oid_down." WHERE zakaznik='".$zakaznik."'";
   mysql_query($insert);
   }
   echo $oid_down," s ",$oid_up ;
0 x

Uživatelský avatar
LordLojza
Příspěvky: 21
Registrován: 18 years ago
Kontaktovat uživatele:

Příspěvekod LordLojza » 18 years ago

tak sem to vyresil sam ...

Kód: Vybrat vše

while ($zaznam = MySQL_Fetch_Array($vysledek))
   {
   $zakaznik = $zaznam["zakaznik"];
   snmp_set_valueretrieval(1);
   $oid_sq = snmpget($hostitel,$komunita,$zaznam["oid_sq"]);
   $oid_up = snmpget($hostitel,$komunita,$zaznam["oid_down"]);
   $oid_down = snmpget($hostitel,$komunita,$zaznam["oid_up"]);
   snmp_set_valueretrieval(0);
   $oid_up = ($oid_up/1000000);
   $oid_down = ($oid_down/1000000);
   $insert = "UPDATE users SET data_out=".$oid_up.",data_in=".$oid_down." WHERE zakaznik='".$zakaznik."'";
   mysql_query($insert);
   }
   echo $oid_down," s ",$oid_up ;
0 x

andreas4all
Příspěvky: 411
Registrován: 18 years ago

Příspěvekod andreas4all » 18 years ago

a co takto pouzit k tomu IPaccountig, ktory je na to stvoreny a podstatne rychlejsi, ako ked sa mas na kazdu hodnotu zvlast pytat snmp...
0 x

Uživatelský avatar
LordLojza
Příspěvky: 21
Registrován: 18 years ago
Kontaktovat uživatele:

Příspěvekod LordLojza » 18 years ago

nemel by nekdo k dispozici nejakou dokumentaci jak presne IP accounting funguje ? ... dival sem se po nejakych funkcnich projektech ale nic mi nevyhovuje takze se pustim do něčeho sám ...
0 x

andreas4all
Příspěvky: 411
Registrován: 18 years ago

Příspěvekod andreas4all » 18 years ago

zber dat mam spraveny, nejake Iface si uz musis spravit sam. je to cisto iba collector, DB by si si mal vediet zrekonstrulovat sam, nechce sa mi tu vyhrabavat vsetko... ak nieco nebudes vediet, tak napis...

collector:

Kód: Vybrat vše

<?

include '/var/www/isl/configuration.php';
include '/var/www/isl/function/mysql_connect.php';

$query = "SELECT ip_router FROM isl_ipacc_conf";
$result = mysql_query($query);

while ($row = mysql_fetch_array($result, MYSQL_BOTH)){
    $file = "http://".$row['ip_router']."/accounting/ip.cgi";
$ip_router = $row['ip_router'];

$file = file($file);

//mysql_connect('localhost', 'root', 'rootroot') or die('err');
//mysql_select_db('isl-andrej') or die('err2');

foreach ($file as $line_num => $line) {
    $str_pos = strpos($line, ' ');
    $src_ip = substr($line, 0, $str_pos);
    $str_pos++;
    $line2 = substr($line, $str_pos, 30);
   
    $str_pos2 = strpos($line2, ' ');
    $dst_ip = substr($line2, 0, $str_pos2);
    $str_pos2++;
    $line3 = substr($line2, $str_pos2, 30);
   
    $str_pos3 = strpos($line3, ' ');
    $data = substr($line3, 0, $str_pos3);
    $str_pos3++;
    $line4 = substr($line3, $str_pos3, 30);
   
    $str_pos4 = strpos($line4, ' ');
    $packet = substr($line4, 0, $str_pos4);
   
    $src = '0';
    $dst = '0';

$year = date(Y);
$month = date(m);
$day = date(d);
$hour = date(H);
$min = date(i);

$q_log = "INSERT INTO isl_ip_log VALUES ('', '$year', '$month', '$day', '$hour', '$min', '$src_ip', '$dst_ip')";
$res_log = mysql_query($q_log);



   
    $all_ips = count($ips);
   
    for ($i=0; $i < $all_ips; $i++){
   $src_p = strpos($src_ip, $ips[$i]);
   $dst_p = strpos($dst_ip, $ips[$i]);
   
       if (strlen($src_p) == '1'){$src=1;}
       if (strlen($dst_p) == '1'){$dst=1;}
   }
   

    if ($src == '1' && $src != $dst){   
        $query = "SELECT id, up, up_packet, ip FROM isl_ipacc_short WHERE ip='$src_ip' AND ip_router='$ip_router'";
       $result = mysql_query($query);
      while ($row = mysql_fetch_array($result, MYSQL_BOTH)){
          $id = $row['id'];
          $up = $row['up'];
          $up_packet = $row['up_packet'];
          $ip_db = $row['ip'];
                            }                  
      
      if ($id >= '1' && $src_ip == $ip_db) {
          $data = $data + $up;
          $packet = $packet + $up_packet;
          $query2 = "UPDATE isl_ipacc_short SET up='$data', up_packet='$packet' WHERE id='$id' AND ip_router='$ip_router'";
          mysql_query($query2);
          $data = NULL;
          $packet = NULL;
            }
      
      else {
          $query3 = "INSERT INTO isl_ipacc_short VALUES ('', '$ip_router', '$src_ip', '', '$data', '', '$packet')";
          mysql_query($query3);
          $data = NULL;
          $packet = NULL;
            }
          }
         
    if ($dst == '1' && $src != $dst){
       $query = "SELECT id, down, down_packet, ip FROM isl_ipacc_short WHERE ip='$dst_ip' AND ip_router='$ip_router'";
       $result = mysql_query($query);
      while ($row = mysql_fetch_array($result, MYSQL_BOTH)){
          $id = $row['id'];
          $down = $row['down'];
          $down_packet = $row['down_packet'];
          $ip_db = $row['ip'];
                            }
                           
      if ($id >= '1' && $dst_ip == $ip_db) {
          $data = $data + $down;
          $packet = $packet + $down_packet;
          $query2 = "UPDATE isl_ipacc_short SET down='$data', down_packet='$packet' WHERE id='$id' AND ip_router='$ip_router'";
          mysql_query($query2);
          $data = NULL;
          $packet = NULL;      
            }
            
      else {
          $query3 = "INSERT INTO isl_ipacc_short VALUES ('', '$ip_router', '$dst_ip', '$data', '', '$packet', '')";
          mysql_query($query3);
          $data = NULL;
          $packet = NULL;
            }
       }
}
}
mysql_close();
?>


a potom raz za den, ukladanie podla datumu

Kód: Vybrat vše

<?

include '/var/www/isl/configuration.php';
include '/var/www/isl/function/mysql_connect.php';

$query = "SELECT * FROM isl_ipacc_short";
$result = mysql_query($query);

while ($row = mysql_fetch_array($result, MYSQL_BOTH)){
    $year = date(Y);
    $month = date(m);
    $week = date(W);
    $day = date(z);
    $down = $row['down'];
    $up = $row['up'];
    $down_packet = $row['down_packet'];
    $up_packet = $row['up_packet'];
    $ip_router = $row['ip_router'];
    $ip = $row['ip'];
   

    $query2 = "INSERT INTO isl_ipacc_full VALUES ('', '$year', '$month', '$week', '$day', '$ip_router', '$ip', '$down', '$up', '$down_packet', '$up_packet')";
    $result2 = mysql_query($query2);

    $query3 = "TRUNCATE TABLE isl_ipacc_short";
    $result3 = mysql_query($query3);
}

?>


zberac funguje tak, ze zapisuje do dvoch DB. jedna je cisto IPacc a druha je na logovanie trafficu (zakony v SR to vyzaduju, odpocuvanie a pod.), takze aspon taky zaklad, aby sme sa mohli niecim poohanat.
0 x

Uživatelský avatar
LordLojza
Příspěvky: 21
Registrován: 18 years ago
Kontaktovat uživatele:

Příspěvekod LordLojza » 18 years ago

Ahoj, moc ti děkuju za pomoc, jakmile se k tomu dostanu, zkusim to a dam vedet ...
0 x

Nick_xx
Příspěvky: 123
Registrován: 18 years ago

Příspěvekod Nick_xx » 18 years ago

andreas4all píše:zber dat mam spraveny, nejake Iface si uz musis spravit sam. je to cisto iba collector, DB by si si mal vediet zrekonstrulovat sam, nechce sa mi tu vyhrabavat vsetko... ak nieco nebudes vediet, tak napis...


zberac funguje tak, ze zapisuje do dvoch DB. jedna je cisto IPacc a druha je na logovanie trafficu (zakony v SR to vyzaduju, odpocuvanie a pod.), takze aspon taky zaklad, aby sme sa mohli niecim poohanat.

Mel bych dva dotazy ke skriptum. Jak casto se spousti collector? Jednou za minutu? Neni chyba v druhem skriptu? Selectem se vytahnou vsechna data z tabulky, po zpracovani prvniho radku se tato tabulka vycisti. Nemelo by byt TRUNCATE TABLE isl_ipacc_short za zavorkou ukoncujici cyklus?

PS: Nebyla by struktura tabulek v databazi? :oops: :wink:
0 x

Nick_xx
Příspěvky: 123
Registrován: 18 years ago

Příspěvekod Nick_xx » 18 years ago

Svuj predchozi prispevek dementuji. Zde uvedenymi skripty jsem se inspiroval, ale udelal jsem je vyrazne jednodussi (druhy skript je zbytecny). Kdyby mel nekdo zajem, mohu to sem vylepit.
0 x

Uživatelský avatar
LordLojza
Příspěvky: 21
Registrován: 18 years ago
Kontaktovat uživatele:

Příspěvekod LordLojza » 18 years ago

Jasny, samozřejmě je potřeba si scripty upravit dle potřeby. Laskavost andreas4all byla ze me jen navedl na spravnou cestu, ja sem vpodstate prekopal celou strukturu a udelal to jinak. Vylepit sem scripty muzes, je spousta nadsencu, kteri kody uvitaji ...
0 x

Nick_xx
Příspěvky: 123
Registrován: 18 years ago

Příspěvekod Nick_xx » 18 years ago

LordLojza píše:Jasny, samozřejmě je potřeba si scripty upravit dle potřeby. Laskavost andreas4all byla ze me jen navedl na spravnou cestu, ja sem vpodstate prekopal celou strukturu a udelal to jinak. Vylepit sem scripty muzes, je spousta nadsencu, kteri kody uvitaji ...

Dneska jsem si s tim opet hral a trochu jsem skripty zeslozitil :oops: Kazdopadne mi ale chybi prezentacni vrstva pro namerena data - na zaklade logu chci udelat graf za posledni dve hodiny. Kdysi jsem si na to zvykl u BrazilFW a RouterOS to nema - grafy jsou prilis hrube.

Pokud jsi vytvoril neco sam, take bych se rad podival, jak jsi to nakonec pojal.

Na zaver bych se chtel jeste zeptat, zda existuje nejake nastaveni poctu radek v accounting/ip.cgi? Maximum mam 256, vic se nedostanu :-(

PS: V nedeli snad bud mit trosku casu, tak sem ty skripty vylepim i s popisky. Snad to nekomu pomuze ;-)
0 x

andreas4all
Příspěvky: 411
Registrován: 18 years ago

Příspěvekod andreas4all » 18 years ago

script som sem daval na rychlo.

struktura db_short:
id, ip_router, ip_user, down, up, down_packet, up_packet

db_full:
id, year, month, week, day, ip_router, ip_user, down, up, down_packet, up_packet

obmedzenie na ip.cgi existuje, da sa to nastavit priamo v MT.
0 x

Nick_xx
Příspěvky: 123
Registrován: 18 years ago

Příspěvekod Nick_xx » 17 years ago

andreas4all píše:obmedzenie na ip.cgi existuje, da sa to nastavit priamo v MT.
Zvlastni, drive jsem to nemohl najit, ted jsem kouknul do WinBoxu a na prvni pokus nasel a nastavil. Asi to chce obcas zapnout mozek :oops:

andreas4all píše:... logovanie trafficu (zakony v SR to vyzaduju, odpocuvanie a pod.)
Za jake obdobi musis uchovavat log aktivity uzivatelu? Po tydnu logovani to je cca 300 MB dat, takze je do datove docela narocne :?
0 x

Nick_xx
Příspěvky: 123
Registrován: 18 years ago

Příspěvekod Nick_xx » 17 years ago

Před nějakým časem jsem slíbil vlastni skript pro uložení informací o stažených datech jednotlivých userů. Skript je jen jeden, spouštím ho přes .bat soubor ve Win - jakási náhrada cronu.

SQL pro vytvoření tabulek:

Kód: Vybrat vše

--
-- Struktura tabulky `ip_acc`
--

CREATE TABLE `ip_acc` (
  `id` int(8) unsigned NOT NULL auto_increment,
  `ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `date` date NOT NULL,
  `up` bigint(20) unsigned NOT NULL,
  `up_packet` int(11) unsigned NOT NULL,
  `down` bigint(20) unsigned NOT NULL,
  `down_packet` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

-- --------------------------------------------------------

--
-- Struktura tabulky `ip_log`
--

CREATE TABLE `ip_log` (
  `id` int(9) NOT NULL auto_increment,
  `src_ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `dst_ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `date` datetime NOT NULL,
  `data` int(6) NOT NULL,
  `packet` int(6) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

-- --------------------------------------------------------

--
-- Struktura tabulky `uzivatele` (osekal jsem nepodstatne sloupce, kazdy si doplni informace, ktere potrebuje)
--

CREATE TABLE `uzivatele` (
  `id` int(11) NOT NULL auto_increment,
  `ip` varchar(16) collate cp1250_czech_cs NOT NULL default '',
  `jmeno` varchar(64) collate cp1250_czech_cs NOT NULL default '',
  `dtLast` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;


"CRON" je velmi primitivní:

Kód: Vybrat vše

:cyklus

@ECHO OFF

CALL php.exe c:/Home/netmon/collector.php

ping -n 1 -w 750 192.168.1.254 > nul

GOTO cyklus


A nakonec samotný skript pro zpracování dat z RB. Snažil jsem se okomentovat důležité části.

Kód: Vybrat vše

<?
// pripojeni k databazi
require_once("conn.php");

// nacteni relace
$session = file("session.tmp");

$time = trim($session[0]);
$interval = trim($session[1]);
$rozdil = time() - $time;
if($rozdil < $interval) {
  exit;
}

// vytazeni IP adres vsech uzivatelu site
$sql = mysql_query("select ip from uzivatele");
while($ip = mysql_fetch_row($sql)) {
  $ips[] = $ip[0];
}

list($max_id) = mysql_fetch_row(mysql_query("select max(id) from ip_log"));

// nacteni informaci z RB
$ip_router = "192.168.1.1";
$filename = "http://".$ip_router."/accounting/ip.cgi";
$file = file($filename);

// zpracovani
foreach ($file as $line_num => $line) {
  list($src_ip, $dst_ip, $data, $packet) = explode(" ", $line);

  $q_log = "INSERT INTO ip_log (src_ip, dst_ip, date, data, packet) VALUES ('$src_ip', '$dst_ip', NOW(), '$data', '$packet')";
  $res_log = mysql_query($q_log);

  if($src_ip != $dst_ip) {
    if(in_array($src_ip, $ips)) $src = true;
    else $src = false;

    if(in_array($dst_ip, $ips)) $dst = true;
    else $dst = false;

    if ($src == true){
      $query = "SELECT id, up, up_packet FROM ip_acc WHERE ip = '$src_ip' and date = CURDATE() limit 1";
      $result = mysql_query($query);
      if($row = mysql_fetch_array($result)) {
        $id = $row['id'];
        $up = $data + $row['up'];
        $up_packet = $packet + $row['up_packet'];

        $query2 = "UPDATE ip_acc SET up = '$up', up_packet = '$up_packet' WHERE id = '$id' limit 1";
      }
      else {
        $query2 = "INSERT INTO ip_acc (ip, up, up_packet, date) VALUES ('$src_ip', '$data', '$packet', CURDATE())";
      }
      mysql_query($query2);
    }

    if ($dst == true){
      $query = "SELECT id, down, down_packet FROM ip_acc WHERE ip = '$dst_ip' and date = CURDATE() limit 1";
      $result = mysql_query($query);
      if($row = mysql_fetch_array($result)) {
        $id = $row['id'];
        $down = $data + $row['down'];
        $down_packet = $packet + $row['down_packet'];

        $query2 = "UPDATE ip_acc SET down = '$down', down_packet = '$down_packet' WHERE id = '$id' limit 1";
      }
      else {
        $query2 = "INSERT INTO ip_acc (ip, down, down_packet, date) VALUES ('$dst_ip', '$data', '$packet', CURDATE())";
      }
      mysql_query($query2);
    }
    unset($data, $packet);
  }
}

// zaktualizujeme cas posledni aktivity uzivatele (pro zobrazeni uzivatelu, kteri jsou prave online)
$sql = mysql_query("select src_ip, dst_ip, date from ip_log where id > '$max_id' order by id desc");
while($radek = mysql_fetch_assoc($sql)) {
  if(in_array($radek["src_ip"], $ips) or in_array($radek["dst_ip"], $ips)) {
    foreach($ips as $key => $value) {
      if($value == $radek["src_ip"] or $value == $radek["dst_ip"]) {
        mysql_query("update uzivatele set dtLast = '$radek[date]' where ip = '$value' limit 1");
        unset($ips[$key]);
        break;
      }
    }
  }
}

$pocet = sizeof($file);

// vypocteni intervalu pro dalsi stazeni dat z RB
if($interval <= 15) {
  if($pocet < 50) $interval+=2;
  elseif($pocet < 100) $interval++;
}
if($pocet > 250) {
  if($interval > 5) $interval=5;
  else $interval-=2;
}
elseif($pocet > 200) {
  if($interval > 10) $interval=8;
  else $interval-=3;
}
elseif($pocet > 150) {
  if($interval > 10) $interval-=6;
  elseif($interval > 7) $interval-=3;
  else $interval--;
}

// ulozeni relace
file_put_contents("session.tmp", time()."\n".$interval);

mysql_close();
?>


S daty v tabulkách se pak již dá celkem solidně pracovat - generovat statistiky jednotlivých uživatelů podle dnů/týdnů..., generovat seznam právě připojených klientů, pro fajnšmekry jde zobrazovat datové toky v síti. Ve fantazii se meze nekladou ;-)
0 x

modrus
Příspěvky: 1
Registrován: 17 years ago

Příspěvekod modrus » 17 years ago

Nick_xx píše:Před nějakým časem jsem slíbil vlastni skript pro uložení informací o stažených datech jednotlivých userů. Skript je jen jeden, spouštím ho přes .bat soubor ve Win - jakási náhrada cronu.

SQL pro vytvoření tabulek:

Kód: Vybrat vše

--
-- Struktura tabulky `ip_acc`
--

CREATE TABLE `ip_acc` (
  `id` int(8) unsigned NOT NULL auto_increment,
  `ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `date` date NOT NULL,
  `up` bigint(20) unsigned NOT NULL,
  `up_packet` int(11) unsigned NOT NULL,
  `down` bigint(20) unsigned NOT NULL,
  `down_packet` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

-- --------------------------------------------------------

--
-- Struktura tabulky `ip_log`
--

CREATE TABLE `ip_log` (
  `id` int(9) NOT NULL auto_increment,
  `src_ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `dst_ip` varchar(15) collate cp1250_czech_cs NOT NULL,
  `date` datetime NOT NULL,
  `data` int(6) NOT NULL,
  `packet` int(6) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

-- --------------------------------------------------------

--
-- Struktura tabulky `uzivatele` (osekal jsem nepodstatne sloupce, kazdy si doplni informace, ktere potrebuje)
--

CREATE TABLE `uzivatele` (
  `id` int(11) NOT NULL auto_increment,
  `ip` varchar(16) collate cp1250_czech_cs NOT NULL default '',
  `jmeno` varchar(64) collate cp1250_czech_cs NOT NULL default '',
  `dtLast` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;


"CRON" je velmi primitivní:

Kód: Vybrat vše

:cyklus

@ECHO OFF

CALL php.exe c:/Home/netmon/collector.php

ping -n 1 -w 750 192.168.1.254 > nul

GOTO cyklus


A nakonec samotný skript pro zpracování dat z RB. Snažil jsem se okomentovat důležité části.

Kód: Vybrat vše

<?
// pripojeni k databazi
require_once("conn.php");

// nacteni relace
$session = file("session.tmp");

$time = trim($session[0]);
$interval = trim($session[1]);
$rozdil = time() - $time;
if($rozdil < $interval) {
  exit;
}

// vytazeni IP adres vsech uzivatelu site
$sql = mysql_query("select ip from uzivatele");
while($ip = mysql_fetch_row($sql)) {
  $ips[] = $ip[0];
}

list($max_id) = mysql_fetch_row(mysql_query("select max(id) from ip_log"));

// nacteni informaci z RB
$ip_router = "192.168.1.1";
$filename = "http://".$ip_router."/accounting/ip.cgi";
$file = file($filename);

// zpracovani
foreach ($file as $line_num => $line) {
  list($src_ip, $dst_ip, $data, $packet) = explode(" ", $line);

  $q_log = "INSERT INTO ip_log (src_ip, dst_ip, date, data, packet) VALUES ('$src_ip', '$dst_ip', NOW(), '$data', '$packet')";
  $res_log = mysql_query($q_log);

  if($src_ip != $dst_ip) {
    if(in_array($src_ip, $ips)) $src = true;
    else $src = false;

    if(in_array($dst_ip, $ips)) $dst = true;
    else $dst = false;

    if ($src == true){
      $query = "SELECT id, up, up_packet FROM ip_acc WHERE ip = '$src_ip' and date = CURDATE() limit 1";
      $result = mysql_query($query);
      if($row = mysql_fetch_array($result)) {
        $id = $row['id'];
        $up = $data + $row['up'];
        $up_packet = $packet + $row['up_packet'];

        $query2 = "UPDATE ip_acc SET up = '$up', up_packet = '$up_packet' WHERE id = '$id' limit 1";
      }
      else {
        $query2 = "INSERT INTO ip_acc (ip, up, up_packet, date) VALUES ('$src_ip', '$data', '$packet', CURDATE())";
      }
      mysql_query($query2);
    }

    if ($dst == true){
      $query = "SELECT id, down, down_packet FROM ip_acc WHERE ip = '$dst_ip' and date = CURDATE() limit 1";
      $result = mysql_query($query);
      if($row = mysql_fetch_array($result)) {
        $id = $row['id'];
        $down = $data + $row['down'];
        $down_packet = $packet + $row['down_packet'];

        $query2 = "UPDATE ip_acc SET down = '$down', down_packet = '$down_packet' WHERE id = '$id' limit 1";
      }
      else {
        $query2 = "INSERT INTO ip_acc (ip, down, down_packet, date) VALUES ('$dst_ip', '$data', '$packet', CURDATE())";
      }
      mysql_query($query2);
    }
    unset($data, $packet);
  }
}

// zaktualizujeme cas posledni aktivity uzivatele (pro zobrazeni uzivatelu, kteri jsou prave online)
$sql = mysql_query("select src_ip, dst_ip, date from ip_log where id > '$max_id' order by id desc");
while($radek = mysql_fetch_assoc($sql)) {
  if(in_array($radek["src_ip"], $ips) or in_array($radek["dst_ip"], $ips)) {
    foreach($ips as $key => $value) {
      if($value == $radek["src_ip"] or $value == $radek["dst_ip"]) {
        mysql_query("update uzivatele set dtLast = '$radek[date]' where ip = '$value' limit 1");
        unset($ips[$key]);
        break;
      }
    }
  }
}

$pocet = sizeof($file);

// vypocteni intervalu pro dalsi stazeni dat z RB
if($interval <= 15) {
  if($pocet < 50) $interval+=2;
  elseif($pocet < 100) $interval++;
}
if($pocet > 250) {
  if($interval > 5) $interval=5;
  else $interval-=2;
}
elseif($pocet > 200) {
  if($interval > 10) $interval=8;
  else $interval-=3;
}
elseif($pocet > 150) {
  if($interval > 10) $interval-=6;
  elseif($interval > 7) $interval-=3;
  else $interval--;
}

// ulozeni relace
file_put_contents("session.tmp", time()."\n".$interval);

mysql_close();
?>


S daty v tabulkách se pak již dá celkem solidně pracovat - generovat statistiky jednotlivých uživatelů podle dnů/týdnů..., generovat seznam právě připojených klientů, pro fajnšmekry jde zobrazovat datové toky v síti. Ve fantazii se meze nekladou ;-)


Dobrý den,

nesetkali jste se při tomto skriptu s problémovou hláškou Warning: file(http://IP_adresa/accounting/ip.cgi) [function.file]: failed to open stream: Connection refused in /var/www/....../traffic.php on line 83
Prosím poradte čím by to mohlo být.
allow_url_fopen mam povolene
0 x