Tools:NutzerZeit

Aus Delixs
Version vom 3. August 2005, 21:43 Uhr von Schoffer (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Uberarbeiten Diese Seite sollte nochmals überarbeitet werden. Eine Begründung befindet sich in der Regel unter Diskussion (oben).

Anzeige der Arbeitszeit der Nutzer

los gehts...

Das Script

heisst arbzeit.cgi sollte nach

/usr/www/secure/admin

kopiert werden.

Wenn Sie einen Router verwenden, dann muss die Router-IP an der entsprechenden Stelle im script eingetragen werden.

Sind mehrere Netzwerkarten im Rechner, werden die Subnetze aufgelistet.

#!/usr/bin/perl
use strict;
use CGI qw/:standard/;
# damit es auch als HTML-Seite ausgegeben wird
print "Content-type: text/html\n\n";

# Bemerkungen:
# Frei nach uproxy.cgi von Rüdiger Kukula
# umgeschrieben von Jörg Fiebig
# unter Mithilfe und vielen Anregungen  von Hans-Dietrich Kirmse
# Es wird nur angezeigt, wenn der Nutzer mit seinem Home verbunden wurde - also Anmeldezwang herrscht
# Es wurde unter XP zur Zufriedenheit getestet
# Unter W2000 gibt es ständig Ab- und Anmeldungen
# die ich hiermit eliminieren wollte - dazu gibt es
# die Variablen $Kurzzeit und $minanmeldedauer
# Win2000 Nutzer sollten mit diesen etwas experimentieren!
#
# ach so, es kann nach /home/www/cgi-bin ist aber für:
# /usr/www/secure/admin (dann klapps auch mit dem Hintergrund) programmiert
# Test-Aufruf http://arktur/cgi-bin/arbzeit.cgi (wenn es dort liegt)
# oder besser  http://arktur/admin2/arbzeit.cgi (mit Einbindung ins admin2-Menü)
#
# Vergessen Sie nicht die folgenden 4 Voreinstellungen anzupassen!

# Voreinstellungen:
# in die Variable $versteckt einfach die User eintragen, die nicht angezeigt werden sollen
my $versteckt="lehrer direktor ";
# Achtung fiebig ist in fiebigj enthalten, würde ich fiebigj unter versteckt eintragen,
# dann wird auch fiebig nicht angezeigt!
# Dies sollte bei den Namenskonventionen von Arktur nicht vorkommen - wenn Sie aber
# per Hand etwas geändert haben ..... !

#Name und Ort der Log-Datei hier ablegen:
my $logdatei="/var/log/samba/smblogin.log";

# my $logdatei="/var/log/samba/log.smbd";
# wäre die Datei mit den ausführlichen Meldungen, die mit diesem
# Script nun auch ausgewertet werden kann
#
# Bei Leerzeichen in den Computernamen *MUSS*
# zwingend die untere Vereinbarung genutzt werden

#IP des Routers, da man dessen Subnetz ja nicht mit anzeigen will
# Bsp.: (bei mir)
# my $routerip="192.168.50.1";
# kein Router, dann kann man die Variable leer lassen
my $routerip="";

# Kurzzeitdauer (Dauer, die man abgemeldet sein kann, ohne dass das Script sie berücksichtigt)
my $Kurzzeit = 3;
# Mindest-Anmeldedauer (falls man Kurzanmeldungen ausfiltern will)
my $minanmeldedauer = 0;

# Ãœbernahme der Teilnetznummer durch den Aufruf:
# z.B.: http://arktur/admin2/arbzeit12.cgi?teilnetz=1
my $teilnetz = param('teilnetz');

# die Variable Teilnetz wird durch das Script ermittelt!
# sie enthält die ersten drei Zahlen der IP der vorhandenen Netzwerkkarten)
# ---- Rest nur zur Erinnerung des Autors --- bitte ignorieren
# if ($teilnetz eq '') {$teilnetz = "192.168.0.1"}
# Es wird nach der kompletten IP gegangen!
# ggf. sind für $teilnetz hier weitere IPs einzugtagen

# weitere Vereinbarungen

my $AnzDatum = param('AnzDatum');
if ($AnzDatum !~ /\./) {$AnzDatum = '.';}

# Der Dateiname wird hier festgelegt:
my $adresse = $ENV{SCRIPT_NAME};

# Hier werden die Dateiendungen für die rotierten log-Dateien festgelegt
# normalerweise wird die Logdatei aber nicht rotiert!
my @dateien = ();

my $Kopf = <<"ENDHEADER";

<HTML>
<HEAD>
<TITLE>Anmeldungen am Homeverzeichnis auf Arktur</TITLE>
</HEAD>
<BODY background="whttxtr2.jpg">
<center><H1><a href="$adresse">Arbeitszeiten der Nutzer</a></H1>
ENDHEADER

# zum Einfügen der Links die folgenden Zeilen freigeben

# Seitenende mit Zurücklink, bei Einbindung in admin2-Menü

 my $fuss = <<Endfuss;
 <HR>
 <SMALL>arbzeit 1.2 - Zuletzt geändert am: 01.08.2005 © Jörg Fiebig</SMALL>
 <BR>
 <a href=\"index.htm\" target=_top><img src=\"back.gif\" border=0> Zurück </a><br>
 </BODY></HTML>
Endfuss

# Endfuss muss ganz links stehen (ohne Leerzeichen)
# und diese dann auskommentieren mit # am Anfang

# Seitenende ohne Zurücklink
# my $fuss = <<Endfuss;
# <HR>
# <SMALL>arbzeit 1.2 - Zuletzt geändert am: 01.08.2005 © Jörg Fiebig</SMALL>
# <BR>
# </BODY></HTML>
# Endfuss

####  Programmm

my @Merkliste=();
my @Endliste=();

# Ausgabe der Ãœberschrift
print $Kopf;

# Ermitteln der vorhandenen Subnetze per ifconfig
&Subnetze_ermitteln;

@Merkliste = &auswerten ($logdatei);

# sortieren nach IP und Computername, damit Kurzanmeldungen gefiltert werden können
my $psort=2;
@Merkliste = &sortiere_daten(@Merkliste);

# Kurzzeitanmeldungen <2min zusammenfassen
@Endliste = &kurzanmeldung_filtern (@Merkliste);

# Sortieren nach Datum und der Anmeldezeit
$psort=3;
@Endliste = &sortiere_daten(@Endliste);

#hier noch eine Nutzersortierung
@Endliste = &sortiere_wahl(@Endliste);

# Ausgabe der Anzeige
&Ausgabe(@Endliste);

###### Ende des Programmes

# Unterprogramme:

sub auswerten
{

  my $datei = @_[0];
  my @dat =();
  my $logdateibereit="ja";
  my $weg='';
  my $abgemeldet;
  my $Merkzeilenzahl;
  my ($anDatum,$anZeit,$anPCname,$anPCname2,$anIP,$Username,$BS);
  my ($abDatum,$abZeit2,$abPCname,$abPCname2,$connect,$from,$abService,$abIP,$abBS);
  my ($line,$abZeit,$anDatum1,$vorher2,$antag,$anmonat,$ipkonflikt);
# Variablen für smb.log
  my ($einenummer,$meldung1,$leerzeichen,$PCname,$connect,$to,$service,$anService,$initially,$as,$user,$anuid,$angud,$anpid);
  my ($b1,$b3,$b4,$b5,$b6,$closed,$connection,$abto,$service,$b13,$b14);
  my ($linenew,$vorher,$linenew2,$PCname2,$VerDat);


# erstes Einlesen des Samba-Logs falls es da und bereit ist
  open (FH,'<'.$datei) or $logdateibereit="nein";

  if ($logdateibereit eq "nein")
   {
     &datei_nicht_bereit;
   }
  else
   {
     # ab mit der Datei in den Speicher
     my @lines = <FH>;
     # und wieder schließen
     close (FH);

     chomp @lines;

    # nun noch ein zweites Mal in den Speicher holen, um hier die Abmeldezeit zu finden
     open (FJ,'<'.$datei);
     my @lines2 = <FJ>;
     close (FJ);
     chomp @lines2;

    # Variable zum Merken, ob ein Nutzer abgemeldet ist
     $abgemeldet="nein";
    # für alle Zeilen im eingelesenen Log-File
    #Zeilenzahl der Liste
     $Merkzeilenzahl=0;
     foreach $line(@lines)
      {
# Da eine Zeile mit Anmeldung vor der Abmeldung folgen muss kann die in
# der zweiten Abmeldesuchdatei ja schon weg.
        $weg=shift @lines2;

# falls es sich um die smblogin.log handelt
      if ($logdatei eq "/var/log/samba/smblogin.log")
      {

# Wenn die Zeile unten stehenden Text enthält und der Servie = dem Nutzernamen ist!
        if ($line=~ /connect/)
           {($anDatum,$anZeit,$Username,$connect,$from,$anPCname,$anIP,$BS) = split(/ /,$line);
# Arktur 4: Aufsplitten der Zeile - die Variablennamen dienen nur der Bezeichnung der einzelnen Worte und werden nicht alle verwendet!
# leider hat dann mal einer PC-Namen mit Leerzeichen vergeben, deshalb das folgende Konstrukt:
# welches aber an sich unnötig ist, da das erzeugende preexec-Script den Rechnernamen falsch behandelt!
# aber vielleicht ändert sich das ja mal nach der beta40d
            if ($anIP !~ /\(/)
               {($anDatum,$anZeit,$Username,$connect,$from,$anPCname,$anPCname2,$anIP,$BS) = split(/ /,$line);
                 $anPCname=$anPCname.'_'.$anPCname2;
               }
# für Arktur 3.5 ist mir der Aufbau der smblogin.log nicht bekannt !
#           Aufsplitten der Zeile - der Unterschied der smbd-Versionen wird hier ausgeglichen !
            else  { ($anDatum,$anZeit,$einenummer,$meldung1,$leerzeichen,$PCname,$anIP,$connect,$to,$service,$anService,$as,$user,$Username,$anuid,$angud,$anpid) = split(/ /,$linenew);}
# nur hh:mm
            $anZeit=substr($anZeit,0,5);
# Ausgabe der Daten der Anmeldung in eine Merkliste
            push @dat,$Username.' '.$anPCname.' '.$anIP.' '.$anDatum.' '.$anZeit;
            $Merkzeilenzahl++;
# merken, dass er noch nicht abgemeldet ist
            $abgemeldet="nein";
# für alle übriggebliebenen Zeilen in der 2. Merke-Version des Log-Files
            foreach $line(@lines2)
              {
# wenn noch keine Abmeldung festgestellt wurde
              if ($abgemeldet eq "nein")
                 {
# und man die erste Zeile mit Abmeldung des Nutzers findet
                     if ($line=~ /logout/)
                    {
# dann wird wieder aufgesplittet
                    ($abDatum,$abZeit2,$abService,$connect,$from,$abPCname,$abIP,$abBS) = split(/ /,$line);
# leider hat dann mal einer PC-Namen mit Leerzeichen vergeben, deshalb das folgende Konstrukt:
                    if ($abIP !~ /\(/)
                           {($abDatum,$abZeit,$Username,$connect,$from,$abPCname,$abPCname2,$abIP,$abBS) = split(/ /,$line);
                           $abPCname=$abPCname.'_'.$abPCname2;
# Ein Vergleich der IPs war ungünstig, da diese sich irgendwie ändern können - deshalb der PCname-Vergleich
                           }
# Wenn der abgemeldete Service dem angemeldetet Nutzernamen entspricht und die IPs gleich sind
                    if ($abService eq $Username and $anPCname eq $abPCname)
                       {
# dann wird die Zeit wieder schön gemacht
                       $abZeit=substr($abZeit2,0,5);
# geschaut, ob die IPs auch stimmem
                       $ipkonflikt='';
                       if ($anIP ne $abIP) {$ipkonflikt='!';}
# und die Abmeldezeit in das entsprechende Element der Liste
                       $dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' '.$abZeit.$ipkonflikt."\n";
# und sich gemerkt, dass er abgemeldet wurde
                       $abgemeldet="ja";
# und raus aus der Schleife
                       last;
                       }
                    }
# Falls ein Tag vergangen ist,
# soll beendet ausgegeben werden
                    else
                    {
                     if (substr($line,0,10) cmp $anDatum )
                       {
# Beendet in die Merkliste schreiben
                        $dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' abgeschaltet'."\n";
# und sich gemerkt, dass er sozusagen abgemeldet wurde
                           $abgemeldet="ja";
# und raus aus der Schleife
                           last;
                       }
                    }
                 $vorher2=$line;
                 }
              }
# jetzt sind wir mit dem zweiten Durchlauf fertig
# sollte bei der ganzen Sucherei keine Abmeldung festgestellt worden sein,
# so wird "aktiv" in die Liste geschrieben
              if ($abgemeldet eq "nein") {$dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' aktiv'."\n";};
# könnte man das noch schneller machen?

# Emde der "if connect ist drin" - Schleife
           }
      }
#
# das wars, wenn es die smblogin.log war
#
# wenn nicht, dann versuchen wir es mit der login.smbd
#
      else
#
# das ganze nochmal für die login.smbd
# (für die Clients mit Leerzeichen im Namen!
# oder Arktur 3.5
# oder Leute, die nicht so weit zurückblicken wollen
      {
# also wieder von vorn!
        $linenew=$vorher.$line;
# Wenn die Zeile unten stehenden Text enthält und der Servie = dem Nutzernamen ist!
        if ($line=~ /connect to service (\w+) (initially )?as user (\w+)/ and $1 eq $3)
        {
# Arktur 4: Aufsplitten der Zeile - die Variablennamen dienen nur der Bezeichnung der einzelnen Worte und werden nicht alle verwendet!
            if ($2 eq "initially ")
            { ($anDatum,$anZeit,$einenummer,$meldung1,$leerzeichen,$anPCname,$anIP,$connect,$to,$service,$anService,$initially,$as,$user,$Username,$anuid,$angud,$anpid) = split(/ /,$linenew);
# dummerweise hat jemand Rechnernamen mit Leerzeichen erstellt - deshalb diese folgende Konstruktion
                if ($connect ne "connect")
                {($anDatum,$anZeit,$einenummer,$meldung1,$leerzeichen,$anPCname,$anPCname2,$anIP,$connect,$to,$service,$anService,$initially,$as,$user,$Username,$anuid,$angud,$anpid) = split(/ /,$linenew);
                  $anPCname=$anPCname.'_'.$anPCname2;
                }
            }
# Arktur 3.5: Aufsplitten der Zeile - der Unterschied der smbd-Versionen wird hier ausgeglichen !
            else  { ($anDatum,$anZeit,$einenummer,$meldung1,$leerzeichen,$anPCname,$anIP,$connect,$to,$service,$anService,$as,$user,$Username,$anuid,$angud,$anpid) = split(/ /,$linenew);}
# nur hh:mm
            $anZeit=substr($anZeit,0,5);
# ohne die [] rundrum
            $anDatum=substr($anDatum,1,10);
# Ausgabe der Daten der Anmeldung in eine Merkliste
            push @dat, $Username.' '.$anPCname.' '.$anIP.' '.$anDatum.' '.$anZeit;
            $Merkzeilenzahl++;
# merken, dass er noch nicht abgemeldet ist
            $abgemeldet="nein";
# für alle übriggebliebenen Zeilen in der 2. Merke-Version des Log-Files
            foreach $line(@lines2)
              {
# wenn noch keine Abmeldung festgestellt wurde
              if ($abgemeldet eq "nein")
                 {
                 $linenew2=$vorher2.$line;
# und man die erste Zeile mit Abmeldung des Nutzers von seinem Home findet
                     if ($line=~ /closed connection to service $Username/)
                    {
# dann wird wieder aufgesplittet
                    ($b1,$abZeit2,$b3,$b4,$b5,$abPCname,$abIP,$closed,$connection,$abto,$service,$abService,$b13,$b14) = split(/ /,$linenew2);
# und auch hier muss wieder nachgeschaut werden, wenn der Rechnername ein Leerzeichen enthält.
                    if ($closed ne "closed")
                       {
                        ($b1,$abZeit2,$b3,$b4,$b4,$abPCname,$abPCname2,$abIP,$closed,$connection,$abto,$service,$abService,$b13,$b14) = split(/ /,$linenew2);
                         $abPCname=$abPCname.'_'.$abPCname2;
                       }
# Wenn der abgemeldete Service dem angemeldetet Nutzernamen entspricht und die IPs gleich sind
                    if ($abService eq $Username and $anPCname eq $abPCname )
                       {
# dann wird die Zeit wieder schön gemacht
                        $abZeit=substr($abZeit2,0,5);
# geschaut, ob die IPs auch stimmem
                        $ipkonflikt='';
                        if ($anIP ne $abIP) {$ipkonflikt='!';}
# und die Abmeldezeit in das entsprechende Element der Liste
                        $dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' '.$abZeit.$ipkonflikt."\n";
# und sich gemerkt, dass er abgemeldet wurde
                        $abgemeldet="ja";
# und raus aus der Schleife
                        last;
                       }
                    }
# Falls der Server aber vor der Abmeldung des Users heruntegefahren wurde,
# soll beendet ausgegeben werden
                 if ( $line=~ /smbd version/ )
                    {
# Beendet in die Merkliste schreiben
                     $dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' beendet'."\n";
# und sich gemerkt, dass er sozusagen abgemeldet wurde
                     $abgemeldet="ja";
# und raus aus der Schleife
                     last;
                    }
# Falls ein Tag vergangen ist,
# soll beendet ausgegeben werden
                     $VerDat=substr($line,1,10);
                     if ($VerDat =~ /\//)
                              {
                        if ($anDatum ne $VerDat)
                          {
# Test                       print '-'.substr($line,1,10).'-'.$anDatum.'-'."<br>";
# Beendet in die Merkliste schreiben
                          $dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' abgeschaltet'."\n";
# und sich gemerkt, dass er sozusagen abgemeldet wurde
                              $abgemeldet="ja";
# und raus aus der Schleife
                              last;
                          }
                         }
                 $vorher2=$line;
                 }
              }
# jetzt sind wir mit dem zweiten Durchlauf fertig
# sollte bei der ganzen Sucherei keine Abmeldung festgestellt worden sein,
# so wird "aktiv" in die Liste geschrieben
              if ($abgemeldet eq "nein") {$dat[$Merkzeilenzahl-1]=$dat[$Merkzeilenzahl-1].' aktiv'."\n";};
# könnte man das noch schneller machen?
          }
      $vorher=$line;
      }
# hier endet die ganze Sache zur logdateibearbeitung!
      }
# Zeilenvorschübe entfernen
  chomp (@dat);
  return @dat;
  }

}

sub kurzanmeldung_filtern
{
# Filtern der Kurzanmeldungen
# Variablen festlegen
# die Zeile in der Merkliste
my $mz=0;
# Noch haben wir uns keine Zeit gemerkt, also -
my $MerkeAnmeldezeit="-";
my  @dat = @_;
my  @dat2 =();
my  ($Nutzername,$CompName,$IPNummer,$Datum,$Anmeldezeit,$Abmeldezeit);
my  ($FNutzername,$FCompName,$FIPNummer,$FDatum,$FAnmeldezeit,$FAbmeldezeit);
my  $letzteab ='';
my  ($anzh,$anzm,$anzs,$abzh,$abzm,$abzs,$fanzh,$fanzm,$fanzs,$fabzh,$fabzm,$fabzs,$dauer,$unterschied);
my  ($AusgabeAnzeit,$AusgabeAbzeit,$line);

# für alle Zeilen in der Merkliste
foreach $line(@dat)
  {
# Splitten wir die aktuelle und
    ($Nutzername,$CompName,$IPNummer,$Datum,$Anmeldezeit,$Abmeldezeit) = split(/ /,$dat[$mz]);
# die nächste Zeile auf
    ($FNutzername,$FCompName,$FIPNummer,$FDatum,$FAnmeldezeit,$FAbmeldezeit) = split(/ /,$dat[$mz+1]);
# und merken uns, dass wir dann in der nächsten weitermachen müssen
    $mz++;
# nun werden die Zeitangaben zerlegt
    $letzteab=$Abmeldezeit;
    ($anzh,$anzm,$anzs) = split(/:/,$Anmeldezeit);
    ($abzh,$abzm,$abzs) = split(/:/,$Abmeldezeit);
    ($fanzh,$fanzm,$fanzs) = split(/:/,$FAnmeldezeit);
    ($fabzh,$fabzm,$fabzs) = split(/:/,$FAbmeldezeit);
# und die Dauer der Verbindung berechnet
    $dauer= abs (($abzh*60+$abzm)-($anzh*60+$anzm));
# und der Unterschied zwischen zwei aufeinanderfolgenden Ab- und Anmeldungen
# der auch negativ sein kann
    $unterschied = abs (($fanzh*60+$fanzm)-($abzh*60+$abzm));
   if (
# Wenn der Nutzer am selben Rechner am Selben Tag weniger als "Kurzzeit" min ausgeloggt war
# Compname kann hier kein Leerzeichen mehr enthalten!
        (
        $Nutzername eq $FNutzername and $CompName eq $FCompName and $Datum eq $FDatum and $unterschied < $Kurzzeit
        )
       or
# oder wenn die Dauer der Verbindung des Nutzers kleiner als die minimale Anmeldedauer war
        (
          ($Nutzername ne $FNutzername or $IPNummer ne $FIPNummer or $Datum ne $FDatum) and $dauer < $minanmeldedauer)
      )
     {
# und die Anmeldezeit noch nicht gemerkt wurde
       if ($MerkeAnmeldezeit eq "-")
            {
# dann merken wir uns sie
          $MerkeAnmeldezeit=$Anmeldezeit;
          }
# und geben Sie der Ausgabezeit
       $AusgabeAnzeit=$MerkeAnmeldezeit;
     }
   else
     {
# falls wir uns keine Anmeldezeit gemerkt haben, holen wir sie uns
       if ($MerkeAnmeldezeit eq "-")
          {
          $AusgabeAnzeit=$Anmeldezeit;
          }
# und auch die aktuelle Abmeldezeit
       $AusgabeAbzeit=$Abmeldezeit;
# und da das ausgegeben wird, merken wir uns, dass wir uns wieder noch nichts gemerkt haben
       $MerkeAnmeldezeit="-";
# und natürlich geben wir das jetzt in eine weitere Endliste aus
       push @dat2, $Nutzername.' '.$CompName.' '.$IPNummer.' '.$Datum.' '.$AusgabeAnzeit.' '.$AusgabeAbzeit."\n";
     }
   }
#
 return @dat2;
}

sub Ausgabe
{
 my @dat = @_;
 my ($Nutzername,$CompName,$IPNummer,$Datum,$Anmeldezeit,$Abmeldezeit,$dDatum,$line,$IPanfang,$ip1,$ip2,$ip3,$ip4,$ausgabenanzahl);
 my ($MerkNname,$MerkCName,$MerkDatum,$MerkAzeit);
 $MerkNname='-';
 $MerkCName='-';
 $MerkDatum='-';
 $MerkAzeit='-';
# Ausgabe der HTML-Datei
# Wird schon im Prog. ausgegeben, da die Subnetzauswahl darunter passieren soll
# Wenn die Tagesabfrage wieder reinkommt, dann die beiden folgenden Leerzeilen auch wieder rein!
 print "Zu folgenden Zeiten waren die genannten Nutzer";
 if (length($AnzDatum) eq 10) { print ' am ',$AnzDatum;}
 print " mit ihren Homeverzeichnissen auf Arktur verbunden:<br>";
 print '<font size = "1">';
 print "(aktive Verbindungen - <font color = green> grün </font>/ Unterschiede zwischen Anmelde- und Abmelde-IP - <font color = blue>blau</font> / kein Abmelde-Eintrag - <font color = red>rot</font>)";
 print '</font>';
 print "<HR></center>";
 print '<table border="1" width="100%"><tr BGCOLOR="#D0D0D0"><th>';
 print 'Nutzer</th><th>';
 print 'Computer ';
 print '- IP-Nummer</th><th>';
 print 'Datum</th><th>';
 print 'von</th><th>';
 print 'bis</th></tr>'."\n";
 $ausgabenanzahl=0;
 foreach $line(@dat)
   {
 # Splitten wir die Endliste wiederum auf und
     ($Nutzername,$CompName,$IPNummer,$Datum,$Anmeldezeit,$Abmeldezeit) = split(/ /,$line);
 # Datum in deutsche Form umsortieren - geht hier wegen der Sortierung nicht
     $dDatum=substr($Datum,8,2).".".substr($Datum,5,2).".".substr($Datum,0,4);
 # IP-Nummer ohne Klammern
     $IPNummer=substr($IPNummer,1);
     $IPNummer=reverse($IPNummer);
     $IPNummer=substr($IPNummer,1);
     $IPNummer=reverse($IPNummer);
# nur die ersten 3 Zahlen zur Erkennung des Subnetzes
     ($ip1,$ip2,$ip3,$ip4) = split(/\./,$IPNummer);
     $IPanfang = $ip1.".".$ip2.".".$ip3;
# geben es nun endlich aus, falls
# die Subnetznummer erwünscht ist
# und in $versteckt nicht der Username enthalten ist
    if ((  $teilnetz =~ $IPanfang ) and ($versteckt !~ $Nutzername) and ($dDatum =~ $AnzDatum))
    {
     if ($MerkNname.$MerkCName.$MerkAzeit ne $Nutzername.$CompName.$Anmeldezeit)
        {
        print "<tr><th>",$Nutzername,"</th><th>",$CompName," - ",$IPNummer,"</th><th>",$dDatum,"</th><th>",$Anmeldezeit,"</th><th>";
        if ($Abmeldezeit =~ "aktiv")
           {
# aktive Verbindungen grün markieren!
            print "<font color=green>",$Abmeldezeit,"</font>";
           }
         else
           {
           if ($Abmeldezeit =~ "!")
              {
# IP Veränderungen blau markieren!
              print "<font color=blue>",$Abmeldezeit,"</font>";
              }
              else
              {
              if ($Abmeldezeit =~ "abgeschaltet")
                 {
# kein Abmeldeeintrag rot markieren!
                 print "<font color=red>",$Abmeldezeit,"</font>";
                 }
                 else
                 {
                 print $Abmeldezeit
                 }
                }
            }
     print "</th><tr>\n";
     $ausgabenanzahl++
        }
    }
    $MerkNname=$Nutzername;
    $MerkCName=$CompName;
    $MerkDatum=$Datum;
    $MerkAzeit=$Anmeldezeit;
   }
# Die Tabelle wird geschlossen
 print "</table><br>";
 if ($ausgabenanzahl == 0)
   {
     print "<center> Für das gewählte Teilnetz ",$teilnetz," liegen";
     if ($AnzDatum ne /\./) {print " für den ",$AnzDatum;}
     print " keine Anmeldungen vor.</center><br>";
   }
   else
   {
     print $ausgabenanzahl," Einträge <br>";
   }
# Ausgabe Fusszeile und ggf. zurück-Link
 print $fuss;
}

sub sortiere_daten
{
# übernommen von H.-D. Kirmse
 my @dat = @_;
 my @dat2 = ();
 my @tmp = ();
 my $sort = 0;

 $sort=$psort;
 if ($sort==1)
  { @dat = sort nutzer @dat }
 if ($sort==2)
  { @dat = sort vergleich_ip_computername @dat }
 if ($sort==3)
  { @dat = sort nach_Datum_anmeldezeit @dat }
 if ($sort==4)
  { @dat = sort nach_ip @dat }
 if ($sort==5)
  { @dat = sort nach_compname @dat }
 if ($sort==6)
  { @dat = sort nach_Datum @dat }
 return @dat
}

sub sortiere_wahl
{
# übernommen von H.-D. Kirmse
 my @dat = @_;
 my @dat2 = ();
 my @tmp = ();
 my $sort = 0;

 my $sort = param('sort');

 if ($sort==1)
  { @dat = sort nutzer @dat }
 if ($sort==2)
  { @dat = sort vergleich_ip_computername @dat }
 if ($sort==3)
  { @dat = sort nach_Datum_anmeldezeit @dat }
 if ($sort==4)
  { @dat = sort nach_ip @dat }
 if ($sort==5)
  { @dat = sort nach_compname @dat }
 if ($sort==6)
  { @dat = sort nach_Datum @dat }
 if ($sort==7)
  { @dat = sort nach_Zustand @dat }
 return @dat
}

#1 nach Nutzer und vom letzten Datum an
sub nutzer
#_time
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
 # meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 return (($temp1[0] cmp $temp2[0]) || ($temp2[3] cmp $temp1[3]))
}

#2
sub vergleich_ip_computername
#_time
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
# meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 return (($temp1[2] cmp $temp2[2]) || ($temp1[1] cmp $temp2[1]))
}

#3
sub nach_Datum_anmeldezeit
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
# meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
# und das Datum ist noch in der Ursprungsschreibweise [2004/10/16 !
 return (($temp2[3] cmp $temp1[3]) || ($temp1[4] cmp  $temp2[4]))
}

#4
sub nach_ip
#_time
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
 # meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 return (($temp1[2] cmp $temp2[2]) || ($temp2[3] cmp $temp1[3]))
}

#5
sub nach_compname
#_time
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
 # meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 return (($temp1[1] cmp $temp2[1]) || ($temp2[3] cmp $temp1[3]))
}

# andersrum als 3
#6
sub nach_Datum
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
 # meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 # und das Datum ist noch in der Ursprungsschreibweise [2004/10/16 !
 return (($temp1[3] cmp $temp2[3]) || ($temp1[4] cmp $temp2[4]) )
}

#7
sub nach_Zustand
{
 my @temp1 = split ' ',$a;
 my @temp2 = split ' ',$b;
 # meine Felder sind Nutzername,CompName,IPNummer,Datum,Anmeldezeit,Abmeldezeit
 return (($temp2[5] cmp $temp1[5]))
}

sub datei_nicht_bereit
{
 print '<BR><center><font size ="7" color="red"><strong>Fehler</strong></font><BR>';
 print "<BR><BR> Logdatei <strong>",$logdatei,"</strong> konnte nicht geöffnet werden!";
 print '<BR><BR> Prüfen Sie, ob sie existiert und "<i>Jeder</i>" Leserechte auf diese Datei hat.</center><BR>';
 print $fuss;
 die;
}

sub Testausgabe
{
 my @dat = @_;
 my $line='';
# print $kopf;
 foreach $line(@dat)
 {
 print $line,"<br>";
 }
}


sub Subnetze_ermitteln
{
 my $line ='';
 my $anzahl = 0;
 my $etherzahl = ();
 my $teilnetze ='';
 my $AktTime = time();
 my $AktDatum = localtime($AktTime);
 my @AktTimeA = ();
 my @ausgabe =();
 my @ausgabetext =();
 my $AktJahr = '';
# Zusammensetzen des aktuellen Datums:
# Eigentlich unnötig, denn ich verwende nur noch das aktuelle Jahr
# aber ich wollte das aktuelle Datum in die Datumsauswahl einsetzen
# doch dann würde eben nur das aktuelle (und nicht alle) angezeigt.
 $AktDatum =~ s/Jan/01/;
 $AktDatum =~ s/Feb/02/;
 $AktDatum =~ s/Mar/03/;
 $AktDatum =~ s/Apr/04/;
 $AktDatum =~ s/May/05/;
 $AktDatum =~ s/Jun/06/;
 $AktDatum =~ s/Jul/07/;
 $AktDatum =~ s/Aug/08/;
 $AktDatum =~ s/Sep/09/;
 $AktDatum =~ s/Oct/10/;
 $AktDatum =~ s/Nov/11/;
 $AktDatum =~ s/Dec/10/;
 @AktTimeA = split(/ +/,$AktDatum);
 $AktDatum = $AktTimeA[2].'.'.$AktTimeA[1].'.'.$AktTimeA[4];
 $AktJahr = $AktTimeA[4];
# Anzeige der Ãœbersicht der Netzschnittstellen
 my @ausgabetext = `/sbin/ifconfig`;
 foreach $line(@ausgabetext)
   {
   # wenn in der Zeile >>inet addr<< dann ein Nichtwortzeichen (:) steht
   # und dann werden die in Klammern stehenden Zahlzeichen (+ für mehrere)
   # die mit . getrennt sind und von einem Leerzeichen (\s) und dem Wort
   # Bcast gefolgt werden, herausgelöst - also die IP der NWK
      if ($line =~ /inet addr\W(\d+.\d+.\d+.)\d+\s Bcast/)
          {
          if ($1 ne $routerip)
             {
               @ausgabe[$anzahl] = $1."x";
               $anzahl++;
             }
         }
    }

# Ermittlung der Variablen $teilnetze, die alle Teilnetze enthält.
 foreach $line(@ausgabe)
   {
     $teilnetze=$teilnetze."-".$line;
   }
 if ($teilnetz eq '') {$teilnetz=$teilnetze};
# Formular zur Eingabe von Subnetz und Datum
 print '<form action="',$adresse,'" method="get"> ';
# Nach einer Vorlage von R. Kukula:
 print 'Wählen Sie die Sortierreihenfolge aus:<br> ';
 print '<input type="radio" name="sort" value="3"> Datum (heute zuerst) ';
 print '<input type="radio" name="sort" value="6"> Datum (heute zuletzt) ';
 print '<input type="radio" name="sort" value="1"> Nutzer ';
 print '<input type="radio" name="sort" value="2"> Computer ';
 print '<input type="radio" name="sort" value="4"> IP ';
 print '<input type="radio" name="sort" value="7"> aktiv ';
# print '<input type="radio" name="sort" value="5"> Anmeldezeit ';
 print '<br>';
 print '<font size = "1">';
 print "  <br>";
 print '</font>';
# Wenn es mehr als ein Teilnetz gibt, dann Ausgabe der Schaltflächen
if ($anzahl > 1)
 {
# Alle Teilnetze erhält man auch beim Anklicken ohne Auswahl!
# ggf. noch die letzte IP-Ziffer eliminieren
 print 'Wenn Sie ein spezielles Teilnetz wünschen, so wählen Sie es aus: <br>';
 foreach $line(@ausgabe)
   {
     print '<input type="radio" name="teilnetz" value="',$line,'">',$line,'   ';
   }
 }
# Eingabemöglichkeit für das Datum:
 print '<br> Wenn Sie ein spezielles Datum wünschen, so geben Sie es hier ein : ';
 print '<input type="date" name="AnzDatum" value="tt.mm.jjjj" size="9"><br>';
 print '<font size = "1">';
 print "(Wenn Sie nichts auswählen wird alles angezeigt.)<br>";
 print '</font>';

# das folgende hat hier eigentlich nichts verloren!
# dient zur Richtigstellung von Datumsfalscheingaben
# und könnte auch nach param(AnzDatum) stehen!

 @AktTimeA = split(/\./,$AnzDatum);
 if ($AnzDatum <= 'tt.mm.jjjj') {$AnzDatum = '.'};
 if (length($AnzDatum) > 2) {
                            if (($AktTimeA[0]) < 10 && (length($AktTimeA[0]) <2) ) {$AktTimeA[0]='0'.$AktTimeA[0];}
                            if (($AktTimeA[1] < 10) && (length($AktTimeA[1]) <2) ) {$AktTimeA[1]='0'.$AktTimeA[1];}
                            if (length($AktTimeA[2]) != 4) {$AktTimeA[2] = $AktJahr};
                            $AnzDatum=$AktTimeA[0].'.'.$AktTimeA[1].'.'.$AktTimeA[2];
                            }
 print '<input type="submit" value="Anzeigen">';
 print '</form>';
}

zurück | Hauptseite