Script de sauvegarde
Bonjour,
Je tiens a préciser que je suis débutant sur ce langage et dont j'ai beaucoup de mal a mis mettre donc essayé d’être le plus précis possible pour que je puisse bien comprendre.
Dans l'optique de créer un script de sauvegarde d'équipements automatique,
Je souhaite lire un fichier txt contenant des informations, sous la forme ci-dessous, pour les attribuer chacune à une variable.
-----------------------------------------------
exemple.txt :
info1:info11:info12:info13
info2:info21:info22:info23
etc...
-----------------------------------------------
Pour obtenir le résultat suivant :
$ip = info1
$port = info11
$nom_eqpmt=info12
etc...
Utiliser les variables précédemment créés pour se connecter etc sur un équipement pour faire la sauvegarde du matos et d'effectuer cette action pour chaque ligne du fichier txt (une ligne correspondant à un équipement différent).
Si quelqu'un arrive à me mettre sur la voie, se serais au top.
J'espère que j'ai été assez compréhensible sinon n'hésité pas a me poser des questions.
Je tiens a préciser que je suis débutant sur ce langage et dont j'ai beaucoup de mal a mis mettre donc essayé d’être le plus précis possible pour que je puisse bien comprendre.
Dans l'optique de créer un script de sauvegarde d'équipements automatique,
Je souhaite lire un fichier txt contenant des informations, sous la forme ci-dessous, pour les attribuer chacune à une variable.
-----------------------------------------------
exemple.txt :
info1:info11:info12:info13
info2:info21:info22:info23
etc...
-----------------------------------------------
Pour obtenir le résultat suivant :
$ip = info1
$port = info11
$nom_eqpmt=info12
etc...
Utiliser les variables précédemment créés pour se connecter etc sur un équipement pour faire la sauvegarde du matos et d'effectuer cette action pour chaque ligne du fichier txt (une ligne correspondant à un équipement différent).
Si quelqu'un arrive à me mettre sur la voie, se serais au top.
J'espère que j'ai été assez compréhensible sinon n'hésité pas a me poser des questions.
3 réponses
-
Alors là je vous demande vos avis sur le code que j'ai fais (trouver en partie sur le net :
#!/usr/bin/perl use Expect; # Utilisation du module Expect #$Expect::Log_Stdout=1; #Chargement du fichier de commandes print "\nChargement du fichier contenant la liste des commandes 'liste.commandes'..."; $ListeCommandes = 'liste.commandes' ; open(LISTECOMMANDES, "<$ListeCommandes" ) || die "\nNe peux lire le fichier $ListeCommandes: $!"; @commandes = <LISTECOMMANDES> ; close(LISTECOMMANDES) ; print "OK\n"; #Chargement du fichier de hosts print "\nChargement du fichier contenant la liste des equipements..."; my $ListeHosts = "liste.ciscosmb"; open(LISTEHOSTS, '<:encoding(UTF-8)', $ListeHosts) || die "Ouverture impossible du fichier '$ListeHosts' $!\n"; @hosts = <LISTEHOSTS> ; while (my $row = <LISTEHOSTS>) { chomp $row; if ($row =~ /^([^:]+):([^:]+):([^:]+):([^:]+):([^:]+):([^:]+)$/) { my ($ip, $port, $login, $pwd, $enablemdp, $iptftp) = ($1, $2, $3, $4, $5, $6); print " IP=$ip - Port=$port - Login=$login - Password=$pwd - EnablePassword=$enablemdp - IpTFTP=$iptftp\n"; } } close(LISTEHOSTS) ; print "OK\n"; # Demande du login a utiliser print "\nChargement du login"; my $user = "$login"; print "\nChargement du mot de passe"; my $loginpass = "$pwd"; print "\nChargement mot de passe Enable"; my $enablepass = "$enablempd"; ### 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 print "\nCreation du fichier de log..."; open(LOG_FILE, ">log.ciscosmb.${year}${mon}${mday}${hour}${min}") || die "\nNe peux ecrire dans le fichier log.ciscosmb: $!"; print "OK\n"; # Avertissement du fonctionnement en mode de test 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 entrée:\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,"Password: ")) { print $telnet "$loginpass\r"; } else { print $telnet "\b$user\r"; sleep 1; print $telnet "$loginpass\r"; } $prompt = '[\>]'; if (!$telnet->expect(5,'-re',$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"; ### Envoie de la configuration print LOG_FILE "Passage en mode Enable..."; print $telnet "enable\r"; sleep 1; if (!$telnet->expect(5,"Password: ")) { print LOG_FILE "\nNe reconnais pas la commande enable"; $telnet->hard_close(); next HOST; } print $telnet "$enablepass\r"; $prompt = '[\#]'; if (!$telnet->expect(5,'-re',$prompt)) { print LOG_FILE "\nProbleme de passage en mode Enable sur $host, ".$telnet->exp_error()."\n"; $telnet->hard_close(); next HOST; } 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 "Envoie des commandes..."; foreach $commande (@commandes) { chomp($commande); print $telnet "$commande\r"; if (!$telnet->expect(20,'-re',$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"; $telnet->hard_close(); # Fermeture de la session } # Fin de la boucle globale close(LOG_FILE) || die "\nNe peux fermer le fichier log.ciscosmb : $!"; # Fermeture du fichier de log