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>';
}