Strona 1 z 1

Problem ze zbieraniem danych RRDTOOL

: 2008-06-04, 14:47
autor: saurus
Od początku: slackware 12.1, zainstalowane rrdtool-1.2.27,iptables 1.4.0
Odpowiednie dane są zbierane za pomocą modułu account w /proc/net/ipt_account//net1 i net 2 i net 3 dla każdej z moich podsieci

skrypt który tworzy pliki z danymi : account_create

Kod: Zaznacz cały

#!/bin/bash

CONFIG_FILE=/etc/firewall/extra/account/config
source $CONFIG_FILE

create_database() {
    $RRDTOOL create $RRDDIR/$1 \
    DS:in:DERIVE:600:0:U \
    DS:out:DERIVE:600:0:U \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:6:700 \
    RRA:AVERAGE:0.5:24:775 \
    RRA:AVERAGE:0.5:288:797 \
    RRA:MAX:0.5:1:600 \
    RRA:MAX:0.5:6:700 \
    RRA:MAX:0.5:24:775 \
    RRA:MAX:0.5:288:797 \
    RRA:MIN:0.5:1:600 \
    RRA:MIN:0.5:6:700 \
    RRA:MIN:0.5:24:775 \
    RRA:MIN:0.5:288:797 \
    RRA:LAST:0.5:1:600 \
    RRA:LAST:0.5:6:700 \
    RRA:LAST:0.5:24:775 \
    RRA:LAST:0.5:288:797
}

u_int32_to_ip() {
    ip1=$((($1 >> 24) & 0xff))
    ip2=$((($1 >> 16) & 0xff))
    ip3=$((($1 >> 8) & 0xff))
    ip4=$(($1 & 0xff))
    echo -n "${ip1}.${ip2}.${ip3}.${ip4}"
}

for x in $IP ; do
    b1ip=`echo $x | cut -d'.' -f1`
    b2ip=`echo $x | cut -d'.' -f2`
    b3ip=`echo $x | cut -d'.' -f3`
    e1ip=`echo $x | cut -d'.' -f1`
    e2ip=`echo $x | cut -d'.' -f2`
    e3ip=`echo $x | cut -d'.' -f3`

    ip_begin=$(($b1ip << 24 | $b2ip << 16 | $b3ip << 8 | 0))
    ip_end=$(($e1ip << 24 | $e2ip << 16 | $e3ip << 8 | 255))

    for (( ip = ip_begin ; ip <= ip_end ; ip++ )) ; do
	ip_text=$( u_int32_to_ip ${ip} )
	create_database bits-${ip_text}.rrd
    done
done

exit 0
skrypt który ma aktualizować dane...

Kod: Zaznacz cały

#!/bin/bash

CONFIG_FILE=/etc/firewall/extra/account/config
source $CONFIG_FILE

# 1  2       3           4     5 6      7      8 9     10    11 12     13     14 15 16  17 18
# ip = 192.168.0.255 bytes_src = 0 packets_src = 0 bytes_dest = 0 packets_dest = 0 time = 543

ACN="1"
for x in $IP ; do
    for i in $IPKI2 ; do
	cat /proc/net/ipt_account/net${ACN} | grep -w $i | awk -v RRDUPDATE=$RRDUPDATE -v RRDDIR=$RRDDIR '{ system (RRDUPDATE " " RRDDIR "/bits-" $3 ".rrd" " N:" $6 ":" $12) }'
    done
    ACN=$[$ACN+1]
done

exit 0
jeszcze config ale w nim ustawione tylko scieżki, wszystko dobrze

Kod: Zaznacz cały

#!/bin/bash

CONFIG_MFILE=/etc/firewall/main.cfg
source $CONFIG_MFILE

IMGDIR="/srv/www/htdocs/account/images"	# polozenie katalogu z grafikami statystyk dla www
RRDDIR="/var/account_db"			# katalog, w ktorym beda zbierane dane (ok. 50MB na 1 podsiec)
IP="$STATIPTA"					# pobranie IP ze zmiennej STATIPTA
#IP="192.168.101.0"				# IP sieci (bez maski!), np.: 192.168.1.0

# ponizej juz nic nie musisz zmieniac
IPKI=`cat /etc/firewall/client.cfg | grep -v "^#" | sed -e '/^$/d' | awk '{ print $1 }'`
if [ -f /etc/firewall/clinat.cfg ] ; then
    IPKI=`cat /etc/firewall/clinat.cfg | grep -v "#" | sed -e '/^$/d' | awk '{ print $1 }'`
fi
RRDTOOL=`which rrdtool`
RRDUPDATE=`which rrdupdate`
if [ ! -d $RRDDIR ]; then
	mkdir $RRDDIR
fi
echo "$IPKI" > $RRDDIR/iplist
for x in $IP ; do
    echo $x | cut -d'/' -f1 >> $RRDDIR/iplist
done
IPKI2=`cat $RRDDIR/iplist`
CZAS=`date '+%d-%m-%Y, godz.%H, min.%M'`
skrypt create_account wszystkie pliki tworzy ładnie ale już account_update ich nie aktualizuje przez niezgodnośc danych?

gdy daję rrdtool info bits-192.168.101.0.rrd

dostaje:

Kod: Zaznacz cały

filename = "/var/account_db/bits-192.168.101.0.rrd"
rrd_version = "0003"
step = 300
last_update = 1212587011
ds[in].type = "DERIVE"
ds[in].minimal_heartbeat = 600
ds[in].min = 0.0000000000e+00
ds[in].max = NaN
ds[in].last_ds = "55046493"
ds[in].value = 0.0000000000e+00
ds[in].unknown_sec = 211
ds[out].type = "DERIVE"
ds[out].minimal_heartbeat = 600
ds[out].min = 0.0000000000e+00
ds[out].max = NaN
ds[out].last_ds = "818831241"
ds[out].value = 0.0000000000e+00
ds[out].unknown_sec = 211
rra[0].cf = "AVERAGE"
rra[0].rows = 600
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[0].cdp_prep[1].value = NaN
rra[0].cdp_prep[1].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 700
rra[1].pdp_per_row = 6
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = NaN
rra[1].cdp_prep[0].unknown_datapoints = 2
rra[1].cdp_prep[1].value = NaN
rra[1].cdp_prep[1].unknown_datapoints = 2
rra[2].cf = "AVERAGE"
rra[2].rows = 775
rra[2].pdp_per_row = 24
rra[2].xff = 5.0000000000e-01
rra[2].cdp_prep[0].value = NaN
rra[2].cdp_prep[0].unknown_datapoints = 20
rra[2].cdp_prep[1].value = NaN
rra[2].cdp_prep[1].unknown_datapoints = 20
rra[3].cf = "AVERAGE"
rra[3].rows = 797
rra[3].pdp_per_row = 288
rra[3].xff = 5.0000000000e-01
rra[3].cdp_prep[0].value = NaN
rra[3].cdp_prep[0].unknown_datapoints = 164
rra[3].cdp_prep[1].value = NaN
rra[3].cdp_prep[1].unknown_datapoints = 164
rra[4].cf = "MAX"
rra[4].rows = 600
rra[4].pdp_per_row = 1
rra[4].xff = 5.0000000000e-01
rra[4].cdp_prep[0].value = NaN
rra[4].cdp_prep[0].unknown_datapoints = 0
rra[4].cdp_prep[1].value = NaN
rra[4].cdp_prep[1].unknown_datapoints = 0
rra[5].cf = "MAX"
rra[5].rows = 700
rra[5].pdp_per_row = 6
rra[5].xff = 5.0000000000e-01
rra[5].cdp_prep[0].value = NaN
rra[5].cdp_prep[0].unknown_datapoints = 2
rra[5].cdp_prep[1].value = NaN
rra[5].cdp_prep[1].unknown_datapoints = 2
rra[6].cf = "MAX"
rra[6].rows = 775
rra[6].pdp_per_row = 24
rra[6].xff = 5.0000000000e-01
rra[6].cdp_prep[0].value = NaN
rra[6].cdp_prep[0].unknown_datapoints = 20
rra[6].cdp_prep[1].value = NaN
rra[6].cdp_prep[1].unknown_datapoints = 20
rra[7].cf = "MAX"
rra[7].rows = 797
rra[7].pdp_per_row = 288
rra[7].xff = 5.0000000000e-01
rra[7].cdp_prep[0].value = NaN
rra[7].cdp_prep[0].unknown_datapoints = 164
rra[7].cdp_prep[1].value = NaN
rra[7].cdp_prep[1].unknown_datapoints = 164
rra[8].cf = "MIN"
rra[8].rows = 600
rra[8].pdp_per_row = 1
rra[8].xff = 5.0000000000e-01
rra[8].cdp_prep[0].value = NaN
rra[8].cdp_prep[0].unknown_datapoints = 0
rra[8].cdp_prep[1].value = NaN
rra[8].cdp_prep[1].unknown_datapoints = 0
rra[9].cf = "MIN"
rra[9].rows = 700
rra[9].pdp_per_row = 6
rra[9].xff = 5.0000000000e-01
rra[9].cdp_prep[0].value = NaN
rra[9].cdp_prep[0].unknown_datapoints = 2
rra[9].cdp_prep[1].value = NaN
rra[9].cdp_prep[1].unknown_datapoints = 2
rra[10].cf = "MIN"
rra[10].rows = 775
rra[10].pdp_per_row = 24
rra[10].xff = 5.0000000000e-01
rra[10].cdp_prep[0].value = NaN
rra[10].cdp_prep[0].unknown_datapoints = 20
rra[10].cdp_prep[1].value = NaN
rra[10].cdp_prep[1].unknown_datapoints = 20
rra[11].cf = "MIN"
rra[11].rows = 797
rra[11].pdp_per_row = 288
rra[11].xff = 5.0000000000e-01
rra[11].cdp_prep[0].value = NaN
rra[11].cdp_prep[0].unknown_datapoints = 164
rra[11].cdp_prep[1].value = NaN
rra[11].cdp_prep[1].unknown_datapoints = 164
rra[12].cf = "LAST"
rra[12].rows = 600
rra[12].pdp_per_row = 1
rra[12].xff = 5.0000000000e-01
rra[12].cdp_prep[0].value = NaN
rra[12].cdp_prep[0].unknown_datapoints = 0
rra[12].cdp_prep[1].value = NaN
rra[12].cdp_prep[1].unknown_datapoints = 0
rra[13].cf = "LAST"
rra[13].rows = 700
rra[13].pdp_per_row = 6
rra[13].xff = 5.0000000000e-01
rra[13].cdp_prep[0].value = NaN
rra[13].cdp_prep[0].unknown_datapoints = 2
rra[13].cdp_prep[1].value = NaN
rra[13].cdp_prep[1].unknown_datapoints = 2
rra[14].cf = "LAST"
rra[14].rows = 775
rra[14].pdp_per_row = 24
rra[14].xff = 5.0000000000e-01
rra[14].cdp_prep[0].value = NaN
rra[14].cdp_prep[0].unknown_datapoints = 20
rra[14].cdp_prep[1].value = NaN
rra[14].cdp_prep[1].unknown_datapoints = 20
rra[15].cf = "LAST"
rra[15].rows = 797
rra[15].pdp_per_row = 288
rra[15].xff = 5.0000000000e-01
rra[15].cdp_prep[0].value = NaN
rra[15].cdp_prep[0].unknown_datapoints = 164
rra[15].cdp_prep[1].value = NaN
rra[15].cdp_prep[1].unknown_datapoints = 164
NaN rozumiem, że jest to brak danych, czyli coś nie tak... ale dlaczego i gdzie tkwi błąd... nie mogę znaleść

Re: Problem ze zbieraniem danych RRDTOOL

: 2008-06-04, 23:18
autor: matryc
Witam!
Po co skrypt aktualizujący dane zawiera pętle for i w niej jeszcze jedną pętle for ?? Uwzględnia się w niej ADRES sieci i IP jakie w sieci się znajduje?? IMHO jest to nie potrzebne!
Przecież każda sieć zbiera dane w osobnym pliku. A użycie zmiennej TIMEOUT pozwala na aktualizacje tylko tych baz, w których licznik nabija.

Kod: Zaznacz cały

....
....
TIMEOUT=300 #300s=5min
....
ACN=1
while [ $ACN -le 3 ]; do

cat /proc/net/ipt_account/net${ACN} | awk -v TIMEOUT=$TIMEOUT -v RRDUPDATE=$RRDUPDATE -v RRDDIR=$RRDDIR '{ if (TIMEOUT - $18 > 0) system (RRDUPDATE " " RRDDIR "/bits-" $3 ".rrd" " N:" $6 ":" $12) }'

ACN=$[$ACN+1]

done
....
....
POZDRAWIAM

Re: Problem ze zbieraniem danych RRDTOOL

: 2008-06-05, 09:15
autor: saurus
tak pętla ma na celu uaktualnienie wszystkich plików rrd, jeden IP jeden plik + jeden plik dla całego ruchu na danych interfejsie, ja mam bez TIMEOUTu bo skrypt i tak nie sprawdza czy był ruch czy nie i uaktualnia wszystko, no fakt, że może to niepotrzebne... ale czy problem tkwi w tych pętlach? spróbuję tego co zasugerowałeś

Re: Problem ze zbieraniem danych RRDTOOL

: 2008-06-05, 14:36
autor: matryc
Witam!
tak pętla ma na celu uaktualnienie wszystkich plików rrd, jeden IP jeden plik + jeden plik dla całego ruchu na danych interfejsie
Nie ma takiej potrzeby robić to pętlami!! Autor podał skrypt który robi to bardzo dobrze i dla każdego IP ( łączenie z całą siecią ).
Wprowadzając TIMEOUT oszczędzas pracy ( czas ) skryptowi aktualizującego bazę.
Ja wprowadziłem pętle while tylko dlatego, że masz 3 sieci i każda zbiera dane do osobnego pliku. Natomiast linijka zaczynająca się od cat /proc/net/ipt_account...... wczytuje każdą linie ( każde IP nawet ADRES sieci ) sprawdzając czy TIMEOUT jest przekroczony aktualizuje bazę dla danego IP.

No i oczywiście polecam sprawdzić czy wogóle moduł ipt_account działa czyli dla pliku net1:

Kod: Zaznacz cały

cat /proc/net/ipt_account/net1
POZDRAWIAM

Re: Problem ze zbieraniem danych RRDTOOL

: 2008-06-05, 16:23
autor: saurus
Oczywiście moduł ipt_account działa i zbiera dane, wszystkie te skrypty co tu przedstawiłem działają bez problemu na kilku moich routerach, na jajku 2.4.32, i innym systemie, teraz próbuje konfigurować nowy ruter z jajkiem 2.6.24.7 i wszystko już działa oprócz właśnie generowania tych statystyk i ich wykresów, sprawdziłem już, że do zmiennych $3 $6 $ 12, dobrze ładuje dane,
próbowałem bezpośrednio ładować liczby z /proc/.../net1 do bazy dla całej sieci:

Kod: Zaznacz cały

"/bits-" "xxxx" ".rrd" " N:" "xxxx" ":" "xxxx"
i wtedy rzeczywiście ładuje te liczby to pliku rrd i generują się poprawne wykresy, więc na razie wygląda to tak, że dane ze zmiennych nie są przekazywane w odpowiedni sposób....
wieczorkiem jeszcze będę sprawdzał od początku wszystko