Adsl Monitoring ou verifier la connexion adsl

But

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

Détails techniques

Environnement

  • Une des lignes ADSL est en ppp donc pppd fait son jobs de failover quand la ligne est en panne.
  • L’autre ligne est une freebox sur cette ligne on fait passe tout ce qui marche avec le proxy.
  • Plusieurs fichiers de configuration pour squid sont mis en place. Ce qui change essentiellement c’est le paramètre tcp_outgoing_address, ainsi que les limitations de bande passante.

Principes techniques

On s’appuie sur le fait que si le lien ADSL n’est pas disponible le premier routeur est lui aussi indisponible.

Code

#!/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});
}
 
 
tech/adsl_monitoring.txt · Dernière modification: 2007/01/13 21:52
 
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki Powered by Lescampeurs