LINUX.ORG.RU

Скриптик для резервного копирования

 , ,


0

1

Есть несколько бухгалтерских компьютеров на ХР. На каждом есть расшареный ресурс «copy». Есть сервер на федоре. Задача такова. В пятницу вечером, начиная с 19 часов, сервер должен:
1. Узнать, включен ли компьютер
2. Если да, то смонтировать общий ресурс локально
3. Все содержимое ресурса упаковать в архив 7z и положить в /archives/
4. Отмонтировать сетевой ресурс
5. Выключить удаленный компьютер
6. Все это время вести лог
7. В конце процедуры отправить лог мне
Собственно вот быдлокод, который я набросал. Да, сам в панике от его быдловатости:

#!/bin/sh

HOSTMAIL="trololo@ukr.net"
ANDREYMAIL="lol@citynet.dp.ua"
IP_HEAD="192.168.1."
IP_TAIL="0"
LOG_TAIL="`date +%F` `date +%R`"
LOGFILE="/var/log/gp.log"
ARC_NAME="$(date +%F).7z"
BASES=copy
USER=Admin
PASS=123
Z7="7z a -tzip -mx5 -r0 -x@/archives/ex.txt"
INDIR="/mnt/backup/"
TARGETDIR="/archives/"
COMP1=192.168.1.10		# MAN1
COMP2=192.168.1.20 		# MAN2
COMP3=192.168.1.30 		# MAN3
COMP4=192.168.1.40 		# MAN4
COMP5=192.168.1.50 		# BUHGALTER
COMP6=192.168.1.60 		# VOJAGE

function go ()
    {
	for i in 1 2 3 4 5 6
	do
	
	   if [ "`ping -c 1 $IP_HEAD$i$IP_TAIL | grep -c Unreachable 2>/dev/null`" -eq 1 ]; then
	      echo "$LOG_TAIL: Host $IP_HEAD$i$IP_TAIL is avaible" >> $LOGFILE
	          
	          # Монтування та створення архіву
	          if [ ! `mount.cifs //$IP_HEAD$i$IP_TAIL/$BASES $INDIR -o user=$USER%$PASS 2>/dev/null` ]; then
	             echo "$LOG_TAIL Mount $IP_HEAD$i$IP_TAIL is filed" >> $LOGFILE
	          else
	             $Z7 $TARGETDIR/$ARC_NAME $INDIR && echo "$LOG_TAIL Archive $ARC_NAME created sucsessfully" >> $LOGFILE
                     umount $INDIR
                     sleep 10
                     net rpc SHUTDOWN -I $IP_HEAD$i$IP_TAIL -U $USER%$PASS
	          fi
	          
	   else
	      echo "$LOG_TAIL: Host $IP_HEAD$i$IP_TAIL is down" >> $LOGFILE
	      #echo "$LOG_TAIL: Host $IP_HEAD$i$IP_TAIL is down" | mutt -x -s "Система была выключена" $ANDREYMAIL
	   fi

	done	
    }

go
Чего хочу узнать:
1. Отправка почты работает от моего пользователя, от рута со скрипта не уходит. Какой конфиг править, тот что в /root или в /etc?
2. Диски не резиновые, как бы прикрутить удаление архивов, старше месяца?
3. Так, между прочим, может кто-нибудь знает как в виндовсе поставить запрет на отключение компьютера по пятницам? :)

1. mutt игнорирует переменную окружения EMAIL когда запущен не интерактивно. 2. может лучше rsync?

старше месяца?

например так:

[code=bash] find /path/to/files* -mtime +31 -exec rm {} \; [/code]

3. Настрой Wake on Lan и не парься. У меня на работе так 500 компов в 2 часа ночи просыпаются и ставят обновления и выключаются.

hope13 ★★★
()
Ответ на: комментарий от Chaser_Andrey

По-крайней мере, ты сможешь легко паковать в bzip2/gzip, и делать инкрементальные бэкапы (что лучше сэкономит место, чем 7z). Ну и с удалением старых проблемы тоже не будет

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

и делать инкрементальные бэкапы

Не-не-не, нужны именно моментальные снимки рабочих баз за месяц. Это раз. 7z был выбран для того, чтоб директор в любой момент мог открыть архив и просмотреть файл с кириллическими символами. Пока что только с этим форматом нормально получилось.

KERNEL_PANIC ★★★
() автор топика

Я бы вместо

if [ "`ping -c 1 $IP_HEAD$i$IP_TAIL | grep -c Unreachable 2>/dev/null`" -eq 1 ]; then
написал бы
ping -q -c 1 $IP_HEAD$i$IP_TAIL > /dev/null
if [ $? -eq 0 ]; then
, а вместо COMP1=…, COMP2=… и for i in 1 2 3 4 5 6 —
comps=192.168.1.10
comps="$comps 192.168.1.20"
…
for comp in $comps
(и заменил бы все $IP_HEAD$i$IP_TAIL на $comp)

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

,Можно. На счет COMP1=…, COMP2=, да, так наверное лучше, а то я сам в записи $IP_HEAD$i$IP_TAIL глаза ломаю >_<
Ну а насчет пинга, то да, может быть, но мой вариант мне тоже нравится) При желании можно с десяток вариантов напридумывать :)

KERNEL_PANIC ★★★
() автор топика
Ответ на: комментарий от KERNEL_PANIC

я сам в записи $IP_HEAD$i$IP_TAIL глаза ломаю >_<

Дело не столько в глазах, сколько в лучшей масштабируемости: сегодня у тебя шесть компов с IP-адресами вида 192.168.1.${i}0, а завтра их станет шесть раз по шесть с произвольными IP'шниками — в предлагаемом мной варианте надо будет дописать нужные компы в строки вида comps=«$comps <new-ip>», больше ничего в скрипте не меняя.

Насчет пинга — дело хозяйское, но проверять вывод (к слову, разный для разных версий/реализаций ping и разных локалей) вместо проверки exit code (который для того и придуман, чтобы быть нулевым, когда все хорошо, и ненулевым, когда что-то нехорошо) категорически неверно

dexpl ★★★★★
()

выдрал сз своего бекап-скрипта полезняшки для тебя

COMPUTERS=(
'192.168.1.10'
'192.168.1.20'
'192.168.1.30'
)
COMPUTERSCOUNT=${#COMPUTERS[*]}
for ((i=0;i<COMPUTERSCOUNT;i++)); do
done



if [ "$KEEPOLD" != "0" ]; then
  cd "$BACKUPDIR" || emergency 5
  ls --sort=time --time=status "$BACKUPDIR" -1 | tail -n +$KEEPOLD | xargs rm -rf
fi

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.