bash-скрипты

Народ, тут тема где парню надо было узнать место на винте сподвигла на идею! Давайте выкладывать свои полезные скриптики у кого какие есть. Чтоб добро не пропадало, чтоб люди их могли улучшать и юзать! Да здравствует GNU/GPL! %)
Начну первый

Скрипт выполняет открыт ли порт какой либо сетевой службы и при случае если он свалился перезапускает ответственную за него службу.
#!/bin/bash
RES="/tmp/result"
HOST="localhost"
SERVICE="sendmail"
PORT="25"

telnet $HOST $PORT &> $RES &			             #1
sleep 5	           	                                     #2
if cat $RES |grep Unable; then /etc/init.d/$SERVICE restart  #3
        else echo "OK"; rm $RES; exit;		             #4
fi

#1 - проверяем телнетом, результат пишем во временный файл и уходим в фон
#2 - ждем 5 сек, перед тем как почесть файл (ответ от телнета уже должен записаться)
#3 - парсим файл по значению Unable, если удачно, то перезапускаем сервис
#4 - если Unable нету, то удаляем временный файл и выходим
#после выхода из скрипта фоновый процесс телнета завершается будучи дочерним от процесса скрипта

* после рестарта службы можно добавить отсылку письма или запись в лог.

Оптимизация

s/'cat $RES |grep Unable'/'grep Unable $RES'

Я бы делал

Я бы делал через netstat.

+

Heretiqu3 написал(а):
Я бы делал через netstat.

выбрал телнет потому что были случаи с индейцем, что netstat показывает что порт открыт, а на самом деле сокет мертв(((

Вот мой

Вот мой вариант

# cat watchdog
#!/bin/bash
nmap -p $2 localhost |grep open
if [ `echo $?` = 1 ]
then
/etc/init.d/$1 restart
fi

10:10:19 Astarte kos # time sh watchdog postfix 25
postfix restart

real 0m0.047s
user 0m0.041s
sys 0m0.006s
10:10:40 Astarte kos # time sh watchdog1
telnet: Unable to connect to remote host: Address family not supported by protocol
/etc/init.d/sendmail restart

real 0m5.007s
user 0m0.004s
sys 0m0.005s

Работоспособность службы не

Работоспособность службы не ограничивается наличием открытого порта. Что нить поизощренней типа wget, с последующим разбором результата. Плюс оповещалку, плюс сохранение инцитдента в какой нить базе. Заббикс можно научить.

Хорошая

Хорошая тема.
Извиняюсь за оффтоп, но нет ли у кого случайно скрипта который выводит список пакетов от которых никакие другие пакеты не зависят?
Или может есть какое-то готовое средство? Просто иногда попробуешь какую-нибудь программу, потом удалишь, а то что она за собой утянула остается и болтается в системе без всякой надобности. Перебирать каждый интересующий пакет руками через equery d не очень то хочется.

revdep-rebuild, не?

revdep-rebuild, не?

Нее, emerge --depclean -a

Нее, emerge --depclean -a

Да он только

Да он только всё грозиться удалить "важные пакеты", но на самом деле практически ничего и не удаляет)
А revdep-rebuild вообще в моей практике ничего ни разу не удалял, только пересобирал.
Попробую что-нибудь придумать

Он как раз

Он как раз делает то, что вы и просили. Удаляет зависимости пакета. Если делать вот так:
emerge --depclean
revdep-rebuild
emerge -uDNv world

То почистите систему и ничего не просрется [-:

:)

Heretiqu3 написал(а):
Он как раз делает то, что вы и просили. Удаляет зависимости пакета. Если делать вот так:
emerge --depclean
revdep-rebuild
emerge -uDNv world

То почистите систему и ничего не просрется [-:

Самое весёлое, что приведённая последовательность команд полнотой не отличается :)

--
Live free or die

DreamDragon

DreamDragon написал(а):
Хорошая тема.
Извиняюсь за оффтоп, но нет ли у кого случайно скрипта который выводит список пакетов от которых никакие другие пакеты не зависят?

vim /var/lib/portage/world если ты все ставил правильно, то получишь список пакетов, от которых никто не зависит ))
остальные пакеты удаляются по emerge --depclean ;)

не совсем

Цитата:
vim /var/lib/portage/world если ты все ставил правильно, то получишь список пакетов, от которых никто не зависит

Не совсем. Легко может быть ситуация, при которой тебе нужен какой-то пакет и его зависимость. Соответственно, и пакет и зависимость будут в world (например, с perl-либами такое у меня бывает)

еще один скриптос :-)

тут не совсем bash скрипт, суть в следующем, скрипт проверяет есть ли впн-каналы до удаленных точек, если нет то проверяет доступность точки, если точка доступна то пытается перезапустить канал. если вовсе недоступна то выводит сообщение

!/sbin/runscript
opts="${opts} start test up reload"

test() {
ebegin "Starting remote net test"
if ping -c 3 172.17.1.1 &> /dev/null
  then echo "filial01 - SAVELYEVA net - OK"
  else
    if ping -c 3 192.168.223.33 &> /dev/null
       then echo "SAVELYEVA vpn tunnel down";
            ipsec auto --up filial01
       else echo "filial01 - SAVELYEVA net not responds"
    fi
fi
if ping -c 3 172.17.2.1 &> /dev/null
  then echo "filial02 - DANILOVSKY net - OK"
  else
    if ping -c 3 192.168.2.34 &> /dev/null
       then echo "DANILOVSKY vpn tunnel down";
            ipsec auto --up filial02
       else echo "filial02 - DANILOVSKY net not responds"
    fi
fi

einfo "All net tests done."
}

up() {
     echo "available names: filial01, filial02"
     echo "Enter net name"
     read "NET"
     ipsec auto --up $NET
}

reload() {
     ebegin "Reload IPSec subsystem"
     /etc/init.d/ipsec stop;
     /etc/init.d/ipsec start
}

start() {
     ebegin "Restart and post-test remote units system"
     reload
     test
}

вобще в оригинальном скрипте около 20 филиалов и для каждого свой блок кода, так вот задачка для ума, можно оптимизировать скрипт через цикл, чтобы шел перебор доступных филиалов, дабы не прописывать каждый филиал отдельно
ps. забыл упомянуть в качестве впн-сервиса используется strongswan, синтаксис конфигов практически одинаков с freeswan/openswan

ну под такую

ну под такую радость вообще нужно выделять блог и мал по мал собирать разные полезности. эх, если б кто взялся

# cat

# cat /etc/init.d/myshaper
#!/sbin/runscript
IFACE="eth1"

start() {
ebegin "Shaper Starting..."
# определение переменных
DPORT="match ip dport"
SPORT="match ip sport"
U32="protocol ip u32"
ICMP="match ip protocol 1 0xff"
TCP="match ip protocol 6 0xff"
UDP="match ip protocol 17 0xff"
RATE_OUT="700" # скорость исходящего трафика

tc qdisc add dev $IFACE root handle 1: htb default 13
tc class add dev $IFACE parent 1: classid 1:1 htb rate ${RATE_OUT}kbit

#делим канал на 4 части
tc class add dev $IFACE parent 1:1 classid 1:10 htb rate $[$RATE_OUT/9]kbit ceil $[$RATE_OUT/2]kbit prio 0
tc class add dev $IFACE parent 1:1 classid 1:11 htb rate 20kbit prio 1
tc class add dev $IFACE parent 1:1 classid 1:12 htb rate $[$RATE_OUT/2]kbit ceil ${RATE_OUT}kbit prio 2
tc class add dev $IFACE parent 1:1 classid 1:13 htb rate $[$RATE_OUT/9]kbit ceil ${RATE_OUT}kbit prio 3

# $SPORT 22 0xffff - 22 port, 22 0xfffe - 22,23 ports.
# 1:10
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $TCP $SPORT 22 0xffff classid 1:10
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $TCP $DPORT 22 0xffff classid 1:10

# 1:11
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $ICMP classid 1:11

# 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $DPORT 80 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $DPORT 443 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 25 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 80 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 443 0xffff classid 1:12
#остальное в 1:13

# алгоритм добавления очереди
tc qdisc add dev $IFACE parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $IFACE parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $IFACE parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $IFACE parent 1:13 handle 13: sfq perturb 10
eend $?
}

stop() {
ebegin "Shaper Stopping..."
IFACE=eth1
tc qdisc del dev $IFACE root
eend $?
}

субдомены && apache

вот писал: http://www.gentoo.ru/node/11842
не удивлен, но ни кто мне не ответил и не помог. это часто свойственно людям, но помог себе сам :)
через mod_rewrite, эффект получил совершенно не тот :(
но написал скрипт за вечер :)

#!/bin/bash

# Not optimized!!! [FixMe]
# Crash don't detected

APACHE2_STATUS="/etc/init.d/apache2 status";
APACHE2_START="/etc/init.d/apache2 start";
APACHE2_STOP="/etc/init.d/apache2 stop";

$APACHE2_STATUS
if [ $? = 0 ]; then
$APACHE2_STOP >/dev/null 2>&1
fi

VHOST_DIR="/home/www/localhost/vhosts/works";
VHOSTS_BASE="/usr/local/etc/vhost.conf";

HOSTS_CONF_FILE="/etc/hosts"
VHOST_CONF_FILE="/etc/apache2/vhosts.d/works_vhost.include";

VHOST_COUNT=`ls -t $VHOST_DIR|awk -F' ' '{ print $0 | "sort" }'|wc -l`

while [ $VHOST_COUNT -gt 0 ]
do
VHOST=`ls -t $VHOST_DIR|awk -F' ' '{ print $0 | "sort" }'|head -n $VHOST_COUNT|tail -n 1`
let VHOST_COUNT=VHOST_COUNT-1
grep -x $VHOST $VHOSTS_BASE >/dev/null 2>&1
if [ $? = 0 ]; then
echo -en "\033[32;40;5m * \033[0m$VHOST:\033[32;40;22m exist \033[0m\n"
else
echo -en "\033[32;40;5m * \033[0m$VHOST:\033[31;40;22m don't exist \033[0m "

VHOST_CONF="\n<VirtualHost localhost:80>\n\tServerName $VHOST\n\tServerAdmin root@localhost\n\tDocumentRoot \"/home/www/localhost/vhosts/works/$VHOST\"\n\n\t<Directory \"/home/www/localhost/vhosts/works/$VHOST\">\n\t\tOptions Indexes FollowSymLinks\n\t\tAllowOverride All\n\t\tOrder allow,deny\n\t\tAllow from all\n\t</Directory>\n\n\t<IfModule mpm_peruser_module>\n\t\tServerEnvironment apache apache\n\t</IfModule>\n</VirtualHost>\n";

echo -en $VHOST_CONF >> $VHOST_CONF_FILE
echo $VHOST >> $VHOSTS_BASE
echo -en "192.168.0.1\t$VHOST\n" >> $HOSTS_CONF_FILE
echo -en "\033[32;40;22m (add) \033[0m\n"
fi
done

$APACHE2_STATUS
if [ $? != 0 ]; then
$APACHE2_START >/dev/null 2>&1
fi

маленький такой скриптик, дает нужную функциональность. есть парочка не доработок :( как видно читаются не только директории, нет функции удаления отутсвующих в реальности но имеющихся в базе хостов, да и все вроде :)

#!/bin/bash

DATE=`/bin/date "+%Y%m%d"`
PORTDIR="/usr/portage/"
FILENAME="portage"
SAVEDIR="/home/ftp/gentoo/portage/"
OPTIONS="Create Erase Check Quit"
echo -e '\E[37;44m'"\033[1mToday : `/bin/date "+%c"`\033[0m"; tput sgr0
select opt in $OPTIONS; do
if [ "$opt" = "Create" ]; then
echo -e '\E[37;44m'"\033[1mCreate tar arch\033[0m" ; tput sgr0
time tar cf $SAVEDIR$FILENAME-$DATE.tar $PORTDIR
echo -e '\E[37;44m'"\033[1mbzip2 file\033[0m" ; tput sgr0
time bzip2 $SAVEDIR$FILENAME-$DATE.tar
md5sum $SAVEDIR$FILENAME-$DATE.tar.bz2 >> $SAVEDIR$FILENAME-$DATE.tar.bz2.md5sum
ls -lh $SAVEDIR$FILENAME-$DATE.tar.bz2 | gawk '{ print $9"\t" $5}'
elif [ "$opt" = "Quit" ]; then
echo -e '\E[37;44m'"\033[1mQuit...\033[0m" ; tput sgr0
exit
elif [ "$opt" = "Erase" ]; then
echo -e '\E[37;44m'"\033[1mPlease enter date for delete:\033[0m" ; tput sgr0
read UDATE
rm -i $SAVEDIR$FILENAME-$UDATE.tar.bz2
rm -i $SAVEDIR$FILENAME-$UDATE.tar.bz2.md5sum
elif [ "$opt" = "Check" ]; then
echo -e '\E[37;44m'"\033[1mPlease enter date for check:\033[0m" ; tput sgr0
read UDATE
cd $SAVEDIR
md5sum -w -c $FILENAME-$UDATE.tar.bz2.md5sum
fi
done

Народ. Тэг "[code]"

Народ. Тэг "[code]" еще никто не отменял. Читать же невозможно =)/

Пишите назанечение скриптов

Народ, + пишите объяснение скриптов

В баше не очень

В баше не очень шарю.
Написал вот такую штуку включать-отключать флэш, а то часто опера виснет когда что-нибудь собирается и пытаешься посмотреть страницу на которой есть флэш.

#!/bin/bash
if [ -f "/opt/netscape/plugins/libflashplayer.so.notused" ] 
then
  sudo mv -v /opt/netscape/plugins/libflashplayer.so.notused /opt/netscape/plugins/libflashplayer.so;
elif [ -f "/opt/netscape/plugins/libflashplayer.so" ]
then
  sudo mv -v /opt/netscape/plugins/libflashplayer.so /opt/netscape/plugins/libflashplayer.so.notused;
fi

просто переименовывает файл, может и через жопу, но во всяком случае с оперой срабатывает

А что,

А что, отключение по F12 уже не катит? (-:Е


Пожалуйста, не описывайте своё железо в подписи

FlashBlock плагин (userjs) к

FlashBlock плагин (userjs) к опере этим может занимаеться по-человечески.

Шкрыптец для

Шкрыптец для реализации XEP-0118 (Publish tune) в связке Psi+MPD


Пожалуйста, не описывайте своё железо в подписи

Поддался общей

Поддался общей графомании.
Полуплагиат, не помню уже где спёр идею, только "творчески" переработал :)

#!/bin/sh
# Скрипт для бэкапа моей домашней директории в зашифрованный с помощью EncFS каталог.
# Запускается ежедневно, раз в месяц делается полное резервирование в отдельный каталог.
# Таким образом, создаётся отдельный ежемесячный бэкап с ежедневрым инкрементным обновлением.
# Директории, которые используются программой EncFS, создаются заранее.
# Смотри man encfs.
# Определяем переменные и функции, пути к исполняемым файлам.
# Так как данный скрипт запускается при старте KDE,
# сделана задержка его исполнения, чтобы дать KDE загрузиться.
RUNTIME_DELAY="30"
# Директория, данные из которой нужно сохранить.
BACKUPED_DIR="${HOME}"
# Директории, данные из которых не нуждаются в сохранении.
EXCLUDE_DIR_1="${BACKUPED_DIR}/Desktop/Doc/private/foto"
EXCLUDE_DIR_2="${BACKUPED_DIR}/Desktop/Doc/private/video"
# Директория, в которой в зашифрованном виде хранятся данные.
ENCRYPT_DIR="/home/users/encrypt-backup"
# Директория, в которой находятся (виртуально) расшифрованные данные.
VIRT_ENCRYPT_DIR="/home/users/raw-backup"
# Директория, с ежемесячным бэкапом.
MONTHLY_BACKUP="${VIRT_ENCRYPT_DIR}/`date +%m-%Y`-`whoami`"
#
# Определяем полные пути к программам.
FUSERMOUNT=`which fusermount`
ENCFS=`which encfs`
KDIALOG=`which kdialog`
RDIFF_BACKUP=`which rdiff-backup`
# Опции команды rdiff-backup
# Исключить каталоги
EXCLUDE_OPT="--exclude ${EXCLUDE_DIR_1} --exclude ${EXCLUDE_DIR_2}"
# Включить каталоги
INCLUDE_OPT=""
#
RDIFF_BACKUP_OPT="${EXCLUDE_OPT}"
# Количество попыток подключёния зашифрованного раздела
ECRYPT_CHECK_NUM="3"
# Проверяем, делалось ли резервирование сегодня
CHECK_LOCK="${HOME}/home-rdiff.lock"
### ЗАПУСКАЕМ СКРИПТ ###
# Задержка при запуске
sleep ${RUNTIME_DELAY}
# Если lock-файла нет или он создан на несколько дней раньше, выполнить резервирование.
if [[ ! ( -f ${CHECK_LOCK} ) || $(cat ${CHECK_LOCK} ) -lt `date +%Y%j` ]];
# В предыдущей строке в date +%j дополнительно поставил %Y (год в формате YYYY),
# иначе с наступлением следующего года нумерация в CHECK_LOCK была бы больше текущей даты.
then
# Хотим ли мы делать резервирование.
if $(${KDIALOG} --title "Запланированное резервирование!" --yesno "Продолжить резервирование ${BACKUPED_DIR}?");
then
# Производить проверку, подключён ли зашифрованный раздел.
# Возможно, нужно ограничить количество попыток ввода пароля.
while [ "$(cat /proc/mounts | grep encfs | grep ${VIRT_ENCRYPT_DIR})" = "" ];
do
${KDIALOG} --title "Монтирование ${ENCRYPT_DIR}..." --password "Введите пароль. Количество попыток ${ECRYPT_CHECK_NUM}" | ${ENCFS} -S ${ENCRYPT_DIR} ${VIRT_ENCRYPT_DIR} || \
${KDIALOG} --sorry "Неверный пароль!"
# Счётчик уменьшаем на 1 после каждой попытки
ECRYPT_CHECK_NUM=`expr ${ECRYPT_CHECK_NUM} - 1`
if [ ${ECRYPT_CHECK_NUM} -eq 0 ];
then
# При неудачном вводе пароля выходим со статусом ошибки.
exit 1
fi
done
if [ ! -d ${MONTHLY_BACKUP} -o ! -w ${MONTHLY_BACKUP} ];
then
#${KDIALOG} --msgbox "Создаю папку"
mkdir -p ${MONTHLY_BACKUP}
fi
#${KDIALOG} --msgbox "Резервирование ${BACKUPED_DIR} ..."
if $(${RDIFF_BACKUP} ${RDIFF_BACKUP_OPT} ${BACKUPED_DIR} ${MONTHLY_BACKUP} );
then
if $(${FUSERMOUNT} -u ${VIRT_ENCRYPT_DIR} );
then
${KDIALOG} --msgbox "Резервирование ${BACKUPED_DIR} закончено успешно"
# Создаём временную метку созданного бэкапа.
# В предыдущей строке в date +%j дополнительно
# поставил %Y (год в формате YYYY),
# иначе с наступлением следующего года
# нумерация в CHECK_LOCK была бы больше текущей даты.
echo "`date +%Y%j`" > ${CHECK_LOCK}
else
${KDIALOG} --error "Не могу размонтировать ${VIRT_ENCRYPT_DIR}, устройство занято!"
fi
else
${KDIALOG} --error "Резервирование ${BACKUPED_DIR} закончено с ошибками!"
fi
else
${KDIALOG} --sorry "Резервирование отменено!"
#exit 1
# Возможно использовать код выхода для контроля выполнения резервирования.
fi
fi

P. S. Скрипт следует поместить в ~/.kde3.5/Autostart

Для извлечения в случае необходимости сохранённых бэкапов (man rdiff-backup) написал, точнее "творчески" переработал ещё один скриптик:

#!/bin/sh
# В первом аргументе скрипта передаётся путь к директории с зашифрованными данными.
SRC=$1
# Во втором аргументе - точка монтирования для расшифровки
DST=$2
KDIALOG=`which kdialog`
FUSERMOUNT=`which fusermount`
KONQUEROR=`which konqueror`
ENCFS=`which encfs`
if [ "$(cat /proc/mounts | grep encfs | grep $DST)" != "" ];
then
$(${KDIALOG} --title "encFS: Отмонтирование $DST..." --warningyesno "encFS: Хотите $DST отмонтировать?")
if [ $? == 0 ]
then
${FUSERMOUNT} -u $DST &
else
${KONQUEROR} $DST &
fi
else
$(${KDIALOG} --title "encFS: Монтирование $DST..." --warningyesno "encFS: Хотите монтировать $DST ?")
if [ $? == 0 ]
then
${KDIALOG} --title "encFS: Пароль..." --password "Ввод пароля для [$DST]" | ${ENCFS} -S
fi
fi

В KDE'шном меню создал пункт "Проверка архива", где в строку "Команда" ввёл

/home/lupo/bin/mountsafe.sh /home/users/encrypt-backup /home/users/raw-backup

инкрементальное резервирование, не привязанное ко времени

Выложу свой скриптик для резервирования, + его в том, что может выполняться в любой момент и всегда доступно наперёд заданное число бэкапов.
То есть, решена проблема, когда что-то испортилось, а пользователь ещё не успел заметить, но уже сделана новая полная резервная копия.
Число хранимых полных резервных копий и промежуточных регулируется, выполнение скрипта возможно в любой момент. Дополнительно производится синхронизация общих бэкапов с сервером. Для каждого хоста создаётся своя директория в синхронизируемых папках, пример папок такой:
mirror
host1
дата-время-full
дата-время
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время
дата-время-full
дата-время
дата-время
host2
дата-время-full
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время-full
Устаревшие бэкапы и инкрементальные, для кт. отсутствуют полные рез. копии (по причине устаревания или просто, если юзер удалил) автоматически удаляются.

#!/bin/bash

# -------------------- НАСТРОЙКИ --------------------
ARC_DIR="/home/bkp"	# хранилище резервных копий
ARC_SYNC_DIR="/mnt/ftp.myserver/bkp"	# зеркало хранилища, если пустое, то зеркалирование не выполняется

USR_DIRS="/home/pupkin /home/vasya /home/ftp"	# пользовательские директории для резервирования
USR_EXCL=""	# исключения

SYS_DIRS="/bin /boot /etc /lib32 /lib64 /opt /root /sbin /usr /var"	# системные директории для резервирования
SYS_EXCL="/var/tmp"	# исключения

FULL_NUM=2 # кол-во хранимых полных копий
INCR_NUM=8	# кол-во инкр. копий между полными копиями

TAR="nice -n 19 ionice -c2 -n7 tar czp --one-file-system -f" # команда архивирования
EXT="tgz"
# -------------------- ПЕРЕМЕННЫЕ --------------------
NOW=`date +%Y%m%d\ %H:%M:%S`
HOSTNAME=`hostname`
ARC_DIR_HOST="$ARC_DIR/$HOSTNAME"
ARC_SYNC_DIR_HOST="$ARC_SYNC_DIR/$HOSTNAME"
DIRS="$SYS_DIRS $USR_DIRS"
EXCL="$SYS_EXCL $USR_EXCL"
# -------------------- ФУНКЦИИ --------------------
# Удаление "сломанных" инкрементальных копий,
# для которых не найдена полная копия
function rm_brok_incr
{
  for dir in `ls $ARC_DIR_HOST`; do
	full_arc_dirname=`cat $ARC_DIR_HOST/$dir/full-arc-dirname 2>/dev/null`
	if [[  ( "$?" != "0" || ! -d $ARC_DIR_HOST/$full_arc_dirname ) && "`echo $dir|grep full`" == "" ]]; then
	  rm -rf $ARC_DIR_HOST/$dir
	fi
  done
}

# -------------------- MAIN --------------------
# создаём необходимые каталоги
mkdir -p $ARC_DIR_HOST $ARC_SYNC_DIR_HOST

# удаляем мусор
rm_brok_incr

# дата последней полной копии
LAST_FULL_DIR=`ls $ARC_DIR_HOST|grep full|tail -n1`
LAST_FULL_TIME=`echo $LAST_FULL_DIR|sed 's/-full//;s/\.//g;s/_/ /'`

# кол-во сделанных инкр. копий
INCR_COUNT=0
for dir in `ls $ARC_DIR_HOST`; do
  if [[ "`echo $dir|grep full`" != "" ]]; then
	INCR_COUNT=0
  else
	INCR_COUNT=$(($INCR_COUNT+1))
  fi
done

# если кол-во инкр. копий превысило INCR_NUM,
# то необходимо делать новую полную резервную копию
if [[ $INCR_COUNT -ge $INCR_NUM ]]; then
  LAST_FULL_DIR=""
  LAST_FULL_TIME=""
fi

# выбор копии - полная или инкр.
BKP_DIRNAME=`date -d "$NOW" +%Y.%m.%d_%H:%M:%S`
if [[ "$LAST_FULL_DIR" == "" ]]; then	# ----- полная копия
  BKP_DIRNAME=$BKP_DIRNAME-full
  mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
  # создаём полную резервную копию
  for dir in $DIRS; do
	dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
	$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --exclude "$EXCL"
  done
  
else	# ----- инкрем. копия
  mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
  echo $LAST_FULL_DIR > $ARC_DIR_HOST/$BKP_DIRNAME/full-arc-dirname
  NEWER=`date -d "$LAST_FULL_TIME" +%Y-%m-%d\ %H:%M:%S`
  # создаём резервную копию
  for dir in $DIRS; do
	dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
	$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --newer "$NEWER" --exclude "$EXCL"
  done
fi

# удаление старых резервных копий
for dir in `ls $ARC_DIR_HOST|grep full|head -n -$FULL_NUM`; do
  rm -rf $ARC_DIR_HOST/$dir
done

# удаляем мусор
rm_brok_incr

# синхронизируем с зеркалом
if [[ "$ARC_SYNC_DIR" != "" ]]; then
  rsync -rt --delete $ARC_DIR_HOST/ $ARC_SYNC_DIR_HOST &&
  rsync -rt --delete $ARC_SYNC_DIR/ $ARC_DIR
fi

Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!

Похоже на переизобретение

Похоже на переизобретение app-backup/rsnapshot

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

Похоже, не смотрели даже =)

krigstask написал(а):
Похоже на переизобретение app-backup/rsnapshot

rsnapshot может быть запущен с интервалом в несколько секунд, если Вы работаете в системе и Вам необходимо сохранять все снимки ф.с. каждые 0.017-5 минут?
Скорость выполнения задачи rsnapshot-ом сравнима со скоростью алгоритма однократного обхода дерева файловой системы с прямой подстановкой условий?
Все входные данные для скрипта берутся из директории с бэкапами и являются достаточными для определения того, что уже не требуется и что было удалено по желанию пользователя, в то время как для работы rsnaphot необходимо возиться с файлами конфигурации. Особенно это ощутимо, когда Вам нужно на час-другой настроить авто-бэкап разрабатываемого проекта или Вы просто пришли посидеть за чужим компьютером.
Сравните громоздкость программы rsnapshot на perl и прозрачность bash-скрипта. =)
+ bash-скрипт каждый может модифицировать в соответствии с его требованиями, мне понадобился один вечер, чтобы придумать и реализовать нужный мне алгоритм на bash, которые делает то, что нужно именно мне.

Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!

и Вам необходимо сохранять

и Вам необходимо сохранять все снимки ф.с. каждые 0.017-5 минут?

освой icron , если уж на то пошло

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

slepnoga написал(а): и Вам

slepnoga написал(а):
и Вам необходимо сохранять все снимки ф.с. каждые 0.017-5 минут?

освой icron , если уж на то пошло

Спасибо за совет! А что это, если не секрет?
Как альтернатива, такая команда:

(while [[ "`date +%H`" < 18 ]]; do backup; sleep 60; done &>/dev/null)&

Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!

займусь некрофилией (-:Е (с)Krigstask

скрипт, выполняет, обновление системы, обновление базы esearch, затем проводит emerge -pvuDN world, glsa-check (на наличие уязвимых пакетов), затем фильтрует вывод и отправляет по почте через ssmtp который идет в gentoo как MTA по дефолту. чтобы скрипт оправлял почту нужно настроить ssmtp настройка сводится к простой правке /etc/ssmtp/ssmtp.conf

root=yourmail@domain.com
mailhub=mx.domain.com:25
hostname=mx.domain.com:25
FromLineOverride=YES
UseSTARTTLS=YES
AuthUser=yourmail@domain.com
AuthPass=yourpassword

ну и сам скрипт

#!/bin/bash
LIST="/tmp/list"
MAILTO="lesovsky_av@uzps.mh.ru"
rm $LIST
emerge --sync; eudatedb;
echo "Subject: `hostname` emerge notification" >> $LIST
echo -e "\n `date -R`" >> $LIST
echo '######## emerge -uDN world information ########' >> $LIST
emerge -pvuDN world |awk -F ] '{print $2}' |awk -F [ '{print $1}' |awk '{print $1}' |uniq >> $LIST
echo '######## GLSA-CHECK information ########' >> $LIST
glsa-check -l affected >> $LIST
cat $LIST | ssmtp $MAILTO

+ 1

наверняка многие админы шлюзов и проксей сталкивались с клиент-банками, через прокси они работать не хотят, подавай им реальный айпишник... так вот наверняка приходилось их натить, и для каждого такого клиента вписывать в правила соответвующуюю строчку типа, iptables -t nat -A POSTROUTING -s 192.168.0.5 -d 85.24.16.68 -p tcp --dport 8452 -j SNAT --to-source $REAL_IP.
так вот обленившись в очередной раз я решил написать скрипт, который сам прописывает параметры клиентов и адресов с портами банков в правила для iptables. в итоге получилось что нужно вести текстовый файл, в котором посторочно перечислены 'клиент моей сетки' 'адрес банка' 'порт банка'.

192.168.1.15 85.24.34.58 1856
192.168.1.52 56.78.89.65 2158

В скрипте цикл который читает строку и распихивает эти парметры в строку для iptables. получилось вот что.

#!/bin/bash
TEXTFILE="/root/temp/addresses"
while read src dst dport; do
    iptables -t nat -A POSTROUTING -s $src -d $dst -p tcp --dport $dport -j SNAT --to-source 212.220.129.40"
  done < $TEXTFILE

проверено, работает. Этот цикл у меня воткнут в набор правил где происходит формирование nat-цепочек

Друзья! Помогите плз! Тема

Друзья! Помогите плз! Тема такая что надо написать скриптик на BASH, который прописывает прокси в систему, т.е что бы при поключении к одной точке доступа было прокси а при подключении к другим не было. Напишете хоть алгоритм действий или не обходимые команды.

Ну, можно сделать это через

Ну, можно сделать это через post_up в /etc/conf.d/net, к примеру.

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

Я бы monit заюзал.

Я бы monit заюзал.

OpenVPN

Проверка доступен или нет впн сервер, если не доступен то делаем рестарт служб.
Информация записывается в файл лога, всегда можно видеть что и как было.
Скрипт запускаю у себя по кронтабу, каждую минут.
Может кому понадобится...

#!/bin/sh

VPN_SERVER="10.10.0.1"
GUEST_DEV="ppp1"
TIME_RESTART_CONNECTION="30"
LOGFILE="/var/log/vpn_status"

echo "Start scripts check status";
date >> ${LOGFILE};
echo "Start scripts check status" >> ${LOGFILE};

if ping -c 3 ${VPN_SERVER} &> /dev/null 

        then    echo "VPN Connect - Ok";
                echo "VPN Connect - Ok" >> ${LOGFILE};

        else    echo "VPN Connect - Down";
                echo "VPN Connect - Down" >> ${LOGFILE};

                /etc/init.d/net.${GUEST_DEV} restart;
                echo "net.${GUEST_DEV} restart" >> ${LOGFILE};

                sleep 5;

                /etc/init.d/openvpn restart;
                echo "Openvpn restart" >> ${LOGFILE};

                sleep 5;

                echo "VPN Service was restarted";
                echo "VPN Service was restarted" >> ${LOGFILE};

                sleep ${TIME_RESTART_CONNECTION};

                echo "Try connect again";
                echo "Try connect again" >> ${LOGFILE};

                if ping -c 3 ${VPN_SERVER} &> /dev/null 

                        then    echo "VPN Connect after restart service- Ok";
                                echo "VPN Connect after restart service- Ok" >> ${LOGFILE};

                        else    echo "VPN Connect after restart service - Down";
                                echo "VPN Connect after restart service - Down" >> ${LOGFILE};

                fi

fi

echo "End scripts check status";
echo "End scripts check status" >> ${LOGFILE};
date >> ${LOGFILE};
echo "==========================================================" >> ${LOGFILE};

Почему не сделать через опции

Почему не сделать через опции самого pppd (persist)?

...

небольшая специфика работы.. засчет этого иногда при созданном пппое соединении не пингуется сервер..
это вопросы к провайдеру, но когда пытаешся говорить с ним, толка так и не появляется..
поэтому пришлось вот придумывать..
т.е. когда pppoe соединение падает, то у меня оно само подымается.

Примитивный скрипт для логов,

Примитивный скрипт для логов, делал для себя
Все просто, при включении проверяем существует ли папка, если нет, создаем и делаем симлинк. Плюс в силу особенностей времяпрепровождения за шайтан машиной, еще пара команд, так же весьма понятных...

#!/bin/bash
### Simple LogDB
### GPL-v2
### joy4eg[at]gmail.com

### Var ###
user="userx"
LogDB="/var/log"
db="/var/LogDB"
mhs=$(date +%m)
year=$(date +%Y)
mhh=$(echo $mhs -1 | bc).$year
day=$(date +%d)
dc="$db/DC/$mhs.$year/$day"
homedc="/home/$user/.config/eiskaltdc++/Logs"
LANG=C
###

if [[ ! -d "$db/$mhs.$year/$day" ]];
then
	mkdir -p $db/$mhs.$year/$day
	rm $LogDB -f
	ln -s -f $db/$mhs.$year/$day $LogDB
	touch $LogDB/torrent.transmission
	chmod 700 $LogDB/torrent.transmission
	chown $user:$user $LogDB/torrent.transmission
	mkdir $LogDB/{paludis,tor}
	chmod 755 $LogDB/paludis
	chown paludisbuild:paludisbuild $LogDB/paludis -R
	chown tor:tor $LogDB/tor -R
	chmod 755 $LogDB/tor -R
### EiskaltDC++ LogDB
	mkdir -p $dc
	chmod 700 $dc -R
	chown $user:$user $dc -R
	rm $homedc -f
	sudo -u $user ln -s $dc $homedc
else	
	exit 0
fi
### Bak ###
if [ "$day" -eq "1" ]; then
	if [[ -d "$db/$mhh" ]]; then
		tar -czf $db/$mhh.tar.gz $db/$mhh
	fi
fi

Все мы, рано или поздно, будем там...

отдельный раздел или блог

думается мне что в одной нити форума постить кучу скриптов и тут же их обсуждать как то плохо выглядит.
надо либо отдельный раздел под это выделять, либо модерируемый блог для всех или еще чего нибудь.
а то совсем каша получается, а вот инфа хорошая ...

на 100% согласен!

Поддерживаю!
Деление по целевому назначению.

Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".