Logfileordner erzeugen

Aus MostlyHarmless

Wechseln zu: Navigation, Suche

Leider können Benutzer Ordner in ihrem Homeverzeichnis löschen, obwohl sie vom root-Benutzer angelegt wurden. Das ist von Nachteil, wenn man Benutzern die Orginal Apache-Logfiles zur Verfügung stellen will oder muß: Die Benutzer können einfach den Logfileordner löschen. Das hört sich erstmal nicht schlimm an, wird aber zum Problem wenn Apache neu starten muß. Dies passiert zum Beispiel bei Configänderungen (da fällt es aber sofort auf), oder wenn der wöchentliche Cron-Job logrotate läuft, was dann schon schlimmer ist. Aus diesem Grund habe ich das folgende Skript geschrieben, das im prerotate vom logrotate Apache-Skript läuft:

Zuerst wird aus der Apache-Configdatei jede Zeile mit access_log ausgefiltert, die nicht mit einem Kommentarzeichen anfängt. Das ganze wird dann mit AWK gefiltert, um die passende Textspalte mit Ordnername+access_los auszugeben. Das ganze wird dann in einer Datei zwischengespeichert.

#!/bin/bash
/bin/cat /etc/apache/httpd.conf | /bin/grep ^[^#].*access_log | /usr/bin/gawk '{ print $2 }' > /root/al-liste.txt

Dann wird eine weitere temporäre Datei benötigt, die erstmal bei Bedarf gelöscht wird.

/bin/rm -rf /root/logdir-liste.txt

Als nächstes werden die vorverarbeiteten Ordnernamen um den Dateinamen access_log gekürzt. Übrig bleibt der reine Ordnername, der in die temporäre Datei geschrieben wird.

/bin/cat /root/al-liste.txt | /usr/bin/gawk '{ sub(/\/access_log/, "", $1); print >> "/root/logdir-liste.txt" }'

Diese Ordnerliste wird jetzt in einer for-Schleife durchlaufen

for ordner in `cat /root/logdir-liste.txt`
do

Wenn der Ordner für die Logfiles nicht existiert, wird er (inkl. aller Elternordner) neu erzeugt und eine Meldung ausgegeben.

        if [ ! -d $ordner ]; then
                /bin/mkdir -p $ordner
                echo "$ordner erzeugt!"
        fi
done

Fertig. :-)

Eingebunden habe ich das ganze im logrotate Skript für den Apache (/etc/logrotate.d/apache):

prerotate
        /root/test-and-fix-logdirs
endscript

Und noch einmal das komplette Bash-Skript, ohne Kommentare:

#!/bin/bash
/bin/cat /etc/apache/httpd.conf | /bin/grep ^[^#].*access_log | /usr/bin/gawk '{ print $2 }' > /root/al-liste.txt
/bin/rm -rf /root/logdir-liste.txt
/bin/cat /root/al-liste.txt | /usr/bin/gawk '{ sub(/\/access_log/, "", $1); print >> "/root/logdir-liste.txt" }'
for ordner in `cat /root/logdir-liste.txt`
do
        if [ ! -d $ordner ]; then
                /bin/mkdir -p $ordner
                echo "$ordner erzeugt!"
        fi
done
Persönliche Werkzeuge