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

Název: Skrip pro rotování logů
Přispěvatel: 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

Kód: [Vybrat]

#!/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