Страница 9 из 11

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-04-14 16:23:57
Soldier
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#
и прекрасно отработает.
Мдя. На звездочку внимания не обратил. Спасибо за разъяснение.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-04-19 11:36:31
Гость
anigif - простенкий конвертор видео в gif/apng

Код: Выделить всё

#! /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 - пофикшенный вариант

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-05-17 13:36:14
ban
Squid url_regex реклама порно ban резать Rejik
Основная проблема при зарезании рекламмы - найти списки 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
Чтобы использовать скачаный 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);
Выполним скрипт, передав ему режиковский ban-лист:

Код: Выделить всё

#chmod 744 /usr/local/etc/squid/ustakanim.pl
#/usr/local/etc/squid/ustakanim.pl adRejik
По идее ban-лист теперь можно считать подговленный для использования его в Squid, но на вашем месте я бы не лишал себя чувства здорового подозрения :)

Настраиваем конфигурацию Squid
Чтобы заблокировать доступ к ресурсам, перечисленным в ban-листе, надо конфигурацию Squid видоизменить так:

Код: Выделить всё

...
acl adRejik url_regex "/usr/local/etc/squid/adRejik"
...
http_access deny adRejik
...
не забывайте, что http_access deny adRejik надо ставить над всеми http_access, чтобы резалось все в самом начале.

========================
Я был бы очень признателен, если бы кто-нибудь шаристый подверг скрипт яростной, раздалбливающей все в пух и прах с целью добирания до истины в виде правильноработающего скрипта, критике.
-----
Всегда Ленин
Алексей Николаевич,
специально для Леночки :)
---------------------------------
май 2010, на улице солце прямо в глаз
третий этаж, палата номер 13 (направо), между Наполеоном и Архимедом (есть подозрение, что Архимед пидарас... Надо назюкать Гитлера из 6й, случайно проболтавшись ему, что мама Архимеда была истиная еврейка... пусть потом разбираются чья кровь Голубее).

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-22 8:29:29
Andy
Скрипт для Solaris 10 10/09 s10x_u8wos_08a X86.
У системы мониторинга, немного доработанной нашими программистами,
где то течет память, поэтому 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.S: У Соляры утилита expr не умеет length, хотя в мане написано, что умеет. Поэтому - башизм.
p.p.S: Вроде как awk умеет длину считать, но не я разбирался.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-23 9:21:55
Andy
Ах да, чуть не забыл, путь к команде top весьма оригинален,

Код: Выделить всё

/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#
Добро пожаловать в SystemV.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-23 18:15:43
Alex Keda
помоему, ты перегнул...
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-24 14:54:23
Andy
Alex Keda писал(а):помоему, ты перегнул...
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно
*/x точно нету, так как при употреблении такой нотации,
мне крон говорил, что он не распарсил. Думаешь, 0-23 поймет?

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-24 15:44:26
Гость
http://www.freebsd.org.ua/man/crontab.5.html
ман что ли наберите в консоли

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-07-24 19:18:47
Andy
Гость писал(а):http://www.freebsd.org.ua/man/crontab.5.html
ман что ли наберите в консоли
Спасибо, но речь шла о Solaris 10.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-08-04 8:48:40
Andy
В Solaris 10, у утилиты top есть бага - когда программа занимает памяти больше некоего порогового
значения, вывод 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;

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-08-17 22:08:57
Cancer
Схема такая:

Код: Выделить всё

Интернет----модем----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
Второй скрипт с помощью которого основной скрипт будет перезагружать модем modem_reboot.sh
Для того что бы скипт работал нужно установить из портов /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
Скрипт прекрасно справляется со своей задачей.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-10-24 19:08:22
Cancer
Скрипт мониторинга свободного места на жестком диске, если места на одном из разделов менее 90% отправляется уведомление на почтовый адрес администратора.

Сразу скажу скрипт написан не мной, взял я его тут
И слегка его дописал под себя.

Код: Выделить всё

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

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-11-05 17:06:23
gonzo111
по быстрому, получение DNS имен из IP в таблице ipfw , чтоб немного ориентироваться кто в списке забанен :smile:

Код: Выделить всё

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

Еще раз о резервировании канала

Добавлено: 2010-11-07 16:43:12
pinger
Добавляем статический маршрут к цели тестирования (лучше прописать и в rc.conf)

Код: Выделить всё

# route add 195.214.195.105 192.168.0.254
устанавливаем fping

Код: Выделить всё

# 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)
Задание:
В случае крушения основного канала переключаться на резервный, после восстановления основного переключиться на него.

В кроне работает, выставить переодичность по вкусу.

Re: Еще раз о резервировании канала

Добавлено: 2010-12-25 1:53:17
Leviafan
pinger писал(а):Добавляем статический маршрут к цели тестирования (лучше прописать и в rc.conf)

Код: Выделить всё

# route add 195.214.195.105 192.168.0.254
устанавливаем fping

Код: Выделить всё

# 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% не падующий и стабильный

Re: Еще раз о резервировании канала

Добавлено: 2010-12-27 11:03:16
pinger
Leviafan писал(а):тут весь прикол в том что работает этот скрипт только когда падает шлюз провайдера. А вот когда шлюз прова работает, а инет у него обрывается?
Вы внимательно читали пост?

Код: Выделить всё

target="195.214.195.105"; # цель тестирования ukr.net

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2010-12-27 12:44:49
Leviafan
видимо не внимательно.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-02-18 9:30:42
Cancer
Скрипт для работы с 2мя-3мя и более интернет каналами.

Код: Выделить всё

#!/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
Для того что бы отправлять сообщения на Jabber нужно установить из портов Sendxmpp

Код: Выделить всё

/usr/ports/net-im/sendxmpp
Статья по настройки sendxmpp http://www.lissyara.su/articles/freebsd ... /sendxmpp/

Оригинал скрипта брал тут он заточен по Linux

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-02-26 20:06:21
Cancer
Скрипт для работы с 2мя-3мя и более интернет каналами.

Работает пока только на 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
//>
Работаю пока над этим!

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-02-26 20:29:26
Cancer
Скрипт для работы с 2мя-3мя и более интернет каналами.

Данный скрипт сделан для 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
Для того что бы отправлять сообщения на Jabber нужно установить из портов Sendxmpp

Код: Выделить всё

/usr/ports/net-im/sendxmpp
Статья по настройки sendxmpp http://www.lissyara.su/articles/freebsd ... /sendxmpp/

Оригинал скрипта брал тут он заточен по Linux

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-02-26 22:58:39
Cancer
Скрипт для работы с 2-мя, 3-мя и более интернет каналами.

Данный скрипт переработан и работает на 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
Для того что бы отправлять сообщения на Jabber нужно установить из портов Sendxmpp

Код: Выделить всё

/usr/ports/net-im/sendxmpp
Статья по настройки sendxmpp http://www.lissyara.su/articles/freebsd ... /sendxmpp/

Оригинал скрипта брал тут он заточен по Linux

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-03-21 15:27:36
Shumsky
Конечно понимаю что не ахти, но все-же:

Код: Выделить всё

while(true)
  {
    ppp -foreground
  }
do
done
смысл в том, что у меня временами отпадает ppp, каждый раз руками передергивать неинтересно))))
может кто сталкивался с таким на ccu650-u?

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-03-22 17:26:29
kpp
Могу предложить скрипт по скачиванию медиаконтента с ex.ua.
Под FreeBSD и Debian.
https://hi.dp.ua/svn/sh_wget_exua

Код: Выделить всё

flib_exua
macros_sampl
wget_from_exua.sh - запускаемый
Библиотеки функций, по умолчанию закинуть в /etc/libs/
https://hi.dp.ua/svn/sh_libfunc

Код: Выделить всё

initial
libfunc
libfunc.os.bsd
libfunc.os.debian
Заодно скрипт, кот. проверяет: примонтировано ли устройство MOUNT_RES в точку монтирования MOUNT_POINT

Код: Выделить всё

check_mount_res.sh
логин: tat пароль: 123
Для Фри сделать

Код: Выделить всё

ln -s libfunc.os.bsd libfunc.os
Для Линукса сделать

Код: Выделить всё

ln -s libfunc.os.debian libfunc.os
Для работы нужен wget, md5.

Работает просто:
Скачать фильм "Государственная граница":

Код: Выделить всё

sh ./wget_from_exua.sh "http://www.ex.ua/view/44772" /video
Будет создан каталог

Код: Выделить всё

/video/Государственная Граница (1980-1988)
и зальются все серии.

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-06-02 13:07:18
sudoroot
Скрипт отслеживающий состояние канала связи, и в случае пропадания icmp ответов, переключается на резервный канал и обратно.
Можно загнать в крон.

Код: Выделить всё

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

Re: Полезные скрипты наструганные на коленке.

Добавлено: 2011-06-07 23:42:47
Bayerische
Принимайте от меня простейший скрипт для создания прозрачности окна в OpenBox, в данном случае, это окно терминала xterm.
Для его работы требуется установить 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"
Жрёт это всё меньше, чем известный Компиз.