1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| function sauvegarder($id)
{
//initialisation des débuts et fins de scripts
$debseq = '#! usr/bin/perl -w
use strict;
use warnings;
use Net::Telnet;';
//variable contenant l'adresse du server TFTP
$iptftp = '192.168.2.9';
//préparation de la requête sql
$sql = 'SELECT `IP_Switch`,`seq_save`,`Prompt`, `Pass_switch` FROM `switch` WHERE `Id_Switch` = "'.$id.'"';
//traitement...
$req = mysql_query($sql) or die ('ERREUR SQL !' .$sql. ' <br/> '.mysql_error());
//enregistrement dans un tableau
$data = mysql_fetch_array($req);
//Génération du nom du fichier de configuration : (data[0] contient l'IP du switch concerné)
$nomcfg = "config$data[0].doc";
//à ce stade, nous connaissons l'id du switch, son prompt, le numéro de seq_save. Il nous faut faire correspondre le numéro de seq_save avec l'id de la séquence, et nous enregistrerons cette partie de la séquence dans une variable. Cette variable sera celle dans laquelle str_replace va chercher les occurences à remplacer
//requête pour obtenir le bon morceau de séquence
$sql2 = 'SELECT `sequence` FROM `script`,`switch` WHERE `Id_sequence` = `seq_save` AND `Id_Switch` = "'.$id.'"';
//traitement de la requête :
$req2 = mysql_query($sql2) or die ('ERREUR SQL !' .$sql. ' <br/> '.mysql_error());
//ici seqvar contient des données (notre morceau de séquence en réalité).
$seqvar = mysql_fetch_array($req2);
//Nous avons à présent tous les éléments en main pour modifier $seqvar (morceau de la séquence qui varie selon le modele de switch) et l'adapter à notre situation
//Nous allons créer un tableau contenant les éléments à remplacer (|IP|, |PROMPT|...) Ainsi qu'un tableau contenant les éléments qui les remplaceront (192.168.X.X ...)
//Remarque : L'ordre est capital pour ces tableaux car la fonction str_replace va remplacer le premier élément par le premier, etc...
$aremplacer = array("|IP|","|MDP|","|PROMPT|","|PROMPT|","|TFTPSRV|","|NOMCONF|","|PROMPT|");
$remplacant = array("$data[0]","$data[3]","$data[2]","$data[2]","$iptftp","$nomcfg","$data[2]");
//Nous avons tout ce qu'il faut pour utiliser str_replace et on enregistrera le résultat dans une variable
$resteseq = str_replace($aremplacer,$remplacant,$seqvar);
//Nous avons un début de séquence fixe et affecté, notre séquence variable a été modifiée en fonction du modèle sélectionné, il ne nous reste qu'à concaténer le tout pour avoir le script de sauvegarde complet :
$seqfinal = $debseq.$resteseq[0];
//ouverture (création s'il n'existe pas) du script perl qui va créer la liaison telnet et le transfert. Note : En écriture car le programme va modifier son contenu (fwrite ci-dessous) selon le switch à sauvegarder
$fpperl = fopen("scripts/poney.pl", "w+");
// on écrit dans $fp la séquence
fwrite($fpperl, $seqfinal);
fclose($fpperl);
//exécution du script, génération du fichier de config si cela a fonctionné
exec('scripts\\poney.pl');
//destruction du script perl
unlink('scripts/poney.pl');
if(file_exists('scripts/'.$nomcfg.''))
{
//si le transfert à fonctionné, on va enregistrer un certain nombre d'infos sur le fichier de configuration dans la base de données afin de pouvoir administrer ces derniers :
$contenu = file_get_contents("scripts/$nomcfg");
$sqlfile = 'INSERT INTO fichierconf VALUES("'.$nomcfg.'",NOW(),"'.mysql_real_escape_string($contenu).'")';
mysql_query($sqlfile) or die ('Erreur SQL !' .$sqlfile.' <br/>' .mysql_error());
unlink('scripts/'.$nomcfg.'');
}
}
//Ma fonction de ping
function ping($host,$port,$timeout)
{
$fpping = fsockopen($host, $port, $errno, $errstr, $timeout);
if(!$fpping)
{
return "DOWN";
}
return "OK";
}
//Ma fonction de sauvegarde générale se servant de la fonction ping ci dessus
function ping_and_save_switch()
{
//requête sql pour obtenir toutes les IP (i.e : tous les switchs a sauvegarder)
$sqlselectip = 'SELECT IP_Switch FROM switch';
//traitement de la requête
$reqselectip = mysql_query($sqlselectip) or die ('Erreur sql ! '.$sqlselectip. '<br/> ' .mysql_error());
//On boucle pour avoir chaque IP
while($host = mysql_fetch_array($reqselectip))
{
//Pour réaliser un ping, on est sur le protocole ICMP ou la notion de port n'intervient pas. Pour autant, fsockopen() doit se voir spécifier un port. Ici j'ai choisi le 80 mais c'est un risque. En effet, ce port est utilisé pour le web et rien ne me garantit que tous les switchs ne le supportent ! A méditer...
$port = 80;
//Un délai en secondes, suffisant pour les switchs...et les impatients
$timeout = 3;
//la variable $test va contenir le résultat de la fonction ping(), a savoir OK ou DOWN, host[0] va successivement prendre les valeurs des IP des switchs
$test = ping($host[0], $port, $timeout);
if($test == "OK")
{
//il va falloir récupérer les id des switchs qui répondent pour les passer en paramètres a ma fonction de sauvegarde
//la requête SQL
$sqlselectid = 'SELECT Id_Switch FROM switch WHERE IP_Switch = "'.$host[0].'"';
//Traitement de la requête
$reqselectid = mysql_query($sqlselectid) or die ('Erreur SQL !' .$sql. '<br/> '.mysql_error());
//On stocke les ID des switchs qui ont répondu dans un tableau que nous allons parcourir pour lancer la fonction de sauvegarde uniquement sur ceux-ci
$dataselectid = mysql_fetch_array($reqselectid);
//lancement de la fonction
for($i=0;$i<5;$i++)
sauvegarder($dataselectid[0]);
}
/* elseif($test == "DOWN")
{
echo 'Ping échoué<br/>';
ON PEUT IMAGINER d'envoyer un mail ou un avertissement pour signaler chaque switch qui n'a pas répondu et qui, par conséquent, n'a pas été sauvegardé !
}*/
/*else
{
echo 'une erreur est survenue !!';
}*/
}
} |
Partager