Une entreprise peut posséder une ou plusieurs ligne ADSL. Dans la plus part des cas les systèmes de balance de charge ne permet pas une gestion fine de l’utilisation des lignes. Dans le cas présent l’idée est de ce servir du système de failover pour l’ensemble des trafics qui demande une interactivité, tel que le ssh, ftp, smtp, etc... Le problème principal c’est le HTTP quand on à une dizaine d’utilisateurs et un proxy (squid) sur le routeur de tête ; comment s’assurer que l’on peut partager la bande passante équitablement quand une ligne ADSL est en panne ?
Ce modelé de script peut être utilisé dans d’autre cas ou l’on a besoin d’effectuer des actions en cas de pannes
On s’appuie sur le fait que si le lien ADSL n’est pas disponible le premier routeur est lui aussi indisponible.
#!/usr/bin/perl -w use strict; use Net::Ping; use Mail::Sender; my $h = { p => Net::Ping->new(), free_gate => shift || '82.66.87.254' , squid => { conf => '/etc/squid.conf', free => '/etc/squid.conf-free', all => '/etc/squid.conf-any', }, mail => new Mail::Sender({ smtp => 'smtp.mondomaine.net', from => 'NetReport@mondomaine.net', to => 'Report@mondomaine.com', cc => 'admin@mondomaine.com' }), check => { normal => 60, fail => 30, strange => 5, nb => 5, }, sig => "\n\n--\nCordialement,\nLeffe\nServer Pro-Actif\n\n", }; sub mail_down { my $msg = shift; $h->{mail}->MailMsg({ subject => 'Free net acces is down', msg => $msg . $h->{sig}, }); } sub mail_up { my $msg = shift; $h->{mail}->MailMsg({ subject => 'Free net access is up', msg => $msg . $h->{sig}, }); } my $strangetime = localtime(); sub free_is_up { #do some squid thing my $msg = ''; my $status = 0; $msg .= `/bin/ln -sfv $h->{squid}->{free} $h->{squid}->{conf}`; $status++ unless $?; $msg .= "Squid config shift: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= `/etc/init.d/squid stop`; $status++ unless $?; $msg .= "Squid stop: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= `/etc/init.d/squid start`; $status++ unless $?; $msg .= "Squid start: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= "Network web mode "; $msg .= $status ? "FULL POWER\n" : "DOWN\n"; mail_up($msg); } sub free_is_down { #do some squid thing my $msg = ''; my $status = 0; $msg .= "Down since : $strangetime\n"; $msg .= `/bin/ln -sfv $h->{squid}->{all} $h->{squid}->{conf}`; $status++ unless $?; $msg .= "Squid config shift: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= `/etc/init.d/squid stop`; $status++ unless $?; $msg .= "Squid stop: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= `/etc/init.d/squid start`; $status++ unless $?; $msg .= "Squid start: "; $msg .= $? ? "Fail\n" : "Ok\n"; $msg .= "Network web mode "; $msg .= $status ? "DEGRADE\n" : "DOWN\n"; mail_down($msg); } my $state = 'normal'; my $nb = 0; while (1) { if ($h->{p}->ping($h->{free_gate})) { if ($state eq 'fail') { free_is_up(); } $state = 'normal'; $nb = 0; } else { if ($state eq 'normal') { $state = 'strange'; $strangetime = localtime(); } if ($state eq 'strange') { $nb++; if ($nb >= $h->{check}->{nb}) { free_is_down(); $state = 'fail'; } } } #print "state: $state $nb\n"; sleep($h->{check}->{$state}); }