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: