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.

3 réponses

  1. 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