Tools:NutzerZeit
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>'; }