NFsec Logo

Obliczanie wykorzystanego transferu

17/08/2009 w Hacks & Scripts Brak komentarzy.  (artykuł nr 129, ilość słów: 533)

P

rzedstawiony zestaw skryptów służy do obliczania wykorzystanego transferu łącza. Autorem skryptu jest Radosław Ryza, który stworzył poniższy zestaw w celu kontroli ilości pobranych danych na łączach posiadających miesięczne lub inne czasowe limity. Jego funkcja polega na obliczeniu dziennej (lub mniejszej czasowo sesji) ilości pobranych danych oraz zapisaniu ich w wybranej lokalizacji. Każda zapisana czasowo sesja jest sumowana z poprzednimi dając wiarygodny wynik w wymiarze np. dnia, tygodnia, miesiąca czy roku. Przed uruchomieniem skryptów w odpowiedniej kolejności należy stworzyć do tego odpowiednie warunki systemowe – czyli stworzenie pliku konfiguracyjnego, z którego będą korzystały skrypty oraz dwóch “baz danych”:

mkdir /etc/counter
cd /etc/counter
cat > counter.conf << EOF
export database_act="/etc/counter/database1"
export database_stor="/etc/counter/database2"
export start_date="/etc/counter/data"
EOF
touch data
touch database1
touch database2

Pierwszym skryptem, który można nazwać counter_clean.sh wykonuje czynności resetujące bazy danych oraz ustawia początkową datę, od której będą liczone kolejne sesje.

#!/bin/bash

. /etc/counter/counter.conf

echo -e "0 0" > $database_act
echo -e "0\n0" > $database_stor
echo -e "`date + "%d-%m-%Y"`" > $start_date

Skrypt ten należy uruchomić za każdym razem (w tym również po raz pierwszy), gdy pragniemy zacząć zliczanie pobranych i wysłanych danych. Drugi skrypt (counter_start.sh) odpowiada za sumowanie danych z obydwu baz. Należy wspomnieć, że pierwszy plik (database1) odpowiada za ilość danych pobranych w bieżącej sesji, drugi natomiast (database2) przechowuje skumulowane wartości z poprzednich sesji. Przy okazji skrypt ten czyści bazę z bieżącą ilością pobranych danych (database1) przygotowując ją dla trzeciego skryptu odpowiedzialnego za samo ich zliczanie. W celu zagwarantowania, że dane będą zliczane przy każdym starcie systemu można dodać wywołanie tego skryptu np. do pliku /etc/rc.d/rc.local:

#!/bin/bash
. /etc/counter/counter.conf

touch /tmp/lock_counter

receive=`cat $database_act | cut -d" " -f 1`
transmit=`cat $database_act | cut -d" " -f 2` 

if [ -f $database_stor ]; then
	old_receive=`cat $database_stor | sed -n -e "1p"`
	old_transmit=`cat $database_stor |sed -n -e "2p"`
else
old_receive=0
old_transmit=0
fi

echo $(($receive+$old_receive)) > $database_stor
echo $(($transmit+$old_transmit)) >> $database_stor

rm /tmp/lock_counter
echo "0 0" > $database_act

Trzecim skryptem (counter_count.sh) jest skrypt odpowiedzialny za zliczanie ilości danych w bieżącej sesji. Jego działanie polega na wyborze odpowiednich pól liczbowych z pliku /proc/net/dev/{interfejs} i przekazaniu ich do pierwszej bazy:

#!/bin/bash
. /etc/counter/counter.conf

i=0
for liczba in `cat /proc/net/dev | grep eth0 | cut -d":" -f2`; do
	i=$(($i+1))

	if [ $i -eq 1 ]; then
		receive=$liczba
	elif [ $i -eq 9 ]; then
		transmit=$liczba
	fi
done

if [ -f /tmp/lock_counter ]; then
	sleep 1
else
	echo "$receive $transmit" > $database_act
fi

W skrypcie tym należy zdefiniować interfejs sieciowy podłączony bezpośrednio do łącza dostarczającego usługę Internetu. Wywołanie tego skryptu można dodać np. do pliku /etc/rc.d/rc.6, w celu podsumowania ilości dotychczasowego transferu. By uniknąć utraty zliczanych danych w przypadku nieprzewidzianego przymusu restartu systemu należy rozważyć możliwość dodania wywołania skryptu do programu crontab – i wywoływania go np. co 1 / 2 minuty. Ostatni skrypt (counter_show.sh) zajmuje się prezentacją zebranych danych:

#!/bin/bash
. /etc/counter/counter.conf

receive_act=`cut -d" " -f1 $database_act`
transmit_act=`cut -d" " -f2 $database_act`

receive=`sed -ne "1p" $database_stor`
transmit=`sed -ne "2p" $database_stor`

echo -e "Bajtów odebranych:\t" $(($receive+$receive_act))
echo -e "MB odebranych:\t\t" $((($receive+$receive_act)/(1024*1024)))

echo -e "Bajtów wysłanych:\t" $(($transmit+$transmit_act))
echo -e "MB wysłanych:\t\t" $((($transmit+$transmit_act)/(1024*1024)))
        
echo -e "Data rozpoczęcia zliczania:\t" `cat $start_date`

Prezentacja danych wygląda następująco:

# ./counter_show.sh
Bajtów odebranych:       13258923
MB odebranych:           12
Bajtów wysłanych:        860011
MB wysłanych:            0
Data rozpoczęcia zliczania:      11-11-2008

Więcej informacji: www.prook.net

Kategorie K a t e g o r i e : Hacks & Scripts

Tagi T a g i : , , , ,

Komentowanie tego wpisu jest zablokowane.