Tools:NutzerZeit: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
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&auml;ndert am: 01.08.2005 &copy; J&ouml;rg Fiebig</SMALL>
<BR>
<a href=\"index.htm\" target=_top><img src=\"back.gif\" border=0> Zur&uuml;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&auml;ndert am: 01.08.2005 &copy; J&ouml;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&uuml;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&uuml;r das gew&auml;hlte Teilnetz ",$teilnetz," liegen";
    if ($AnzDatum ne /\./) {print " f&uuml;r den ",$AnzDatum;}
    print " keine Anmeldungen vor.</center><br>";
  }
  else
  {
    print $ausgabenanzahl," Eintr&auml;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&ouml;ffnet werden!";
print '<BR><BR> Pr&uuml;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&auml;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 "&nbsp; <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&uuml;nschen, so w&auml;hlen Sie es aus: <br>';
foreach $line(@ausgabe)
  {
    print '<input type="radio" name="teilnetz" value="',$line,'">',$line,' &nbsp;&nbsp;';
  }
}
# Eingabemöglichkeit für das Datum:
print '<br> Wenn Sie ein spezielles Datum w&uuml;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&auml;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>

Version vom 29. August 2005, 12:20 Uhr

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...

Anzeige der Arbeitszeit der Nutzer

Eigentlich handelt es sich um die Anzeige der Zeiten, in denen angemeldete Nutzer mit Ihrem Homeverzeichnis verbunden waren.

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.

Sie können es in der jeweils aktuellsten Version von den Arktur-Seiten von Jörg Fiebig [1] herunterladen.

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.

Wenn Sie im Browser nun http://arktur/admin2/arbzeit.cgi eingeben, so erscheint nach der Passwortabfrage eine Seite, ähnlich der folgenden:


Bild kommt noch


Ein Klick auf die Überschrift oder auf die Schaltfläche "Anzeigen" erneuert die Anzeige. Sie können die Sortierreichenfolge anpassen, Teilnetze oder ein Datum auswählen. Bei der Sortierung nach Nutzer erhalten Sie alle Verbindungzeiten des jeweiligen Nutzers angezeigt. Damit werden auch Doppelanmeldungen eines Nutzers an verschiedenen Computern sichtbar. 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. 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).


Bild kommt noch


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.

Einrichtungshinweise:

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:


Bild kommt noch


my $versteckt="lehrer direktor ";

Geben Sie hier die Nutzernamen ein, die nicht angezeigt werden sollen. Die Trennung folgt durch ein Leerzeichen.


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)

my $routerip="192.168.50.1";

Geben Sie hier die IP Ihres Routers an. In der Datei ist diese Variable nicht belegt. Bei mir enthält sie obigen Eintrag.

my $Kurzzeit und $minanmeldedauer

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.

Sollten Sie eine Zeile entdecken wie:

hojacque pc - 9 08.07.2005 07:56 abgeschaltet

dann haben Sie wahrscheinlich Computernamen mit Leerzeichen verwendet. (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 $logdatei = /var/log/samba/smblogin.log


mit einem # auskommentieren und das Kommentarzeichen vor der nächsten Vereinbarung

  1. my $logdatei = /var/log/samba/log.smbd


--JFiebig 12:05, 29. August 2005 (CEST)


zurück | Hauptseite