Muff's website forum

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

SMF - Just Installed!

Автор Тема: Скрипт автоматического переключения между основным и резервным каналом  (Прочитано 19131 раз)

Regent

  • Пионер
  • *
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 3
    • Просмотр профиля

К статье: http://muff.kiev.ua/content/skript-avtomaticheskogo-pereklyucheniya-mezhdu-osnovnym-i-rezervnym-kanalom

У меня 3 интерфейса: 1 L2TP(Медовый) 2 PPPoE(Яичный) 3 (Локалка).
 
Роняю первый, в crone скрипт отробатывает и переключает шлюз на 2.
 
Проходит минута и Use of uninitialized value in string ne at /usr/local/etc/route-change.pl line 40. if($b[1] ne $gw){
 
После этого дефаулт шлюзом становиться шлюз локалки яичного првайдера а не шлюз PPPoE (как хотелось-бы).
 
Куда копать? В Perle не разбираюсь.
Записан

muff

  • Administrator
  • Долгожитель
  • ***
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 283
    • Просмотр профиля
    • IT, Network, Beer!

Предоставьте листинг скрипта и вывод ifconfig.
Записан
Если нет ответа, то давайте подумаем...

Regent

  • Пионер
  • *
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 3
    • Просмотр профиля

Сам скрипт:
#!/usr/bin/perl -w
 use strict;
 use warnings;
use Net::Ping::External qw(ping);
# 1 - автоматический режим переключение канала
# 2 - принудительное переключение на второй канал.
my $action = 1;
 my $host_gw = "85.21.230.141"; # default gateway
 my $gw = "95.104.192.36"; # backup gateway
 my $now = localtime time;
 my $log = "/var/log/route-change.log";
if($action == 1){
my $command = `netstat -rn | grep default`;
 my @b = split('\s+',$command,3);
if (ping(hostname=>$host_gw, count=>5)){
    print "host $host_gw is ok\n";
        if($b[1] ne $host_gw){
            if($b[1] eq ""){
                `route add default $host_gw`;
            }else{
                `route change default $host_gw`;
                open(LOG,">>$log");
                    print LOG "[!] $now Route change to $host_gw\n";
                close(LOG);
            }
        }
 }else{
    print "host $host_gw is bad.\n";
if($b[1] ne $gw){
      `route change default $gw`;
    open(LOG,">>$log");
        print LOG "[!] $now Route change to $gw\n";
    close(LOG);
    }
 }
 }
if($action == 2){
my $command = `netstat -rn | grep default`;
 my @b = split('\s+',$command,3);
if($b[1] ne $gw){
    if($b[1] eq ""){
        `route add default $gw`;
    }else{
        `route change default $gw`;
        open(LOG,">>/change_route.log");
            print LOG "[!] $now Route change to $gw\n";
        close(LOG);
    }
    }
 }



А вот и ifconfig

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet 127.0.0.1 netmask 0xff000000
pfsync0: flags=0<> metric 0 mtu 1460
        syncpeer: 224.0.0.240 maxupd: 128
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33152
bee: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=3<RXCSUM,TXCSUM>
        ether 00:25:90:0d:43:97
        inet 10.114.4.210 netmask 0xfffffc00 broadcast 10.114.7.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        vlan: 10 parent interface: em1
mts: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=3<RXCSUM,TXCSUM>
        ether 00:25:90:0d:43:97
        inet 172.30.230.2 netmask 0xffffff00 broadcast 172.30.230.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        vlan: 20 parent interface: em1
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet 192.168.3.1 --> 192.168.3.2 netmask 0xffffffff
        Opened by PID 1754
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1460
        inet 89.179.xxx.xxx --> 85.21.230.141 netmask 0xffffffff
ng1: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1492
        inet 95.104.xxx.xxx --> 95.104.192.35 netmask 0xffffffff
ng2: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1400
        inet 192.168.2.1 --> 192.168.2.37 netmask 0xffffffff

Записан

muff

  • Administrator
  • Долгожитель
  • ***
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 283
    • Просмотр профиля
    • IT, Network, Beer!

Попробуйте направлять трафик не на IP-адресс, а в интерфейс.
Модифицированный скрипт:

#!/usr/bin/perl -w
 use strict;
 use warnings;
use Net::Ping::External qw(ping);
# 1 - автоматический режим переключение канала
# 2 - принудительное переключение на второй канал.
my $action = 1;
 my $host_gw = "ng0"; # default gateway
 my $gw = "ng1"; # backup gateway
 my $now = localtime time;
 my $log = "/var/log/route-change.log";
if($action == 1){
my $command = `netstat -rn | grep default`;
 my @b = split('\s+',$command,3);
if (ping(hostname=>$host_gw, count=>5)){
    print "host $host_gw is ok\n";
        if($b[1] ne $host_gw){
            if($b[1] eq ""){
                `route add default -iface $host_gw`;
            }else{
                `route change default -iface $host_gw`;
                open(LOG,">>$log");
                    print LOG "[!] $now Route change to $host_gw\n";
                close(LOG);
            }
        }
 }else{
    print "host $host_gw is bad.\n";
if($b[1] ne $gw){
      `route change default -iface $gw`;
    open(LOG,">>$log");
        print LOG "[!] $now Route change to $gw\n";
    close(LOG);
    }
 }
 }
if($action == 2){
my $command = `netstat -rn | grep default`;
 my @b = split('\s+',$command,3);
if($b[1] ne $gw){
    if($b[1] eq ""){
        `route add default -iface $gw`;
    }else{
        `route change default -iface $gw`;
        open(LOG,">>/change_route.log");
            print LOG "[!] $now Route change to $gw\n";
        close(LOG);
    }
    }
 }
Записан
Если нет ответа, то давайте подумаем...

Regent

  • Пионер
  • *
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 3
    • Просмотр профиля

К сожелению замена на имена интерфейсов не помогла:

Если использую IP шлюза выдает:
Use of uninitialized value in string ne at /usr/local/etc/route-change.pl line 40.
route: writing to routing socket: No such process

Если использую название интерфейса:
Use of uninitialized value in string ne at /usr/local/etc/route-change.pl line 28.
Use of uninitialized value $b[1] in string eq at /usr/local/etc/route-change.pl line 29.
Записан

muff

  • Administrator
  • Долгожитель
  • ***
  • Karma: 0
  • Оффлайн Оффлайн
  • Сообщений: 283
    • Просмотр профиля
    • IT, Network, Beer!

Модифицируйте скрипт до такого состояния:

#!/usr/bin/perl -w
 use strict;
 use warnings;
use Net::Ping::External qw(ping);
# 1 - автоматический режим переключение канала
# 2 - принудительное переключение на второй канал.
my $action = 1;
 my $host_gw = "85.21.230.141"; # default gateway
 my $gw = "95.104.192.36"; # backup gateway
 my $now = localtime time;
 my $log = "/var/log/route-change.log";
if($action == 1){
my $command = `netstat -rn | grep default`;
    open(LOG,">>$log");
        print LOG "[!] $now netstat1: $command\n";
    close(LOG)
 my @b = split('\s+',$command,3);
if (ping(hostname=>$host_gw, count=>5)){
    print "host $host_gw is ok\n";
        if($b[1] ne $host_gw){
            if($b[1] eq ""){
                `route add default $host_gw`;
            }else{
                `route change default $host_gw`;
                open(LOG,">>$log");
                    print LOG "[!] $now Route change to $host_gw\n";
                close(LOG);
            }
        }
 }else{
    print "host $host_gw is bad.\n";
if($b[1] ne $gw){
      `route change default $gw`;
    open(LOG,">>$log");
        print LOG "[!] $now Route change to $gw\n";
    close(LOG);
    }
 }
 }
if($action == 2){
my $command = `netstat -rn | grep default`;
    open(LOG,">>$log");
        print LOG "[!] $now netstat2: $command\n";
    close(LOG)
 my @b = split('\s+',$command,3);
if($b[1] ne $gw){
    if($b[1] eq ""){
        `route add default $gw`;
    }else{
        `route change default $gw`;
        open(LOG,">>/change_route.log");
            print LOG "[!] $now Route change to $gw\n";
        close(LOG);
    }
    }
 }

И дайте вывод того, что пишется в логи.
« Последнее редактирование: Мая 23, 2012, 05:00:25 pm от muff »
Записан
Если нет ответа, то давайте подумаем...
 

Страница сгенерирована за 0.391 секунд. Запросов: 27.