Poniżej wstawiłem kod skryptu obsługi liczników account.
UWAGA jest to wersja testowa
kernel musi być z zaimplementowaną obsługą liczników account
#! /bin/sh
# ---------------------------------------------------------------------------
#
# Skrypt obsługi liczników account
# rcaccount Piotr "JamP" Jamrozik <jamp(at)jamp.int.pl>
#
# !!! UWAGA !!!
# wersja testowa 001
# ---------------------------------------------------------------------------
#
# Skrypt należy umie¶cić w katalogu /etc/rc.d/ i dopisać w sekcji DAEMONS
# w pliku /etc/rc.conf bezpo¶rednio po iptables
#
# W trakcie startu systemu odbudowywany stan istniej±cych w kopii liczników
# Podczas zatrzymywania systemu wykonywane jest zapisanie obecnego stanu
# liczników do kopii ( st±d niestandardowe użycie opcji stop - nie zatrzymuje
# liczenia tylko zapisuje liczniki )
#
# Dostępne opcje:
#
# start - uruchomienie liczników i rozpoczęcie zliczania
# stop - zapisanie kopii liczników do pliku
# reset - kasowanie liczników i rozpoczęcie zliczania od zera
# stat - proste statystyki
#
# ---------------------------------------------------------------------------
#
# Użyte zmienne konfiguracyjne:
#
# SIECLAN
# -------
# Do zmiennej SIECLAN wpisz swoj± sieć lokaln± w formacie: "192.168.1.0/24"
# !!! UWAGA !!!
# maska może mieć mieć tylko jedn± z 3 warto¶ci: 8, 16, 24 lub
# można j± pomin±ć zliczaj±c tylko 1 użytkownika wtedy podajemy "192.168.1.2"
# ---------------------------------------------------------------------------
#
# PELNE
# -----
# Zmienna PELNE=1 - pełne / PELNE=0 - skrócone (bez rozbicia na na usługi)
#
# ---------------------------------------------------------------------------
#
# GDZIE
# -----
# Zmienna GDZIE zawiera ¶cieżkę do zapisywania kopii liczników
#
# ---------------------------------------------------------------------------
#
# W tej chwili skrypt obsługuje tylko 1 plik liczników
# W budowie obsługa limitowania niceshapera na podstawie liczników account
#
# ---------------------------------------------------------------------------
#
# Kopię liczników co 1 minutę można uzyskać przez dopisanie w cronie poleceniem
# crontab -e
# 0-59/1 * * * * /etc/rc.d/rcaccount stop
#
# ---------------------------------------------------------------------------
#
# Narazie skrypt nie jest optymalny ani piękny ale chyba działa bez problemów:)
# Napisałem go dzi¶ w nocy więc mog± wyst±pić jakie¶ nieprzewidziane trudno¶ci
#
# Proszę o zgłaszanie uwag i potrzeb co do dalszego sposobu rozwijania skryptu:)
#
# Miłej zabawy z licznikami account :)
#
# ---------------------------------------------------------------------------
. /etc/rc.conf
. /etc/rc.d/functions
# ---------------------------------------------------------------------------
# Te 3 parametry ustaw sam :)
# ---------------------------------------------------------------------------
SIECLAN="192.168.1.0/24"
PELNE=1
GDZIE="/etc/iptables/account"
# ---------------------------------------------------------------------------
# Poniżej nie musisz nic zmieniać
# ---------------------------------------------------------------------------
case "$1" in
start)
stat_busy "Uruchamianie liczników account"
if [ ! -d $GDZIE ]; then
mkdir -p $GDZIE;
fi
if [ ! -e /proc/net/ipt_account/mynetwork ]; then
iptables -N statistics
if [ "$PELNE" = "1" ]; then
iptables -A statistics -m account --aaddr $SIECLAN --aname mynetwork
LINIAZERO="bytes_src = 0 0 0 0 0 packets_src = 0 0 0 0 0 bytes_dest = 0 0 0 0 0 packets_dest = 0 0 0 0 0 time = 0"
else
iptables -A statistics -m account --aaddr $SIECLAN --aname mynetwork --ashort
LINIAZERO="bytes_src = 0 packets_src = 0 bytes_dest = 0 packets_dest = 0 time = 0"
fi
iptables -I FORWARD -j statistics
if [ ! -e $GDZIE/.mynetwork.zero ]; then
stat_busy "Budowa pliku zerowania accounta"
sleep 5
while read line; do
echo $line | echo "ip = `cut -f 3 -d ' '` $LINIAZERO" >> $GDZIE/.mynetwork.zero
done < /proc/net/ipt_account/mynetwork
stat_done
fi
fi
stat_done
stat_busy "Zapis ostatnich warto¶ci do liczników account"
if [ -f $GDZIE/.mynetwork.save ]; then
while read line; do echo $line > /proc/net/ipt_account/mynetwork; done < $GDZIE/.mynetwork.save
fi
stat_done
wynik
;;
stop)
stat_busy "Zapis liczników account"
if [ -f /proc/net/ipt_account/mynetwork ]; then
cat /proc/net/ipt_account/mynetwork > $GDZIE/.mynetwork.save
fi
stat_done
wynik
;;
reset)
$0 stop
stat_busy "Zerowanie licznikópw account"
if [ -f $GDZIE/.mynetwork.zero ]; then
while read line; do echo $line > /proc/net/ipt_account/mynetwork; done < $GDZIE/.mynetwork.zero
fi
stat_done
stat_busy "Kopia liczników account"
if [ ! -f $GDZIE/.mynetwork.kopia ]; then
cat $GDZIE/.mynetwork.save > $GDZIE/.mynetwork.kopia
else
cat $GDZIE/.mynetwork.kopia > $GDZIE/.mynetwork.kopia1
cat $GDZIE/.mynetwork.save > $GDZIE/.mynetwork.kopia
fi
cat $GDZIE/.mynetwork.zero > $GDZIE/.mynetwork.save
stat_done
wynik
;;
stat)
stat_busy "Proste statystki liczników account"
echo "+-----------------+------------+------------+------------+--------------+"
echo "| Użytkownik | razem | odebrał | wysłał | nieatywny od |"
echo "+-----------------+------------+------------+------------+--------------+"
if [ "$PELNE" = "1" ]; then
awk 'BEGIN {aaa=0}{bbb="B"}{bbb1="B"}{bbb2="B"}{ccc=$6+$20}
{ddd=$6}{eee=$20}{zm=0}{roz="B"}{fff=$33}
function jednostka(zm){{if(zm < 1024 ) {roz="B"}}
{if((zm > 1024 )&&(zm < 1024^2)) {{zm/=1024} {roz="KB"}}}
{if((zm > 1024^2)&&(zm < 1024^3)) {{zm/=1024^2}{roz="MB"}}}
{if(zm > 1024^3) {{zm/=1024^3} {roz="GB"}}}
{ccc=zm}{bbb=roz}}
{if(ccc > 0) {
{jednostka(ccc)}{op1=ccc}{w1=bbb}
{jednostka(ddd)}{op2=ccc}{w2=bbb}
{jednostka(eee)}{op3=ccc}{w3=bbb}
{cz=$34 " sek"}
{if($34 > 31536000 ) {cz="ponad roku"}}
{printf"| %-15s | %7.2f %-2s | %7.2f %-2s | %7.2f %-2s | %12s |\n",$3,op1,w1,op2,w2,op3,w3,cz}
{zm=0}{roz="B"}
}}' /proc/net/ipt_account/mynetwork
else
awk 'BEGIN {aaa=0}{bbb="B"}{bbb1="B"}{bbb2="B"}{ccc=$6+$12}
{ddd=$6}{eee=$12}{zm=0}{roz="B"}{fff=$33}
function jednostka(zm){{if(zm < 1024 ) {roz="B"}}
{if((zm > 1024 )&&(zm < 1024^2)) {{zm/=1024} {roz="KB"}}}
{if((zm > 1024^2)&&(zm < 1024^3)) {{zm/=1024^2}{roz="MB"}}}
{if(zm > 1024^3) {{zm/=1024^3} {roz="GB"}}}
{ccc=zm}{bbb=roz}}
{if(ccc > 0) {
{jednostka(ccc)}{op1=ccc}{w1=bbb}
{jednostka(ddd)}{op2=ccc}{w2=bbb}
{jednostka(eee)}{op3=ccc}{w3=bbb}
{cz=$18 " sek"}
{if($18 > 31536000 ) {cz="ponad roku"}}
{printf"| %-15s | %7.2f %-2s | %7.2f %-2s | %7.2f %-2s | %12s |\n",$3,op1,w1,op2,w2,op3,w3,cz}
{zm=0}{roz="B"}
}}' /proc/net/ipt_account/mynetwork
fi
echo "+-----------------+------------+------------+------------+--------------+"
stat_done
wynik
;;
*)
echo "Użycie: rcaccount [ start | stop | reset | stat ]"
;;
esac
exit 0
Zapraszam do testów i proszę o zgłaszanie uwag
Dodane 10.02.2006r.
Trochę o skrypcie
Narazie nie zauważyłem usterek w działaniu skryptu
Powstał dlatego że:
- był dla mnie niezbędny
- obsługa account jest w kernelu (nowe wersje) i działa lepiej oraz szybciej niż inne sposoby liczenia ruchu w sieci oraz jest łatwa w zastosowaniach
- brak gotowych rozwiązań w NND na zapis, odczyt i kasowanie liczników oraz prostych statystyk
Bardzo proszę o opinię bo narazie niemam zielonego pojęcia czy jest jakiekolwiek zainteresowanie moim skryptem, a robienie czegoś czego nikt nie potrzebuje mija się z celem
