#!/bin/bash

# /etc/init.d/netmon [start|stop]
# avvio / arresto del monitoraggio
# 
# compiti dello script:
# 1) predisporre il sistema di logging
# 2) predisporre il sistema di verifica delle soglie di traffico 
#      (vedi monitor.sh)
# 3) avviare il monitoraggio dei log
#      (vedi startstop.sh e track.sh)
# 4) avviare il logging da iptables
#
# in fase di arresto, tutto al contrario!

SOGLIA=1000
SCRIPTPATH=/root


# copio syslog.conf ripulito delle righe relative al monitoraggio in /tmp/syslog.$$
egrep -v '/var/log/newconn|/var/log/excess' /etc/syslog.conf > /tmp/syslog.$$

# copio la cron table di root ripulita della riga relative al monitoraggio in /tmp/crontab.$$
crontab -l | grep -v monitor.sh > /tmp/crontab.$$

case "$1" in 
start)
	# avvio startstop.sh, che si mette in ascolto degli eventi di inizio/fine connessione
	# è la prima cosa da fare perchè è l'unica che può fallire, e nel caso non devo proseguire
	$SCRIPTPATH/startstop.sh & sspid=$!
	ps -w $sspid | grep -q startstop.sh || exit 1
	echo $sspid > /var/run/startstop.pid

	# accodo le direttive per il logging dei pacchetti di inizio/fine connessione
	# e dei messaggi di segnalazione degli sforamenti
	# ed installo la nuova configurazione di syslog
	echo -e "kern.warn\t\t/var/log/newconn" >> /etc/syslog.$$
	echo -e "local0.warn\t\t/var/log/excess" >> /etc/syslog.$$
	cat /etc/syslog.$$ > /etc/syslog.conf
	/etc/init.d/sysklogd reload

	# installo la crontab con la direttiva di eseguire ogni minuto monitor.sh
	echo "* * * * * $SCRIPTPATH/monitor.sh $SOGLIA" >> /tmp/crontab.$$
	crontab /tmp/crontab.$$

	# inserisco nel packet filter le regole per loggare i pacchetti di inizio/fine connessione
	iptables -I FORWARD -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags SYN,ACK SYN -j LOG --log-level warn --log-prefix " inizio "
	iptables -I FORWARD -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags FIN FIN -j LOG --log-level warn --log-prefix " fine "
	;;

stop)
	# rimuovo dal packet filter le regole per loggare i pacchetti di inizio/fine connessione
	iptables -D FORWARD -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags SYN,ACK SYN -j LOG --log-level warn --log-prefix " inizio "
	iptables -D FORWARD -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags FIN FIN -j LOG --log-level warn --log-prefix " fine "

	# ripulisco e rimuovo tutte le custom chains
	iptables -nL | grep "^Chain CONN_" | awk -F '_' '{ print $2,$3 }' | while read srcport dstport ; do
		$SCRIPTPATH/track.sh D $srcport $dstport
	done

	# arresto il processo di ascolto degli eventi di inizio/fine connessione
	sspid=`cat /var/run/startstop.pid`
	ps -w $sspid | grep -q startstop.sh && kill $sspid
	sleep 2
	ps -w $sspid | grep -q startstop.sh && kill -9 $sspid

	# installo i crontab e syslog.conf già ripuliti delle direttive di monitoraggio
        crontab /tmp/crontab.$$

        cat /etc/syslog.$$ > /etc/syslog.conf
        /etc/init.d/sysklogd reload
	;;
*)
	echo Usage: $0 '[start|stop]'
	exit 1
	;;
esac

