BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 INVENTAIRE D'UN PARC INFORMATIQUE Client UNIX Session 2006 – 2007 Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page1/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 Lycee de formation: Lycee Jean Lurcat SOMMAIRE 1. Presentation du projet 2. Description 3. Analyse UML 1. Diagramme de cas d'utilisations generale 2. Diagramme de cas d'utilisation 3. Diagramme de sequence acteur / systeme 4. Diagramme de sequence client / serveur 5. Diagramme d'activite 6. Diagramme de classe 5. Programmation 1. Tests et prototypes 6. Conclusion Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page2/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 1. Presentation du projet 1. Description Il s'agit de développer un systeme d'inventaire en temps réel. A la mise en service d'un poste sur le réseau pédagogique de l'établissement, celui ci devra être reconnu par le système, qui récuperera dans une base de données les informations matérielles et logicielles du matériel connecté. 2. Cahier des charges (voir annexe) Ce projet se divise en trois parties: Serveur Détecter la connexion d'un poste client. Recevoir le relevé d'informations du client.. Mettre a jour la base de données inventaire. Un utilisateur autorisé pourra configurer le service. Base de données Récuperer la base de données. Extraire des informations depuis la base de données. Exécuter des requetes pre-programmées sur la base de données. Client Récupérer et ordonner les informations du poste. Comparer les données mises a jour. Envoyer les informations au serveur d'inventaire. Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page3/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 3. Approfondissement de la partie client La récuperation des données se fait lors du démarrage du poste, l'utilisateur ne peut pas intervenir lors de l'execution du programme. Les données sont envoyées par le réseau Ethernet (protocole TCP/IP), en liaison asynchrone avec le serveur (pas de réponse attendue de la part du serveur), par le biais de socket via le port 60000. Nous utiliserons des adresses IP temporaires: 192.0.0.119 pour le serveur Win, 192.0.0.117 pour le serveur Unix, et 192.0.0.111 pour le client Unix. La compatibilité des systemes d'exploitation du serveur et du client devra rester fonctionnelle: l'envoi des données doit marcher vers un serveur UNIX et Windows. Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page4/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 2. Analyse UML 1. Diagramme de cas d'utilisation générale Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page5/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 2. Diagramme de cas d'utilisation L'utilisateur n'intervient pas dans le déroulement du programme. Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page6/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 3. Diagramme de sequence acteur / systeme Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page7/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 Comme dit avant, l'utilisateur n'intervient pas dans le déroulement du programme. 4. Diagramme de sequence client / serveur Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page8/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 5. Diagramme d'activite [different] La boucle d'écoute client du serveur doit etre demarrée avant que le client n'envoie ses données. Le cas échéant, le client n'envoie pas les données et continue le Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page9/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 démarrage du poste apres avoir renvoyé une erreur de connexion. 6. Diagramme de classes La partie client se compose de deux programmes, un écrit en script shell et un autre en C++. Nous verrons dans la partie Programmation le déroulement du script qui s'occupe de la rotation des bases de données, le relevé d'informations, l'ordonnancement des informations relevées, et l'appel du programme en C++ qui se Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page10/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 compose de 3 classes en plus du programme principal main.cpp. La classe main fait appel a a la classe c_Client qui contient l'algorithme de comparaison, qui elle meme decide d'envoyer la base de données au serveur ou non. Si la decision d'envoi est positive, c_Client::Comp() fait appel a c_NetworkCommunication::SendToServer() qui contient l'algorithme d'envoi. Elle établi une connection avec le serveur par le biais de c_NetworkCommunication::CallSocket(), puis envoie la base de données en appelant c_NetworkCommunication::SendBuffer(). La fonction c_FileAcces::Verif() est utilisée par les deux autres classes pour verifier l'acces aux bases de données. 5. Programmation 1. Tests et prototypes 1. Script Shell #!/bin/sh #Programme d'inventaire - client UNIX - Remy Chaumard BTSIRIS2 Lurcat Martigues #Creation des fichiers d'inventaire touch log.txt touch log.txt.old #Rotation des fichiers d'inventaire mv -f `pwd`/log.txt `pwd`/log.txt.old #date date >> `pwd`/log.txt echo >> `pwd`/log.txt #Systeme d'exploitation uname >> `pwd`/log.txt echo >> `pwd`/log.txt #Adresse MAC /sbin/ifconfig | grep HWaddr >> `pwd`/log.txt echo >> `pwd`/log.txt #Processeur more /proc/cpuinfo | grep vendor_id >> `pwd`/log.txt more /proc/cpuinfo | grep model\ name >> `pwd`/log.txt more /proc/cpuinfo | grep cpu\ MHz >> `pwd`/log.txt Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page11/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 more /proc/cpuinfo | grep cache\ size >> `pwd`/log.txt echo >> `pwd`/log.txt #disques durs df -h >> `pwd`/log.txt echo >> `pwd`/log.txt #memoire vive free >> `pwd`/log.txt echo >> `pwd`/log.txt #Carte son /sbin/lspci -v | grep Multimedia\ audio\ controller >> `pwd`/log.txt echo >> `pwd`/log.txt #Carte graphique /sbin/lspci -v | grep VGA\ compatible\ controller >> `pwd`/log.txt echo >> `pwd`/log.txt #Cartes reseau /sbin/lspci -v | grep Network\ controller >> `pwd`/log.txt /sbin/lspci -v | grep Ethernet\ controller >> `pwd`/log.txt echo >> `pwd`/log.txt #Configuration reseau /sbin/ifconfig | grep inet\ adr >> `pwd`/log.txt echo >> `pwd`/log.txt #Logiciels rpm -qa | sort -u | uniq -w 3 >> `pwd`/log.txt #Envoi `pwd`/main.exe 192.0.0.119 exit Le script est une suite de commande écrites en shell. La commande touch permet de créer les fichiers textes s'ils n'existent pas déja. La deuxieme commande permet de supprimer la base de données actuelle en la renommant en ancienne base de données, ce qui a pour effet d'écraser l'ancienne. Les commandes suivantes stockent dans la nouvelle base de données les informations logicielles dans l'ordre des commentaires, puis les informations logicielles. La nouvelle base de données est automatiquement crée. Ensuite, le script appelle le programme écrit en C++. Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page12/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 2. Main.cpp /*#Programme d'inventaire - CLIENT UNIX - Remy Chaumard BTSIRIS2 Lurcat Martigues*/ /*Script d'inventaire automatise*/ /*Ce programme s'execute a la fin du releve d'informations, compare mot par mot les deux bases de donnees et, si elles sont differentes, envoie la base de donnees la plus recente au serveur */ /*-----------------------------------------------------------------*/ #include <ios> #include <iostream> #include "lib.h" using namespace std; int main ( int argc, char* argv[] ) { int Res; try { c_Client Comm; if ( ( Res = Comm.Comp ( argv[1] ) < 0 ) ) throw 0; } catch ( ... ) { cerr << "erreur dans la comparaison" << endl; return -1; } return Res; Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page13/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 } 3. lib.h /*#Programme d'inventaire - CLIENT UNIX - Remy Chaumard BTSIRIS2 Lurcat Martigues*/ class c_Client { public: int Comp ( char* ); }; class c_NetworkCommunication { public: int SendToServer ( char*, char* ); // private: int CallSocket ( char* ); int SendBuffer ( char*, int, const char* ); }; class c_FileAcces { public: int Verif ( char*, char* ); }; lib.h contient les entetes des classes incluses dans main.cpp Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page14/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 4. lib.cpp /*#Programme d'inventaire - CLIENT UNIX - Remy Chaumard BTSIRIS2 Lurcat Martigues*/ /*Script d'inventaire automatise*/ /*Ce programme s'execute a la fin du releve d'informations, compare mot par mot les deux bases de donnees et, si elles sont differentes, envoie la base de donnees la plus recente au serveur */ /*#Programme d'inventaire - CLIENT UNIX - Remy Chaumard BTSIRIS2 Lurcat Martigues*/ #include <ios> #include <iostream> #include <fstream> #include <string> #include <stdlib.h> #include <sstream> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <fcntl.h> #define PORT_SERVER 60000 #include "lib.h" using namespace std; /* int Verif ( char*, char* ) verifie l'acces aux fichiers dont le chemin est passe en parametre*/ Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page15/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ int c_FileAcces::Verif ( char* Path_File, char* Path_OldFile = NULL ) { //Creation des flux de lecture ifstream File( Path_File ); ifstream OldFile( Path_OldFile ); //Verification de l'ouverture des fichier if ( File.bad() ) { cerr << "Ouverture de \"log.txt\" echouee" << endl; return -1; } if ( OldFile.bad() ) { cerr << "Ouverture de \"log.txt.old\" echouee" << endl; return -1; } return 0; } /*CallSocket() renvoie le descripteur Socket apres avoir etabli la communication avec le serveur*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ int c_NetworkCommunication::CallSocket ( char* IP_SERVER ) { struct sockaddr_in serv_addr; struct hostent *Host_Port; int Sock; // Resolution du serveur if ( ( Host_Port = gethostbyname( IP_SERVER ) ) == NULL ) { cerr << "Impossible de resoudre le serveur" << endl; return(-1); } // Creation socket serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons( PORT_SERVER ); memcpy( &serv_addr.sin_addr.s_addr, Host_Port->h_addr, Host_Port->h_length ); if ( ( Sock = socket( Host_Port->h_addrtype, SOCK_STREAM, 0 ) ) < 0 ) { cerr << "Impossible de creer le socket" << endl; Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page16/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 return( -1 ); } // Connexion au serveur if ( connect( Sock, ( struct sockaddr * ) &serv_addr, sizeof( serv_addr ) ) < 0 ) { cerr << "Impossible de se connecter au serveur" << endl; close( Sock ); return -1 ; } return( Sock ); } /*SendBuffer() envoie la base de donnees au serveur---------------*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ int c_NetworkCommunication::SendBuffer ( char* Path_File, int Sock, const char* BufToSend ) { if ( send( Sock, BufToSend, strlen ( BufToSend ), 0 ) < 0 ) { cerr << "Impossible d'envoyer \"" << "BufToSend" << "\" au serveur" << endl; return -1; } return 0; } /*SendToServer() stocke le fichier dans un buffer et envoie ce buffer a la fonction SendBuffer(), avec le socket et le chemin du fichier*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ int c_NetworkCommunication::SendToServer ( char* Path_File, char* IP_SERVER ) { //Creation des flux de lecture ifstream File( Path_File ); if ( File ) // ce test échoue si le fichier n'est pas ouvert { stringstream Buffer; // Ouverture socket int Sock = CallSocket( IP_SERVER ); Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page17/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 const char *BufToSend; string tmp; // Lecture du fichier Buffer << File.rdbuf(); tmp = Buffer.str(); BufToSend = tmp.c_str(); // Envoi Buffer int SendBuffer_State = SendBuffer ( Path_File, Sock, BufToSend ); // Fermeture du fichier File.close(); } else { cerr << "ifstream File echoue" << endl; return -1; } return 0; } /*Comp() contient l'algorithme de comparaison des deux fichiers texte, il les compare mot a mot apres avoir verifier l'acces aux fichiers, et fait appel a la fonction Comp() s'ils sont differents.*/ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ int c_Client::Comp ( char* IP = "192.0.0.117" ) { char* IP_SERVER = IP; char* Path_File = "log.txt"; char* Path_OldFile = "log.txt.old"; //Buffer de mot string Word; string OldWord; bool Id = true; //---------------------------------------------Ouverture Fichiers--------------------------------------------//Creation des flux de lecture ifstream File( Path_File ); ifstream OldFile( Path_OldFile ); c_FileAcces Verification; Verification.Verif( Path_File, Path_OldFile ); //---------------------------------------------Traitement Fichiers--------------------------------------------//Lecture du fichier for ( unsigned i = 0; !OldFile.eof() && Id; ++i ) Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page18/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 { File >> Word; OldFile >> OldWord; //Comparaison if ( Word != OldWord ) { Id = false; File.close(); c_NetworkCommunication Envoi; Envoi.SendToServer( Path_File, IP_SERVER ); } } //---------------------------------------------Fermeture Fichiers--------------------------------------------File.close(); OldFile.close(); return 0; } 6. Conclusion Les normes de communications ont été établies avec l'équipe Serveur. On utilisera le protocole TCP/IP via une communication Socket. L'algorithme de comparaison fonctionne. Le relevé d'informations ordonnées fonctionne. Le transfert du relevé fonctionne. L'exécution automatique du script au démarrage fonctionne. A travailler: Masques de sous reseaux Securisation de la communication Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page19/20 BTS IRIS 2 – Informatique et Reseaux pour l'Industrie et les Services techniques E-6 PROJET INFORMATIQUE Revue n1 Rémy Chaumard – BTSIRIS2 – projet GPI client UNIX – revue n1 Page20/20