#!/bin/bash
# Author: LeoN @ka Children of koRn
# www.ilab.me / XMPP: ChildrenofkoRn@ilab.me
# iLAB – Time to fly
### logrotate lighttpd ###
### Version script V06 of 2011.03.15 AM 09:18 AM ###
# глобальные переменные:
PLOG='/root/Lighty.logrotate.txt'
LSROT="## Last logrotate: "`date +%Y"."%m"."%d" "%I":"%M" "%p`" ##"
#####
echo '\n'`date +%I":"%M":"%S" "%p`" # logrotate: start script"'\n'
# записываем дату ротации в лог tar'a
echo '\n'$LSROT >> $PLOG
# собственно сама функция ротации логов
rotate ()
{
# список аргументов, которые нужно передать функции при вызове слева - направо, по порядку:
# $1 - имя пользователя, используется в имени архива, строки 42, 45
# $2 - путь до каталога логов пользователя, строка 23
# $3 - путь до каталога, куда будет сохранён архив, строки 42, 44, 45
#
# переходим в каталог с логами
cd "$2"
# получаем список файлов, фильтруем grep'ом по ".log", Sed преобразует список в одну строку,
# ну и записываем результат в локальную переменную $a
local a="`ls | grep ".log" | sed ':a;N;s/\n/ /;ta'`"
# переменная с датой, которая добавится к именам копий логов
local cpdate="`date +%y%m%d_%I%M%p`"
# поиск логов в текущем каталоге и копирование с переименованием их
for file in *.log; do
  cp $file `basename "$file" .log`_$cpdate.log
done
# далее обнуляем логи, посылая echo c датой и временем ротации
# утилита tee может дублировать вывод stdout в несколько файлов, причем как дописывать в них, так и переписывать, скармливаем ей список из переменной $a.
local lasttime="## Last logrotate: `date +%Y"."%m"."%d" "%I":"%M":"%S" "%p` ##"
echo $lasttime | tee $a > /dev/null
# упаковка и удаление исходных файлов tar'ом
# "test -d $3 || mkdir -p $3 && tar ..." -
# проверяем существует ли папка $3, если нет - создаём и только потом запускаем tar
# опция --remove-files удаляет исходные файлы после упаковки
# список файлов получаем из переменной $a, предварительно делаем замену Sed'ом '.log' на '_$DATE.log'
# " >> $PLOG 2>&1" перенаправляем вывод stdout и stder tar'a в лог $PLOG, при успешной упаковке в лог запишутся только имена упакованных файлов
local tardate="`date +%y%m%d_%I%M%p`"
test -d $3 || mkdir -p $3 && tar czvf "$3/lighttpd_$1_$tardate.tar.gz" --remove-files `echo $a | sed "s/\.log/_$cpdate\.log/g"` >> $PLOG 2>&1
# устанавливаем для папки с архивами права только на чтение для пользователя.
chown root:root $3 && chmod 750 $3
echo `date +%I":"%M":"%S" "%p`" # logrotate completed for $1 > $3/lighttpd_$1_$tardate.tar.gz"
# завершение функции
return 0
}
#####
# вызовы функции с параметрами, ниже идут три примера непосредственно самой ротации.
#
# ротация логов /var/log/lighttpd, третий аргумент 'logrotate#save', т.е. архив будет сохранён в подкаталоге с логами, т.е. в '/var/log/lighttpd/logrotate#save'
rotate 'var' '/var/log/lighttpd' 'logrotate#save'
# ротация логов для пользователя solo
rotate 'solo' '/home/solo/logs' 'logrotate#save'
# ротация логов для пользователя fess, в этот раз мы передаём функции полный путь до каталога с архивами, т.к. надо сохранить не в подкаталоге c логами
rotate 'fess' '/home/fess/logs' '/home/fess/data/save'
#
echo '\n''All operations completed, bye!''\n'
# завершение работы скрипта
exit 0
