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 <[EMAIL PROTECTED]> a ete
corrige. Il s'agissait d'une erreur dans le calcul des totaux avec l'option -l.

- Grace a Jacques L'helgoualc'h <[EMAIL PROTECTED]>, (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 <[EMAIL PROTECTED]>, 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 <[EMAIL PROTECTED]>
# v0.3.2 Aho
#
# calculate time spent by pppd connection
#
# Juin-July 2001

# thanks to Jacques L'helgoualc'h <[EMAIL PROTECTED]> for this little tips about
# LOCALE and  grep.
# thanks also to many helpers from [email protected] 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
}
'

Répondre à