|
AUTOMATISER LA RECONFIGURATION (LINUX)
Problème: Un petit réseau local hybride filaire sans fil utilise la live box comme routeur firewall. Un serveur sous linux est dans ce réseau. Il sert de plateforme de développement et nécessite un DNS pour que Apache puisse fonctionner en virtual hosting name based. De plus, le serveur DHCP est configuré pour que des machines disposant de certaines adresses MAC se voiet attribuer toujours la même IP. De ce fait tout le parc machines est en DHCP, bien qu'ils sr voient attribuer des IP fixes par le DHCP. Ce serveur héberge un certain nombre de services dont: - Un serveur web - Un serveur DHCP - Un serveur DNS mis à jour automatiquement par le DHCP. - Un client de mise à jour DYNDNS - Un serveur Kiss pour fournir les vidéos au Kiss DP 500 (ethernet) - + autres serveurs dont SSH, Webmin, NTP, FTP, NFS
Problème: Lorsque l'on veut dévalider le serveur DHCP sur ma livebox et que l'on veut activer le relais DHCP, cela fonctionne, mais malgré l'instruction de sauvegarde de la config (que ce soit dans l'interface graphique ou sous telnet), la live box perd les paramètres au reboot suivant.
Question: Comment contourner ce problème?
Réponse: En automatisant l'envoi de commandes telnet à intervalle régulier vers la livebox. De ce fait, même si elle perd son alimentation, elle se verra reconfigurée automatiquement. La sortie de ce script est placée /var/log, dans un fichier nommé "livebox.log". Il contient la dernière tentative de MAJ. Toutefois, il est possible de logger la totalité des mises à jour (attention, ce fichier risque de devenir volumineux!!) en replacant la ligne du script:
open(LOG_FILE, ">/var/log/livebox.log") par
open(LOG_FILE, ">>/var/log/livebox.log") La méthode décrite à été testée sur RedHat Enterprise et Fedora Core 3. Elle devrait également directement marcher sous Mandrake.
Un petit script Perl, installé sur le serveur Linux, est appelé à intervalle régulier (toutes les 5 minutes) pour envoyer une liste de commandes via telnet à la livebox. L'adresse ip de la livebox est dans le fichier liste.livebox, tandis que les commandes à envoyer sont dans le fichier liste.commandes. Le script lui même contient au début le login et le password du compte root, autorisé à utiliser l'interface telnet (CLI). Il fonctionne tel quel si vous n'avez pas changé le mot de passe root (1234 par défaut).
Ce script perl nécessite les modules PERL 'IO::Tty' et 'Expect'
Il peuvent être facilement installés sous Webmin, dans l'ongelt "Others", puis "Perl Modules". Taper le nom des modules dans la zone "Provenant du CPAN, ayant pour nom" en commencant par le module "IO::Tty" (qui est nécessaire pour 'Expect')et cliquer sur "Installation".
Voici le script reconfig.pl
#!/usr/bin/perl
use Expect; # Utilisation du module Expect $ListeCommandes = 'liste.commandes' ;
# Parametres Livebox $device='livebox' ; $user='root'; $loginpass='1234'; $testonly='non';
open(LISTECOMMANDES, "<$ListeCommandes" ) || die "\nNe peux lire le fichier $ListeCommandes: $!"; @commandes = <LISTECOMMANDES> ; close(LISTECOMMANDES) ;
# Demande de l'utilisation du mode de test until (($testonly eq "oui") or ($testonly eq "non")) { print "\nVoulez-vous activer le mode TEST (n'entre pas les commandes)? oui/non :"; chomp($testonly=<STDIN>); } # Demande du nom du groupe d'equipement (fichier liste.nom-du-groupe) while ($device eq "") { print "\nEntrez le nom du groupe d'equipement :" ; chomp($device=<STDIN>); }
#Chargement du fichier de hosts $ListeHosts = "liste.$device" ; open(LISTEHOSTS, "<$ListeHosts" ) || die "\nNe peux lire le fichier $ListeHosts: $!"; @hosts = <LISTEHOSTS> ; close(LISTEHOSTS) ;
### Connexion sur les equipements # Creation du fichier de log avec comme extension le type de device puis la date
# Appel de la fonction localtime ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year+=1900; # ajout de 1900 a l'annee $mon+=1; # ajout de 1 au mois car le premier est zero
open(LOG_FILE, ">/var/log/livebox.log") || die "\nNe peux ecrire dans le fichier log.$device: $!";
# Ouvre une trace pour ce jour print LOG_FILE "---------------------------------\n"; print LOG_FILE "${hour}:${min} le ${year}${mon}${mday}\n"; print LOG_FILE "---------------------------------\n"; if ($testonly==1) { print LOG_FILE "Mode Test: les commandes suivantes ne seront pas envoyees au equipement\n"; }
# Insertion des commandes dans le fichier de log
print LOG_FILE "Liste des commandes entrees:\n\n"; foreach $commande (@commandes) { last if $commande eq "\n" ; # Arret sur la premiere ligne vide next if /^#/; # va a la ligne suivante si commentaire chomp ($commande); # suppresion du caractere \n print LOG_FILE "$commande\n"; } print LOG_FILE "-------------------------------\n";
#Boucle globale pour chaque device de la liste
HOST: foreach $host (@hosts) { chomp ($host); last HOST if $host eq "\n"; next HOST if /^#/ ; print LOG_FILE "Host : $host\n"; print LOG_FILE "------\n";
### Login sur l'equipement print LOG_FILE "Connexion a l'equipement..."; $telnet=Expect->spawn("telnet $host"); if ($telnet->expect(5,"login: ")) { print $telnet "$user\r"; } if ($telnet->expect(5,"assword: ")) { print $telnet "$loginpass\r"; } $prompt = ']$'; if (!$telnet->expect(5,$prompt)) { print LOG_FILE "\nProbleme de login sur $host, ".$telnet->exp_error()."\n"; $telnet->hard_close(); # Fermeture de la session next HOST; # On passe au suivant } print LOG_FILE "OK\n";
### Execution des commandes si on n'est pas en mode de test
if ($testonly eq "oui") { $telnet->hard_close(); next HOST; }
print LOG_FILE "Envoi des commandes..."; foreach $commande (@commandes) { chomp($commande); print $telnet "$commande\r"; if (!$telnet->expect(20,$prompt)) { print LOG_FILE "\nProbleme a la commande $commande sur $host, ".$telnet->exp_error()."\n"; $telnet->hard_close(); # fermeture de la session next HOST; # On passe au suivant } # sleep 1; # pause de 1 seconde entre chaque commande } print LOG_FILE "OK\n";
### Fermeture de Session
print LOG_FILE "Ended for $host\n\n"; print $telnet "exit\r"; $telnet->hard_close(); # Fermeture de la session
} # Fin de la boucle globale close(LOG_FILE) || die "\nNe peux fermer le fichier log.$device : $!"; # Fermeture du fichier de log
Voici le fichier liste.commandes :
dhcpserver stop .. dhcpr start -o 192.168.1.250 Il est à noter que la commande "save" ne figure pas dans le script 'liste.commandes". C'est volontaire. En effet, les configurations étant stockées dans une flash eprom, et le script étant appelé toutes les 5 minutes, le risque est grand de détruire la flash. Ce type de mémoires n'accepte qu'un nombre d'écritures limitées et au delà de ce nombre, elle ne fonctionnent plus. Donc: NE PAS METTRE "save".
La comande "exit", permettant de quitter le telnet n'y figure pas non plus. Elle est enfait directement envoyée par le script PERL à l'issue de l'exécution des commandes.
Et voici le fichier liste.livebox :
Pour être lancé automatiquement, il faut créer un fichier /etc/cron.d/livebox contenant:
0-59/5 * * * * root /root/reconfig.pl >/dev/null
Il faut ensuite relancer cron avec service crond restart.
J'espère que ce petit tuto vous aidera.
|