|
|
Zeile 8: |
Zeile 8: |
| los gehts... | | los gehts... |
|
| |
|
| === Das Script === | | == '''Anzeige der Arbeitszeit der Nutzer''' == |
|
| |
|
| heisst '''arbzeit.cgi''' sollte nach
| | Eigentlich handelt es sich um die Anzeige der Zeiten, in denen angemeldete Nutzer mit Ihrem Homeverzeichnis verbunden waren. |
|
| |
| /usr/www/secure/admin
| |
|
| |
|
| kopiert werden.
| | Manche Administratoren wollen wissen, wer gerade im Schulnetzwerk angemeldet ist, wer wann angemeldet war, wieviel jemand das Schulnetzwerk nutzt oder welche Rechner benutzt werden. Da man hiermit nicht nur die Auslastung der Computer prüfen kann, sondern eben auch die Arbeitszeiten der Nutzer nachvollziehen kann, sollten diese natürlich auch davon unterrichtet werden. |
|
| |
|
| Wenn Sie einen Router verwenden, dann muss die Router-IP an der
| | Sie können es in der jeweils aktuellsten Version von den Arktur-Seiten von Jörg Fiebig [http://www.Arktur.hatdichlieb.de] herunterladen. |
| entsprechenden Stelle im script eingetragen werden.
| |
|
| |
|
| Sind mehrere Netzwerkarten im Rechner, werden die Subnetze aufgelistet.
| | Kopieren Sie es z.B. nach T: (tmp). Als root nehmen Sie sich dann den mc und gehen in dem einen Fenster nach /home/tmp und in dem anderen nach /usr/www/secure/admin. Im Fenster, in dem Sie arbzeit.tar.gz sehen, setzen Sie den Balken darauf und drücken Enter. Es erscheint die ausführbare Datei arbzeit.cgi. Diese kopieren Sie nun mit F5 nach /usr/www/secure/admin. |
|
| |
|
| <pre><nowiki>
| | Wenn Sie im Browser nun http://arktur/admin2/arbzeit.cgi eingeben, so erscheint nach der Passwortabfrage eine Seite, ähnlich der folgenden: |
| #!/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:
| | Bild kommt noch |
| 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
| | Ein Klick auf die Überschrift oder auf die Schaltfläche "Anzeigen" erneuert die Anzeige. |
| # Bsp.: (bei mir)
| | Sie können die Sortierreichenfolge anpassen, Teilnetze oder ein Datum auswählen. |
| # my $routerip="192.168.50.1";
| | Bei der Sortierung nach Nutzer erhalten Sie alle Verbindungzeiten des jeweiligen Nutzers angezeigt. Damit werden auch Doppelanmeldungen eines Nutzers an verschiedenen Computern sichtbar. |
| # kein Router, dann kann man die Variable leer lassen
| | Bei der Sortierung nach Computernamen können Sie feststellen, ob mehrere Rechner die gleiche IP haben, bzw. sich die IP eines Computers geändert hat. |
| my $routerip="";
| | Die Sortierung nach "aktiv" zeigt Ihnen die aktiven Verbindungen zuerst an. Danach folgen die "abgebrochenen Verbindungen", d.h. die Verbindungen zu denen keine Abmeldung im log-File vorliegt. Dies kann u.U. auch passieren, wenn der Server neu gestartet wird, während der Nutzer noch angemeldet war. |
| | Bei der Programmierung ist mir aufgefallen, dass einige Computer Ihre IP "verloren" haben. Solche IP-Unterschiede zwischen An- und Abmelde-IP eines Computers werden blau dargestellt. Der Administrator kann dann nach den Gründen forschen (und mir ggf. Bescheid geben). |
|
| |
|
| # 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!
| | Bild kommt noch |
| # 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:
| | Hier könnte es ein Absturz des PCs "Schueler4" gewesen sein, da zwei Anmeldungen aber nur eine Abmeldung (und diese dann noch mit einer anderen IP) vorliegen. Eine Befragung des Herrn Leopold könnte Klarheit schaffen. |
| my $adresse = $ENV{SCRIPT_NAME};
| |
|
| |
|
| # Hier werden die Dateiendungen für die rotierten log-Dateien festgelegt
| | Einrichtungshinweise: |
| # normalerweise wird die Logdatei aber nicht rotiert!
| |
| my @dateien = ();
| |
|
| |
|
| my $Kopf = <<"ENDHEADER";
| | Das Script ermittelt selbständig die eingebauten Netzwerkkarten und damit die Subnetze. Sollte der Server über einen Router ins Netz gehen, so wäre diese Netzwerkkarte im Script einzutragen, damit das "Router-Netz" nicht angezeigt wird: |
|
| |
|
| <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
| | Bild kommt noch |
|
| |
|
| # Seitenende mit Zurücklink, bei Einbindung in admin2-Menü
| |
|
| |
|
| my $fuss = <<Endfuss;
| | my $versteckt="lehrer direktor "; |
| <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
| | Geben Sie hier die Nutzernamen ein, die nicht angezeigt werden sollen. Die Trennung folgt durch ein Leerzeichen. |
| {
| |
| # übernommen von H.-D. Kirmse
| |
| my @dat = @_;
| |
| my @dat2 = ();
| |
| my @tmp = ();
| |
| my $sort = 0;
| |
|
| |
|
| my $sort = param('sort');
| |
|
| |
|
| if ($sort==1)
| | my $logdatei lassen Sie für Arktur 4 unverändert. Bei 3.5 kommentieren Sie sie aus und entfernen das Kommentarzeichen darunter. (siehe auch weiter unten) |
| { @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
| | my $routerip="192.168.50.1"; |
| 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
| | Geben Sie hier die IP Ihres Routers an. In der Datei ist diese Variable nicht belegt. Bei mir enthält sie obigen Eintrag. |
| 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
| | my $Kurzzeit und $minanmeldedauer |
| 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
| | erklären sich von selbst. Die erste Variable habe ich bei Windows 2000 Clients benötigt, da diese ihre Verbindung immer wieder schnell trennten - es waren dann hunderte von Meldungen vorhanden. Ob es nach der Umstellung auf die log-Datei "smblogin.log" noch so ist, kann ich leider mangels Win2k-Clients nicht mehr testen. |
| 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
| | Sollten Sie eine Zeile entdecken wie: |
| 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
| | hojacque pc - 9 08.07.2005 07:56 abgeschaltet |
| #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
| | dann haben Sie wahrscheinlich Computernamen mit Leerzeichen verwendet. |
| sub nach_Zustand
| | (Ich wusste gar nicht das das geht.) |
| {
| | In diesem Fall ist es nicht möglich die Standard-log-Datei smblogin.log zu verwenden. Aber falls Sie nur ein Leerzeichen in den Computernamen verwendet haben, ist die Verwendung für Arktur 4 trotzdem möglich. Sie müssen dann, wie die Arkur 3.5 - Nutzer, das Script per mc editieren und die Zeile |
| 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
| | my $logdatei = /var/log/samba/smblogin.log |
| {
| |
| 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>";
| |
| }
| |
| }
| |
|
| |
|
| | mit einem # auskommentieren und das Kommentarzeichen vor der nächsten Vereinbarung |
|
| |
|
| sub Subnetze_ermitteln
| | # my $logdatei = /var/log/samba/log.smbd |
| {
| |
| 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);
| | --[[Benutzer:JFiebig|JFiebig]] 12:05, 29. August 2005 (CEST) |
| 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>';
| |
| }
| |
| </nowiki></pre>
| |
|
| |
|
| ---- | | ---- |
| <div align="right">[[Administratorhandbuch|zurück]] | [[Hauptseite]]</div> | | <div align="right">[[Administratorhandbuch|zurück]] | [[Hauptseite]]</div> |