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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
| #include <winsock.h>
#include <windows.h>
#include <iostream>
#include <string.h>
#include <sstream>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//Declaration des fonctions
string ping (string ip);
int net_send (string message);
string test_derniere_reponse (string ip);
//debut du programme
int main()
{
unsigned int nombres_champs = 0;
std::string affiche_site = ""; // le resultat de la requete SQL correspondant a la colonne site de la ligne selectionée
std::string affiche_ip = ""; // le resultat d ela requete SQL correspondant a la colonne IP de la ligne selectionée
std::string reponse_ping = ""; // la variable qui stockera le resultat de la fonction ping
std::string requete = ""; // la requete SQL pour la 1 ere session
std::string update_requete = ""; // la requete SQL pour la 2 eme session
std::string temp_requete = ""; // une variable temporaire pour bidouiller les requetes SQL
std::string message_net_send = ""; // notre variable pour faire passer un message a la fonction net send
int y = 0; // permettra d'avoir un identifiant de ligne lors d'une selection SQL Multiple
//declaration des variables pour la bdd qui contient les infos reseaux
/* const*/ std::string host = "localhost";
/* const*/ std::string user = "root";
/* const*/ std::string pass = "manager";
/* const*/ std::string db = "osiris";
MYSQL * sock ; //Creation d'un string afin de permettre une saisie plus facile
MYSQL_RES * reponse; //un pointeur sur la reponse SQL
MYSQL_ROW ligne; //pour lire le les resultats !
//declaration des variables pour la bdd qui contient les temps de réponse;
/* const*/ std::string update_host = "localhost";
/* const*/ std::string update_user = "root";
/* const*/ std::string update_pass = "manager";
/* const*/ std::string update_db = "osiris";
MYSQL * update_sock ;
//Initialisation de la connexion a la base qui stock les infos reseaux;
sock = mysql_init(0);
if (sock) cout << "Initialisation de la connexion Ok !" << "\n";
else {
cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
}
//Initialisation de la connexion a la base pour mettre a jour les temps de réponse;
update_sock = mysql_init(0);
if (update_sock) cout << "Initialisation de la connexion Ok !" << "\n";
else
{
cout << "Erreur lors de l'initialisation de la connexion : " << mysql_error(update_sock) << "\n";
}
//connection pour recolter les infos reseau
if (mysql_real_connect(sock, host.c_str(), user.c_str(), pass.c_str(), db.c_str(), 0, NULL, 0)) // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
cout << "connection ok, sur la bdd : " << db << "\n";
else
{
cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
}
//connection pour mettre a jour les temps de reponses
if (mysql_real_connect(update_sock, update_host.c_str(), update_user.c_str(), update_pass.c_str(), update_db.c_str(), 0, NULL, 0)) // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
cout << "connection ok, sur la bdd : " << db << "\n";
else
{
cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
}
//execution d'une requete
/* cout << "requete ? " ;
getline( cin, requete ); */
requete = "select site,ip from annuaire_reseau;";
cout << requete.c_str();
/* *****************************************************************
* *
* Debut de la Boucle *
* *
********************************************************************/
while (1)
{
if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
else
{
cout << "requete faite !\n" << endl;
reponse = mysql_use_result(sock);
nombres_champs = mysql_num_fields(reponse);
while ((ligne = mysql_fetch_row(reponse))) //Tant qu'on a une ligne de selectionnée
{
y++;
// selection de la ligne et affichage de ce que l'on va tester
affiche_site = ligne[0];
affiche_ip = ligne[1];
cout << "Connexion a : "<< affiche_site << " "<< "\"" << affiche_ip << "\" ";
//test reseau
reponse_ping = ping (affiche_ip);
cout << reponse_ping;
if (reponse_ping == "offline") //si le reseau ne repond pas on va envoyer un message si derniere_reponse = 0 et modifier la base en conséquence
reponse_ping = ping (affiche_ip);
if (reponse_ping == "offline")
{
if(test_derniere_reponse (affiche_ip)=="0")
{
message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " ne repond plus";
net_send(message_net_send);
update_requete = "update annuaire_reseau set derniere_reponse = now() where ip = '" + affiche_ip + "';";
mysql_query(update_sock,update_requete.c_str());
}
else
{
// on est deja au courant on ne touche pas a la date et on n'envoie pas de messages.
}
}
else //si le reseau repond on verifie qu'avant il repondait bien sinon on averti user que le reseau est retabli, la base sera modifié en conséquence
{
if(test_derniere_reponse (affiche_ip)=="0");
else
{
message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " est a nouveau disponible";
net_send(message_net_send);
update_requete = "update annuaire_reseau set derniere_reponse = '0' where ip='"+ affiche_ip +"';";
if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
}
}
// update du temps de réponse
update_requete = "update annuaire_reseau set PING = \"";
temp_requete = "\" where ip= '" + affiche_ip;
update_requete = update_requete + reponse_ping + temp_requete +"';";
if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
cout << endl;
}
}
}
//Pause !
system("PAUSE");
//Fermeture de la connection a la BDD
mysql_close(sock);
mysql_close(update_sock);
return EXIT_SUCCESS;
}
/*
Fonction pour ping, qui va renvoyer le temps de reponse de l'@ IP renseignée
Pour ce faire on va faire un ping windows ou l'on va sauvegarder notre resultat
dans un fichier tempY (avec y = identifiant de ping), ensuite on valire notre
fichier et y trouver ou pas un temps de reponse et renvoyer ce dernier, si aucun
temps de réponse n'est retrouvé on renvoie offline
*/
string ping (string ip)
{
int result = 1;
bool booltest = false;
char test[50];
std::string tests;
std::string ping_id;
std::string fichier = "temp";
std::string commande = "";
std::ostringstream oss;
FILE * temp;
commande = commande + "ping " + ip + " -n 1 -w 800 > temp" + ping_id;
system(commande.c_str());
temp = fopen (fichier.c_str(),"r");
while (!feof (temp))
{
fscanf (temp,"%s",test);
if (booltest == true)
{
booltest = false;
tests.assign(test);
fclose(temp);
return tests;
}
if (strcmp (test,"bytes=32") == 0)
{
booltest = true;
}
if (strcmp (test,"out.") == 0)
{
result = 0;
}
}
fclose(temp);
tests.assign(test);
tests = "offline";
return tests;
}
/*
une fonction qui envoie un message a l'utilisateur, le message est passé en
parametres sous la form d'un char
*/
int net_send (string message)
{
string commande = "net send moisan.j ";
commande = commande + message + " > save_net_send.txt";
system(commande.c_str());
return 1;
}
/*
Voici notre fonction qui va rechercher dans notre table annuaire_reseau la valeur
de la colonne derniere_reponse et la retourner.
*/
string test_derniere_reponse (string ip)
{
std::string affiche = "";
std::string requete = "";
unsigned int nombres_champs = 0;
char * host = "localhost";
char * user = "root";
char * pass = "manager";
char * db = "osiris";
MYSQL * sock ;
MYSQL_RES * reponse;
MYSQL_ROW ligne;
//initialisation
sock = mysql_init(0); // on initialise la connexion a la base de donnée
if (sock);
else {
cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
}
//connection
if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0));
else
{
cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
}
//la requete
requete = "select derniere_reponse from annuaire_reseau where ip='"+ip+"';";
//execution de la requete
if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
else
{
reponse = mysql_use_result(sock);
nombres_champs = mysql_num_fields(reponse);
while ((ligne = mysql_fetch_row(reponse))) //Tant qu'on a une ligne de selectionnée
{
affiche = ligne[0]; // on stock le resultat de notre 1 ere case ds affiche
}
}
mysql_close(sock);
if (affiche != "0" )
{
return affiche;
}
else
{
return "0";
}
} |
Partager