Classe de gestion d'interface réseaux

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

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.