[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

pppd log v0.3 Aho



Hello,

Me voici de retour avec mon petit script ppptime. C'est avec une certaine
fierte que je vous annonce la version 0.3 du script ;).

<les aventure de bugs bunny>
Bugs Bunny: - What's up, doc ?
gregoire: - he bien un certain nombre de nouveautes mon cher.
Bugs Bunny: - Ah bon ? les carottes sont cuites ?
gregoire: - euh... en quelque sorte.
</les aventure de bugs bunny>

Les nouveautes sont:

- Afin d'ajuster au mieux le calcul des durees de connection, c'est maintenant
les lignes de type:
	Connect xxxx  # (ou xxxx est la vitesse est la vitesse de connection)
qui sont prises en compte. Ce qui devrait nous permettre de gagner 1 a 5
secondes d'exactitude dans les calculs du temps de connection. En effet, on
commence a calculer au moment ou se termine le handshaking entre les modems.

- Gestion des arguments de la ligne de commandes:
	lanfeust:~ # ./ppptime -h
	Usage: ppptime [-vl] [-f file] -m month
        	-f file         path to pppd log file
	        -h              display help message and exit successfully
	        -l              list detail for each connection
	        -m month        search file for month. REQUIRED.
	        -v              verbose mode
	        if no file is given, ppptime will read from stdin.
	lanfeust:~ #

Ces options sont donc:
	-f	permet de preciser le fichier de log qui va servir d'input au
		script. Si cette option est omise, le script va lire les lignes
		d'entrees depuis stdin (standard input). Ce qui permet
		d'appeler le script dans un pipe. Exemple:
		lanfeust:~ # zcat `ls -r /var/log/messages*` | ppptime -m Jun
		...
		lanfeust:~ #
		Note: l'exemple precedent permet de prendre l'ensemble des
		fichier /var/log/messages* comme input et ce meme si ces
		fichier sont compresses au format gzip.
	-h	affiche un message d'aide.
	-l	affiche le detail de chaque connection de facon similaire a
		kppp. Example:
		<example>
		jour	start		stop		total
		|	|		|		|
		V	V		V		V		
		29       0:12:59         0:20:59         0:08:00
		29       1:31:54         1:42:19         0:10:25
		29       2:05:20         2:16:17         0:10:57
		29       2:31:24         2:43:08         0:11:44
		29       2:52:04         3:05:32         0:13:28
		30      19:53:39        20:04:58         0:11:19
		30      23:19:52        23:56:16         0:36:24
		==      ========        ========        ========
nbre de jours->	10                                      10:12:02  <- duree tot.
		</example>
	-m	Seule option requise a l'heure actuelle, elle permet de
		preciser le mois recherche. Example:
		lanfeust:~ # ./ppptime -f /var/log/messages -m Jun
	-v	Pour verbose... Donne un output detaille sur
		- le temps total de connection
		- le temps moyen de connection sur une journee
		- le temps moyen de connection par connection
		- le nombre moyen de connection par jour.
A noter que s'il y une erreur dans une des options passees en parametre,
ppptime affiche un message d'erreur de type:
Usage: ppptime [-vl] [-f file] -m month
Try 'ppptime -h' for more information.
A noter que s'il on ne precise ni l'option -v, ni l'option -l, ppptime
n'affiche que le temps total de connection. J'ai choisi cette optique de facon
a ce que l'output puisse facilement etre recuperer pour etre utilise dans un
autre script ou pour etre inserer dans une db. Example:
	lanfeust:~ # ./ppptime -f /var/log/messages -m Jun
	10:12:02
	lanfeust:~ #

A l'heure actuelle il reste un bug connu.
<les aventure de bugs bunny>
Bugs bunny: - Un BUG ??? et pourquoi pas un Omer tant que vous y etes ?
</les aventure de bugs bunny>

Il concerne le passage d'un mois a un autre pendant une connection.
example: 
	- on est le 30.06 à 23h58 et je me connecte.
	- j'arrete ma connection le 01.07 à 00h10.

Les resultat de juin ne seront pas complets: il manquera le temps de connection
entre 23h58 et 23h59'59''. Juillet aura une valeur fausse.

Ce sera corrige pour la version v0.4, Kernighan, promis.

C'est tout pour aujourd'hui. 
So 'till next time, enjoy ppptime! :)

--
Life is hard but the root password helps.
		-- Anonymous

Gregoire Welraeds
<gregoire (at) welraeds (dot) be>

#!/bin/sh

# ppptime by Grégoire Welraeds <gregoire@welraeds.be>
# v0.3 Aho
#
# calculate time spent by pppd connection
#
# Juin 2001

VERBOSE=0
LIST=0

usage()
{
cat << _END_
Usage: ppptime [-vl] [-f file] -m month 
Try 'ppptime -h' for more information.
_END_
}

help()
{
cat << _EOF_
Usage: ppptime [-vl] [-f file] -m month 
	-f file		path to pppd log file
	-h		display help message and exit successfully
	-l		list detail for each connection
	-m month	search file for month. REQUIRED.
	-v		verbose mode
	if no file is given, ppptime will read from stdin.
_EOF_
}

test $# -eq 0 && usage && exit -1

TEMP=`getopt f:hlm:v "$@"` # > /dev/null`

if [ $? != 0 ] ; then usage >&2 ; exit 1 ; fi

eval set -- "$TEMP"

while test 1
do
	case $1 in
		-f) FILE=$2; shift 2;;
		-l) LIST=1; shift ;;
		-m) MONTH=$2; shift 2 ;;
		-v) VERBOSE=1; shift ;;
		-h) help ; exit 1 ;; 
		--) shift ; test $1 || break ;;
		 *) echo "invalid option $1"; usage ; exit -1 ;;
	esac	
done	

# test if $FILE exist and is readable
if test ${FILE}; then
	if ! test -r ${FILE}; then
		echo Can\'t read ${FILE}; 
		usage;
		exit -1
	fi
else
	FILE="-"
fi

if test ! ${MONTH}; then
	usage ; exit -1
fi	

grep "^${MONTH}" ${FILE} | awk -v verbose=${VERBOSE} -v list=${LIST} '

BEGIN {
	total= 0
	daycount= 0
	day= ""
	connectcount= 0
}

	$6 == "CONNECT" {

		# new connection

		if ( day != $2 ) { 
			day= $2 ; daycount++ 
		}
		# store time
		start_hour= substr($3,1,2)
		start_min= substr($3,4,5)
		start_sec= substr($3,7,8)
	}

	$6 == "Connection" && $7 == "terminated." {

		# end of the connection
		connectcount++

		# store time
		stop_hour= substr($3,1,2)
		stop_min= substr($3,4,5)
		stop_sec= substr($3,7,8)

		start= start_hour*3600 + start_min*60 + start_sec
		stop= stop_hour*3600 + stop_min*60 + stop_sec

		if ( list )
		{
			printf("%2d", day);
			printf("\t%8s", time2str(start));
			printf("\t%8s", time2str(stop));
		}
			
		if ( day != $2 ) { 
			daydiff = $2 - day
			daycount += daydiff ; day= $2 
			tmp= (stop + ((86400 * daydiff) - start))
		}
		else
			tmp = stop - start
		if ( list )
			printf("\t%8s\n", time2str(tmp))
		total += tmp
	}

END {
	spent= time2str(total)
	if ( list )
	{
		printf("==\t========\t========\t========\n")
		printf("%2d\t        \t        \t%8s\n", daycount, spent)
	}
	if ( verbose )
	{	
		if ( list )
			printf("\n");
		printf("spent: ");
	}	
	if ( verbose || ! list ) 
		print spent
	if (verbose ) 
	{
		print "avg time/day (" daycount "):", time2str(int (total / daycount) )  
		print "avg time/connect (" connectcount "):", time2str(int (total / connectcount))
		print "avg connect/day:", connectcount / daycount
	}
}

function time2str(total)
{
	# recieve an amount of seconds and 
	# convert it to a string format
	hour= int ( total / 3600 )
	tmp= total % 3600
	minute= int ( tmp / 60 )
	second= tmp % 60

	minute= ( minute < 10 ? 0 minute : minute )

	second= ( second < 10 ? 0 second : second )

	return hour ":" minute ":" second

}
'

Reply to: