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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Soldier
ст. сержант
Сообщения: 364
Зарегистрирован: 2008-10-02 9:28:30

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

Непрочитанное сообщение Soldier » 2010-04-14 16:23:57

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#
и прекрасно отработает.
Мдя. На звездочку внимания не обратил. Спасибо за разъяснение.
Tux: "Kill Bill !!!"

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (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: Полезные скрипты наструганные на коленке.

Непрочитанное сообщение Гость » 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 - пофикшенный вариант

Аватара пользователя
ban
мл. сержант
Сообщения: 145
Зарегистрирован: 2009-07-22 22:36:29
Откуда: г.Волжский Волг. обл.

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

Непрочитанное сообщение ban » 2010-05-17 13:36:14

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й, случайно проболтавшись ему, что мама Архимеда была истиная еврейка... пусть потом разбираются чья кровь Голубее).
кто никуда не торопится, тот везде успевает

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2010-07-22 8:29:29

Скрипт для 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 умеет длину считать, но не я разбирался.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2010-07-23 9:21:55

Ах да, чуть не забыл, путь к команде 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.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2010-07-23 18:15:43

помоему, ты перегнул...
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно
Убей их всех! Бог потом рассортирует...

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2010-07-24 14:54:23

Alex Keda писал(а):помоему, ты перегнул...
там нету толи диапазонов, толи */x
а * в том поле, оно должно понять корректно
*/x точно нету, так как при употреблении такой нотации,
мне крон говорил, что он не распарсил. Думаешь, 0-23 поймет?
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104


Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2010-07-24 19:18:47

Гость писал(а):http://www.freebsd.org.ua/man/crontab.5.html
ман что ли наберите в консоли
Спасибо, но речь шла о Solaris 10.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2010-08-04 8:48:40

В 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;
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2010-08-17 22:08:57

Схема такая:

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

Интернет----модем----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
Скрипт прекрасно справляется со своей задачей.

Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2010-10-24 19:08:22

Скрипт мониторинга свободного места на жестком диске, если места на одном из разделов менее 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

Аватара пользователя
gonzo111
лейтенант
Сообщения: 648
Зарегистрирован: 2007-11-15 16:32:33
Откуда: China
Контактная информация:

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

Непрочитанное сообщение gonzo111 » 2010-11-05 17:06:23

по быстрому, получение 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 ="
Тяжело в учении легко в РАЮ!
беру зарплату гречкой и сахаром...
Наша комната - lissyara.su@conference.jabber.ru

Аватара пользователя
pinger
рядовой
Сообщения: 23
Зарегистрирован: 2009-03-22 20:41:11
Откуда: УССР, Днепродзержинск
Контактная информация:

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

Непрочитанное сообщение pinger » 2010-11-07 16:43:12

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

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

Leviafan
мл. сержант
Сообщения: 134
Зарегистрирован: 2010-06-30 15:40:30

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

Непрочитанное сообщение Leviafan » 2010-12-25 1:53:17

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

Аватара пользователя
pinger
рядовой
Сообщения: 23
Зарегистрирован: 2009-03-22 20:41:11
Откуда: УССР, Днепродзержинск
Контактная информация:

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

Непрочитанное сообщение pinger » 2010-12-27 11:03:16

Leviafan писал(а):тут весь прикол в том что работает этот скрипт только когда падает шлюз провайдера. А вот когда шлюз прова работает, а инет у него обрывается?
Вы внимательно читали пост?

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

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


Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2011-02-18 9:30:42

Скрипт для работы с 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

Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2011-02-26 20:06:21

Скрипт для работы с 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
//>
Работаю пока над этим!

Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2011-02-26 20:29:26

Скрипт для работы с 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

Аватара пользователя
Cancer
Гл. Кастратор
Сообщения: 1269
Зарегистрирован: 2008-03-25 12:21:36
Откуда: г. Ростов-на-Дону
Контактная информация:

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

Непрочитанное сообщение Cancer » 2011-02-26 22:58:39

Скрипт для работы с 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

Аватара пользователя
Shumsky
мл. сержант
Сообщения: 73
Зарегистрирован: 2011-03-19 15:56:54
Откуда: Днепропетровск, Украина
Контактная информация:

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

Непрочитанное сообщение Shumsky » 2011-03-21 15:27:36

Конечно понимаю что не ахти, но все-же:

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

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2011-03-22 17:26:29

Могу предложить скрипт по скачиванию медиаконтента с 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)
и зальются все серии.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

sudoroot
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-06-02 12:02:01

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

Непрочитанное сообщение sudoroot » 2011-06-02 13:07:18

Скрипт отслеживающий состояние канала связи, и в случае пропадания 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

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

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

Непрочитанное сообщение Bayerische » 2011-06-07 23:42:47

Принимайте от меня простейший скрипт для создания прозрачности окна в 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"
Жрёт это всё меньше, чем известный Компиз.