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

ppptime v0.3.2 Aho



Hello,

Voici la nouvelle mouture de ppptime.

Les changements sont:

- (pour faire pro) __several__ minor bugs fixed.

- Plusieurs personnes se sont plaintes de ne pas avoir dans leur log de ligne
du type:
	
	Jul  5 09:04:28 lanfeust chat[777]: CONNECT 115200^M

Ce qui est tout a fait vraisemblable dans la mesure ou cette ligne est generee
par la commande chat et non directement par la commande ppp. J'ai donc du une
fois de plus trouver autre chose. Sur base des quelques logs que j'ai recu
(merci pour eux), j'ai etabli que la ligne la plus fiable (parce que presente
dans chacun d'eux) etait du type:
	
	Jul  5 09:04:33 lanfeust pppd[776]: Connect: ppp0 <--> /dev/ttyS1

C'est donc cette ligne qui est prise en compte a partir d'aujourd'hui. 

- Le bug signale par Nicolas Bertolissio <nico.bertol@wanadoo.fr> a ete
corrige. Il s'agissait d'une erreur dans le calcul des totaux avec l'option -l.

- Grace a Jacques L'helgoualc'h <lhh@free.fr>, (j'ai vraiment l'impression
d'avoir ecrit le script de l'annee :), les LOCALES sont disablee en debut de
script. 

- Toujours grace a Jacques L'helgoualc'h <lhh@free.fr>, la commande grep, qui
passe les lignes du log au script awk, a ete amelioree en vue d'ameliorer les
performances

- Dans le cas ou le mois n'est pas precise, le mois courant est pris en compte.
De ceci il decoule, que l'option -m n'est plus requise.

- Une petite fonctionnalite que je trouve bien utile a ete ajoutee. Lorsqu'il
y a une connection en cours, l'appel du script avec l'option -v (verbose)
renvoie, en plus des autres informations,  la duree de la connection en
cours... Ca peut servir de 'uptime' ou de compteur pour ceux qui paye leur
communication telephonique comme moi :). Cette option n'a ete que faiblement
testee, j'attends vos commentaires.

Deux bugs restent :(:

1. Le cas que j'ai signale cette semaine ou syslog est redemarre alors qu'il y
a une connection en cours:

	- pppd start
	- kill syslog < EG: manual kill or reboot or crash...
	- pppd stop
	- start syslog

A l'heure actuelle, ces connections ne sont pas reprises dans le total. Je ne
pense pas que je vais les traiter parce que cela me parait for couteux en
performance pour un cas qui me parait tout a fait exceptionnel.

2. Le cas du rotate de fichier log pendant une connection:

	- pppd start, logs in file A
	- syslog rotate, file A is backuped, logs in file B
	- pppd stop
	- CASE A: ppptime -f file A
	- CASE B: ppptime -f file B

Ce cas ci est plus genant, parce que plus courant. Si vous pensez etre dans
ce cas (ex: ADSL + logrotate tous les soirs a minuit), le mieux pour combattre
ce probleme est de systematiquement fournir tous les fichiers de logs en entree
de ppptime. -> perfomance down mais resultats parfaitement exact.
Ce probleme n'est pas encore fixe parce que je ne trouve pas de solutions
satisfaisantes. 

Que la saporo soit avec vous.

--
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.2 Aho
#
# calculate time spent by pppd connection
#
# Juin-July 2001

# thanks to Jacques L'helgoualc'h <lhh@free.fr> for this little tips about
# LOCALE and  grep.
# thanks also to many helpers from debian-french@lists.debian.org for
# new ideas.

# disable all locale.
LC_ALL=C


VERBOSE=0
LIST=0
FILE="-"

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

help()
{
cat << _EOF_
Usage: ppptime [-h] | [-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.
  -v		verbose mode
  if no file is given, ppptime will read from stdin.
  if no month is given, ppptime will consider the current month
_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
fi

# if $MONTH is not given on command line, take the current month as default.
if test ! ${MONTH}; then
	MONTH=`date +%b`
fi	

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

BEGIN {
	total= 0
	daycount= 0
	day= ""
	connectcount= 0
}
	
	$6 == "Connect:" {

		# new connection
		stop_hour= 0

		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)
		next
	}

	$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)

		# find duration
		start= start_hour*3600 + start_min*60 + start_sec
		stop= stop_hour*3600 + stop_min*60 + stop_sec
			
		if ( day != $2 ) { 
			daydiff= $2 - day
			daycount+= daydiff ; day= $2 
			tmp= (stop + ((86400 * daydiff) - start))
		}
		else
			tmp= stop - start

		total += tmp

		if ( list )
		{
			printf("%2d\t%8s\t%8s\t%8s\n", day, 
				time2str(start),
				time2str(stop),
				time2str(tmp));
		}
		next
	}

END {
	if ( ! stop_hour ) 
	{
		# there is a connection up and running
		# get today 
		"date" | getline date
		split(date, d, " ")

                stop_hour= substr(d[4],1,2)
                stop_min= substr(d[4],4,5)
                stop_sec= substr(d[4],7,8)

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

		if ( day != d[3] ) {
			daydiff = d[3] - day
			daycount += daydiff ;
			tmp= (stop + ((86400 * daydiff) - start))
		}
		else
			tmp = stop - start

                total += tmp
		current= tmp

                if ( list )
                {
                        printf("%2d\t%8s\t%8s\t%8s\n", day,
                                time2str(start),
                                time2str(stop),
                                time2str(tmp));
                }
	}

	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

		if ( current )
			print "current connect:", time2str(current)
	}
}

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

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

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

	return hour ":" minute ":" second
}
'

Reply to: