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

pppd logs



Hello,

Suite a une conversation recente concernant un utilitaire calculant le temps de
connection en ppp, j'ai commence a developper un petit script awk qui execute
cette tache en ligne de commande. 

A l'heure actuelle, si l'on passe un mois en parametres au script, celui ci va
calculer le temps total de connection pour le mois vise ainsi que le temps
moyen par jour.

Plusieurs remarques:

1. Ce n'est pas optimise... ce qui veut dire que cela peut prendre un certain 
temps pour l'execution du script sur un tres gros fichier de log. Cela veut
aussi dire que certains d'entre vous pourrait tomber a la renverse en regardant
le code. (il vaut donc mieux rester assis). Je decline toute responsabilite
pour les chuttes qui pourrait resulter de la lecture du code.

2. Il y a encore des bugs. Notemment, quand le temps de connection sur un mois
depasse une certaine duree, les resultats sont fausses. Cela est du au fait que
awk utilise des entiers par defaut. Je dois encore adapte la situation pour
obtenir des longs a la place.

3. Ce n'est pas encore termine. Ce qui veut dire que le script ne dispose que
peu de features. Je planifie de travailler la dessus pour ameliorer cela.
Notemment en ecrivant un script shell qui enrobe l'appel au script awk.

Pour lancer le script, il suffit de taper ceci:

~$ awk -f /path/to/ppptime.awk -v search="Month" /path/to/pppd/logfile

+ Month est le mois pour lequel vous rechercher le temps de connection
+ Par defaut, les logs de pppd sont envoyes dans /var/log/messages.

Si vous etes interesse par tester le script, n'hesitez pas.

Feedback is needed, awk tips and tricks welcome ! :)

stay tuned for the next release.

<signature>
	Gregoire Welraeds
	<gregoire (at) welraeds (dot) be>
</signature>
BEGIN {
	month= ""
}

	$1 != search { next }
	$6 == "Connect:" {
		# new connection
		if ( month != $1 ) {
			month= $1
			total[month]=0
			daycount[month]=0
			day="" 
		}
		if ( day != $2 ) { 
			day= $2 ; daycount[month]++ 
		}

		# store time
		start_time= $3
		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
		# store time
		# stop_time= $3
		stop_hour= substr($3,1,2)
		stop_min= substr($3,4,5)
		stop_sec= substr($3,7,8)

		# init counters
		hour= 0; min=0
		# find duration
		# sec= 60 + stop_sec - start_sec
		# min= sec div 60
		# sec= sec % 60
		start= start_hour*3600 + start_min*60 + start_sec
		stop= stop_hour*3600 + stop_min*60 + stop_sec
		duration= stop - start
		total[month]+= duration
		dh= int(duration / 3600)
		dm= int((duration % 3600 ) / 60)
		ds= duration - (dm * 60)
#		print $1,$2,"\t\t",dh, dm, ds, "\t\t",start_time,"\t\t", stop_time
	}
END {

	print "+-------------------------------------------------+"
	print "| total time spent on internet for this log file: |"
	print "+-------------------------------------------------+"
	for ( m in total )
	{
		dh= int(total[m] / 3600)
		tmp= total[m] % 3600
		dm= int(tmp / 60)
		ds= tmp % 60
		print m ":", dh ":" dm ":" ds 

		avg= int(total[m] / daycount[m])

		dh= int(avg / 3600)

		tmp= avg % 3600
		dm= int(tmp / 60)
		dm= ( dm < 10 ? 0 dm : dm )

		ds= tmp % 60
		ds= ( ds < 10 ? 0 ds : ds )

		print "\taverage time/day (" daycount[m] "):", dh ":" dm ":" ds

		
		
	}
}

Reply to: