#!/usr/bin/perl # Auteur : Sebastien.Desreux@ens.fr # Ce programme permet de lancer le programme de connection a l'école # (ppprun, programme fait par MXK), de déconnecter (pppkill 0, programme # fait par Dom) si pppd est visible par ps (il faut donc a priori être # root pour que le programme fonctionnne). Il donne également le temps # de connection et son coût, les prix étant ceux de France Télécom # valables au 01 10 1997, sans compter les éventuelles réductions par # abonnement. # On supose que la connection a une durée raisonnable, c'est-à-dire que # l'on ne franchit pas deux fois une limite temporelle entre # zones bleue et rouge, ni une zone temporelle et minuit. # Enfin, le coût total est additionné au fil des communications. Lorsque # le programme sera stable, j'ajouterai la possibilité de faire des # stats avec gnuplot. # Bug possible : l'option %s de "date" n'est pas standard. Elle est # presente sur les RedHat. # Seb, 25.04.1998 ## Les constantes $temp_file = "/tmp/ppp_temp" ; $cout_3mn = 74 ; $cout_min_norm = 28 ; $cout_min_red = 14 ; $cout_file = "/root/bin/ppp_cout" ; $ppp_start = "ppprun &" ; $ppp_stop = "pppkill 0" ; # Les prix sont calcules en centimes, les durees en secondes. ## Pour se rappeler des options : ppp help ## Un seul argument à la fois. if (@ARGV[0] eq "help") { die "Usage : ppp [help] [busy] [noanswer] [cout]\n" ; } ## Dans le cas ou la communication échoue if (@ARGV[0] eq "busy") { # Les modems sont surcharges unlink($temp_file) ; system("$ppp_stop") ; open (IN, $cout_file) ; while () { $cout_total = $_ ; } close (OUT) ; unlink($cout_file) ; $cout = 74 ; $cout_total += $cout ; open (OUT, ">>$cout_file") ; print OUT $cout_total ; close (OUT) ; use integer ; $francs = $cout / 100 ; $cts = $cout - ($francs * 100) ; if ($cts < 10) {$cts = "0$cts" ;} print "\t\t\tCout\t $francs,$cts F\n" ; die "J'ai tué le process.\n" ; } if (@ARGV[0] eq "noanswer") { # Les modems ne decrochent pas unlink($temp_file) ; system("$ppp_stop") ; die "J'ai tué le process.\n" ; } ## Pour connaitre la depense totale : ppp cout if (@ARGV[0] eq "cout") { open(IN, $cout_file) ; while () { $cout_total = $_ ; } close (IN) ; { use integer ; $francs = $cout_total / 100 ; } $cts = $cout_total - (100 * $francs) ; # Calcul de la moyenne quotidienne @months = (0,31,28,31,30,31,30,31,31,30,31,30,31) ; $year= `date '+%Y'` ; $month = `date '+%m'` ; # les dates sont comptees a partir du 1er janvier 1998 $days1 = 31 + 28 + 31 + 25 ; $days2 = `date '+%d'` ; for ($i=1; $i<$month; $i++) {$days2 += @months[$i] ;} $days2 += ($year - 1998) * 365 ; $days = $days2 - $days1 ; {use integer ; $moyenne = (10 * $francs) / $days ;} $moyenne /= 10 ; # Afficher le resultat print "Coût total en ppp : \t$francs.$cts F\n" ; die "\t Par jour : \t$moyenne F\n" ; } ## Debut ou fin de connection ? $start = 1 - `ps | grep pppd | grep -v "grep" | wc -l` ; ## @debut = (jour, heure, minute, seconde, temps "absolu") ; ## @fin = (jour, heure, minute, seconde, temps "absolu") ; if ($start) { $debut[0] = `date '+%a'` ; $debut[1] = `date '+%H'` ; $debut[2] = `date '+%M'` ; $debut[3] = `date '+%S'` ; $debut[4] = `date '+%s'` ; } else { $fin[0] = `date '+%a'` ; $fin[1] = `date '+%H'` ; $fin[2] = `date '+%M'` ; $fin[3] = `date '+%S'` ; $fin[4] = `date '+%s'` ; } ## Stocker les valeurs de départ if ($start) { unlink($temp_file) ; open(OUT, ">>$temp_file") ; print OUT "@debut\n" ; close(OUT) ; } ## Communication par ppp if ($start) { system("$ppp_start") ; die "Début de communication\n" ; } else { print "Fin de communication\n" ; system("$ppp_stop") ; } ## Récupérer les valeurs de départ $counter = 0 ; open (IN, $temp_file) ; while () { $debut[$counter] = $_ ; ++$counter ; } close(IN) ; unlink($temp_file) ; ## Calculer le temps passé { use integer ; $total_s = $fin[4] - $debut[4] ; $total = $total_s ; # utile plus loin $total_h = $total_s / 3600 ; $total_m = ($total_s - $total_h * 3600) / 60 ; if ($total_m < 10) {$total_m = "0$total_m" ;} $total_s = $total_s - ($total_h * 3600) - ($total_m * 60) ; if ($total_s < 10) {$total_s = "0$total_s" ;} if ($total_h) { print "\t\t\tDurée\t $total_h h $total_m m $total_s s\n"; } elsif ($total_m) { print "\t\t\tDurée\t $total_m m $total_s s\n"; } else { print "\t\t\tDurée\t $total_s s\n"; } } ## Les limites des zones bleue et rouge if ($debut[0] eq "Sun") { $lim_tot = 0 ; $lim_tard = 0 ; } elsif ($debut[0] eq "Sat") { $lim_tot = 8 * 3600 ; $lim_tard = 12 * 3600 ; } else { $lim_tot = 8 * 3600 ; $lim_tard = 19 * 3600 ; } ## Calculer le temps en zone bleue, le temps en zone rouge ## et le coût # Le temps depuis minuit en secondes $debut_s = (3600 * $debut[1]) + (60 * $debut[2]) + $debut[3] ; $fin_s = (3600 * $fin[1]) + (60 * $fin[2]) + $fin[3] ; if ($fin_s < $lim_tot || $debut_s > $lim_tard) { # Tout en zone bleue $cout_rouge = 0 ; if ($debut[0] eq $fin[0]) { # Meme jour $bleu = $fin_s - $debut_s ; } else { # Minuit entre le debut et la fin $bleu = $fin_s + (24 * 3600 - $debut_s) ; } if ($bleu >= 180) { $cout = $cout_3mn + ($bleu - 180)*(14/60) ; } else { $cout = $cout_3mn ; } } elsif ($fin_s > $lim_tot) { # Zone bleue puis rouge $rouge = $fin_s - $lim_tot ; $bleu = $lim_tot - $fin_s ; if ($total < 180) { $cout = $cout_3mn ; } elsif ($bleu > 180) { $cout_bleu = ($bleu - 180)*(14/60) ; $cout_rouge = $rouge * (28/60) ; $cout = $cout_3mn + $cout_rouge + $cout_bleu ; } else { $cout_bleu = 0 ; $cout_rouge = ($total - 180) * (28/60) ; $cout = $cout_3mn + $cout_rouge + $cout_bleu ; } } else { # Zone rouge puis bleue $rouge = $lim_tard - $debut_s ; $bleu = $fin_s - $lim_tard ; if ($total < 180) { $cout = $cout_3mn ; } elsif ($rouge > 180) { $cout_rouge = ($rouge - 180) * (28/60) ; $cout_bleu = $bleu * (14/60) ; $cout = $cout_3mn + $cout_rouge + $cout_bleu ; } else { $cout_rouge = 0 ; $cout_bleu = ($total - 180) * (14/60) ; $cout = $cout_3mn + $cout_rouge + $cout_bleu ; } } ## Afficher et sauvegarder le cout { use integer ; $francs = $cout / 100 ; $cts = $cout - ($francs * 100) ; if ($cts < 10) {$cts = "0$cts" ;} print "\t\t\tCout\t $francs,$cts F\n" ; if ($cout > 5000 || $cout < 74) { die "Hum, ca sent le bug a plein nez ; je ne sauvegarde pas...\n" ; } if (!(-e $cout_file)) { open (OUT, ">>$cout_file") ; print OUT 0 ; close (OUT) ; } open (IN, $cout_file) ; while () { $cout_total = $_ ; } close (OUT) ; unlink($cout_file) ; $cout_total += $cout ; open (OUT, ">>$cout_file") ; print OUT $cout_total ; close (OUT) ; }