Classe de gestion d'interface réseaux

Soyez le premier à donner votre avis sur cette source.

Vue 5 873 fois - Téléchargée 1 085 fois

Description

Bonjour à tous,

C'est la première source que je partage.

Il s'agit d'une classe qui permet de récupérer les paramètres réseau du SERVEUR (IP, netmask, gateway, etc.) et de les modifier.

Elle ne fonctionne qu'avec Windows pour le moment. Elle a encore besoin d'être améliorée, notament au niveau des problèmes de charset dans la réponse de la fonction "exec()", et au niveau de la méthode de parsing de cette réponse, que je trouve au peu "bourrin".
Donc je compte beaucoup sur vos remarques.

Le fichier index.php ne sert qu'aux tests.

Enjoy :-)

Edit :
Compatible Linux en lecture seulement car je n'ai pas encore trouvé comment donner les droits d'exécution à apache.

Source / Exemple :


<?php
/**

  • class NetworkInterface
  • @author Madislak <madislak@yahoo;fr>
  • @version 20090218
  • @licence : GPL
  • /
class networkManager { var $os; public static $netshOutput; public static $ifconfigaOutput; public static $ifconfigOutput; public function __construct($status=""){ /* Detection de l'OS */ if(eregi("win",$_SERVER["SERVER_SOFTWARE"],$result)) $this->os = "windows"; else $this->os = "linux"; if($this->os=="windows") { $this->netshOutput = array(); try{ exec('netsh interface show interface',$this->netshOutput); } catch (Exception $e) { } // Affiche la liste des interfaces reseau sous Windows } else { $this->ifconfigaOutput = array(); try{ exec('ifconfig -a | grep eth',$this->ifconfigaOutput); } catch (Exception $e) { } // Affiche la liste des interfaces reseau sous Linux $this->ifconfigOutput = array(); try{ exec('ifconfig | grep eth',$this->ifconfigOutput); } catch (Exception $e) { } // Affiche la liste des interfaces reseau actives sous Linux } } function getNetworkInterfaces(){ $interfaces = array(); /* Detection de toutes les interfaces reseau de la machine */ if($this->os=="windows") { $nb_lines = sizeof($this->netshOutput); for($i=3; $i<$nb_lines; $i++){ $infos = preg_split("/\s{2,}/", $this->netshOutput[$i]); // Parsing de la reponse if($infos[3]!="") $interfaces[] = $infos[3]; // Ajout d'une nouvelle interface } } else { $interfaces = array(); $nb_lines = sizeof($this->ifconfigaOutput); for($i=0; $i<$nb_lines; $i++){ if(eregi("eth[0-9]",$this->ifconfigaOutput[$i],$result)){ // Parsing de la reponse if($result[0]!="") $interfaces[] = $result[0]; // Ajout d'une nouvelle interface } } } sort($interfaces); return $interfaces; } } class NetworkInterface { var $os; var $name; var $status; var $mac_address; var $ip_address; var $ip_address_v6; var $netmask; var $gateway; var $dns1; var $dns2; var $is_dhcp; var $description; var $language; public function __construct($name){ $this->name = $name; $this->language = "fr"; $this->ip_address = "0.0.0.0"; $this->netmask = "0.0.0.0"; $this->gateway = "0.0.0.0"; $this->dns1 = "0.0.0.0"; $this->dns2 = "0.0.0.0"; /* Detection de l'OS */ if(eregi("win",$_SERVER["SERVER_SOFTWARE"],$result)) $this->os = "windows"; else $this->os = "linux"; /* Detection du status de l'interface : Activee/Desactivee, Connectee/deconnectee */ if($this->os=="windows"){ $output = array(); try{ exec('netsh interface show interface',$output); } catch (Exception $e) { return false; } // Affiche la liste des interfaces reseau sous Windows $nb_lines = sizeof($output); for($i=3; $i<$nb_lines; $i++){ $infos = preg_split("/\s{2,}/", $output[$i]); if($infos[3]==$this->name){ if($infos[1]=="Connect?") $this->status = 2; // Manque gestion charset else if($infos[0]=="Activ?" && $infos[1]=="D?connect?") $this->status = 1; // Manque gestion charset else $this->status = 0; } } } else { $output = array(); try{ exec('ifconfig | grep eth',$output); } catch (Exception $e) { return false; } // Affiche la liste des interfaces reseau actives sous Linux $nb_lines = sizeof($output); for($i=0; $i<$nb_lines; $i++){ $this->status = 0; if(eregi("eth[0-9]",$output[$i],$result) && $result[0]==$this->name) $this->status = 2; } } /* Detection des parametres de l'interface : */ if($this->os=="windows" && $this->status==2){ $output = array(); $write = false; // Active ou pas l'ecriture des parametres $previous_line_empty = false; // Indique si la ligne precedente est vide, cad s'il s'agit d'une nouvelle interface try{ exec("ipconfig /all",$output); } catch (Exception $e) { return false; } // Affiche les parametres IP sous Windows $nb_lines = sizeof($output); for($i=0; $i<$nb_lines; $i++){ /* On parcourt le resultat de la commande. On active l'écriture en arrivant a la partie concernant l'interface et on la desactice en arrivant a l'interface suivante */ if((eregi("Carte Ethernet",$output[$i],$result)||eregi("Carte r?seau sans fil",$output[$i],$result)) && $previous_line_empty && eregi($this->name,$output[$i],$result)) $write = true; else if(eregi("Carte",$output[$i],$result) && $previous_line_empty && $write) $write = false; /* Detection de la description hardware de l'interface */ if(eregi("Description",$output[$i],$result) && $write) { $tmp = explode(":",str_replace(" : ",":",$output[$i])); $this->description = $tmp[1]; } /* Detection de l'adresse MAC de l'interface */ if(eregi("Adresse physique",$output[$i],$result) && $write) { preg_match("/([0-9A-F]*\-[0-9A-F]*\-[0-9A-F]*\-[0-9A-F]*\-[0-9A-F]*\-[0-9A-F]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->mac_address = str_replace("-",":",$matches[0][0]); } /* Detection du mode de l'interface : statique ou DHCP*/ if(eregi("DHCP activ?",$output[$i],$result) && $write) { if(eregi("Oui",$output[$i], $matches)) $this->is_dhcp = 1; else $this->is_dhcp = 0; } /* Detection de l'adresse IPv4 de l'interface */ if(eregi("IPv4",$output[$i],$result) && $write) { preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->ip_address = $matches[0][0]; } /* Detection de l'adresse IPv6 de l'interface */ if(eregi("IPv6",$output[$i],$result)) { preg_match("/([0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->ip_address_v6 = $matches[0][0]; } /* Detection du masque de sous-reseaux de l'interface */ if(eregi("Masque",$output[$i],$result) && $write) { preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->netmask = $matches[0][0]; } /* Detection de la passerelle par defaut de l'interface */ if(eregi("Passerelle",$output[$i],$result) && $write) { preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->gateway = $matches[0][0]; } /* Detection des serveurs DNS de l'interface */ if(eregi("Serveurs DNS",$output[$i],$result) && $write) { preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->dns1 = $matches[0][0]; preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[($i+1)], $matches, PREG_OFFSET_CAPTURE, 3); $this->dns2 = $matches[0][0]; } if($output[$i]=="") $previous_line_empty = true; else $previous_line_empty = false; } } else if($this->status==2){ $output = array(); $write = true; // Active ou pas l'ecriture des parametres try{ exec("ifconfig -a ".$this->name,$output); } catch (Exception $e) { return false; } // Affiche les parametres IP sous Linux $nb_lines = sizeof($output); for($i=0; $i<$nb_lines; $i++){ /* Detection de l'adresse MAC de l'interface */ if(eregi("HWaddr",$output[$i],$result) && $write) { preg_match("/([0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->mac_address = str_replace("-",":",$matches[0][0]); } /* Detection de l'adresse IPv4 de l'interface */ if(eregi("inet addr",$output[$i],$result) && $write) { preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->ip_address = $matches[0][0]; } /* Detection de l'adresse IPv6 de l'interface */ if(eregi("inet6 addr",$output[$i],$result)) { preg_match("/([0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*\:[0-9A-F]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->ip_address_v6 = $matches[0][0]; } /* Detection du masque de sous-reseaux de l'interface */ if(eregi("Mask",$output[$i],$result) && $write) { preg_match_all("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[$i], $matches, PREG_OFFSET_CAPTURE, 3); $this->netmask = $matches[0][2][0]; } } /* Detection de la description hardware de l'interface */ $output = array(); try{ exec("cat /etc/sysconfig/network-scripts/ifcfg-".$this->name." | grep \"#\"",$output); } catch (Exception $e) { return false; } // Affiche la liste des DNS sous Linux $this->description = str_replace("# ","",$output[0]); /* Detection du mode de l'interface : statique ou DHCP*/ $output = array(); try{ exec("cat /etc/sysconfig/network-scripts/ifcfg-".$this->name." | grep BOOTPROTO",$output); } catch (Exception $e) { return false; } // Affiche la liste des DNS sous Linux if(eregi("dhcp",$output[0], $matches)) $this->is_dhcp = 1; else $this->is_dhcp = 0; /* Detection des serveurs DNS de l'interface */ $output = array(); try{ exec("cat /etc/resolv.conf | grep nameserver",$output); } catch (Exception $e) { return false; } // Affiche la liste des DNS sous Linux preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[1], $matches, PREG_OFFSET_CAPTURE, 3); $this->dns1 = $matches[0][0]; preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[2], $matches, PREG_OFFSET_CAPTURE, 3); $this->dns2 = $matches[1][0]; /* Detection de la passerelle par defaut de l'interface */ $output = array(); try{ exec("route | grep default | grep ".$this->name,$output); } catch (Exception $e) { return false; } // Affiche la liste des DNS sous Linux preg_match("/([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)/", $output[0], $matches, PREG_OFFSET_CAPTURE, 3); $this->gateway = $matches[0][0]; } // Petite bidouille de charset pour Windows en francais if($this->language=="fr" && $this->os=="windows") $this->name = str_replace("?","é",$this->name); } function getName(){ return $this->name; } function getStatus(){ return $this->status; } // 0: desactivee, 1: deconnectee, 2: connectee function getMacAddress(){ return $this->mac_address; } function getIPv4(){ return $this->ip_address; } function getIPv6(){ return $this->ip_address_v6; } function getNetmask(){ return $this->netmask; } function getGateway(){ return $this->gateway; } function getDNS(){ return $this->dns1; } function getDNS2(){ return $this->dns2; } function getDHCPmode(){ return $this->is_dhcp; } // 0: static mode, 1: DHCP mode function getDescription(){ return $this->description; } function setIPv4($value){ $this->ip_address = $value; } function setIPv6($value){ $this->ip_address_v6 = $value; } function setNetmask($value){ $this->netmask = $value; } function setGateway($value){ $this->gateway = $value; } function setDNS($value){ $this->dns1 = $value; } function setDNS2($value){ $this->dns2 = $value; } function activate() { if($this->os=="windows") try{ exec('netsh interface set interface name="'.$this->name.'" admin=ENABLE',$output); } catch (Exception $e) { return array(); } else try{ exec('ifup '.$this->name,$output); } catch (Exception $e) { return 0; } if($output[0]=="") return 1; else return 0; } function desactivate() { if($this->os=="windows") try{ exec('netsh interface set interface name="'.$this->name.'" admin=DISABLE',$output); } catch (Exception $e) { return array(); } else try{ exec('ifdown '.$this->name,$output); } catch (Exception $e) { return 0; } if($output[0]=="") return 1; else return 0; } function setDHCP() { if($this->os=="windows") { try{ exec('netsh interface ip set address "'.$this->name.'" dhcp',$output); } catch (Exception $e) { return array(); } try{ exec('netsh interface ip set dns "'.$this->name.'" dhcp',$output); } catch (Exception $e) { return array(); } } else try{ exec('dhclient '.$this->name,$output); } catch (Exception $e) { return 0; } if($output[0]=="") { $this->is_dhcp = 1; return 1; } else return 0; } function setStatic($ip_address="",$netmask="",$gateway="",$dns="") { if($ip_address=="") $ip_address = $this->ip_address; if($netmask=="") $netmask = $this->netmask; if($gateway=="") $gateway = $this->gateway; if($dns=="") $dns = $this->dns1; if($ip_address=="") return 0; if($this->os=="windows") { try{ exec('netsh interface ip set address "'.$this->name.'" static '.$ip_address.' '.$netmask.' '.$gateway.' 1',$output); } catch (Exception $e) { return 0; } try{ exec('netsh interface ip set dns "'.$this->name.'" static '.$dns.'',$output); } catch (Exception $e) { return 0; } } else { try{ exec('ifconfig '.$this->name.' inet '.$ip_address.' netmask '.$netmask,$output); } catch (Exception $e) { return 0; } try{ exec('route add default gw '.$gateway,$output); } catch (Exception $e) { return 0; } } if($output[0]=="") { $this->is_dhcp = 0; return 1; } else return 0; } } ?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

1) C'est bien codé, mais juste une petite remarque de détail:

if($this->os=="windows") {

Tu peux aussi coder :
if( "windows" == $this->os) {

ça t'évitera des warnings inutiles si $this->os n'est pas définie

2) A propos de ton edit : Compatible Linux en lecture seulement car je n'ai pas encore trouvé comment donner les droits d'exécution à apache.

Il est FORTEMENT déconseillé - par seulement par moi :-) - de donner les droits root au user Apache (il s'appelle en général "guest", "nobody" ou "www", l'affectation des droits s'effectue via un "visudo" sous Nux). Sans quoi tu ouvres la porte à tous les délires possibles. Plutôt dangereux comme approche.

C'est bien codé, mais tous cela s'effectue aussi très bien en shell sous Nux avec la maîtrise de la sécurité. Donc à part pour une utilisation Windows sur les distri type Easyphp ou Wamp, je ne vois pas trop l'intérêt.

J'ai peut être loupé qq chose ..

3) Tu devrais préciser aussi que ta POO est destinée à PHP5. ça ne marchera tel quel pas en PHP4

A+
Messages postés
202
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019

Les "short tags" sont une nuisance dans le cas où un serveur héberge plusieurs moteurs de scripts: un même source doit alors être traité en plusieurs étapes, la sortie de PHP pouvant apsser par un filtre suivant (ou bien l'inverse aussi, selon l'extension donée au fichier source qui associé généralement le type du premier filtre utilisé).
Certaines de ces instructions de traitement (processing instructions) peuvent être nécessaires pour être compatibles avec des filtres XML, ou SSI par exemple, PHP le script PHP n'étant qu'une des mailles de la suite générale des traitements.
D'une façon générale, les tags plus explicites permettent aussi une identification plus sûre du contenu, surtut quand un source n'est plus lui-même associé à un nom avec une extension mais incorporé au sein d'un autre langage ou protocole de transport n'indiquant pas le type de fichier ni son nom.
C'est une bonne pratique de toute façon d'utiliser "<?php" et non "<?" seul qui reste ambigu.

Note: la non reconnaissance des short tags ne concerne pas QUE les vieilles versions de serveurs (d'aileurs ta remarque à propos d'IIS est inappropriée car IIS n'a pas de support de PHP par défaut, et IIS a toujours cette contrainte nécessitant un label pour associer le filtre correct devant traiter le script; et quel que soit l'age d'IIS, on a toujours eu la possibilité d'utiliser l'association de fichier pour désigner le premier filtre). Enfin même PHP lui-même, dans ses versions les plus récentes, peut encore être configuré pour ne PAS autoriser les short tags (l'option de configuration est présente depuis longtemps). La désactivation des shorttags est en fait bien plus souvent faite sur des serveurs Apache qu'IIS, Apache étant largement plus présent pour les serveurs pour le Web public qu'IIS utilisé principalement pour des Intranet et quelques applications métier ou pour des services d'administration locaux de Windows (qui de toute façon se fait plutôt avec des pages ASP, voire JSP, et pratiquement jamais avec PHP, pour des raisons de sécurité où le nombre de moteurs de scripts à maintenir est réduit au strict minimum, le tag "<?" étant alors utilisé pour désigner ce seul moteur de script autorisé et sans aucun chaînage vers un autre moteur ou filtre, toutes les autres PI comme "<?xml" étant passés en transparence complète dans le résultat, ou son contenu totalement filtré si le label de l'extension PI n'est pas explicitement déclaré et autorisé).

C'est donc bien "<?" qui est obsolète et vraiment trop vieux (et partiellement supporté encore, s'il n'est pas tout bonnement supprimé dans une version ultérieure en tant que nuisance) alors que "<?php" est hautement recommandé depuis maintenant longtemps et s'est imposé depuis des années (et sur certains serveurs partagés, l'option désactivant les shorttags est configurée mais pas modifiable du tout), avec un coût vraiment minime (3 caractères, est-ce que ça tue un source?).

Note: on trouve aussi "<?php5" et "<?php4" pour désigner la version de PHP à utiliser (PHP pouvant être lui-même configuré pour indiquer le label qu'il reconnaitra et ceux qu'il ignorera. Un filtre SSI d'Apache peut alors être configuré pour exécuter la bonne version en fonction des PI qu'il trouve dans un source. On trouve aussi "<?perl", "<?SSI", "<?asp", "<?xml", "<?python", etc... et il existe dans PHP des extensions permettant d'utiliser des sous-filtres en amont ou en aval de traitement, ou pour reprendre le traitement du résultat produit après un filtre intermédiaire (qui peut lui-même générer un script PHP dans son résultat, ou retourner des résultats dans divers autres formats indiqués par la signature du label PI en tête du fichier qu'ils produisent.) J'ai même vu "<?text" pour indiquer que toute la suite est du texte brut qui ne doit pas être parsé mais transmis en transparence complète (en ignorant toute présence d'un autre "<?" dedans ou "?>" qui ne doit pas autoriser la reprise de l'analyse lexico-syntaxique.)
Utilisateur anonyme
Voila c'est compatible Linux :-)
Par contre ça ne marche que si apache a les droits root pour les commandes concernées.

J'ai mis le resultat des commandes netsh, etc dans des variables publiques pour ne pas avoir à réexécuter les commandes à chaque fois comme le conseillais aKheNathOn, mais je n'arrive pas à les réutiliser dans l'autre classe (enfin bon j'ai pas cherché très longtemps non plus, donc je ferais ptet une autre MaJ plus tard).

J'ai mis des <?php partout dans le index pour vous faire plaisir ;-)
Vous avez raison sur ce point, mais sans vouloir relancer le débat, d'un autre côté je ne connais aucun serveur qui n'accepte pas les shorts tags, à part peut être les vielles versions d'IIS.
Messages postés
202
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019

Mettre un "?>" à la fin c'est une syntaxe équivalent à écrire un write() supplémentaire (dont la fin de chaine serait délimitée par "<?php" ou la fin de fichier).

Il n'y a qu'au début du fichier où on peut garder un "<?php" qui met fin à l'instruction write() implicite (qui n'est éliminée QUE s'il n'y a strictement rien avant).

Le problème du "?>" à la fin est qu'il peut trop facilement y avoir des blancs et sauts de lignes après (parfois ajoutés involontairemet dans les éditeurs par simpel navigation avec les flèches, et que les éditeurs de texte ne suppriment pas non plus automatiquement), et donc cette suite ne sera pas vide et compilera une instruction write() indésirable (qui plantera tout appel ultérieur à header() par exemple)...
Messages postés
276
Date d'inscription
dimanche 22 juillet 2001
Statut
Modérateur
Dernière intervention
5 décembre 2013

sympa l'optimisation, je la connaissait pas celle-la :)
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.