Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: donjirka 24 Února 2016, 09:43:26
-
Ahoj, stvořil jsem takovou šílenost (předem se omlouvám programátorům) na rotování logů z centrálního úložiště na přimountovaný filesystem.
Moje požadavky byly:
Aby Rsyslog ukládal logy do /var/syslog/remote/%HOSTNAME:::lowercase%/%$NOW%%HOSTNAME:::lowercase%.log.
Archivovat denně logy z lokálního disku serveru na pole.
V archivu zachovat adresářovou strukturu.
Možnost ověřit pravost logů. (dělám hash)
Skript sice funguje dobře, ale problém mám v tom, že se mi vůbec nelíbí jak jsem to napsal.
Nenašel by se někdo, kdo by se na ten kód mrknul a trochu konsolidoval případně potvrdil, že tam nejsou nesmysly? :-\
Předem děkuji
#!/bin/bash
# určení cest
volume="/mnt/d1vksc02/" # složka kde je přimountovaný filesystem
odkud="/var/syslog/remote/" # složka kde se nacházejí logy
kam="/mnt/pole/syslog/remote/" # složka kam se mají logy přesouvat
hash="/mnt/pole/syslog/sum/" # složka pro sha1sum zabalených souborů
# kontrola namauntovaného disku pro archiv logů
function kontrola {
# kontrola namauntovaného disku pro archiv logů
if ! [ -d $odkud ]; then
echo "neexistuje "$odkud
exit
fi
# kontrola existence adresáře
if ! [ -d $kam ]; then
echo "neexistuje "$kam
exit
fi
# vytvoření souboru hash.log pokud chybí
if ! [ -e $hash'hash.log' ]; then
touch $hash'hash.log'
fi
# kontrola jestli je přimountován filesystem
if mount|grep $volume; then
echo "není přimountován filesystem, není kam zálohovat"
exit
fi
}
# načte všechny soubory
function cteni_mv {
i="0"
echo "Čtu soubory pro přesun"
while read file
do
array[ $i ]="$file"
(( i++ ))
done < <( find $odkud -type f -printf "%f\n" )
}
# přesune log soubory
function odsun {
echo "Přemisťuji logy z $odkud do $kam"
for each in "${array[@]}"
do
# vytvoří složku když neexistuje adresář pro server
each_=${each:10}
if ! [ -d $kam${each_%.*} ]; then
mkdir $kam${each_%.*}
fi
#echo "přemisťuji "$each
mv $odkud${each_%.*}/$each $kam${each_%.*}/$each
done
killall -HUP rsyslogd
}
# vypisuje pole array
function vypis {
echo "zahajuji výpis"
for each in "${array[@]}"
do
echo "$each"
done
}
# načte všechny log soubory
function cteni_gzip {
i="0"
echo "Čtu soubory pro balení"
while read file
do
array[ $i ]="$file"
(( i++ ))
done < <( find $kam -name '*.log' -printf "%f\n" )
}
# přejmenuje, sbalí a vytvoří hash logům
function baleni {
echo "Balím logy"
cd $kam
# krmení proměnné polem
for each in "${array[@]}"
do
each_=${each:10}
a="0" # proměnná pro while cyklus
i="0" # počítadlo kopií souboru
# ověřuje jetli archviv existuje
if [ -e $kam${each_%.*}/$each'.gz' ]; then
# cyklus jede do doby dokud není splněna podmínka
while [ $a != "1" ] ; do
# ověřuje jestli existuje přejmenovaný archiv z dřívějška a jede dokud nenajde poslední
if [ -e $kam${each_%.*}/$each"($i).gz" ]; then
(( i++ ))
continue
else
# když najde volný název, přidá tam index $i a archivuje soubor
a="1"
mv $kam${each_%.*}/$each $kam${each_%.*}/$each"($i)"
gzip -9 $kam${each_%.*}/$each"($i)"
sha1sum $kam${each_%.*}/$each"($i).gz" >> $hash"hash.log"
fi
done
else
# archivuje v případě, že ještě neexistuje stejný archiv
gzip -9 $kam${each_%.*}/$each # zabalení logů
sha1sum $kam${each_%.*}/$each'.gz' >> $hash"hash.log" # hash zabalených souborů
fi
done
}
kontrola
cteni_mv
#vypis
odsun
cteni_gzip
#vypis
baleni
echo "Rotace dokončena"
exit