Мдя. На звездочку внимания не обратил. Спасибо за разъяснение.lissyara писал(а):не путайте две разные командыдействительно не работает.Код: Выделить всё
lissyara$ su lissyara# rm -rf / rm: "/" may not be removed lissyara#
а вот предлагаемая командадо выполнения шеллом интерпретируется так:Код: Выделить всё
rm -rf /*
и прекрасно отработает.Код: Выделить всё
lissyara# echo rm -rf /* rm -rf /COPYRIGHT /bin /boot /cdrom /compat /dev /entropy /etc /home /lib /libexec /media /mnt /proc /rescue /restoresymtable /root /sbin /shares /sys /tmp /usr /var lissyara#
Полезные скрипты наструганные на коленке.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- ст. сержант
- Сообщения: 364
- Зарегистрирован: 2008-10-02 9:28:30
Re: Полезные скрипты наструганные на коленке.
Услуги хостинговой компании Host-Food.ru
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
-
- проходил мимо
Re: Полезные скрипты наструганные на коленке.
Код: Выделить всё
#! /bin/sh
for arg; {
if [ -f "$arg" ]; then
vidfile=$arg
else
eval "$arg"
fi
}
if [ ! $vidfile ]; then
echo usage: ${0##*/} [key=value] file [key=value]
exit 1
fi
tplname=${tplname:-$(mktemp -u ani_XXXX)}
frames=${frames:-15}
seek=${seek:-90}
rate=${rate:-10}
width=${width:-320}
trap 'rm -f ${tplname}_*.png; pkill -f -- -nosub' exit int
mplayer -slave -really-quiet -nosound -benchmark \
-vo yuv4mpeg:file=/dev/stdout \
-nosub -ss $seek -sws 9 -vf-add scale=$width:-2,$filters "$vidfile" |
ffmpeg -i - -r $rate -vframes $frames \
${tplname}_%3d.png
if [ ${png+png} ]; then
apngasm $tplname.png ${tplname}_001.png 1 $rate
else
convert -verbose -layers optimize -delay 1x$rate ${tplname}_\*.png $tplname.gif
fi
GIF
Код: Выделить всё
$ anigif seek=611 filters=crop=260 samayou_02.mkv

PNG
Код: Выделить всё
$ anigif png= frames=8 samayou_02.mkv

зависимости: mplayer, ffmpeg, ImageMagick, apngasm (для png)
способы применения: аватары, иллюстрации
UPD
ftp://ftp.lissyara.su/users/Guest/anigif - пофикшенный вариант
- ban
- мл. сержант
- Сообщения: 145
- Зарегистрирован: 2009-07-22 22:36:29
- Откуда: г.Волжский Волг. обл.
Re: Полезные скрипты наструганные на коленке.
Основная проблема при зарезании рекламмы - найти списки URL и подготовить их, чтобы Squid правильно воспринял. Такие списки можно составить и самостоятельно. Предлагаю свой подход для решения задачи зарезания рекламмы на основании ban-листа Rejik-ban-banners и acl Squid url_regex.
Получаем ban-лист
Предположим, выбрали для хранения ban-листа следующую папку:
, тогда выполните следующую последовательность действий:/usr/local/etc/squid
Код: Выделить всё
cd /usr/local/etc/squid
fetch http://rejik.ru/adblock
mv adblock adRejik
chown -R squid:squid adRejik
Чтобы использовать скачаный ban-лист в Squid, сначала его надо подготовить. Следующий ниже скрипт на Perl преследует вышеобозначенную цель подготовки ban-листа для Squid:
ee /usr/local/etc/squid/ustakanim.pl
Код: Выделить всё
#!/usr/bin/perl -w
#Проверим передали ли файл как параметр
die "ERROR: peredaj skriptu parametr v vide imeni faila!!!\n" unless @ARGV;
#Открытие, чтение и закрытие файла блокировок рекламы Adblock
open(F1, $ARGV[0]) or die "ERROR: ne mogu otkrit\' fail\nTi che tam peredal hot\' ponyal sam\?\n";
@file = <F1>;
close(F1) or die $!;
#Откроем файл, куда будем складывать обработанные строки
open(FOUT, ">adRejik") or die "ERROR: cann't create new file\n";
## ...Идея->Тюрьма->Идея...:
## Подготовка Rejik'ского бан-листа для плагина Adblock браузера Firefox так,
## чтобы он корректно воспринялся ACL'ом url_regex прокси сервера Squid в
## качестве регулярного выражения.
#
# после ненапряжного зрительного и еще какого-то (незнаю как это назвать) анализа
# в режиковском бан-листе были выявлены следующие левые паттерны:
# (1)СИМВОЛЫ$domainСИМВОЛЫ
# (2)СИМВОЛЫ$КОНЕЦСТРОКИ
## Самый главный цикл
foreach $tekSTR (@file){
chop $tekSTR;
# паттерн (1)СИМВОЛЫ$domainСИМВОЛЫ буду ловить по "$d"
if ($tekSTR =~ /^(.+)\$d/) {
print FOUT MetasimvolLiteral($1),"\n";
}
# паттерн (2)СИМВОЛЫ$КОНЕЦСТРОКИ получается практически автоматом
elsif ($tekSTR =~ /^(.+)\$/) {
print FOUT MetasimvolLiteral($1),"\n";
}
# все остальные строки
elsif ($tekSTR =~ /[^\$]/) {
print FOUT MetasimvolLiteral($tekSTR),"\n";
}
}
## Функция:
# Если сочтет строку нерегулярным выражением, то заэкранирует Метасимволы
sub MetasimvolLiteral {
$in = $_[0];
# 1. Если в строке нет ни одного сопадения на экранирование, то строку
# будем анализировать на совпадение с Метасимволами и экранировать их
if ($in !~ /\\/){
# ТОЧКА .
$in =~ s/\./\\\./g;
# СЛЭШ /
# хоть кажется он и не является метасимволом, заэкранирую все же... на всякий случай...
$in =~ s/\//\\\//g;
# ВОПРОС ?
$in =~ s/\?/\\\?/g;
# ЗВЕЗДОЧКА *
$in =~ s/\*/\.\+/g;
return $in;
}
# 2. В противном случае строка считается регулярным выражением
# и ничего делать не будем
else {
return $in;
}
}
close(FOUT);
Код: Выделить всё
#chmod 744 /usr/local/etc/squid/ustakanim.pl
#/usr/local/etc/squid/ustakanim.pl adRejik

Настраиваем конфигурацию Squid
Чтобы заблокировать доступ к ресурсам, перечисленным в ban-листе, надо конфигурацию Squid видоизменить так:
Код: Выделить всё
...
acl adRejik url_regex "/usr/local/etc/squid/adRejik"
...
http_access deny adRejik
...
========================
Я был бы очень признателен, если бы кто-нибудь шаристый подверг скрипт яростной, раздалбливающей все в пух и прах с целью добирания до истины в виде правильноработающего скрипта, критике.
-----
Всегда Ленин
Алексей Николаевич,
специально для Леночки

---------------------------------
май 2010, на улице солце прямо в глаз
третий этаж, палата номер 13 (направо), между Наполеоном и Архимедом (есть подозрение, что Архимед пидарас... Надо назюкать Гитлера из 6й, случайно проболтавшись ему, что мама Архимеда была истиная еврейка... пусть потом разбираются чья кровь Голубее).
-
- ст. лейтенант
- Сообщения: 1117
- Зарегистрирован: 2007-03-04 7:48:58
- Откуда: Mytischi
Re: Полезные скрипты наструганные на коленке.
У системы мониторинга, немного доработанной нашими программистами,
где то течет память, поэтому java сжирает все и останавливается. Как правило,
это происходит в выходные, поэтому разбираются только в понедельник.
Скрипт пристреливает жабу, если она сожрала больше 30 гигабайт памяти.
Код: Выделить всё
#!/bin/bash
#
# process seeker and destroyer
# script kill java process if he great than 30G
javasize=`top -o size -n 2>&1 | grep -i "java" | head -n 1 | awk '{print $6}' | sed 's/[A-Za-z]//'`
jpid=`top -o size -n 2>&1 | grep -i "java" | head -n 1 | awk '{print $1}'`
size="${#javasize}"
counter=0
jobpid=0
if [ "$size" -gt "2" ]; then
if [ "$javasize" -ge "30720" ]; then
/opt/opennms/bin/opennms stop 2>&1 >/dev/null &
jobpid=$!
while [ "$counter" -le "3" ]
do
if [ "`ls /proc | grep "$jobpid"`" ]; then
sleep 25
fi
counter=`expr $counter + 1`
done
kill -9 $jobpid $jpid 2>&1 >/dev/null
/opt/opennms/bin/opennms start 2>&1 >/dev/null
if [ "$?" != "0" ]; then
echo "some trouble was happend. cannot restart opennms on `hostname`" | mailx -s `hostname` scripts.reports@XXXX
m.ru
exit 1;
fi
echo "opennms was restarted successfully on `hostname`" | mailx -s `hostname` scripts.reports@XXXX.ru
fi
exit 0;
else
if [ "$javasize" -ge "30" ]; then
/opt/opennms/bin/opennms stop 2>&1 >/dev/null &
jobpid=$!
while [ "$counter" -le "3" ]
do
if [ "`ls /proc | grep "$jobpid"`" ]; then
sleep 25
fi
counter=`expr $counter + 1`
done
kill -9 $jobpid $jpid 2>&1 >/dev/null
/opt/opennms/bin/opennms start 2>&1 >/dev/null
if [ "$?" != "0" ]; then
echo "some trouble was happend. cannot restart opennms on `hostname`" | mailx -s `hostname` scripts.reports@XXXX
m.ru
exit 1;
fi
echo "opennms was restarted successfully on `hostname`" | mailx -s `hostname` scripts.reports@XXXX.ru
fi
fi
exit 0;
p.p.S: Вроде как awk умеет длину считать, но не я разбирался.
-
- ст. лейтенант
- Сообщения: 1117
- Зарегистрирован: 2007-03-04 7:48:58
- Откуда: Mytischi
Re: Полезные скрипты наструганные на коленке.
Код: Выделить всё
/opt/sfw/bin/top
Код: Выделить всё
export PATH="$PATH:/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/ucb:/usr/ccs/bin:/usr/sfw/bin:/usr/sfw/sbin:/opt/sfw/bin:/opt/sfw/sbin:/opt/csw/bin:/opt/csw/sbin"
Код: Выделить всё
bash-3.00# cat /var/spool/cron/crontabs/root
#ident "@(#)root 1.21 04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * * /opt/scripts/jkill.sh
bash-3.00#
- Alex Keda
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно
-
- ст. лейтенант
- Сообщения: 1117
- Зарегистрирован: 2007-03-04 7:48:58
- Откуда: Mytischi
Re: Полезные скрипты наструганные на коленке.
*/x точно нету, так как при употреблении такой нотации,Alex Keda писал(а):помоему, ты перегнул...
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно
мне крон говорил, что он не распарсил. Думаешь, 0-23 поймет?
-
- проходил мимо
Re: Полезные скрипты наструганные на коленке.
ман что ли наберите в консоли
-
- ст. лейтенант
- Сообщения: 1117
- Зарегистрирован: 2007-03-04 7:48:58
- Откуда: Mytischi
Re: Полезные скрипты наструганные на коленке.
Спасибо, но речь шла о Solaris 10.Гость писал(а):http://www.freebsd.org.ua/man/crontab.5.html
ман что ли наберите в консоли
-
- ст. лейтенант
- Сообщения: 1117
- Зарегистрирован: 2007-03-04 7:48:58
- Откуда: Mytischi
Re: Полезные скрипты наструганные на коленке.
значения, вывод top будет всегда показывать 0.

работать никогда. Исправленная версия:
Код: Выделить всё
#!/bin/sh
#
# process seeker and destroyer
# script kill java process if he great than 30G
# top has bug, so we use ps
javasize="`ps -ef -o pid,rss,args | grep -v "grep" | grep -i "Dopennms" | awk '{print $2}'`"
jpid="`ps -ef -o pid,rss,args | grep -v "grep" | grep -i "Dopennms" | awk '{print $1}'`"
counter=0
jobpid=0
if [ "$javasize" -ge "31457280" ]; then
/opt/opennms/bin/opennms stop 2>&1 >/dev/null &
jobpid=$!
while [ "$counter" -le "3" ]; do
if [ "`ls /proc | grep "$jobpid"`" ]; then
sleep 25;
fi
counter=`expr $counter + 1`
done
kill -9 $jobpid $jpid 2>&1 >/dev/null
/opt/opennms/bin/opennms start 2>&1 >/dev/null
if [ "$?" != "0" ]; then
echo "some trouble was happend. cannot restart opennms on `hostname`" | mailx -s `hostname` scripts.reports@xxx.xx
exit 1;
fi
echo "opennms was restarted successfully on `hostname`" | mailx -s `hostname` scripts.reports@xxx.xx
fi
exit 0;
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Код: Выделить всё
Интернет----модем----GATE---Локальная сеть
Для работы скриптов нужны:
/usr/ports/lang/expect
/usr/ports/net-im/sendxmpp
Настройка SenXMPP написана тут
Первый скрипт и основной который будем по крону запускать inet_check.sh
Код: Выделить всё
#!/bin/sh
ping="/sbin/ping"
sendxmpp="/usr/local/bin/sendxmpp"
echo="/bin/echo"
log_dir="/var/log"
alert="ICMP failed Service"
active="ICMP succeeded Service"
utk_dns_down="Internet канал "ЮТК" ***НЕ РАБОТАЕТ***, пробуем перезагрузить модем 192.168.253.1"
utk_dns_up="Internet канал "ЮТК" снова работает!"
# ping ДНС сервера ЮТК
$ping -q -c 6 80.254.111.254 > /dev/null 2>&1
if [ $? != 0 ]; then
# Тот самый скрипт перезагружающий модем
/usr/SCRIPTS/modem_reboot.sh > /dev/null 2>&1
cat $log_dir/utk_dns.log | grep down > /dev/null 2>&1
if [ $? != 0 ]; then
$echo $utk_dns_down | $sendxmpp admin@office.jabber.ru -s "$alert" -f /root/.sendxmpprc
$echo down > $log_dir/utk_dns.log
fi
else
cat $log_dir/utk_dns.log | grep active > /dev/null 2>&1
if [ $? != 0 ]; then
$echo $utk_dns_up | $sendxmpp admin@office.jabber.ru -s "$active" -f /root/.sendxmpprc
$echo active > $log_dir/utk_dns.log
fi
fi
Для того что бы скипт работал нужно установить из портов /usr/ports/lang/expect
Код: Выделить всё
#!/usr/local/bin/expect
spawn telnet 192.168.253.1
expect "Login:"
send "логин\r"
expect "Password:"
send "пароль\r"
expect ">"
send "reboot\r"
sleep 30
expect eof
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Сразу скажу скрипт написан не мной, взял я его тут
И слегка его дописал под себя.
Код: Выделить всё
#!/bin/sh
ADMIN="admin@domain.ru"
# set alert level 90% is default
ALERT=90
df -H | grep -vE '^Filesystem|tmpfs|cdrom|devfs' | awk '{ print $5 " " $1 }' | while read output;
do
#echo $output
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
mail -s "Alert: Almost out of disk space $usep" $ADMIN -f support@domain.ru
fi
done
- gonzo111
- лейтенант
- Сообщения: 648
- Зарегистрирован: 2007-11-15 16:32:33
- Откуда: China
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.

Код: Выделить всё
#!/bin/sh
echo "Table 40"
ipfw table 40 list|awk -F '/' '{ print $1 }'| nslookup $@ | grep "name ="
echo -e "\n"
echo -e "\n"
echo "Table 50"
ipfw table 50 list|awk -F '/' '{ print $1 }'| nslookup $@ | grep "name ="
беру зарплату гречкой и сахаром...
Наша комната - lissyara.su@conference.jabber.ru
- pinger
- рядовой
- Сообщения: 23
- Зарегистрирован: 2009-03-22 20:41:11
- Откуда: УССР, Днепродзержинск
- Контактная информация:
Еще раз о резервировании канала
Код: Выделить всё
# route add 195.214.195.105 192.168.0.254
Код: Выделить всё
# cd /usr/ports/net/fping && make install clean
Код: Выделить всё
#!/bin/sh
target="195.214.195.105"; # цель тестирования ukr.net
fping_path="/usr/local/sbin/fping"
datenow="$(date +%Y%m%d%H%M%S)"
flags_path="/tmp/fping-$datenow.log"
gw_main="192.168.0.254"; #шлюз основного канала
gw_reserv="192.168.0.1"; #шлюз резерва
res=`$fping_path $target|grep -o 'alive' > $flags_path && grep 'alive' $flags_path | wc -l && rm $flags_path`; # собственно сама проверка канала
ans=0;
if [ $res>$ans ];
then
echo "Link is UP $datenow" >> /tmp/reserver.log
/sbin/route del default
/sbin/route add default $gw_main
else
echo "Link is DOWN $datenow" >> /tmp/reserver.log
/sbin/route del default
/sbin/route add default $gw_reserv
fi
1) Цель (target) тестирования основного шлюза (gw_main)
2) Основной шлюз (gw_main)
3) Резервный шлюз (gw_reserv)
Задание:
В случае крушения основного канала переключаться на резервный, после восстановления основного переключиться на него.
В кроне работает, выставить переодичность по вкусу.

-
- мл. сержант
- Сообщения: 134
- Зарегистрирован: 2010-06-30 15:40:30
Re: Еще раз о резервировании канала
тут весь прикол в том что работает этот скрипт только когда падает шлюз провайдера. А вот когда шлюз прова работает, а инет у него обрывается?pinger писал(а):Добавляем статический маршрут к цели тестирования (лучше прописать и в rc.conf)устанавливаем fpingКод: Выделить всё
# route add 195.214.195.105 192.168.0.254
Код: Выделить всё
# cd /usr/ports/net/fping && make install clean
Дано:Код: Выделить всё
#!/bin/sh target="195.214.195.105"; # цель тестирования ukr.net fping_path="/usr/local/sbin/fping" datenow="$(date +%Y%m%d%H%M%S)" flags_path="/tmp/fping-$datenow.log" gw_main="192.168.0.254"; #шлюз основного канала gw_reserv="192.168.0.1"; #шлюз резерва res=`$fping_path $target|grep -o 'alive' > $flags_path && grep 'alive' $flags_path | wc -l && rm $flags_path`; # собственно сама проверка канала ans=0; if [ $res>$ans ]; then echo "Link is UP $datenow" >> /tmp/reserver.log /sbin/route del default /sbin/route add default $gw_main else echo "Link is DOWN $datenow" >> /tmp/reserver.log /sbin/route del default /sbin/route add default $gw_reserv fi
1) Цель (target) тестирования основного шлюза (gw_main)
2) Основной шлюз (gw_main)
3) Резервный шлюз (gw_reserv)
Задание:
В случае крушения основного канала переключаться на резервный, после восстановления основного переключиться на него.
В кроне работает, выставить переодичность по вкусу.
Наклепал алгоритм:

Т.е. смысл пинга заведомо стабильного интернет ресурса поочередно через шлюзы двух провайдеров, а не просто их шлюзы.
К сожалению не владею языком программирования Perl (только основами Delphi\Pascal), поэтому решил проблему добавлением роутов типа:
mail.ru через ISP1
rambler.ru через ISP2
и использую скрипт как тут http://rexxer.kharkov.ru/2010/06/23/fre ... -internet/
Конечно желательно найти 2 ресурса который скорее всего на офисе использоваться не будет (например корейский или китайский), но заведомо 99% не падующий и стабильный
- pinger
- рядовой
- Сообщения: 23
- Зарегистрирован: 2009-03-22 20:41:11
- Откуда: УССР, Днепродзержинск
- Контактная информация:
Re: Еще раз о резервировании канала
Вы внимательно читали пост?Leviafan писал(а):тут весь прикол в том что работает этот скрипт только когда падает шлюз провайдера. А вот когда шлюз прова работает, а инет у него обрывается?
Код: Выделить всё
target="195.214.195.105"; # цель тестирования ukr.net

-
- мл. сержант
- Сообщения: 134
- Зарегистрирован: 2010-06-30 15:40:30
Re: Полезные скрипты наструганные на коленке.
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Код: Выделить всё
#!/bin/sh
# Указываем путь у log-файлу
log="/var/log/routing.log"
# Для очистки вчерашнего дня (хранение лога за один день)
yesterday=`/bin/date -v -1d "+%d.%m.%Y"`
# Если log-файл не найден, создаем его, иначе, если есть записи старше 1 дня чистим его.
clear_log ()
{
if [ ! -f ${log} ]
then
touch ${log}
else
if cat ${log} | grep ${yesterday} > /dev/null
then
cat /dev/null > ${log}
fi
fi
}
# Инициализируем переменные
init ()
{
gw1="111.11.11.1"
gw2="222.22.22.1"
gw3="333.33.33.1"
prefered_gw=${gw1}
cts_gw="80.80.xx.xx"
enforta_gw="79.122.xxx.x"
utk_gw="80.254.xxx.x"
dev_if1="rl1"
dev_if2="re0"
dev_if3="rl2"
if1=`ifconfig ${dev_if1} | awk -F ' *|:' '/inet /{print $2}'`
if2=`ifconfig ${dev_if2} | awk -F ' *|:' '/inet /{print $2}'`
if3=`ifconfig ${dev_if3} | awk -F ' *|:' '/inet /{print $2}'`
# Сообщения для отправки
sendxmpp="/usr/local/bin/sendxmpp"
cts_down="Internet канал ЦТС ${gw1} ***НЕ РАБОТАЕТ*** $(date)"
all_down="Internet канал ЦТС ${gw1}, Энфорта ${gw2} и ЮТК ${gw3} не работают! $(date)"
cts_used="Вернулись на основной Internet канал ЦТС ${gw1} $(date)"
enforta_used="Канал ЦТС не работает. Переключаемся на Internet канал Энфорта ${gw2} $(date)"
utk_used="Каналы ЦТС и Энфорта не работают. Переключаемся на Internet канал ЮТК ${gw3} $(date)"
# Текущие статусы шлюзов: 0 - шлюз недоступен, 1 - шлюз работает
gw1_curr_status=0
gw2_curr_status=0
gw3_curr_status=0
# Текущие потери пакетов на шлюзе
gw1_curr_packet_loss=0
gw2_curr_packet_loss=0
gw3_curr_packet_loss=0
# Максимальный процент потерь пакетов, при превышении данного числа, шлюз считается недоступным
gw1_max_packet_loss=90
gw2_max_packet_loss=90
gw3_max_packet_loss=90
# Отчищаем log-файл и сохраняем значения основных переменных
clear_log
# echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status every ${check_period}." >> ${log}
echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status." >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP1 [if1=${if1}, dev_if1=${dev_if1}, gw1=${gw1}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP2 [if2=${if2}, dev_if2=${dev_if2}, gw2=${gw2}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP3 [if3=${if3}, dev_if3=${dev_if3}, gw3=${gw3}]" >> ${log}
}
# Данная функция определяет текущее состояние каждого из шлюзов.
# Если текущий процент потерь меньше максимально допустимого, то считаем, что шлюз доступен.
get_current_status ()
{
echo `date +"%T %d.%m.%Y"`." Get current status ISP gateways." >> ${log}
# Get current status default gateway ISP1 (ЦТС)
gw1_curr_packet_loss=`ping -S ${if1} -c20 -l20 -q -W3 ${cts_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"%" -f1`
if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - OK]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - CRITICAL]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=0
fi
# Get current status default gateway ISP2 (Энфорта)
gw2_curr_packet_loss=`ping -S ${if2} -c20 -l20 -q -W3 ${enforta_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"%" -f1`
if [ ${gw2_curr_packet_loss} -le ${gw2_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - OK]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - CRITICAL]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=0
fi
# Get current status default gateway ISP3 (ЮТК)
gw3_curr_packet_loss=`ping -S ${if3} -c20 -l20 -q -W3 ${utk_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"%" -f1`
if [ ${gw3_curr_packet_loss} -le ${gw3_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - OK]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - CRITICAL]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=0
fi
}
# Данная функция производит переключение шлюза по умолчанию в зависимости от результатов полученных в get_current_status ()
# На данный момент предпочитаемым шлюзом может быть только ${gw1}
switch_default_gw ()
{
curr_gw=`route -n get default | grep gateway | awk '{print $2}'`
# Основной шлюз GW1 нормально работает.
# (Если [текущий_гейт = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "[STATUS - OK]. Current default gateway is prefered and running up. Nothing to do." >> ${log}
return
fi
# GW1 упал. Переключаемся на GW2.
# (Если [текущий_гейт не = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} != ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} is down. Change default gw to ${gw2}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw2}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_down" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
echo "$enforta_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw2}
/sbin/pfctl -f /etc/pf2.conf
return
fi
# GW1 и GW2 упали. Переключаемся на GW3.
# (Если [текущий_гейт не = GW3 и у gw1 и gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} != ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} and gw ${gw2} is down. Change default gw to ${gw3}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw3}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$utk_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw3}
/sbin/pfctl -f /etc/pf3.conf
return
fi
# GW1 поднялся. Переключаемся снова на GW1.
# (Если [текущий_гейт не = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw1}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw1}
/sbin/pfctl -f /etc/pf.conf
return
fi
# GW1 в дауне. По прежнему используется GW2.
# (Если [текущий_гейт = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} = ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is still down. Current default gw is ${gw2}" >> ${log}
return
fi
# GW1 и GW2 в дауне. По прежнему используется GW3.
# (Если [текущий_гейт = GW3 и у gw1 и у gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} = ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} and gw ${gw2} is still down. Current default gw is ${gw3}" >> ${log}
return
fi
# GW1, GW2 и GW3 в дауне.
# (Если [у gw1,gw2 и gw3 статус=0] тогда)
if [ ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 0 ]
then
echo "***************************************************************************" >> ${log}
echo `date +"%T %d.%m.%Y"`. "CRITICAL. Three gateways is down. Try again later." >> ${log}
echo "***************************************************************************" >> ${log}
return
fi
}
# Инициализируем переменные
init
# По очереди вызываем функции get_current_status () и switch_default_gw ()
get_current_status
switch_default_gw
Код: Выделить всё
//> ee /etc/crontab
Код: Выделить всё
# Атоматическая проверка и смена канала "ЦТС"-"Энфорта"-"ЮТК" (круглосуточно, каждую минуту)
#minute hour mday month wday who command
*/1 * * * * root /usr/SCRIPTS/check_gateways.sh > /dev/null 2>&1
Код: Выделить всё
/usr/ports/net-im/sendxmpp
Оригинал скрипта брал тут он заточен по Linux
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Работает пока только на freebsd 6.x так как при команде
Код: Выделить всё
//> ping -S 192.168.xxx.x -c20 -l20 -q -W3 ya.ru | grep loss | awk '{print $(NF-2)}' | cut -d"%" -f1
0
//>
Код: Выделить всё
а на freebsd 7.x и 8.x
//> ping -S 192.168.xxx.x -c20 -l20 -q -W3 ya.ru | grep loss | awk '{print $(NF-2)}' | cut -d"%" -f1
0.0
//>
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Данный скрипт сделан для FreeBSD 7.x и 8.x
Код: Выделить всё
Изменено было | cut -d"%" -f1 на | cut -d"." -f1
Код: Выделить всё
#!/bin/sh
# Указываем путь у log-файлу
log="/var/log/routing.log"
# Для очистки вчерашнего дня (хранение лога за один день)
yesterday=`/bin/date -v -1d "+%d.%m.%Y"`
# Если log-файл не найден, создаем его, иначе, если есть записи старше 1 дня чистим его.
clear_log ()
{
if [ ! -f ${log} ]
then
touch ${log}
else
if cat ${log} | grep ${yesterday} > /dev/null
then
cat /dev/null > ${log}
fi
fi
}
# Инициализируем переменные
init ()
{
gw1="111.11.11.1"
gw2="222.22.22.1"
gw3="333.33.33.1"
prefered_gw=${gw1}
cts_gw="80.80.xx.xx"
enforta_gw="79.122.xxx.x"
utk_gw="80.254.xxx.x"
dev_if1="rl1"
dev_if2="re0"
dev_if3="rl2"
if1=`ifconfig ${dev_if1} | awk -F ' *|:' '/inet /{print $2}'`
if2=`ifconfig ${dev_if2} | awk -F ' *|:' '/inet /{print $2}'`
if3=`ifconfig ${dev_if3} | awk -F ' *|:' '/inet /{print $2}'`
# Сообщения для отправки
sendxmpp="/usr/local/bin/sendxmpp"
cts_down="Internet канал ЦТС ${gw1} ***НЕ РАБОТАЕТ*** $(date)"
all_down="Internet канал ЦТС ${gw1}, Энфорта ${gw2} и ЮТК ${gw3} не работают! $(date)"
cts_used="Вернулись на основной Internet канал ЦТС ${gw1} $(date)"
enforta_used="Канал ЦТС не работает. Переключаемся на Internet канал Энфорта ${gw2} $(date)"
utk_used="Каналы ЦТС и Энфорта не работают. Переключаемся на Internet канал ЮТК ${gw3} $(date)"
# Текущие статусы шлюзов: 0 - шлюз недоступен, 1 - шлюз работает
gw1_curr_status=0
gw2_curr_status=0
gw3_curr_status=0
# Текущие потери пакетов на шлюзе
gw1_curr_packet_loss=0
gw2_curr_packet_loss=0
gw3_curr_packet_loss=0
# Максимальный процент потерь пакетов, при превышении данного числа, шлюз считается недоступным
gw1_max_packet_loss=90
gw2_max_packet_loss=90
gw3_max_packet_loss=90
# Отчищаем log-файл и сохраняем значения основных переменных
clear_log
# echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status every ${check_period}." >> ${log}
echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status." >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP1 [if1=${if1}, dev_if1=${dev_if1}, gw1=${gw1}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP2 [if2=${if2}, dev_if2=${dev_if2}, gw2=${gw2}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP3 [if3=${if3}, dev_if3=${dev_if3}, gw3=${gw3}]" >> ${log}
}
# Данная функция определяет текущее состояние каждого из шлюзов.
# Если текущий процент потерь меньше максимально допустимого, то считаем, что шлюз доступен.
get_current_status ()
{
echo `date +"%T %d.%m.%Y"`." Get current status ISP gateways." >> ${log}
# Get current status default gateway ISP1 (ЦТС)
gw1_curr_packet_loss=`ping -S ${if1} -c20 -l20 -q -W3 ${cts_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1`
if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - OK]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - CRITICAL]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=0
fi
# Get current status default gateway ISP2 (Энфорта)
gw2_curr_packet_loss=`ping -S ${if2} -c20 -l20 -q -W3 ${enforta_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1`
if [ ${gw2_curr_packet_loss} -le ${gw2_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - OK]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - CRITICAL]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=0
fi
# Get current status default gateway ISP3 (ЮТК)
gw3_curr_packet_loss=`ping -S ${if3} -c20 -l20 -q -W3 ${utk_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1`
if [ ${gw3_curr_packet_loss} -le ${gw3_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - OK]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - CRITICAL]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=0
fi
}
# Данная функция производит переключение шлюза по умолчанию в зависимости от результатов полученных в get_current_status ()
# На данный момент предпочитаемым шлюзом может быть только ${gw1}
switch_default_gw ()
{
curr_gw=`route -n get default | grep gateway | awk '{print $2}'`
# Основной шлюз GW1 нормально работает.
# (Если [текущий_гейт = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "[STATUS - OK]. Current default gateway is prefered and running up. Nothing to do." >> ${log}
return
fi
# GW1 упал. Переключаемся на GW2.
# (Если [текущий_гейт не = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} != ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} is down. Change default gw to ${gw2}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw2}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_down" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
echo "$enforta_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw2}
/sbin/pfctl -f /etc/pf2.conf
return
fi
# GW1 и GW2 упали. Переключаемся на GW3.
# (Если [текущий_гейт не = GW3 и у gw1 и gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} != ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} and gw ${gw2} is down. Change default gw to ${gw3}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw3}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$utk_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw3}
/sbin/pfctl -f /etc/pf3.conf
return
fi
# GW1 поднялся. Переключаемся снова на GW1.
# (Если [текущий_гейт не = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw1}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw1}
/sbin/pfctl -f /etc/pf.conf
return
fi
# GW1 в дауне. По прежнему используется GW2.
# (Если [текущий_гейт = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} = ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is still down. Current default gw is ${gw2}" >> ${log}
return
fi
# GW1 и GW2 в дауне. По прежнему используется GW3.
# (Если [текущий_гейт = GW3 и у gw1 и у gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} = ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} and gw ${gw2} is still down. Current default gw is ${gw3}" >> ${log}
return
fi
# GW1, GW2 и GW3 в дауне.
# (Если [у gw1,gw2 и gw3 статус=0] тогда)
if [ ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 0 ]
then
echo "***************************************************************************" >> ${log}
echo `date +"%T %d.%m.%Y"`. "CRITICAL. Three gateways is down. Try again later." >> ${log}
echo "***************************************************************************" >> ${log}
return
fi
}
# Инициализируем переменные
init
# По очереди вызываем функции get_current_status () и switch_default_gw ()
get_current_status
switch_default_gw
Код: Выделить всё
//> ee /etc/crontab
Код: Выделить всё
# Атоматическая проверка и смена канала "ЦТС"-"Энфорта"-"ЮТК" (круглосуточно, каждую минуту)
#minute hour mday month wday who command
*/1 * * * * root /usr/SCRIPTS/check_gateways.sh > /dev/null 2>&1
Код: Выделить всё
/usr/ports/net-im/sendxmpp
Оригинал скрипта брал тут он заточен по Linux
- Cancer
- Гл. Кастратор
- Сообщения: 1269
- Зарегистрирован: 2008-03-25 12:21:36
- Откуда: г. Ростов-на-Дону
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Данный скрипт переработан и работает на FreeBSD 6.x 7.x и 8.x
Код: Выделить всё
#!/bin/sh
# Указываем путь у log-файлу
log="/var/log/routing.log"
# Для очистки вчерашнего дня (хранение лога за один день)
yesterday=`/bin/date -v -1d "+%d.%m.%Y"`
# Если log-файл не найден, создаем его, иначе, если есть записи старше 1 дня чистим его.
clear_log ()
{
if [ ! -f ${log} ]
then
touch ${log}
else
if cat ${log} | grep ${yesterday} > /dev/null
then
cat /dev/null > ${log}
fi
fi
}
# Инициализируем переменные
init ()
{
gw1="111.11.11.1"
gw2="222.22.22.1"
gw3="333.33.33.1"
prefered_gw=${gw1}
cts_gw="80.80.xx.xx"
enforta_gw="79.122.xxx.x"
utk_gw="80.254.xxx.x"
dev_if1="rl1"
dev_if2="re0"
dev_if3="rl2"
if1=`ifconfig ${dev_if1} | awk -F ' *|:' '/inet /{print $2}'`
if2=`ifconfig ${dev_if2} | awk -F ' *|:' '/inet /{print $2}'`
if3=`ifconfig ${dev_if3} | awk -F ' *|:' '/inet /{print $2}'`
# Сообщения для отправки
sendxmpp="/usr/local/bin/sendxmpp"
cts_down="Internet канал ЦТС ${gw1} ***НЕ РАБОТАЕТ*** $(date)"
all_down="Internet канал ЦТС ${gw1}, Энфорта ${gw2} и ЮТК ${gw3} не работают! $(date)"
cts_used="Вернулись на основной Internet канал ЦТС ${gw1} $(date)"
enforta_used="Канал ЦТС не работает. Переключаемся на Internet канал Энфорта ${gw2} $(date)"
utk_used="Каналы ЦТС и Энфорта не работают. Переключаемся на Internet канал ЮТК ${gw3} $(date)"
# Текущие статусы шлюзов: 0 - шлюз недоступен, 1 - шлюз работает
gw1_curr_status=0
gw2_curr_status=0
gw3_curr_status=0
# Текущие потери пакетов на шлюзе
gw1_curr_packet_loss=0
gw2_curr_packet_loss=0
gw3_curr_packet_loss=0
# Максимальный процент потерь пакетов, при превышении данного числа, шлюз считается недоступным
gw1_max_packet_loss=90
gw2_max_packet_loss=90
gw3_max_packet_loss=90
# Отчищаем log-файл и сохраняем значения основных переменных
clear_log
# echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status every ${check_period}." >> ${log}
echo `date +"%T %d.%m.%Y"`." Init environment OK. Check gateways status." >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP1 [if1=${if1}, dev_if1=${dev_if1}, gw1=${gw1}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP2 [if2=${if2}, dev_if2=${dev_if2}, gw2=${gw2}]" >> ${log}
echo `date +"%T %d.%m.%Y"`." ISP3 [if3=${if3}, dev_if3=${dev_if3}, gw3=${gw3}]" >> ${log}
}
# Данная функция определяет текущее состояние каждого из шлюзов.
# Если текущий процент потерь меньше максимально допустимого, то считаем, что шлюз доступен.
get_current_status ()
{
echo `date +"%T %d.%m.%Y"`." Get current status ISP gateways." >> ${log}
# Get current status default gateway ISP1 (ЦТС)
gw1_curr_packet_loss=`ping -S ${if1} -c20 -l20 -q -W3 ${cts_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1 | cut -d"%" -f1`
if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - OK]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP1. [STATUS - CRITICAL]. Current packet loss on ${cts_gw} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
gw1_curr_status=0
fi
# Get current status default gateway ISP2 (Энфорта)
gw2_curr_packet_loss=`ping -S ${if2} -c20 -l20 -q -W3 ${enforta_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1 | cut -d"%" -f1`
if [ ${gw2_curr_packet_loss} -le ${gw2_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - OK]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP2. [STATUS - CRITICAL]. Current packet loss on ${enforta_gw} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
gw2_curr_status=0
fi
# Get current status default gateway ISP3 (ЮТК)
gw3_curr_packet_loss=`ping -S ${if3} -c20 -l20 -q -W3 ${utk_gw} | grep loss | awk '{print $(NF-2)}' | cut -d"." -f1 | cut -d"%" -f1`
if [ ${gw3_curr_packet_loss} -le ${gw3_max_packet_loss} ]
then
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - OK]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=1
else
echo `date +"%T %d.%m.%Y"`. "ISP3. [STATUS - CRITICAL]. Current packet loss on ${utk_gw} via ${dev_if3} is ${gw3_curr_packet_loss}%." >> ${log}
gw3_curr_status=0
fi
}
# Данная функция производит переключение шлюза по умолчанию в зависимости от результатов полученных в get_current_status ()
# На данный момент предпочитаемым шлюзом может быть только ${gw1}
switch_default_gw ()
{
curr_gw=`route -n get default | grep gateway | awk '{print $2}'`
# Основной шлюз GW1 нормально работает.
# (Если [текущий_гейт = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "[STATUS - OK]. Current default gateway is prefered and running up. Nothing to do." >> ${log}
return
fi
# GW1 упал. Переключаемся на GW2.
# (Если [текущий_гейт не = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} != ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} is down. Change default gw to ${gw2}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw2}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_down" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
echo "$enforta_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw2}
/sbin/pfctl -f /etc/pf2.conf
return
fi
# GW1 и GW2 упали. Переключаемся на GW3.
# (Если [текущий_гейт не = GW3 и у gw1 и gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} != ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${gw1} and gw ${gw2} is down. Change default gw to ${gw3}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw3}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$utk_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw3}
/sbin/pfctl -f /etc/pf3.conf
return
fi
# GW1 поднялся. Переключаемся снова на GW1.
# (Если [текущий_гейт не = предпочитаемому и у gw1 статус=1] тогда)
if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}" >> ${log}
echo `date +"%T %d.%m.%Y"`. "route change default via ${gw1}" >> ${log}
# Отправка сообщения админу на Jabber
echo "$cts_used" | $sendxmpp admin@jabber.office.ru -f /root/.sendxmpprc
/sbin/route change default ${gw1}
/sbin/pfctl -f /etc/pf.conf
return
fi
# GW1 в дауне. По прежнему используется GW2.
# (Если [текущий_гейт = GW2 и у gw1 статус=0, а у gw2 статус=1] тогда)
if [ ${curr_gw} = ${gw2} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} is still down. Current default gw is ${gw2}" >> ${log}
return
fi
# GW1 и GW2 в дауне. По прежнему используется GW3.
# (Если [текущий_гейт = GW3 и у gw1 и у gw2 статус=0, а у gw3 статус=1] тогда)
if [ ${curr_gw} = ${gw3} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 1 ]
then
echo `date +"%T %d.%m.%Y"`. "Prefered gw ${prefered_gw} and gw ${gw2} is still down. Current default gw is ${gw3}" >> ${log}
return
fi
# GW1, GW2 и GW3 в дауне.
# (Если [у gw1,gw2 и gw3 статус=0] тогда)
if [ ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 -a ${gw3_curr_status} -eq 0 ]
then
echo "***************************************************************************" >> ${log}
echo `date +"%T %d.%m.%Y"`. "CRITICAL. Three gateways is down. Try again later." >> ${log}
echo "***************************************************************************" >> ${log}
return
fi
}
# Инициализируем переменные
init
# По очереди вызываем функции get_current_status () и switch_default_gw ()
get_current_status
switch_default_gw
Код: Выделить всё
//> ee /etc/crontab
Код: Выделить всё
# Атоматическая проверка и смена канала "ЦТС"-"Энфорта"-"ЮТК" (круглосуточно, каждую минуту)
#minute hour mday month wday who command
*/1 * * * * root /usr/SCRIPTS/check_gateways.sh > /dev/null 2>&1
Код: Выделить всё
/usr/ports/net-im/sendxmpp
Оригинал скрипта брал тут он заточен по Linux
- Shumsky
- мл. сержант
- Сообщения: 73
- Зарегистрирован: 2011-03-19 15:56:54
- Откуда: Днепропетровск, Украина
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Код: Выделить всё
while(true)
{
ppp -foreground
}
do
done
может кто сталкивался с таким на ccu650-u?
-
- лейтенант
- Сообщения: 613
- Зарегистрирован: 2009-08-05 16:10:46
- Откуда: Украина Днепропетровск-Киев
- Контактная информация:
Re: Полезные скрипты наструганные на коленке.
Под FreeBSD и Debian.
https://hi.dp.ua/svn/sh_wget_exua
Код: Выделить всё
flib_exua
macros_sampl
wget_from_exua.sh - запускаемый
https://hi.dp.ua/svn/sh_libfunc
Код: Выделить всё
initial
libfunc
libfunc.os.bsd
libfunc.os.debian
Код: Выделить всё
check_mount_res.sh
Для Фри сделать
Код: Выделить всё
ln -s libfunc.os.bsd libfunc.os
Код: Выделить всё
ln -s libfunc.os.debian libfunc.os
Работает просто:
Скачать фильм "Государственная граница":
Код: Выделить всё
sh ./wget_from_exua.sh "http://www.ex.ua/view/44772" /video
Код: Выделить всё
/video/Государственная Граница (1980-1988)
-
- проходил мимо
- Сообщения: 3
- Зарегистрирован: 2011-06-02 12:02:01
Re: Полезные скрипты наструганные на коленке.
Можно загнать в крон.
Код: Выделить всё
#!/bin/sh
ping="/sbin/ping -c 5"
routechk="`netstat -rn | fgrep default | awk '{print $2}'`"
gw=`ifconfig em0 | awk '/inet/{print $2}'`
rezgw=`ifconfig re0 | awk '/inet/{print $2}'`
############### ping main gateway ###############
$ping $gw > /dev/null
if [ $? = 0 ] && [ $routechk != $gw ]
then
echo "answer from gateway was be given"
echo "check default route and correct"
route change default $gw
elif [ $routechk != $rezgw ]
then
echo "answer from gateway was NOT be given, change route to rezerved gateway";
route change default $rezgw;
else
echo "it's ok, i will repeat check again at 5 minuts"
fi
-
- капитан
- Сообщения: 1820
- Зарегистрирован: 2010-12-25 20:41:50
- Откуда: Хлебная столица
Re: Полезные скрипты наструганные на коленке.
Для его работы требуется установить xcompmgr и transset-df.
Код: Выделить всё
#!/bin/sh
xterm &
sleep .5
id=$(xwininfo -root -tree | grep xterm -B 2 | head -1 | perl -p -e 's/^ *(0x.*?)
"$id"
transset-df .8 -i "$id"