documentation de conception - ensiwiki · 3 choix d’un framework : zend 5 ... nous avons essayé...

36
Thibault Durand Gaëtan Charmette Documentation de conception Gérer la configuration d’un switch Cisco 2960 à l’aide d’une application web Juin 2010

Upload: duonglien

Post on 10-Sep-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Thibault Durand

Gaëtan Charmette

Documentation de conception

Gérer la configuration d’un switch Cisco 2960

à l’aide d’une application web

Juin 2010

Table des matières

1 Introduction 3

2 Matériel et logiciels requis 42.1 Le switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Le serveur web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3 Le serveur FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Choix d’un framework : Zend 53.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2 Modèle MVC (Model-View-Controller) . . . . . . . . . . . . . . . . . . . . 53.3 Framework répandu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.4 Règles de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4 Fichiers de configuration : Pour une application facilement paramé-trable 64.1 conf.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.2 ExpressionReguliere.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5 Gestion de la disposition physique de la salle 75.1 Machine.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

5.1.1 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.1.2 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.1.3 Pour le débuggage . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

5.2 Salle.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.2.1 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.2.2 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95.2.3 Pour l’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

6 Gestion des configurations 106.1 FileConf.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

6.1.1 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.1.2 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

6.2 GestionConfig.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116.2.1 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116.2.2 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

7 L’interaction avec le switch Cisco Catalyst 2960 137.1 TelnetSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137.2 ConnexionSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147.3 CommandeSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

8 Formulaires 198.1 Généralités sur les formulaires . . . . . . . . . . . . . . . . . . . . . . . . . 198.2 Mettre plusieurs formulaires sur une même page phtml . . . . . . . . . . . 198.3 Paramètres de connexion : paramconnswitchForm.php . . . . . . . . . . . . 198.4 Configuration de la salle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2

8.4.1 Configuration VTP : vtpForm.php . . . . . . . . . . . . . . . . . . 198.4.2 Configuration rapide : quickconfigForm.php . . . . . . . . . . . . . 208.4.3 Configuration personnalisée : advancedconfigForm.php . . . . . . . 208.4.4 Configuration du port contrôleur : macForm.php . . . . . . . . . . . 20

8.5 Gestion de configuration de l’équipement réseau . . . . . . . . . . . . . . . 218.5.1 Sauvegarde de la configuration courante : saveconfigForm.php . . . 218.5.2 Chargement d’une configuration dans le switch : loadconfigForm.php 218.5.3 Restauration de la startup-config : resetswitchForm.php . . . . . . . 218.5.4 Faire une comparaison de fichiers de configuration : diffForm.php . 21

8.6 Paramètres de connexion FTP : ftpconnexionForm.php . . . . . . . . . . . 218.7 Gestion du changement de session : chgsessionForm.php . . . . . . . . . . . 228.8 Gestion des adresses MAC du contrôleur : accesvlanprofForm.php . . . . . 22

9 Gestion du contrôleur 239.1 Les URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239.2 Les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239.3 Le passage des variables à la vue . . . . . . . . . . . . . . . . . . . . . . . 249.4 La gestion des formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

10 Gestion des vues 2610.1 Récupération des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . 26

10.1.1 Les variables importantes . . . . . . . . . . . . . . . . . . . . . . . 2610.2 Les pages d’affichage : fichiers phtml . . . . . . . . . . . . . . . . . . . . . 26

10.2.1 Le squelette des pages : layout.phtml . . . . . . . . . . . . . . . . . 2610.2.2 Le corps des pages : views/scripts/index/*.phtml . . . . . . . . . . 26

10.3 La mise en forme : global.css . . . . . . . . . . . . . . . . . . . . . . . . . . 27

11 Les erreurs 2811.1 Interaction avec le Switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

11.1.1 TelnetSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2811.1.2 ConnexionSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . . 2911.1.3 CommandeSwitch.php . . . . . . . . . . . . . . . . . . . . . . . . . 29

11.2 Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3111.2.1 MacProf.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3111.2.2 TestFTP.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

12 Miscellaneous 3212.1 Ping.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3212.2 MacProf.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3312.3 TestFTP.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3412.4 Diff.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

13 Pour un debuggage facile 3513.1 Fichier de logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3513.2 Fichier application.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3

1 Introduction

Ce document explique la philosophie d’implémentation de notre application.

Le but de cette application est de gérer facilement la configuration des switchs dessalles D200 et D201 en vue d’examens de travaux pratiques de réseaux ou pour d’autresTP, de la façon la plus modulaire et paramétrable possible.

Pour mener à bien cet objectif, nous nous sommes basés sur un framework libre (Zend),de sorte à bien séparer l’affichage et le moteur de l’application (modèle MVC).

Nous avons essayé de séparer clairement chaque fonctionnalité en différents modules,dans le but de pouvoir facilement ajouter de nouvelles fonctions, et également de pouvoirchanger un module sans affecter le reste de l’application (par exemple, changer la façonde l’application de dialoguer avec le switch...).

4

2 Matériel et logiciels requis

2.1 Le switch

Cette application a été conçue pour interagir avec un switch Cisco Catalyst 2690.Il est donc probable qu’elle fonctionne avec d’autres switchs Cisco ayant la même

version d’IOS (Internetwork Operating System). Grâce à la modularité de l’application,il est même éventuellement possible d’interagir avec un switch HP (Hewlett-Packard), enchangeant dans les différents fichiers de configuration les commandes à effectuer (voir plusloin).

L’application communique avec le switch grâce au protocole telnet. Il est égalementenvisageable de changer facilement cela (voir la section sur l’interaction avec le switch).

Le nom du switch, le nom d’utilisateur et les mots de passe pour se connecter auswitch sont saisis par l’utilisateur lorsqu’il arrive sur l’application. Par contre, les tests durépertoire www/public/tests/ ont besoin que les paramètres de connexion d’un switchde test soient saisis en brut dans un fichier de configuration (conftests.php).

L’adresse IP du switch est obtenue grâce à la résolution de nom, exploitée ici avec lafonction php gethostbyname().

2.2 Le serveur web

L’application, écrite en PHP et utilisant le framework PHP libre Zend, requiert d’êtrehébergée sur un serveur Apache dont le module php soit de version supérieure à 5.1.0.

Il faut aussi vérifier que le serveur sur lequel tourne l’application peut communiqueravec le switch (attention aux filtres de C.Cassagne !).

La machine qui héberge le serveur Web doit également avoir accès à un serveur DNSpour la résolution du nom du switch.

2.3 Le serveur FTP

Une façon simple, pour le switch, d’importer ou d’exporter un fichier de configurationest de passer par un serveur FTP (File Transfert Protocol).

Il est donc nécessaire, pour faire tourner l’application, d’avoir un serveur FTP respec-tant les paramètres suivants :

– Le serveur FTP doit pointer vers la racine de l’application (le répertoire www).– La variable $FTP_cfgdir de la classe Default_Model_conf doit permettre de poin-

ter vers le répertoire www/data/ciscoconf/ depuis la racine du FTP.L’adresse IP du serveur FTP est à renseigner dans le fichier de configuration (voir

section sur les fichiers de configuration). Cependant le nom d’utilisateur et le mot de passedu serveur FTP sont à indiquer de manière dynamique grâce à un formulaire. Commepour le serveur web, on fera attention à la présence d’une connectivité entre le serveurFTP et le switch, ainsi qu’entre le serveur FTP et le serveur web. La solution la plussimple étant que les serveurs FTP et web tournent sur la même machine.

5

3 Choix d’un framework : Zend

3.1 Généralités

Zend Framework (ZF) est un framework de développement d’applications PHP.Zend Framework est résolument orienté vers un développement à base de PHP5 et de

ses capacités Objet. L’équipe de développement en construit tous les composants selon uneprocédure qualité exemplaire (validations, standards de codage, documentation, tests...).

Pour utiliser Zend Framework, il faut avoir au moins PHP 5.1 et il est fortementrecommandé d’avoir la main sur la configuration du serveur Web (serveur dédié).

3.2 Modèle MVC (Model-View-Controller)

Pour permettre à l’application d’être maintenable, il faut séparer l’affichage (vue) dumoteur de l’application (modèle), et les relier par le contrôleur. Il est aussi important quele “moteur” de l’application soit bien segmenté en modules indépendants. Pour cela, il estintéressant de s’appuyer sur un framework PHP comme Zend.

3.3 Framework répandu

Dans le cadre du cours d’applications web de 2nde année (cours que nous n’avons passuivi), le framework Zend a été utilisé. Il y a donc des enseignants à l’Ensimag qui saventl’utiliser, ainsi que des cours et travaux pratiques disponibles sur le KIOSK.

Zend est également assez répandu sur la toile et bien documenté, tout comme le langagePHP sur lequel il s’appuie.

3.4 Règles de base

Il faut tout de même noter que, si la syntaxe et les règles de Zend sont restrictives etimposent donc une certaine clarté du code, il faut tout de même un temps d’adaptationavant de pouvoir maîtriser l’outil.

Les règles élémentaires de nommage des fichiers d’une application zend que nous avonssuivi sont disponibles ici :

http : //intranet.ensimag.fr/KIOSK/Ensimag/2A/opt/4MMWEB/TP3.pdf

au paragraphe 2.2.

6

4 Fichiers de configuration : Pour une application

facilement paramétrable

4.1 conf.php

Le fichier conf.php contient toutes les constantes globales des différents modules del’application. Ces constantes sont utilisées par un ou plusieurs modules.

Toutes les constantes sont regroupées dans la classe Default_Model_conf et sontaccessibles en faisant :

Default_Model_conf::$nom_de_la_constante

4.2 ExpressionReguliere.php

Le fichier ExpressionReguliere.php contient :– Les commandes Cisco envoyées au switch (“show interfaces status”, “switchport

trunk allowed vlan all” ...)– Les expressions régulières permettant d’analyser la sortie provoquée par ces com-

mandes– D’autres expressions régulières permettant, par exemple, de reconnaître une adresse

IPv4.

Certaines constantes, construites à partir d’autres constantes, ne peuvent être crééesque dans une méthode. Pour ces constantes-là, il faudra appeler la méthode init avantde pouvoir les utiliser :

Default_Model_ExpressionReguliere::init()

Les constantes seront alors accessibles tel que montré dans le paragraphe précédent.

7

5 Gestion de la disposition physique de la salle

Nous devons gérer deux salles (D200 et D201) qui sont similaires en de nombreuxpoints. Elles ont notamment chacune 48 machines qui sont “pilotées” par un switch dédié.

On distingue deux “types” de salle :– La salle sous sa configuration attendue– La salle sous son aspect réel

Pour créer une salle, nous avons ainsi besoin d’un ensemble de machines. Ces dernièrescomportent chacune leurs attributs propres (adresse MAC, adresse IP, nom, etc. ...). Nousavons ainsi créé deux classes nous permettant de “virtualiser” la salle :

– une classe Machine

– une classe Salle

5.1 Machine.php

Un objet de la classe Machine doit avoir les paramètres que possède une machinephysique, sur l’aspect qui nous intéresse ici, c’est-à-dire les paramètres réseaux.

5.1.1 Attributs

Chaque machine possède donc les attributs suivants :– $_NomMachine : Le nom de la machine. Du type ensipsys17.– $_adressIP : L’adresse IP de la machine. Du type 195.221.227.33.– $_adressMAC : L’adresse MAC de la machine. Du type 00:0a:b5:c7:d3:54 (insen-

sible à la casse).– $_Connected : Indique si la machine est connectée physiquement avec un équipe-

ment réseau (booléen).– $_NumPriseSwitch : Indique sur quel port de l’équipement réseau est branchée la

machine. Du type Fa0/42

– $_NumVlan : Donne le numéro du VLAN du port où la machine est connectée (s’ilest en mode Access). Vaut trunk si le port est en mode Trunk.

– $_TrunkVlanList : Donne une liste de VLANs trunk dans le cas où le port sur lequelest connectée la machine est en mode Trunk. Du type 501-504,507,510 (formatCisco). Cet attribut vaut NULL si le port est en mode Access.

– $_isValid : Indique si la machine est connectée au port switch attendu. Par défaut,sa valeur est à false.

Des accesseurs et des mutateurs ont été créés pour chaque attribut.

5.1.2 Méthodes

Une méthode de comparaison de machines nous est nécessaire en plus du constructeur,du destructeur et des accesseurs/mutateurs : c’est la méthode equals.

public function __construct([$_mac,$_ip,$_numplugswitch,$_nommachine])

L’instanciation d’un objet de type Machine peut se faire sans qu’aucun argument ne soitpassé en paramètre du constructeur.

8

Les mutateurs permettent de mettre des valeurs à ces attributs par la suite.Cependant, il est possible d’instancier une machine avec un ou plusieurs des paramètressuivants : $_mac, $_ip, $_numplugswitch, $_nommachine.

public function __destruct()

Destructeur de l’objet.

public function equals($_machine_a_comparer)

Cette méthode nous permet de comparer l’état de la machine “réelle” avec l’état de lamachine “attendue”.

Lors de son utilisation, il est pertinent d’appeler la méthode sur l’objet représentant lamachine “attendue” (et donc avec l’objet représentant la machine “réelle” en paramètre).En effet la machine “attendue” possède comme attributs : un nom, une adresse MAC, uneadresse IP et le numéro de la prise sur laquelle la machine est attendue (ces paramètressont récupérés dans un fichier de configuration). La machine “réelle” possède quant à ellepour attributs (si elle est allumée) : le numéro de la prise où la machine est connectée,son adresse MAC, mais connaît aussi les valeurs des attributs $_Connected, $_NumVlan

et $_TrunkVlanList (ces paramètres sont ceux récupérés auprès du switch).On profite de la comparaison pour mettre à jour les attributs $_Connected, $_NumVlan,

$_TrunkVlanList et $_isValid qui résultent de la comparaison des deux machines. Cettemise à jour ne se fait que dans l’objet sur lequel la méthode est appelée, c’est-à-dire surla machine "attendue".

Il faut noter que la comparaison ne s’effectue que sur l’association adresse MAC /numéro de la prise du switch. On considère que le DHCP a bien fait son travail, c’est-à-direqu’il a attribué la bonne adresse IP à chaque adresse MAC. On cherche surtout à savoirsi la machine (adresse MAC) est branchée sur le bon port du switch.

5.1.3 Pour le débuggage

public function toString()

Cette méthode nous permet d’afficher les attributs principaux d’une machine. Cela permetde débugguer. Personne n’appelle cette méthode.

5.2 Salle.php

Un objet de type Salle représente un ensemble de machines. La classe doit doncrassembler un ensemble d’objets Machine.

5.2.1 Attributs

Une salle est ainsi caractérisée par les attributs suivants :– $_NomSalle : Le nom de la salle. (ex : Salle D200, Salle D201)– $_EnsPort : L’ensemble des objets Machine de la salle. C’est un tableau de Machine

indexé sur les prises du switch (switch associé à la salle en question).Des accesseurs et des mutateurs ont été créés pour chaque attribut.

9

5.2.2 Méthodes

Nous avons besoin de deux méthodes en plus du constructeur, du destructeur et desaccesseurs/mutateurs.

public function __construct($_nomsalle)

L’instanciation d’un objet de type Salle portant le nom : $_nomsalle.

public function __destruct()

Destructeur de l’objet.

public function creeSalleAttendu($GestFichier)

Cette méthode nous permet de créer la salle avec des machines possédant la configurationsouhaitée. Cette configuration est celle passée en paramètre : $GestFichier, objet detype GestionConfig (voir la section suivante).

public function MiseAJourConfig($_salle_a_comparer)

Cette méthode nous permet principalement de mettre à jour la salle “attendue” avec lesinformations apportées par la salle “réelle”. Cela est possible grâce à l’appel de la méthodeequals sur chacune des machines. Il faut appeler la méthode sur l’objet représentant lasalle “attendue” (cf. méthode equals de Machine).

5.2.3 Pour l’affichage

public function toString()

Cette méthode nous permet d’afficher la salle sous la forme d’un tableau. Le nombre demachines par ligne est paramétrable dans le fichier de configuration (conf.php).

public function AfficheMachineAProbleme($salleReelle)

Cette méthode nous permet d’afficher les problèmes qui ont été détectés sur les différentsports du switch (reliés aux machines).

Remarque : Pour les fonctions d’affichage, nous concaténons le résultat dans une chainede caractère. En effet, nous nous trouvons dans la partie "Model" du MVC et nous nenous permettons pas d’afficher des éléments à l’écran (cela est réservé à la partie "View").

10

6 Gestion des configurations

Nous avons besoin d’un support qui nous indique quelle configuration est celle souhai-tée afin de pouvoir tester la bonne disposition de la salle. L’application prend un fichiertexte comme configuration de base. Ce fichier lui donne alors la composition de la salletel qu’elle doit être. Ainsi un nom de machine détermine son adresse IP, son adresse MACainsi que le numéro de prise sur le switch de la salle dans laquelle la machine est connectée.

Nous avons aussi besoin de pouvoir gérer les configurations en cours de l’équipementréseau à l’aide d’un mécanisme de sauvegarde/restauration des configurations.

Nous aurions pu tout mettre dans une seule classe, mais on aurait alors confondule traitement du fichier donnant la configuration "attendue" et la gestion des fichiersde configuration de l’équipement réseau (sauvegarde/restauration). De plus, cela permetqu’en cas d’évolution de l’application sur une base de données (ou un serveur DHCP) etnon avec la lecture dans un fichier, le contrôleur n’a pas a être modifié. Seule la classeFileConfig doit être remplacée par la nouvelle classe qui traite la base de données (ouqui communique avec le DHCP), les appels dans GestionConfig doivent être modifiésainsi que l’endroit (la table de la BD, le serveur DHCP) où trouver la configuration de lasalle (dans le fichier de configuration conf.php).

6.1 FileConf.php

Cette classe permet de lire une configuration dans un fichier et de donner les para-mètres sous un format spécifique (sous forme de tableau).

Un objet FileConfig ne peut pas lire n’importe quel fichier texte. Il faut que cedernier respecte un certain nombre de contraintes (voir la description de la fonctionParcoursConfig() pour avoir les critères à respecter). Un exemple d’un fichier de confi-guration correct est disponible ici : www/data/Conf_initial/mappingsD200.txt.

6.1.1 Attributs

Un objet FileConfig comprend simplement un attribut $_NomConfig qui correspondà l’endroit où se trouve le fichier.

Un accesseur/mutateur a été créé pour cet attribut.

6.1.2 Méthodes

Nous avons seulement besoin de la méthode ParcoursConfig() en plus du construc-teur et du destructeur :

public function __construct($_nomfichier)

Le constructeur a besoin de savoir où trouver le fichier de configuration $_nomfichier. Lesfichiers de configuration initiale sont présents dans le dossier www/data/Conf_initial/.

public function __destruct()

Destructeur de l’objet.

11

public function ParcoursConfig()

Cette méthode doit prendre le contenu du fichier, attribut de la classe, et le découper afinde donner les informations sous la forme d’un tableau. Chaque ligne du tableau corres-pond aux différentes caractéristiques d’une machine et les colonnes ont les significationssuivantes :

– indice 0 => Nom de la machine.– indice 1 => Adresse MAC de la machine.– indice 2 => Adresse IP de la machine.– indice 3 => Numéro de la prise de l’équipement réseau.

Le fichier de configuration, pour être considéré comme valide, doit respecter les critèressuivants :

– Il doit avoir une première ligne descriptive décomposée en quatre champs d’en-tête.– Les autres lignes du fichier doivent avoir quatre champs distincts séparés par un ou

plusieurs espaces.– Les champs doivent correspondre respectivement au nom de la machine, son adresse

MAC, son adresse IP et le numéro sur lequel est attendu la machine. Le numéro deprise doit être sous le format donné par Cisco : "Fa0/xx" où xx est le numéro deport.

– L’ordre des machines détermine l’affichage. La première machine du fichier seracelle en haut à gauche de l’écran lors de l’affichage. L’affichage suit l’ordre naturelde lecture : c’est-à-dire de gauche à droite et de haut en bas. La largeur des lignesest définie par la constante $nbMachineParLigne.

6.2 GestionConfig.php

Cette classe permet de sauvegarder/restaurer une configuration du switch. Elle permetaussi la gestion de l’interprétation du fichier donnant la configuration “attendue”.

6.2.1 Attributs

Un objet GestionConfig est donc simplement une configuration. Dans notre cas, leseul attribut $_FileConf est un objet de type FileConfig.

Aucun accesseur/mutateur n’a été créé pour cet attribut, car personne n’a besoin d’yacceder en dehors de la classe.

6.2.2 Méthodes

Nous avons besoin des méthodes suivantes :

public function __construct($conf)

Le constructeur a besoin de savoir quel est le fichier de configuration $conf à interpréter.

public function __destruct()

Destructeur de l’objet.

public function Parcours_ConfAttendue()

Cette méthode est juste un appel à la méthode ParcoursConfig() de la classe FileConf

12

afin qu’elle lui remonte le tableau de machines correspondant à la configuration attendue.Elle fait ensuite remonter le tableau au contrôleur.

public static function SaveConfig($switch, $file, $choix)

Cette méthode statique permet de récupérer dans un fichier $file la configuration actuellede l’équipement réseau. Elle a besoin d’avoir les paramètres du switch $switch qui ontété négociés par le contrôleur afin de pouvoir effectuer sa requête.

On peut récupérer autant la startup-config que la running-config. C’est le para-mètre $choix qui le détermine.

Le paramètre $file doit donner le chemin pour accéder au fichier à partir du dossierwww/data/ciscoconf/.

Les fichiers sauvegardés seront sous la notation suivante :

"backup_".$file."_".$date_tmp.".cfg"

où $date_tmp est sous le format :

aaaa-mm-jj_hh’h’mm’m’ss’s’

et où $file est le nom donné par l’utilisateur.Ainsi si nous sommes le 10 juin 2010 et qu’il est 17h47min07sec avec $file valant

"exam-reseau", le fichier sera enregistré sous le nom suivant :

backup_exam-reseau_2010-06-10_17h47m07s.cfg

public static function LoadConfig($switch, $file)

Cette méthode statique permet de mettre la configuration souhaitée ($file) dans larunning-configuration de l’équipement réseau. Elle a besoin d’avoir les paramètres duswitch $switch qui ont été négociés par le contrôleur afin de pouvoir effectuer sa requête.

On ne peut importer une configuration que dans la running-config. En effet, il neserait pas prudent de modifier la startup-config.

Le paramètre $file doit donner le chemin pour accéder au fichier à partir du dossierwww/data/ciscoconf/.

public static function RemoveConfig($file)

Cette méthode statique permet de supprimer physiquement un fichier ($file) du serveur.$file doit être la cible à partir du dossier www/data/ciscoconf/. Le format doit doncêtre : nom_rep/nom_fichier.cfg où nom_rep vaut user ou valid.

public static function ResetConfig($switch)

Cette méthode statique permet de remettre la configuration actuelle du switch ($switch)à zéro. Concrétement, on effectue une copie de la startup-config dans la running-config.

public static function ListerRepertoire($rep)

Cette méthode statique permet de lister les fichiers de configuration qui sont disponiblessur le serveur (dans le répertoire $rep).

13

7 L’interaction avec le switch Cisco Catalyst 2960

Nous avons décidé d’interagir avec le switch par sa CLI (Command Line Interface).Pour cela, il faut se connecter en telnet sur le port 23 du switch et saisir un Username etun Password. Ensuite, on envoie des commandes et leur résultat s’imprime sur la console.

Il faut donc une interface PHP capable de communiquer en telnet avec le switch :TelnetSwitch.php.

Des exemples d’utilisation sont fournis dans le dossier www/public/tests/.

7.1 TelnetSwitch.php

La classe TelnetSwitch est une implémentation, à l’aide de la librairie php fsocket,d’une interface de discussion en telnet avec un switch Cisco. Il aurait été long et laborieuxde faire une classe permettant d’établir des connexions telnet avec tout type de "serveurtelnet". Nous avons donc décidé de faire une interface déjà orientée "Cisco".

Cette classe permet de communiquer avec le switch en CLI grâce à ses méthodes :connect($switch_ip, $switch_pwd, $enable_pwd [, $switch_user])

Le résultat de la connexion est la création d’une socket sur laquelle seront exécuté lescommandes fgets et fwrite.En cas d’erreur à la connexion, un message d’erreur est déposé dans l’attribut $err_msg

de la classe.– $switch_ip : Adresse IPv4 du switch entre 0.0.0.0 et 255.255.55.255 vérifiée par

expression régulière.– $switch_pwd : Mot de passe du switch de premier niveau.– $enable_pwd : Mot de passe pour entrer en mode enable.– $switch_user (facultatif) : Nom d’utilisateur pour se loguer sur le switch.

Le paramètre $switch_user est optionnel, pour le cas où on se connecte au switch enentrant directement le mot de passe. Sa valeur par défaut est "".

write($buffer)

– $buffer : La commande à envoyer au switch par l’intermédiaire du socket créé parconnect. La méthode write se charge de rajouter le retour charriot à la fin de lacommande pour la valider.

read(&$buffer)

– $buffer : La variable dans laquelle la fonction mettra les lignes récupérées par lasocket.

telnet_wait()

Cette fonction est appelée par read et write pour temporiser et laisser le temps auswitch de réagir. Son temps d’attente est paramétrable avec la variable $telnet_wait dela classe Default_Model_conf. Réduire ce temps augmente la rapidité de l’applicationmais augmente les risques d’échecs.

Lors de l’instanciation d’un objet TelnetSwitch, il faut passer en paramètre le nomdu switch (i.e. le mot clef qui s’affiche dans le prompt) car il permet à TelnetSwitch dereconnaître le prompt nomduswitch> ou nomduswitch#, et donc de vérifier qu’il est bienconnecté au switch.

Deux exemples sont fournis : t_telnetswitch.php et t_telnetswitchNOK.php.

14

7.2 ConnexionSwitch.php

La classe ConnexionSwitch permet de se connecter au switch, et de lui envoyer descommandes en récupérant la sortie générée par ces commandes, avec ses méthodes :

connect($switch_ip, $switch_pwd, $enable_pwd [, $switch_user])

Utilise directement connect() de TelnetSwitch.– $switch_ip : Adresse IPv4 du switch.– $switch_pwd : Mot de passe du switch de premier niveau.– $enable_pwd : Mot de passe pour entrer en mode enable.– $switch_user (facultatif) : Nom d’utilisateur pour se loguer sur le switch.

Le résultat de la connexion est la création d’une connexion telnet sur laquelle serontexécuté les commandes read et write.En cas d’erreur à la connexion, un message d’erreur est déposé dans l’attribut $err_msg

de la classe.

doCommand($command, &$result)

Utilise write() puis read() de TelnetSwitch.– $command : La commande à envoyer au switch.– $result : La variable dans laquelle le résultat de la commande sera renvoyé.

Les informations remontées par doCommand() contiennent les lignes voulues, mais éga-lement des caractères ASCII non attendus du fait d’une lecture du stream telnet nonparfaite. Il faudra donc “parser” ces lignes avec des expressions régulières.

Même si elle utilise directement TelnetSwitch, cette classe ne sert pas à rien puisqu’ellepermet aux classes “supérieures” de faire abstraction de TelnetSwitch. Cela pourra êtreutile si jamais le protocole de connexion à la CLI du switch cisco change.

Deux exemples sont fournis :t_connexionswitch.php et t_connnexionswitchNOK.php

15

7.3 CommandeSwitch.php

En utilisant ConnexionSwitch, la classe CommandeSwitch envoie des commandes pré-définies mais paramétrables au switch. Dans le cas des commandes de type “show ...”,les fonctions de CommandeSwitch analysent les lignes récupérées à l’aide d’expressionsrégulières, et les renvoient de façon ordonnée dans des tableaux de Machine.

Toutes les commandes, et les expressions régulières permettant d’analyser leur sortie,sont paramétrables dans le fichier ExpressionReguliere.php.

public function __construct($connexionSwitch)

Lors de l’instanciation de la classe, il est nécessaire de passer en paramètre une connexionau switch active, créée auparavant avec ConnexionSwitch. C’est sur cette connexion queseront ensuite envoyées les commandes.

private function ciscoMax2StandardMac($mac)

Les adresses mac renvoyées par le switch Cisco sont du genre afd0.98c1.009d. Hors, pourles comparer avec celles dans les fichiers de mapping, on aimerait plutôt qu’elles soient dela forme af:d0:98:c1:00:9d.

Cette fonction prend donc en paramètre une adresse mac au format “Cisco” et larenvoie au format usuel.

private function standardMac2CiscoMac($mac)

Fonction inverse de la fonction précédente. Sert notamment lors de la recherche de l’adressemac Prof.

private function verifListeVlans($vlan_list)

Cette fonction vérifie la validité de la liste de VLANs passée en paramètre. Elle vérifie leformat de la liste, la valeur des VLANs de la liste, ainsi que la validité des intervalles deVLANs de la liste (ex : 200-198 invalide).

private function sendConfT()

Cette fonction auxiliaire permet d’entrer en mode configure terminal pour pouvoirensuite envoyer des commandes de configuration.

private function sendExit()

Cette fonction auxiliaire permet d’envoyer un exit pour quiter les différents modes deconfiguration (terminal, vlan, interface...).

private function goToMode($mode)

En se servant des deux fonctions précédentes, ainsi que de l’attribut mode, cette fonctions’occupe de basculer la connexion avec le switch dans le mode de configuration voulu. Cen-traliser cette gestion permet d’optimiser les appels aux fonctions sendConfT et sendExit.Toute fonction effectuant des actions sur le switch doit, au préalable, appeler goToMode

avec le bon paramètre parmi Exec, Config, ConfInt et ConfVlan.

public function getVTPMode()

Renvoie le mode VTP actuel du switch parmi { Client ; Transparent ; Server }.

public function setVTPMode($mode)

Cette fonction permet de passer le switch dans le mode VTP $mode.– $mode : Doit être Client, Transparent ou Server (case-sensitive).

16

public function showPortsVlans(&$tab_machines)

Cette fonction analyse la sortie de la commande show interfaces status. Pour chaqueinterface du type Fa0/xy, la fonction instancie un objet Machine dans lequel elle ren-seigne le nom du port (Fa0/xy), le numéro du VLAN (un entier entre 1 et 4094 si le portest en mode access, ou le mot-clef trunk si le port est en mode trunk), et son état deconnectivité (1 pour connecté, 0 pour déconnecté)(sachant qu’un PC éteint mais alimentéest connecté).Pour les ports en mode trunk, la fonction renseigne, dans l’objet Machine, la liste desVLANs trunk auxquels l’interface appartient.Si $tab_machines contient déjà des machines, alors la fonction remplit les Machine exis-tantes, et instancie celles non-existantes.$tab_machines est un tableau de machines indexé sur le nom de port du switch, typeFa0/17.

public function showMacAddresses(&$tab_machines)

Cette fonction analyse la sortie de la commande show mac address-table. Pour chaqueinterface du type Fa0/xy, la fonction instancie un objet Machine dans lequel elle renseignele nom du port (Fa0/xy), ainsi que son adresse MAC si c’est une machine active sur leréseau.Cette fonction requiert que les machines soient allumées et actives. Pour cela, nous avonscréé la classe Ping (voir section Miscellaneous pour son fonctionnement).Si $tab_machines contient déjà des machines, alors la fonction remplit les Machine exis-tantes, et instancie celles non-existantes.$tab_machines est un tableau de machines indexé sur le nom de port du switch, typeFa0/17.

17

public function addPortXtoVlanY($x, $y [, $vlan_list])

Le but de cette fonction est d’ajouter une interface à un VLAN, en mode access ou trunk.– $x : Le port de l’interface à ajouter. Doit être du type Fa0/ab.– $y : Le numéro du Vlan dans lequel $x doit être mis en mode access. Ce paramètre

ne signifie rien si $vlan_list != null.– $vlan_list (facultatif en access, obligatoire en trunk) (Valeur par défaut : null)

Doit être une chaîne de caractères contenant la liste de VLANs, sous la conventionsuivante :– Les numéros de VLAN doivent être compris entre 1 et 4094.– Les numéros de VLAN son séparés par des virgules– Un numéro de VLAN peut être remplacé par une plage de VLANs : deux numéros

de VLANs séparés par un ’-’.Exemple de liste de VLANs valide :501-504,507,510,530-540

Configurer un port en mode trunk outrepasse les configurations en mode acces, etvice-versa.

Voici les commandes effectuées par la fonction pour la mise du port Fa0/17 dans leVLANs 42 en mode access :interface Fa0/17

switchport access vlan 42

switchport trunk allowed vlan all

switchport mode access

Voici les commandes effectuées par la fonction pour la mise du port Fa0/17 dans lesVLANs 501-504,507,510 en mode trunk (Avec la valeur du VLAN par défaut définie dansle fichier de configuration, 200) :interface Fa0/17

no switchport access vlan 200

switchport trunk allowed vlan 501-504,507,510

switchport mode trunk

Avant d’utiliser addPortXtoVlanY, il est important de mettre le switch en mode VTPTransparent. Pour le cas des VLANs en mode trunk, il est important de “créer” cesVLANs avant avec la fonction vlanRange.

18

public function vlanRange($vlan_list, $action)

Ajoute ou Supprime les VLANs de la liste $vlan_list de la configuration du switch.– $vlan_list : Une chaîne de caractères qui respecte le format de liste de VLANs

décrit ci-dessus pour addPortXtoVlanY.– $action : Doit être parmi { "add" ; "del" }.

Requiert également que le mode VTP soit Transparent.

public function copyConfig($nom_cfg, $type_cfg [, $sens])

Si $sens n’est pas spécifié ou égal à "export", la fonction copie la configuration du switch$type_cfg dans le dossier www/data/ciscoconf/user/ grâce au FTP.Si $sens est égal à "import", la fonction importe dans le switch un fichier de configurationdésigné par $nom_cfg, par rapport au répertoire www/data/ciscoconf/. Un nom de fichiersera donc du type valid/fichiervalide.cfg ou user/monfichier.cfg. Dans ce cas,$type_cfg doit être égal à running-config (on ne peut pas écraser la startup-config).Si $sens est égal à "reset", alors les valeurs des deux premiers paramètres ne sont passignificatives et on demande au switch de copier la startup-config vers la running-config.

– $nom_cfg : Désigne le nom du fichier dans lequel on exporte la configuration duswitch, ou alors le nom du fichier de configuration qui sera importé dans le switch.

– $type_cfg : Désigne la configuration qui sera copiée.Doit être parmi { "running-config" ; "startup-config" }

– $sens (facultatif)(Valeur par défaut : "export")Doit être parmi { "export" ; "import" ; "reset" }.

public function whoisPortProf()

Cette fonction renvoie le numéro de port switch sur lequel est branché le poste du prof.Il est déterminé à partir du tableau d’adresses mac “Prof”, généré par la classe MacProf

(cf Miscellaneous).La fonction stoppe la recherche lorsqu’une adresse MAC correspondante est trouvée (etempêche ainsi éventuellement une seconde d’être trouvée).

public function configPortProf($mode)

Configure le port Prof en mode trunk ou access.Si $mode = access, les commandes sont :

switchport access vlan 200

switchport trunk allowed vlan all

no switchport trunk native 200

switchport mode access

Si $mode = trunk, les commandes sont :switchport trunk native vlan 200

switchport trunk allowed vlan all

switchport mode trunk

Où 200 est le numéro du vlan par défaut, défini dans le fichier conf.php.En mode trunk, le allowed vlan all est litigieux car on voudrait plus précisement auto-riser les VLANs trunk sur lesquels d’autres machines sont. Mais, ainsi, l’implémentationest plus simple et il semblerait que le résultat soit le même.

Plusieurs exemples sont fournis, ils sont de la forme t_commandswitch*.php.

19

8 Formulaires

Tous les formulaires de l’application, interactions avec l’utilisateur, se trouvent dansle dossier www/application/forms/.

Les règles de nommage nous imposent de les nommer nomformulaireForm.php oùnomformulaire est le nom souhaité.

8.1 Généralités sur les formulaires

Les formulaires peuvent être facilement réalisés (sous leur forme simple), mais ilspeuvent devenir très compliqués à implémenter dès que l’on veut les mettre sous uneforme personnalisée. Ainsi un formulaire est une suite d’élément (checkbox, radiobutton,etc.) sur lequel on peut ajouter des attributs (taille, valeur par défaut, etc.), des validateurs(type entier, etc.) et des décorateurs personnalisés. La plupart des formulaires ont été missous forme de tableau.

8.2 Mettre plusieurs formulaires sur une même page phtml

Afin de mettre plusieurs formulaires dans une même page, nous avons usé d’une petiteastuce. En effet, la présence de deux formulaires (ou plus) signifie la présence de deuxboutons submit (ou plus). Ainsi lors de l’envoi de l’un des formulaires, il nous faut savoirlequel à été envoyé. Pour cela, nous insérons un champ hidden afin de déterminer quelformulaire a été envoyé grâce à un test sur le champ hidden présent dans le résultat. Cetest est fait dans le contrôleur suite à la réception du formulaire (voir la section suivantepour plus d’information).

8.3 Paramètres de connexion : paramconnswitchForm.php

Ce formulaire est la première page de l’application. Elle sert à l’utilisateur de donnerles paramètres qui permettent de se connecter au switch choisi. Seul le champ user estfacultatif. Les valeurs récupérées seront mises dans des variables de session (voir la sectionsuivante pour plus d’information sur l’utilisation des sessions).

Si une session est existante, la page de connexion utilise le formulaire chgtsessionForm.php

afin de pouvoir accéder à une salle sans devoir ré-entrer les paramètres de connexion.

8.4 Configuration de la salle

8.4.1 Configuration VTP : vtpForm.php

Le formulaire permet à l’utilisateur de changer le mode VTP du switch (cf paragraphesur VTP dans la documentation utilisateur). Nous proposons seulement le mode VTP

client et le mode VTP transparent. En effet, le mode VTP server serait une manipula-tion imprudente pour le rôle central de l’application. Si l’utilisateur veut mettre une telleconfiguration, il devra passer par une configuration "à la main" du switch.

20

8.4.2 Configuration rapide : quickconfigForm.php

Ce formulaire permet à l’utilisateur de configurer toutes les machines sous le formatparamétré. Ainsi il est possible de mettre la même configuration sur 1,2,4 ou 8 ma-chines consécutives. De plus, on donne n VLANs à ces groupes de machines. Le pre-mier VLAN attribué correspondra au numéro donné au formulaire (champ Vlan de

départ). La valeur par défault du dernier paramètre est donnée par la variable glo-bale Default_Model_conf::$vlan_manips_min présente dans le fichier de configuration(conf.php).

Ainsi pour les valeurs suivantes : Nombre de machines groupée(s) = 2, Nombre de

VLAN(s) par groupe de machines = 2 et VLAN de départ = 501 nous aurons la confi-guration des machines suivantes :

– mach1 et mach2 => vlan 501-502 ;– mach3 et mach4 => vlan 503-504 ;– mach5 et mach6 => vlan 505-506 ;– etc...

8.4.3 Configuration personnalisée : advancedconfigForm.php

Ce formulaire permet à l’utilisateur de configurer le nombre de machines de son choix(grâce à la sélection par checkbox) avec la configuration désirée. Un bouton permetcependant d’appliquer la configuration à toutes les machines (checkbox "Appliquer la

config à toutes les machines"). De plus, le choix se base sur le type de VLAN àconfigurer : trunk ou access. Ce choix se fait à l’aide d’un radiobutton. Le choix estdonc unique, c’est-à-dire que l’on ne peut pas avoir un port sous les deux modes en mêmetemps. En effet, le mode access permet de ne configurer qu’un seul VLAN par machine(port), alors que le mode trunk autorise une liste de VLANs.

Il est à noter que des validators ont été définis sur les éléments du formulaire afin d’in-diquer dès que possible à l’utilisateur si son choix est incorrect. Nous avons aussi dû ruserpuisque certains validateurs étaient dépendants du choix de l’utilisateur (trunk/access),non connu lors de la création du formulaire. Pour cela nous avons mis une fonction depré-validation (preValidation($data)) qui permet de mettre les validateurs appropriésen fonction des données ($data) choisies par l’utilisateur.

De plus, nous avons redéfini les decorators afin de pouvoir configurer l’affichage demanière dynamique (grâce au paramètre Default_Model_conf::$nbMachineParLigne).Nous l’avons ainsi mis sous la forme d’un tableau.

8.4.4 Configuration du port contrôleur : macForm.php

Ce formulaire permet à l’utilisateur de donner l’accès au contrôleur/enseignant à tousles VLANs (de 1 à 4094) en mode Trunk en plus de l’accès au VLAN par défaut en Native

ou de le restreindre simplement à l’accès du VLAN de base (en mode Access).

21

8.5 Gestion de configuration de l’équipement réseau

8.5.1 Sauvegarde de la configuration courante : saveconfigForm.php

Ce formulaire permet à l’utilisateur de sauvegarder la configuration souhaitée cou-rante : running-config ou startup-config. Ce choix se fait grâce au radiobuton.L’élément texte permet à l’utilisateur de rentrer le nom qu’il veut donner au fichier.Attention le nom n’est pas seulement constitué de la valeur de ce champ texte (voir lasection sur la gestion des configurations pour plus d’information).

8.5.2 Chargement d’une configuration dans le switch : loadconfigForm.php

Ce formulaire permet de charger une configuration du serveur vers le switch. Il est ànoter qu’il est impossible de mettre une nouvelle configuration dans la startup-config.Cela est un choix de notre part afin de ne pas risquer la stabilité du switch en cas defausse manipulation.

Nous utilisons deux fois ce formulaire dans la même page. En effet, nous avons séparédeux dossiers de configuration (user et valid). Le premier répertorie des fichiers completsprovenant d’une sauvegarde du switch, alors que le second nous donne les morceaux defichiers de configuration. Dans le premier cas nous permettons à l’utilisateur de pouvoirsupprimer les fichiers de configuration. En ce qui concerne le dossier valid, l’utilisateurpeut seulement mettre "à la main" les configurations souhaitées dans ce dossier. Nousavons donc décider de ne pas permettre la suppression de ces fichiers depuis l’application.Tout se fera donc à la main pour ce dossier : insertion/suppression.

Nous avons donc dû mettre un test de condition afin de savoir s’il faut mettre (ou pas)le bouton de suppression.

Nous pouvons noter ici qu’il peut être dangereux de charger un fichier complet (doncavec le mot de passe) trop ancien. Il est du devoir de l’utilisateur de ne charger des fichiersqu’en lesquels il a confiance. Il peut ainsi supprimer les fichiers trop anciens ou inutiles.

8.5.3 Restauration de la startup-config : resetswitchForm.php

Ce formulaire permet en un bouton de copier la startup-config dans larunning-config.

8.5.4 Faire une comparaison de fichiers de configuration : diffForm.php

Ce formulaire permet de comparer deux fichiers de configuration. Il a un résultatbinaire : soit les fichiers sont identiques, soit ils sont différents. Nous avons décider dene pas afficher le contenu. Si l’utilisateur veut voir concrétement les fichiers, il devra serendre dans le répertoire et ouvrir le fichier avec un éditeur de texte.

8.6 Paramètres de connexion FTP : ftpconnexionForm.php

Ce formulaire permet de récupérer les paramètres de connexion au serveur FTP. Avantde continuer nous vérifions qu’il peut se loguer au serveur avec les paramètres obtenus.Comme pour la première page de connexion, nous mettons les valeurs rendu dans la

22

session courante aux noms login_ftp et pwd_ftp respectivement pour le login et le motde passe (voir la section suivante pour plus d’information sur les sessions). Afin de nepas demander ces paramètres à chaque fois, nous vérifions si ces paramètres ne sont pasexistants avant de lancer ce formulaire.

8.7 Gestion du changement de session : chgsessionForm.php

Ce formulaire a comme tâche d’indiquer dans un MultiSelect quelles sont les sessionsdéjà ouvertes par l’utilisateur. Cela permet de changer rapidement de session, sans avoirà retaper tous les paramètres de connexion à un équipement réseau, si cette session existedéjà. De plus nous avons mis un bouton qui permet de revenir à la page de connexionafin de créer une nouvelle session sur une autre salle. Ce bouton redirige simplementl’utilisateur à la page de connexion.

8.8 Gestion des adresses MAC du contrôleur : accesvlanprof-Form.php

Ce formulaire permet à l’utilisateur d’ajouter/supprimer une adresse MAC "contrô-leur". Connaitre les adresses MAC "contrôleur" permet d’indiquer à quelle interface ondoit donner l’accès à tous les VLANs.

23

9 Gestion du contrôleur

Nous avons décidé de n’utiliser qu’un seul Controller (IndexController) pour cetteapplication. Chaque page de l’application correspond à une Action dans notre contrôleur.De plus, une Action “pilote” une et une seule vue (View) et donc une seule page !

Comme pour les formulaires, Zend nous impose des régles de nommage pour les fonc-tions du contrôleur (Action). Les Actions doivent ainsi se nommer nomactionAction oùnomaction est le nom souhaité. Dans notre application, nous avons neuf Action : index,diagnostic, affichage, config, changementsession, deconnexionftp, deconnexion, connexionftpet gestionconfig.

9.1 Les URLs

Zend permet la réécriture des URLs. En effet, les URLs en Zend sont sous la formesuivante :

http : //serveurweb : port/index.php/nomcontroleur/nomaction

où– ’serveurweb’ est le nom (ou l’adresse IP) permettant d’accéder au serveur web.– ’port’ est le numéro de port pour ce connecter à votre application (port 80 par

défaut).– ’nomcontroleur’ est le nom du contrôleur sur lequel se trouve l’action (la page)

dont vous voulez avoir l’affichage (il n’y a qu’un contrôleur index dans notre appli-cation).

– ’nomaction’ est le nom de l’action en cours (affiche la vue associée).

Remarque : Toutes les variables qui doivent être passées entre les vues se mettent enbout d’URL sous la forme suivante :

URL + ”/nomvariable/valeur”

où– ’URL’ est sous la forme décrite précédemment.– ’nomvariable’ est le nom donné à la variable.– ’valeur’ est la valeur donné à la variable définie juste avant.

9.2 Les sessions

Nous avons utilisé le mécanisme des sessions. Cela permet notamment à l’utilisateurd’avoir plusieurs instances de l’application au sein d’un même navigateur. Cela est possiblegrâce à l’objet Zend_Session_Namespace de Zend. Nous instancions alors un objet de cetype nommé ’CountNameSpace’ dans l’index qui nous permet de compter le nombre desous-sessions créées. À chaque fois que l’utilisateur réussi à se connecter, on incrémentedonc ce compteur. Tous les paramètres de connexion (adresse IP du switch, password,etc.) sont alors sauvegardés dans une sous-session appelée "session".$id où $id est lenuméro de la sous-session. On doit alors passer en paramètre (à chaque page) le numérode la session courante afin que le changement soit transparent pour l’utilisateur. C’est

24

pourquoi lors de chaque redirection de page (à l’aide de _redirect) nous ajoutons avecen bout d’URL : "/sessionId/".$id tel que montré dans la partie précédente sur lesURLs.

9.3 Le passage des variables à la vue

Nous avons vu précédemment qu’à une Action était associée une et une seule vue.Mais comment peut-on passer des paramètres du contrôleur à la vue ?Pour cela nous utilisons la notation Zend suivante :

$this->view->param = valeur;

où– ’param’ est le nom du paramètre.– ’valeur’ est la valeur du paramètre ’param’.

9.4 La gestion des formulaires

Pour la gestion des formulaires dans le contrôleur nous avons besoin des fonctionsprincipales suivantes :

– $this->_request->isPost : permet de savoir si un formulaire a été envoyé.– $form->isValid($formData) : permet de vérifier les validateurs mis sur le formu-

laire $form. Les données sont mises sous forme de tableau dans $formData.– $form->populate($formData) : permet de remettre le formulaire avec ses valeurs

d’origine et d’afficher les éventuels messages d’erreurs.

Remarque : Afin de savoir quel formulaire a été envoyé, lorsqu’il y en a plusieurs surla même page, nous pouvons mettre un test de condition d’existence d’un champ hidden.Par exemple, si nous souhaitons mettre un formulaire A et un formulaire B sur la mêmepage. Nous pouvons précéder comme suit : dans formulaireaForm.php (respectivementformulairebForm.php) nous instancions un objet hidden de nom ’process_signup_A’(respectivement ’process_signup_B’ pour le formulaire B). Soit le code suivant (pourformulaireaForm.php) :

// le process permet de mettre deux formulaires sur une même page.

// Il indique alors quel formulaire est a traité

$process = new Zend_Form_Element_Hidden(’process_signup_A’ );

$process->setValue(true);

$this->addElements(array($process));

Dans le contrôleur nous séparons la réception des deux formulaires de la façon suivante :

// Formulaire A

Zend_Loader::loadClass(’formulaireaForm’);

$formA = new formulaireaForm();

// on donne le formulaire à la vue

$this->view->formA = $formA;

// Formulaire B

25

Zend_Loader::loadClass(’formulairebForm’);

$formB = new formulairebForm();

// on donne le formulaire à la vue

$this->view->formB = $formB;

$formData = $this->_request->getPost();

if($this->_request->isPost() && isset($formData[’process_signup_A’])){

// Formulaire A envoyé

} elseif($this->_request->isPost() && isset($formData[’process_signup_B’])){

// Formulaire B envoyé

}

26

10 Gestion des vues

Nous l’avons vu dans la partie précédente sur le contrôleur, chaque action doit cor-respondre à une et une seule vue ! De même, il y a une restriction de nom quand aunommage des fichiers vues. Pour une action nomAction, la vue correspondante doit s’ap-peler nom.phtml.

L’affichage des pages passe obligatoirement par les vues. Aucune fonction d’affichage(echo, print_r, etc.) ne doit être appelée en dehors des vues (sauf pour les fonctions dedebugguage) afin de respecter le modèle MVC.

10.1 Récupération des paramètres

On peut afficher les paramètres passés par le contrôleur. On utilise alors la notationsuivante :

<?php echo $this->param ?>

où le paramètre param est passé par l’action du contrôleur associée (tel que montré dansla section précédente).

10.1.1 Les variables importantes

Les variables qui ont une signification dans notre application sont les suivantes :– salle : Cette variable nous indique le nom de la salle en cours.– idSession : Ce numéro correspond au numéro de la session en cours.– pageconn : Si cette variable existe on est sur la page de connexion.– msg : Cette variable permet de donner du feedback en fonction des actions faites

par l’utilisateur. Indique si une action s’est bien passée.– error : Variable qui contient un message d’erreur. Si cette variable existe, il ne faut

pas afficher le corps de la page qui n’a alors aucune signification.

10.2 Les pages d’affichage : fichiers phtml

10.2.1 Le squelette des pages : layout.phtml

Le fichier layout.phtml nous permet de centraliser les parties communes à toutesles pages d’affichage. Cela nous est utile pour l’en-tête, le menu et le pied de chaquepage. Nous avons dû mettre une exception quant à l’affichage du menu sur la page deconnexion. Cela a été réalisé à l’aide de la variable booléenne ($pageconn). De même, lecorps de chaque page est affiché seulement si aucune erreur n’a été détectée (voir la partieprécédente sur les variables importantes).

10.2.2 Le corps des pages : views/scripts/index/*.phtml

Les pages d’affichage (corps de chaque page) se trouvent dans le dossierwww/application/views/scripts/index/. Elles servent à afficher les paramètres passéspar le contrôleur.

27

10.3 La mise en forme : global.css

Nous avons utilisé une feuille de style CSS (Cascading Style Sheets) afin de centraliserla mise en forme. Le fichier de mise en forme se trouve dans le dossier www/public/css/.

28

11 Les erreurs

Autant que faire se peut, les différents modules de l’application détectent précisementles erreurs et, dans le cas des classes, les traitent de façon à peu près générique.

Lorsqu’une méthode d’une classe détecte une erreur, et interrompt son fonctionnementet retourne un entier différent de 0. Elle dépose également un message d’erreur expliciteet en français dans l’attribut $err_msg de sa classe.

Cette partie de la documentation détaille les différents messages d’erreurs des différentsmodules, ainsi que leurs causes.

11.1 Interaction avec le Switch

11.1.1 TelnetSwitch.php

Erreur : IP Invalide

L’adresse IP à laquelle l’application essaye de se connecter ne correspond pas à une adresseIPv4. En d’autres termes, l’expression régulière définie dans ExpressionReguliere.php nereconnaît pas l’IP.Cela peut être causé par plusieurs choses :

– La résolution du nom du Switch n’a pu avoir lieu, et a renvoyé le nom du Switch aulieu de l’IP.

– L’adresse IP ne correspond pas à l’expression régulière– L’expression régulière n’est pas bonne

Impossible de se connecter à <adresse IP explicitée>

Ce message d’erreur a lieu lorsque la socket n’a pas pu être ouverte à l’adresse IP explicitéedans le message d’erreur, sur le port telnet.Vérifiez la connectivité entre l’application web et le Switch, ainsi que le port 23 (telnet)du Switch.

Erreur : Mauvais nom d’utilisateur

L’application a réussi à se connecter à l’application mais le nom d’utilisateur n’est pasbon. (Non vide alors que nom d’utilisateur vide attendu par le Switch).

Erreur : Mauvais utilisateur ou mot de passe.

L’application n’a pas réussi à se connecter avec les indentifiants fournis.

Erreur : Mauvais mot de passe enable.

L’aplication a réussi à se connecter au switch en mode User EXEC, mais n’a pas pu passeren mode Privileged EXEC car le mot de passe fourni pour entrer dans ce mode n’est pasle bon.

29

11.1.2 ConnexionSwitch.php

La classe ConnexionSwitch se contente de propager les erreurs qu’elle récupère deTelnetSwitch.

Concrètement, si TelnetSwitch renvoie une erreur, la méthode de ConnexionSwitchqui attrape cette erreur, renvoie un entier différent de 0 et recopie le message d’erreurdans son attribut $err_msg.

11.1.3 CommandeSwitch.php

Erreur : Paramètre de création d’un objet CommandeSwitch null.

Avant d’instancier un objet de type CommandeSwitch, vous devez créer un objet validede type ConnexionSwitch.Si ce message d’erreur survient, soit vous avez oublié de créer cet objet, soit la créationde cet objet s’est mal passée et vous avez oublié de relever l’erreur qui en est ressortit.

Erreur : Liste de VLANs invalide : Mauvais format.

La liste de VLANs saisie n’est pas au bon format. Reportez-vous à la section d’interactionavec le switch pour le format en question.Ce format est vérifié par expression régulière.

Erreur : Certains VLANs de la liste ne sont pas dans le bon interval.

Cette erreur survient si un ou plusieurs VLAN de la liste n’est pas entre 1 et 4094.

Erreur : Intervalle(s) de VLANs invalides

Cette erreur survient si un ou plusieurs intervalles de VLANs sont invalides : le premiernombre de l’intervalle est supérieur au second nombre.

Erreur : Mode VTP non reconnu : <mode explicité>

Cette erreur survient lorsque vous essayez de passer le switch dans un mode différent deTransparent, Client ou Server.

Erreur : Numéro de VLAN invalide

Le numéro de VLAN saisi ne correspond pas à un entier entre 1 et 4096.

Erreur : Numéro de port switch invalide

La chaîne de caractères représentant le port switch que vous souhaitez configurer necorrespond pas à l’expression régulière qui permet de reconnaître les ports.

Erreur : mode VTP incompatible avec configuration des VLANs.

Le Switch est en mode VTP Client et il faut le mettre en mode Transparent pour pouvoiradministrer les VLANs.

30

Erreur : Aucune MAC prof détectée, impossible de déterminer

sur quel port le prof est connecté. Veuillez saisir

votre adresse MAC dans le fichier de configuration.

Aucune machine d’enseignant connue n’est détectée par le Switch. Il faut bien ajouterl’adresse MAC de la machine si on souhaite configurer le port enseignant.

Erreur : Mode de config inconnu pour le port Prof : <mode explicité>.

La fonction de configuration du port Prof n’a pas été appelée avec le bon mode.

Erreur : action inconnue <action>. Une action valide est del ou add.

Action demandée inconnue lors de l’ajout ou de la suppression de VLANs.

Erreur : Type de config inconnu : <type explicité>

Voir la section sur CommandeSwitch pour voir quels sont les types de config importablesou exportables.

Erreur : Sens de copie inconnu : <sens explicité>

Voir la section sur CommandeSwitch pour voir quels sont les sens possibles.

Erreur : Impossible d’importer ce type de config.

Vous essayez d’importer votre configuration dans la startup-config, ce qui est vivementdéconseillé et empêché par l’application.

CommandeSwitch fait également remonter les erreurs de la classe MacProf.

31

11.2 Miscellaneous

11.2.1 MacProf.php

Erreur : Fichier introuvable ou vide.

Le fichier passé en paramètre à au constructeur n’est pas valide/existant.

Erreur : Adresse MAC invalide.

L’adresse MAC que vous souhaitez supprimer ou ajouter n’a pas un format valide.

11.2.2 TestFTP.php

Erreur : IP Invalide

Même chose que pour TelnetSwitch.

Impossible de se connecter à <adresse IP explicité>

Même chose que pour TelnetSwitch.

Erreur lors de l’authentification.

Une erreur inconnue est survenue lorsque le nom d’utilisateur a été rentré.

Erreur : Mauvais utilisateur ou mot de passe.

L’application n’a pas réussi à se connecter avec les indentifiants fournis.

32

12 Miscellaneous

12.1 Ping.php

La classe Ping permet de générer facilement du trafic entre le switch et les machinesdu réseau. Cela est nécessaire pour “remplir” les tables ARP et MAC-ADDRESS-TABLEdu switch pour tester la configuration. Cela permet également de tester la connectivitéde la machine.

L’implémentation d’une fonction ping ICMP n’est pas triviale en PHP. Il faut utiliserles fonctions socket_*, qui ne sont pas forcément disponibles sur tous les serveurs Apache(et notamment pas ensibm).

Nous aurions pu utiliser la commande “ping” Cisco, par l’interface CommandeSwitch,mais cette commande ne permet pas un timeout inférieur à une seconde. Il faudrait donc96 secondes au script pour pinger 96 machines éteintes, et moins d’une seconde pour pinger96 machines allumées. Un tel écart de temps d’exécution de script n’est pas acceptable.

Nous avons donc décidé de tester la connectivité de la machine sur le port SSH àl’aide de la librairie php fsocket. Elle permet un temps de timeout bien plus petit, etdonc de pinger les 96 machines des deux salles en moins d’une seconde, quelque soit leurconnectivité effective. Ce timeout est réglable dans le fichier de configuration.

Cette méthode requiert que le port 22 soit ouvert sur la machine. Ce n’est finalementpas un obstacle en salle système car, FreeBSD et Ubuntu étant des systèmes UNIX, ellesdisposent d’un serveur SSH. Après tests, il s’avère que les systèmes Windows XP de lasalle système disposent également d’un serveur SSH.

Notre script pourra donc pinguer n’importe quelle machine de la salle système, si elleest correctement connectée au switch (physiquement et au niveau VLAN).

Les fonctions de cette classe son déclarées en static : Nul n’est besoin d’instancierun objet pour les utiliser.Utilisation : Default_Model_Ping::methode($parametres)

public static function Pinger($host, $port)

La fonction teste la connectivité de la machine d’adresse ip $host sur le port $port. Letimeout de cette fonction ping est réglable dans le fichier de configuration. Il s’agit de lavariable $ping_timeout.

– $host : Adresse IPv4 vérifiée par expression régulière.– $port : Port vérifié par expression régulière.

public static function doPing()

Étant données les variables de configuration $ping_deb, $ping_fin, $ping_plage et$ping_port, la fonction va tester la connectivité des machines $ping_plage.$ping_deb

à $ping_plage.$ping_deb sur le port $ping_port.Par exemple, si $ping_deb=16, $ping_fin=111, et $ping_plage="195.221.227.",

la fonction teste la connectivité des machines 195.221.227.16 à 195.221.227.111 (etgénère du trafic entre le switch et ces machines, par extension).

33

12.2 MacProf.php

Cette classe permet de gérer la liste des adresses MAC des enseignants susceptiblesde se connecter au switch sur les ports Gigabit. À partir de cette liste, l’applicationreconnaît le port switch sur lequel est branchée la machine de l’enseignant. Cela permetà l’application de configurer ce port de manière souhaitée.

Lors de son instanciation, la classe prend en paramètre le chemin vers ce fichier.Ses méthodes sont :

public function __construct($_file)

Le constructeur prend en paramètre le chemin vers le fichier contenant les adresses MAC.Ce fichier doit contenir des adresses MAC de la forme 00:1a:4b:6a:85:9a. Les adressesMAC sont séparées par des sauts de ligne.Le constructeur lit le fichier et enregistre chaque ligne non-vide (donc adresse MAC) dansun tableau (attribut $array_macprof). Il enregistre également le chemin vers le fichierdans l’attribut $file_macprof en vue d’utilisations futures.Si le fichier ne peut être ouvert, alors un message d’erreur sera inséré dans l’attribut$err_msg.

public function ajouterMac($_mac)

Ajoute l’adresse MAC $_mac à la liste (dans l’attribut de type tableau), et re-écrit lefichier avec cette nouvelle adresse MAC.

public function supprimerMac($_mac)

Supprime l’adresse MAC $_mac de la liste (dans l’attribut de type tableau), autant defois qu’elle y figure, et re-écrit le fichier avec cette nouvelle adresse MAC.

viderListe()

Vide la liste d’adresses MAC (vide l’attribut tableau), et vide le fichier.

public function printListe()

Affiche la liste contenue dans l’attribut tableau avec la fonction PHP print_r.

public function getMacArray()

Retourne le tableau d’adresses MAC.Cette fonction est utilisée par la méthode whoisPortProf de la classe CommandeSwitch,pour trouver sur quel port Gigabit est connecté la machine de l’enseignant.

34

12.3 TestFTP.php

Sur le même modèle que TelnetSwitch, cette classe teste la connectivité du serveurFTP, et la validité des identifiants fournis par l’utilisateur. Cela permet, dès la saisie deces identifiants, de vérifier s’ils sont bons ou non. Cela évite que l’erreur n’apparaisse queplus tard, lorsqu’on s’en sert.

public function __construct()

Le constructeur ne prend aucun paramètre et ne fait rien. Il est toutefois indispensabled’instancier un nouvel objet avant d’utiliser la méthode connect.

public function connect($ftp_ip, $ftp_port, $ftp_user, $ftp_pwd)

Crée une socket vers l’adresse IP $ftp_ip sur le port $ftp_port et, à l’aide des com-mandes FTP en telnet (USER et PASS), et en analysant la réponse du serveur, valide lesidentifiants $ftp_user et $ftp_pwd.

12.4 Diff.php

La classe Default_Model_Diff implémente une fonction de diff simple comparant uneà une les lignes de deux fichiers.

Elle contient deux méthodes statiques :

public static function diff($file1, $file2, &$res, &$err)

Cette fonction calcule la différence ligne à ligne entre les fichiers $file1 et $file2, etenregistre le résultat dans le tableau $res.

Le paramètre $err est optionnel. En cas d’erreur lors de l’ouverture d’un des fichiers,une erreur enregistrée dans ce paramètre. Sinon, sa valeur est celle par défaut, soit null.

public static function xdiff($file1, $file2, &$err)

En utilisant diff, la fonction affiche le résultat de la différence des deux fichiers àl’écran à l’aide de la fonction echo.

Le paramètre $err est optionnel. En cas d’erreur lors de l’ouverture d’un des fichiers,une erreur enregistrée dans ce paramètre. Sinon, sa valeur est celle par défaut, soit null.

35

13 Pour un debuggage facile

13.1 Fichier de logs

Il est possible de garder un journal (log) des commandes (hors authentification) en-voyées au switch.

Tous les fichiers de logs se trouvent dans le dossier www/data/logs/.La journalisation est activable/desactivable grâce à la variable $log du fichier de

configuration conf.php.La “capture” des commandes, pour les mettre dans les fichiers de log, se fait au niveau

de ConnexionSwitch, car toutes les commandes envoyées au switch passent par la fonctiondoCommand.

Pour chaque création d’un objet ConnexionSwitch, un fichier de log identifié par ladate et l’heure de la création de l’objet est associé.

13.2 Fichier application.ini

Le fichier www/application/configs/application.init permet de configurer cer-tains comportements de l’application. Notamment les variablesphpSettings.display_startup_errors et phpSettings.display_errors permettentd’indiquer s’il faut afficher à l’écran les erreurs php (warnings + errors).

Remarque : Pour débugger, ces variables devront être mises à 1.

36