Скрипт переключения канала

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Скрипт переключения канала

Сообщение nerve »

Есть основной роутер и 3g роутер.
Логика такая:
- если не пингуется основной шлюз по умолчанию на главном роутере, то:
1) проверяем не установлен ли уже 3g как роутер по умолчанию, если установлен - выходим
2) если не установлен - устанавливаем
- если шлюз по умолчанию пингуется, то проверяем не установлен ли уже 3g как роутер по умолчанию и если установлен, то переключаемся на основной шлюз и проверяем доступность реального хоста в инете. Если доступен - остаемся на основном канале и выходим, если нет - переключаемся назад на 3g.
скрипт сидит в кроне и выполняется каждые 5 минут.
можно ли эту логику как-то оптимизировать или оптимизировать сам скрипт с вложенными условиями?

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

#!/bin/sh

default_gw="1.2.3.4"
backup_gw="192.168.0.111"

fiber () {
  route change default $defgw
}

3g () {
  route change default $backup_gw
}

checkgw () {
  netstat -rn | head -5 | tail -1 | awk '{print $2}' | grep -q $backup_gw > /dev/null
}

if ping -q -c 3 $defgw > /dev/null
  then
      if checkgw
         then
            fiber
            if ping -q -c 3 8.8.8.8 > /dev/null
               then exit 0
               else 3g
             fi
      fi
else
   if checkgw
     then exit 0
     else 3g
   fi
fi
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Скрипт переключения канала

Сообщение Vascom »

Конечно всё зависит от цели оптимизации. Так-то всё выглядит нормально.

Можно объединить функции fiber и 3g в одну с параметром.
Например:

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

use_chan () {
  route change default $1
}

И вызывать соответственно для fiber

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

use_chan $default_gw

И для 3g

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

use_chan $backup_gw
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Скрипт переключения канала

Сообщение nerve »

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

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

forwarders { 192.168.5.250; };

но потом просто прописал все резолверы в строчку

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

forwarders { 194.106.х.х; 194.106.х.у; 192.168.5.250; 8.8.8.8; };

и функции сократились до смены дефолтного гетвея.

кстати, кто нибудь может объяснить логику перебора хостов в опции forwarders { }?
по какому критерию бинд перестает опрашивать первый и спрашивает второй?
бывает ведь так, что хост недоступен вообще, а бывает что доступен, но не отвечает на запросы и тогда бинд не переходит на следующий резолвер.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Скрипт переключения канала

Сообщение Vascom »

Это тебе уже в раздел по сетям и администрированию надо задавать вопрос.
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Скрипт переключения канала

Сообщение nerve »

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

#!/bin/sh

def_gw="194.106.x.y"
back_gw="192.168.z.j"

change () {
  route change default $1
}

checkgw () {
  netstat -rn | head -5 | tail -1 | awk '{print $2}' | grep -q $back_gw > /dev/null
}

if ping -q -c 3 $def_gw > /dev/null
  then
    if checkgw
      then
    change $def_gw
    if ping -q -c 3 8.8.8.8 > /dev/null
      then exit 0
      else change $back_gw
    fi
    fi
  else
    if checkgw
      then exit 0
      else change $back_gw
    fi
fi
Спасибо сказали:
Ответить