• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

isdnrep ausgabescript!

Ich habe mir aus einem alten rechnen nen linux 9.1 Router gebastelt was auch wunderbar funktioniert, ins internet gehe ich mit isdn was acuh geht.

Nun mein Problem ist das ich mit smpppd via brownser online gehe und dann ein script haben möchte, welche mir die Onlinestunden des ganzen Monats anzeigt. Da ich surftime 120 von t-online habe und meine Zeit unter kontrolle haben möchte.

isdnrep funktioniert und listet auch die gesamte onlinezeit auf sowie alles andere was so über isdn gibt (ausgehende eingehende rufnummern...)

Mein Problem ist nun das ich ein Perlscript gefunden habe, aber kein Perl kann und das script bei mir nicht läuft, bzw. da ich linux noch net solange habe ich gar net weiss wo das hinmuss welche rechte man braucht etc.


Code:
#!/usr/bin/perl
#########################################################################
#
# ipppstatus.pl (2te Ausgabe)
#
# Zeigt Onlinezeit, Kosten und übertragene Bytes (im lesbaren Format) an
# 4.10.2003 - Mike Reiche (Rebell)
# veröffentlich für www.debianforum.de
#
# Verwendete Versionen:
# perl v5.6.1
# isdnrep 4.57
# auf Debian Woody
#
#########################################################################

# isdnrep, gibt detailierte Informationen über die ISDN Verbindung aus
# -s %X (nur Uhrzeiten ausgeben)
# -o (nur ausgehende Verbindungen)
# -t (Ausgabe auf ein Datum beschränkt)
$timereport = "isdnrep -s %X -o -t ";

# Maximale Onlinezeit im Monat Tag (HH:MM:SS)
# Wenn hier kein Wert angeben wird, gibts ein "Illegal division by zero"
$max_month_time = "60:00:00"; # 60 Stunden (T-Online surftime 60)

if ($ARGV[0] eq "info") {
   if ($ARGV[1] eq "monat") {
      $showme = 2;
   } elsif ($ARGV[1] eq "verbindungen") {
      $showme = 3;
   } else {
      $showme = 1;
   }
   showOnlineTime($showme);
} else {
   showHelp();
}

exit;

sub showHelp {
   print "usage:\tipppstatus.pl info [INFO]\n\n";
   print "INFO:\n";
   print "\tmonat\t\tzeigt Verbindungsinformationen für diesen Monat an\n";
   print "\ttag\t\tzeigt Verbindungsinformationen für heute an\n";
   print "\tverbindungen\tzeigt die Zeiten der Verbindungsaufbauten an\n";
   print "\n";
}
# Zeigt die Online-Verbindungen an
sub showOnlineTime {
   # Kann sein 1,2 oder 3
   my ($showme) = @_;
   my ($sek, $min, $std, $mtag, $mon, $jahr, $wtag, $stag, $isstd)=localtime();
   $jahr += 1900;
   $mon += 1;

   my $connections_only = 0;
   my $month_only = 0;
   my $have_found = 0;
   my $next_site = 0;

   # Verbindungen für den Monat
   if ($showme == 2) {
      print "\nVerbindungsinformationen für diesen Monat ($mon/$jahr)\n\n";
      $month_only = 1;
      $timereport_string = "$mon/$jahr";

   # Ansonsten Verbindungen für den Tag
   } else {
      if ($showme == 3) {
         print "\nVerbindungsaufbauten Heute ($mtag.$mon.$jahr)\n\n";
         $connections_only = 1;
      } else {
         print "\nVerbindungsinformationen Heute ($mtag.$mon.$jahr)\n\n";
      }
      $timereport_string = "$mtag/$mon/$jahr";
   }
   # Folgende Pipe funktioniert nicht unter Verwendung von Sudo
   my $cmd = "$timereport $timereport_string";
   open TIMEREPORT, "$cmd |";
   while (<TIMEREPORT>) {
      chomp;
      $zeile = $_;
      # Die Information wurde gefunden, wir brauchen aber erst die übernächste Zeile
      if ($have_found) {
         $next_site++;
      }
      if ($next_site == 2) {
         # Alle Leerzeichen in ":" umwandeln
         $zeile =~ s/\s+/:/ig;
         @daten = split(":",$zeile);
         $provider = $daten[0];
         $rufe = $daten[1];
         $stunden = int($daten[3]);
         $minuten = int($daten[4]);
         $sekunden = int($daten[5]);
         $kosten = $daten[6];
         $waehrung = $daten[7];
         $bytes_in = $daten[9];
         $bytes_in_unit = $daten[10];
         $bytes_out = $daten[11];
         $bytes_out =~ s/O=//ig;
         $bytes_out_unit = $daten[12];
         $max_zeiten_sekunden = getSeconds($max_month_time);
         if ($month_only) {
            $date_string = "im Monat";
            $divisor = 1;
            # String der Onlinzeit
            $zeiten_string = $stunden . ":" . $minuten . ":" . $sekunden;
            $zeiten_sekunden = getSeconds($zeiten_string);
            $zeiten_prozent = int(($zeiten_sekunden * 100) / $max_zeiten_sekunden);
         } else {
            $date_string = "am Tag";
            $divisor = 30;
         }
         $max_zeiten_sekunden = $max_zeiten_sekunden / $divisor;
         $max_zeiten_string = getTimeString($max_zeiten_sekunden);
         @max_zeiten = split(":",$max_zeiten_string,3);
         $max_stunden = int($max_zeiten[0]);
         $max_minuten = int($max_zeiten[1]);
         $max_sekunden = int($max_zeiten[2]);
         if ($stunden >= $max_stunden) {
            $diff_stunden = $stunden - $max_stunden;
            if ($minuten >= $max_minuten) {
               $diff_minuten = $minuten - $max_minuten;
               if ($sekunden >= $max_sekunden) {
                  $diff_sekunden = $sekunden - $max_sekunden;
               }
            }
         }
         # Zeiten in lesbares Format umwandeln
         $stunden = makeDigit($stunden);
         $minuten = makeDigit($minuten);
         $sekunden = makeDigit($sekunden);
         $max_stunden = makeDigit($max_stunden);
         $max_minuten = makeDigit($max_minuten);
         $max_sekunden = makeDigit($max_sekunden);
         # Ausgabe Zeichenketten zusammenstellen
         print "Provider: $provider ($rufe ausgehende Anrufe)\n";
         $online_string = "$stunden\:$minuten\:$sekunden von maximal $max_stunden\:$max_minuten\:$max_sekunden $date_string";
         # Falls ein Überlauf vorhanden ist
         $to_much = "";
         if ($diff_stunden > 0 || $diff_minuten > 0 || $diff_sekunden > 0) {
            $diff_stunden = makeDigit($diff_stunden);
            $diff_minuten = makeDigit($diff_minuten);
            $diff_sekunden = makeDigit($diff_sekunden);
            $to_much = " (zu $diff_stunden\:$diff_minuten\:$diff_sekunden überschritten)";
         } elsif ($month_only) {
            $to_much = " ($zeiten_prozent\% verbraucht)";
         }
         $online_string .= $to_much;
         print "Onlinezeit: $online_string\n";
         print "Verursachte Kosten: $kosten $waehrung\n";
         print "Empfangende Daten: $bytes_in $bytes_in_unit\n";
         print "Gesendete Daten: $bytes_out $bytes_out_unit\n";
         last;
      }
      # Finde die erste Verbindungszeit in der Liste
      if ($zeile =~ /^\d{2}\:\d{2}\:\d{2}/ && $connections_only) {
         print "$zeile\n";

      # Liste ist zu Ende
      } elsif ($zeile =~ /^----/ && $connections_only) {
         $connections_only = 0;
         last;

      # Finde die Zeit der ausgehenden Anrufe beim Provider
      } elsif ($zeile =~ /Outgoing calls \(calling\:\)/ig) {
         $have_found = 1;
      }
   }
   close TIMEREPORT;
}

sub makeDigit {
   my ($digit) = @_;
   if (int($digit) < 9) {
      $digit = "0" . $digit;
   }
   return $digit;
}

sub getSeconds {
   my ($time_string) = @_;
   my @zeiten = split(":",$time_string,3);
   my $stunden = $zeiten[0];
   my $minuten = $zeiten[1];
   my $sekunden = $zeiten[2];
   my $sekunden_gesamt = ($stunden * 3600) + ($minuten * 60) + $sekunden;
   return $sekunden_gesamt;
}

sub getTimeString {
   my ($seconds) = @_;
   my $stunden = int($seconds/3600);
   my $rest_zeit = $seconds % 3600;
   my $minuten = int($rest_zeit/60);
   my $rest_zeit = $seconds % 60;
   my $sekunden = $rest_zeit;
   my $time_string = makeDigit($stunden) . ":" . makeDigit($minuten) . ":" . makeDigit($sekunden);
   return $time_string;
}

Meine Perl version: 5.8.3
Apache2 version: 2.0.49

Mein wünsch wäre es wenn ihr mir nun sagt wie ich es hinbekomme oder ein ähnliches Script habt...

Über die Suchenfunktion im Forum habe ich leider nix gefunden!!



mfg r4ng3r
 
Oben