Supervision des serveurs de la plateforme

De Wiki d'activités IMA
Révision datée du 28 juin 2018 à 17:41 par Lzhang2 (discussion | contributions) (Fichiers rendus)

Présentation générale du projet 1

Objectif du stage

L'objectif de ce stage est de trouver une application Web standard sous Linux permettant à un administrateur d'obtenir un tableau de bord de machines virtuelles disséminées sur plusieurs machines physiques. L'application doit être configurée pour obtenir les informations suivantes :

  • état de santé des machines physiques : température, état des disques, ...
  • occupation des machines physiques : utilisation CPU, utilisation espace disque, utilisation mémoire
  • état de santé des connexions réseau : réseau Renater, réseau ADSL, réseau SDSL
  • état de santé des machines virtuelles : temps d'exécution de chaque machine virtuelle
  • occupation des machines virtuelles : utilisation disque et mémoire
  • état de certaines applications critiques :
    • date de validité des clefs DNSSEC
    • dates des dernières sauvegardes des machines virtuelles

Voici le schéma de l'architecture réseau et système de la plateforme maths/info

Plateforme Drawing.png

Recherche sur des applications de surveillance système et réseau

Nagios

Possibilités:

  1. Superviser des services réseaux : (SMTP, POP3, HTTP, NNTP, ICMP, SNMP, LDAP, etc.)
  2. Superviser les ressources des serveurs (charge du processeur, occupation des disques durs, utilisation de la mémoire paginée) et ceci sur les systèmes d'exploitation les plus répandus.
  3. Interface avec le protocole SNMP.
  4. La supervision à distance peut utiliser SSH ou un tunnel SSL (notamment via un agent NRPE).
  5. Les plugins sont écrits dans les langages de programmation les plus adaptés à leur tâche : scripts shell (bash, ksh, etc.), C++, Perl, Python, Ruby, PHP, C#, etc.
  6. La vérification des services se fait en parallèle.
  7. Possibilité de définir une hiérarchie dans le réseau pour pouvoir faire la différence entre un serveur en panne et un serveur injoignable.
  8. La remontée des alertes est entièrement paramétrable grâce à l'utilisation de plugins (alerte par courrier électronique, SMS, etc.).
  9. Acquittement des alertes par les administrateurs.
  10. Gestion des escalades pour les alertes (une alerte non acquittée est envoyée à un groupe différent).
  11. Limitation de la visibilité, les utilisateurs peuvent avoir un accès limité à quelques éléments.
  12. Capacité de gestion des oscillations (nombreux passages d'un état normal à un état d'erreur dans un temps court).
  13. Créer ses propres plugins, dans le langage désiré. Il suffit de respecter la norme Nagios des codes retour
    1. Code 0 : OK (tout va bien)
    2. Code 1 : WARNING (le seuil d'alerte est dépassé)
    3. Code 2 : CRITICAL (le service a un problème)
    4. Code 3 : UNKNOWN (impossible de connaître l'état du service)

Zabbix

Le « serveur ZABBIX » peut être décomposé en trois parties séparées : Le serveur de données, l'interface de gestion et le serveur de traitement. Chacune d'elles peut être disposée sur une machine différente pour répartir la charge et optimiser les performances.

Le système dont l'utilisation des ressources doit être analysée comporte un agent fonctionnant sous forme de démon système appelé zabbix-agentd et écoutant par défaut sur le port TCP 10050. Celui-ci est chargé d’exécuter sur le système différents scripts permettant d'échantillonner l'état des ressources des différents composants du système (Mémoire, CPU, débit réseau, entrées-sorties, nombre de connexion à une application, etc.). Le serveur Zabbix appelle donc régulièrement cet agent et lui demande les informations concernant telle ou telle ressource.

Son interface web est écrite en PHP. Elle agit directement sur les informations stockées dans la base de données. Chaque information nécessaire au serveur de traitement étant réactualisée automatiquement, il n'y a pas d'action à effectuer sur le binaire pour lui indiquer qu'il y a eu une mise à jour.

Cette interface dispose des fonctionnalités principales suivantes:

  1. Affichage des données et état des machines
  2. Génération de graphiques (évolution des données et état des machines/liens)
  3. Classement et groupement des machines surveillées
  4. Auto découverte de machines et ajout automatique
  5. Gestion fine des droits d'accès pour les utilisateurs de l'interface

MRTG

Multi Router Traffic Grapher (MRTG) est un logiciel développé sous licence GNU/GPL à l'initiative de Tobi Oetiker. Ce logiciel permet de surveiller et mesurer le trafic réseau. Il utilise le protocole SNMP pour interroger des équipements réseaux tels que des routeurs, commutateurs, ou bien encore serveurs, disposant d'une MIB.

MRTG a été développé en Perl , et peut être lancé sous Windows, Linux, MacOS et NetWare.

PRTG

PRTG (Paessler Router Traffic Grapher) est un logiciel qui permet grâce à l'analyse de trames SNMP de créer des graphiques sur le trafic réseau. PRTG est aussi capable de faire du sniffing.

Xymon

Xymon s'inspire du logiciel Big Brother System and Network Monitor de Quest Software. De 2002 et 2004, une version open source s'est appelée bbgen toolkit, puis entre 2005 et 2008 Hobbit, mais étant déjà une marque déposée, l'outil a finalement été baptisé Xymon depuis.

Xymon offre une interface graphique de supervision dans un navigateur web, énumérant les états de différents services sur chaque machine. Il permet de paramétrer des envois de courriels après un certain temps de dégradation, par exemple après 30 minutes d'espace disque utilisé à plus de 90 %. On peut ensuite afficher les statistiques de tous ces services sous forme de graphique.

Notices d'installation

Installation de Nagios sur zabeth17

Nagios 4.3.2 est la dernière version au moment de l'écriture de ce Wiki. Avant de compiler Nagios à partir de la source il faut installer des paquets utilisés par l'outil de surveillance Nagios.

Avant de commencer, il passer administrateur. su


Et puis, il faut s'assurer que le système répond à toutes les exigences logicielles pour la compilation et l'installation de Nagios. Il est recommandé de mettre la base des paquetages à jour.

apt update

À l'étape suivante, on a lance une nouvelle commande afin d'installer les utilitaires nécessaires pour gérer le système à partir de la ligne de commande.

apt-get -y install build-essential apache2 php openssl perl make php-gd libgd2-xpm-dev libapache2-mod-php libperl-dev libssl-dev daemon wget apache2-utils unzip

Il faut créer un utilisateur pour autoriser l'exécution des commandes externes via l'interface Web :

useradd nagios
groupadd nagcmd
usermod -a -G nagcmd nagios 
usermod -a -G nagcmd www-data

L'archive peut se récupérer comme suit :

cd /tmp
wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.3.2.tar.gz
tar -zxvf nagios-4.3.2.tar.gz
cd /tmp/nagios-4.3.2/  

Les étapes ci-dessous permettent de compiler Nagios à partir du code source.

./configure --with-nagios-group=nagios --with-command-group=nagcmd --with-httpd_conf=/etc/apache2/sites-enabled/  
make all 
make install 
make install-init 
make install-config 
make install-commandmode 
make install-webconf 

Il suffit ensuite de mettre à jour l'adresse e-mail de notification dans le fichier /usr/local/nagios/etc/objects/contacts.cfg pour nagiosadmin avant de démarrer Nagios ...

Un compte utilisateur "nagiosadmin" est créé pour se connecter à l'interface Web de Nagios. Un mot de passe lui est afffecté.

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 

Le module CGI d'apache2 est activé :

a2enmod cgi

Puis le service Web Apache est relmancé pour que les nouveaux paramètres prennent effet.

service apache2 restart

Des plugins Nagios ont été ajouté à Nagios pour surveiller des points particuliers.

cd /tmp
wget https://nagios-plugins.org/download/nagios-plugins-2.2.1.tar.gz
tar -zxvf /tmp/nagios-plugins-2.2.1.tar.gz
cd /tmp/nagios-plugins-2.2.1/
./configure --with-nagios-user=nagios --with-nagios-group=nagios
make
make install

La commande suivant permet de vérifier les fichiers de configuration Nagios.

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Ensuite, il faut démarrer l'outil de surveillance Nagios en utilisant la commande suivante :

 /etc/init.d/nagios start

Après toutes ces étapes Nagios 4.3.2 est installé sur Debian 9 .

Surveillance de machines en utilisant le plugin NRPE

NRPE Plugin

Le plugin Nagios Remote Plugin Executor (en abrégé NRPE) nous permet de surveiller les applications et services s'exécutant sur des hôtes Linux / Windows distants. Ce module NRPE permet à Nagios de surveiller les ressources comme le processeur, la mémoire, le disque, l'échange, etc. de l'hôte distant.

Et il faut que notre système distant fasse tourner un agent NRPE.

Configuration sur la machine à surveiller

Les plugins NRPE et Nagios ne sont pas disponibles dans les dépôt Debian classiques. Il faut ajouter le dépôt EPEL.

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Ensuite, il est possible d'installer le module complémentaire NRPE et les plugins Nagios.

apt-get install -y nagios-nrpe-server nagios-plugins

Après, le fichier de configuration NRPE doit être modifié pour accepter la connexion du serveur Nagios.

vi /etc/nagios/nrpe.cfg

Est insérée l'adresse IP du serveur Nagios, comme ci-dessous.

 allowed_hosts=172.26.145.112

Le fichier /etc/nagios/nrpe.cfg contient les commandes de base pour vérifier les attributs (CPU, mémoire, disque, etc.architecture) et les services (HTTP, FTP, etc.) sur les hôtes distants. Les lignes de commandes ci-dessous permettent de surveiller des grandeurs à l'aide des plugins Nagios.

command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/mapper/server--vg-root
command[check_swap]=/usr/lib/nagios/plugins/check_swap -w 20% -c 10%
command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200

Dans la définition de commande ci-dessus -w signifie avertissement et -c signifie critique.

Pour tester les commandes de surveillance, il est possible de les exécuter dans un autre terminal :

/usr/lib/nagios/plugins/check_procs -w 150 -c 200

L'affiche suivant est obtenu :

PROCS CRITICAL: 235 processes | procs=235;150;200;0;

Le plugin compte les processus en cours et on averti lorsque le nombre de processus est supérieur à 150, ou il nous préviendra d'un événement critique lorsque le nombre de processus est supérieur à 200. Le plugin affichera OK si le nombre de processus est inférieur à 150.

Il est possible d'ajuster le niveau d'alerte selon nos besoins. On a changé le niveau d'avertissement à 200 et d'alerte critique à 250 pour l'essai.

/usr/lib/nagios/plugins/check_procs -w 200 -c 250 

Pour activer le plugin il faut redémarrer le service NRPE.

/etc/init.d/nagios-nrpe-server restart
Configuration sur le serveur de surveillance

Le même dépot de paquetage que pour les clients NRPE est à configurer.

Pour installer le plugin check_nrpe :

apt-get -y install nagios-nrpe-plugin

Et puis, on a édité le fichier de configuration de Nagios pour inclure tous les fichiers "*.cfg" du répertoire /usr/local/nagios/etc/servers.

vi /usr/local/nagios/etc/nagios.cfg

Ajouter ou décommenter la ligne suivante.

cfg_dir=/usr/local/nagios/etc/servers

Ensuite, créer un répertoire de configuration.

mkdir /usr/local/nagios/etc/servers

Pour configurer le serveur Nagios pour qu'il surveille un client NRPE distant, nous devons créer une définition de commande dans le fichier de configuration Nagios pour utiliser le plugin "check_nrpe".

vi /usr/local/nagios/etc/objects/commands.cfg

Ensuite, ajouter la définition de commande Nagios suivante au fichier :

# .check_nrpe. command definition
define command{
command_name check_nrpe
command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -t 30 -c $ARG1$
}

Ajouter un client NRPE Linux à surveiller

Il faut créer un fichier de configuration client /usr/local/nagios/etc/servers/client.zabeth6.local.cfg pour définir l'hôte Linux distant. Nous pouvons également utiliser le modèle suivant et le modifier en fonction de nos besoins. Le modèle suivant permet de surveiller les utilisateurs connectés, le chargement du système, l'utilisation du disque, le swap et le nombre de processus total.

cat /usr/local/nagios/etc/servers/client.zabeth16.local.cfg

define host
use linux-server
host_name client.zabeth16.local{
alias client.zabeth16.local
address 172.26.145.107
}
define hostgroup{
hostgroup_name linux-server
alias Linux Servers
members client.zabeth16.local
 }
define service{
use local-service
host_name client.zabeth16.local
service_description SWAP Uasge
check_command check_nrpe!check_swap
}
define service{
use local-service
host_name client.zabeth16.local
service_description Root / Partition
check_command check_nrpe!check_root
}
define service{
use local-service
host_name client.zabeth16.local
service_description Current Users
check_command check_nrpe!check_users
}
define service{
use local-service
host_name client.zabeth16.local
service_description Total Processes
check_command check_nrpe!check_total_procs
}
define service{
use local-service
host_name client.zabeth16.local
service_description Current Load
check_command check_nrpe!check_load
}

Pour vérifier si la configuration Nagios est correcte :

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Pour arrêter le serveur Nagios :

service nagios stop

Pour redémarrer le serveur Nagios :

service nagios restart

Nous avons réussi à ajouter deux hôtes Linux distants : zabeth15 et zabeth16. En plus, on a ajouté un plugin pour vérifier l'état des disques dotés de la technologie de prévision de pannes "smart". Pour cela il faut éditer le fichier /etc/nagios/nrpe.cfg pour ajouter la fonction check_smart :

 commande[check_smart]= super check_smart

Cette fonction devant s'exécuter en mode administration nous passons par l'utilitaire super. Nous avons ajouté une ligne dans le fichier /etc/super.tab :

  check_smart    "/usr/lib/nagios/plugins/check_ide_smart -d /dev/sda"   nagios

Il faut aussi ajouter l'appel à cette commande de surveillance dans les fichiers de définition des client NRPE sur le serveur Nagios. Par exemple les lignes suivantes ont été ajoutées dans le fichier /usr/local/nagios/etc/servers/client.zabeth16.local.cfg (sur zabeth17) :

define service{
use local-service
host_name client.zabeth16.local
service_description Disk smart Load
check_command check_nrpe!check_smart
}

Installation de Zabbix sur zabeth17

  • Récupération du paquetage Zabbix pour Debian
 wget http://repo.zabbix.com/zabbix/3.4/debian/pool/main/z/zabbix-release/zabbix-release_3.4-1+stretch_all.deb
 mv zabbix-release_3.4-1+stretch_all.deb  /usr/src
  • Installation du paquetage
 cd /usr/src
 dpkg -i zabbix-release_3.4-1+stretch_all.deb 
 apt install zabbix-frontend-php
 apt install zabbix-server-mysql
  • Création de la base de données pour le serveur Zabbix
zcat /usr/share/zabbix-server-mysql/schema.sql.gz | mysql -uzabbix -p zabbix
zcat /usr/share/zabbix-server-mysql/data.sql.gz | mysql -uzabbix -p zabbix
zcat /usr/share/zabbix-server-mysql/images.sql.gz | mysql -uzabbix -p zabbix
  • Ajout du mot de passe de la base dans le fichier de configuration de Zabbix
 vi  /etc/zabbix/zabbix_server.conf
 service zabbix-server start
 cd /etc/apache2/conf-enable/
 ln -s ../conf-available/zabbix-frontend-php.conf 
 service apache2 stop
 service apache2 start
  • Ajout des modules PHP pour Zabbix
 apt install php7.0-bcmath
 vi /etc/php/7.0/apache2/php.ini 
 service apache2 restart
Installation de XYmon sur zabeth17

Travail restant à effectuer

  • Essai d'installation de Nagios, Zabbix et Xymon sur zabeth17 avec remontée d'informations de zabeth15 et de zabeth16 (charge cpu, température, état des systèmes de fichiers et des disques). Décrire pas à pas dans le Wiki les opérations à faire pour les installations.
  • Dessiner le schéma du réseau de la plateforme maths/info, trouver un moyen de tester les connexion réseau.
  • Trouver des commandes pour évaluer l'état des disques du serveur de sauvegarde (baleine). Regarder ce que peut dire l'utilitaire linux "hpssacli". Regarder aussi du coté des utilitaires "smart disks". Commencer par installer les utilitaires smart disk sur zabeth17 pour tester.
  • Réparer l'espace de stockage de baleine (un disque semble presque défecteux), essayer d'évaluer la durée de vie des autres disques, les remplacer si nécessaire.
  • Faire un essai de sauvegarde d'une machine virtuelle sur baleine.
  • Essayer de trouver un outil pour afficher des informations sur les KSK et ZSK du DNSSEC (en particulier la date de création et la date de fin de vie).

Présentation générale du projet 2

Changement de projet

Pendant le stage, j'ai eu l'opportunité de changer de sujet et de reprendre un sujet de projet IMA4 n'ayant pas abouti. J'ai ainsi pu approfondir d'autres aspects de ma formation. Autant le premier sujet était orienté administration système et réseau, autant le second sujet est dans le domaine de la robotique et de l'électronique.

L'objet de ce second sujet est de concevoir et de fabriquer des robots mobiles relativement petits, simples et peu coûteux. Les robots devront pouvoir communiquer entre eux par infrarouge. La simplicité et le bas côut de fabrication des robots doit permettre d'en fabriquer en nombre suffisant pour simuler des comportements d'essaim d'insectes.

Description de la seconde partie du stage

L'objectif est de réaliser une petite carte de contrôle de robot mobile. Les robots pourront avoir trois types de motorisations : vibreurs, servo-moteurs continus et micro-moteurs.

Je suis partie d'une carte déjà conçue à l'école pour les bureau d'étude PeiP. Cette carte contient un micro-contrôleur ATMega328p, un FTDI (conversion USB série), un contrôleur de moteurs TB6612, des détecteurs infrarouges (3 TSOP IR), une LED infrarouge et des lignes pour des servo-moteurs.

Pour la communication nous utiliserons le protocole infra-rouge RC5 qui permet une certaine immunité à la lumière ambiante.

Avancement du stage "micro-robots"

Semaine 3

Durant la troisième semaine, j'ai utilisé le logiciel inkscape pour construire le chassis du robot. Ensuite, comparé à ce que mes camarades faisaient auparavant, j'ai apporté quelques améliorations. J'ai utilisé le logiciel freecad pour vérifier si la taille des pièces était correcte en assemblant ces pièces. La version de freecad que j'utilisais n'avait pas la fonctionnalité assemblage. Donc j'ai du trouver un paquet d'installation sur Internet pour l'ajouter le module assemblage à freecad. Ensuite, j'ai importé l'image de la structure des pièces realisé par inkscape dans le logiciel freecad.

J'ai modifié l'image vectorielle plusieurs fois pour que les pièces puissent être assemblées avec succès.

Le fichier freecad est disponible: Media:support_robot.zip

Le fichier vectoriel est disponible : Media:new_robot_plain.svg

L'image ci-dessous en donne un aperçu.

New robot plain.png

Semaine 4

J'ai pris un circuit déjà disponible mais je l'ai soudé :

Robot PCB.png
Robot pcb.jpg


Grâce à l'utilisation de freecad pour simuler l'assemblage, j'ai pu découper du plexiglas pour fabriquer un chassis directement fonctionnel.

Après avoir récupéré mes pièces, j'ai assemblé le chariot.

Chariotrobot.jpg

Semaine 5

J'ai appris à utiliser d'une bibliothèque infrarouge sur Arduino par ce site: https://learn.adafruit.com/using-an-infrared-library/controlling-neopixels-with-ir-1

Tout d'abord, j'ai installé la bibliothèque IRLib en suivant les étapes décrite sur ce site. Après l'installation, j'ai pu tester les récepteurs UR du robot avec un exemple de code. Ce code permet de recevoir un signal IR, de le décoder et d'imprimer des informations à son sujet sur le moniteur série. Voici un extrait du code:

void setup() {
 Serial.begin(9600);
 delay(2000); while (!Serial); //delay for Leonardo
 myReceiver.enableIRIn(); // Start the receiver
 Serial.println(F("Ready to receive IR signals"));
}
void loop() {
 //Continue looping until you get a complete signal received
 if (myReceiver.getResults()) {
   myDecoder.decode();           //Decode it
   myDecoder.dumpResults(true);  //Now print results. Use false for less detail
   myReceiver.enableIRIn();      //Restart receiver
 }
}

Le code est disponible :Media:sketch_jun15a.zip

Pour faire marcher le code, il fallait trouver sur quelle entrée étaient connectés les récepteurs TSOP IR. Dans mon cas, c'était l'entrée numéro 2. Puis j'ai vérifié que les autres broches étaient correctement connectées : la broche centrale à la masse et la broche droite au +5v.

Light TSOP38238.png

Enfin, j'ai utilisé une télécommande IR de téléviseur, le récepteur IR capte l'information et le programme l'affiche.

Pendant ces test d'infra-rouge, il m'a été demandé de tester aussi le contrôleur de moteur. J'ai fait un test en adaptant un programme qui utilisait le même contrôleur de moteur que celui soudé sur la carte. J'ai adapté le programme pour utiliser les connexions de la carte vers le contrôleur :

int STBY = 9; //standby
//Motor A
int PWMA = 6; //Speed control
int AIN1 = 8; //Direction
int AIN2 = 7; //Direction
//Motor B
int PWMB = 10; //Speed control
int BIN1 = 4; //Direction
int BIN2 = A5; //Direction
void loop(){
move(1, 255, 1); //motor 1, full speed, left
move(2, 255, 1); //motor 2, full speed, left
delay(1000); //go for 1 second
stop(); //stop
delay(250); //hold for 250ms until move again
move(1, 128, 0); //motor 1, half speed, right
move(2, 128, 0); //motor 2, half speed, right
delay(1000);
stop();
delay(250);
}

Le code est disponible :Media:Moteurtest.zip

Le test des moteurs, ni celui des servo-moteurs, n'étant concluant. Il m'a été demandé de changer la pile de 9v par un porte-piles de 6 piles de 1,5v pour avoir une plus grande puissance.

Il a fallu refaire un chassis pour supporter le porte-piles :

4chassis.png

Et puis,j'ai assemblé le chariot.

Chariotnew1.jpg

Semaine 6

J'ai combiné et modifié les deux ensembles de code ci-dessus pour implémenter les fonctions suivantes :

  • lorsque j'appuie sur la touche 2 de la télécommande, la voiture avance ;
  • lorsque j'appuie sur la touche 8 de la télécommande, la voiture recule ;
  • lorsque j'appuie sur la touche 4 de la télécommande, la voiture tourne à gauche ;
  • lorsque j'appuie sur la touche 6 de la télécommande, la voiture tourne à droite.

Voici un extrait du code:

if (myReceiver.getResults()) {
   myDecoder.decode();           //Decode it
   int value=myDecoder.value&0xff;
   switch(value){
     case 2 :
       move(1, speed, 0);
       move(2, speed, 1);
       break;
     case 4 :
       move(1, speed, 1);
       move(2, speed, 1);
       break;  
     case 6 :
       move(1, speed, 0);
       move(2, speed, 0);
       break;   
     case 8 :
       move(1, speed, 1);
       move(2, speed, 0);
       break;     
   }

Le code est disponible :Media:RobotIR.zip

Le même code mais en utilisant des servo-moteurs et non plus des moteurs simples :

if (myReceiver.getResults()) {
   myDecoder.decode();           //Decode it
   int value=myDecoder.value&0xff;
   switch(value){
     case 2 :
       motor1.write(0);
       motor2.write(180);
       break;
     case 4 :
       motor1.write(100+speed);
       motor2.write(100+speed);
       break;  
     case 5 :
       motor1.write(90);
       motor2.write(90);
       break;  
     case 6 :
       motor1.write(90-speed);
       motor2.write(90-speed);
       break;   
     case 8 :
       motor1.write(180);
       motor2.write(0);
       break; 
   }

Le code est disponible :Media:RobotIRServo.zip

J'ai assemblé un autre chariot avec un capteur de distance.

Chariotnew2.jpg

Fichiers rendus

Rapport

Le rapport est disponible ici : Media:Rapport-stage-zhang_lihe.odt

Les fichier

Le code est disponible ici : Media: RobotServosIRSonar.zip