Ein Codeschnipsel zur Erstellung von Daily Log's.
Auf Basis von FIFO's (named pipes) Siehe man mkfifo.
Voraussetzung ist das Vorhandensein einer Fifo Datei.
In diesem Beispiel 'proftpd_log.fifo'
Das Logformat in der proftpd.conf sieht wie folgt aus.
LogFormat default "IP|%a|CMD|%m|CMDLine|%r|USR|%u|TIME|%{%F %T}t|FileN|%f|CODE|%s"
In dieser Variante werden "Schlüssel" mitgegeben (Nicht für ein "Daily Log" notwendig).
Die Übergabe in der conf
ExtendedLog /usr/local/proftpd/var/log/proftpd_log.fifo ALL default
Hier wird als Logdatei die Fifodatei angegeben.
Wer kein Perl hat kann es sicher auch zu einem Shellscript umbauen.
#!/usr/bin/perl
#######################################################################
#Script wertet das Logformat vom Proftpd das in eine Fifo
#umgeleitet wurde aus und erstellt ein Log mit dem Dateinamen
#des Aktuellen Tages.
#Darüber hinaus wird in diesem Codeschnipsel die Übergabe
#der Logvariablen mit Schlüsseln in ein Hash übergeben.
#Über die Schlüssel angesprochen werden die Werte
#in Variablen gespeichert die zu einer weiteren Verarbeitung
#dienen können.
#######################################################################
#Pfad zur FIFO
$LogFifo = '/usr/local/proftpd/var/log/proftpd_log.fifo';
$i = 1;
while ($i ==1) {
#---------------------------------------------------------------
#Hier "lauscht" das Script auf Logfile Daten vom Proftpd.
#Sind welche vorhanden werden diese zeilenweise in $GetString
#eingelesen.
open FIFO, "<$LogFifo" or die "can't read $LogFifo: $!";
$GetString = <FIFO>;
#----------------------------------------------------------------
#While Schleife prüft bei gefülltem $GetString auf String "stop",
#dieser kann manuell an das FIFO gesendet werden um das Script
#sauber zu beenden.
while($GetString ne ''){
$hit = index($GetString,"stop");
if($hit != -1){
$i=2;
}
#--------------------------------------------------------------------
#--------------------------------------------------------------
#Das Hash wird mit den entsprechenden Infos vom Proftpd gefüllt.
#Hierbei werden, die in der Conf definierten Schlüssel dem Hash
#ebenfalls als Schlüssel übergeben.
%Arr = split('\|',$GetString);
#--------------------------------------------------------------
#--------------------------------------------------------------
#Dieser Block übergibt an die benötigeten Variablen zur weiteren
#Verarbeitung die Werte aus dem Hash.
$User = $Arr{USR};
$Zeit = $Arr{TIME};
$CmdLine = $Arr{CMDLine};
$ClientIP = $Arr{IP};
$Cmd = $Arr{CMD};
$FileName = $Arr{FileN};
$Code = $Arr{CODE};
$timestmp = &getDate; #Aktuelles Datum ermitteln.
#---------------------------------------------------------------
#---------------------------------------------------------
#Das ganze wird in ein Log das als Dateiname das
#Aktuellem Datum hat geschrieben.
#z.b. 15052003
open(LOGFILE,">>/usr/local/proftpd/var/log/$timestmp");
print LOGFILE $GetString;
$GetString = <FIFO>;
}
close LOGFILE;
#---------------------------------------------------------
close FIFO;
sleep 1;
}
##############################################################################
#---Start Prozeduren und Funktionen
##############################################################################
sub getDate{
$jahr = (1900+(localtime)[5]);
$monat = sprintf("%02d",(localtime)[4]+1);
$tag = sprintf("%02d",(localtime)[3]);
$AktDatum = $tag.".".$monat.".".$jahr;
return($AktDatum);
}