Partage
  • Partager sur Facebook
  • Partager sur Twitter

retour ping adresse IP Privée en PHP

site web pour montrer connexion ou non d'appareils de caisses avec IP

    14 février 2020 à 10:57:58

    Bonjour tout le monde, je suis bloqué depuis une semaine maintenant sur une problématique bien précise. Je suis en stage en tant que Dev Junior et j'ai comme mission de créer un site web qui est une sorte de moniteur de connexion de serveurs des différents magasins (je suis en stage au siège informatique de la société en question qui détient plusieurs magasins).

    Je code en PHP, et j'ai trouvé de nombreuses fonctions devant me permettre de pinger ces adresses ip privées mais je n’obtient pas de retour "OK". 

    J'ai posté ma question sur le forum PHP mais on m'a dit d'essayer de venir prendre de l'aide sur la partie réseau. Pour schématiser en gros ma page function.php doit me donner un résultat comme ceci -->

    Sauf que pour l'instant lorsque je mets les adresses IP des magasins en questions cela m'affiche hors ligne, hors en testant l'invité de commande avec la commande Windows ping IP ca fonctionne très bien.

    Si quelqu'un s'y connait bien à la fois en réseau et en PHP je suis preneur merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2020 à 16:44:25

      Bonjour,

      Sans code difficile de dire quoi que ce soit.

      C'est des paquets ICMP echo request que tu envoies? Directement avec des sockets en PHP (https://www.php.net/manual/en/book.sockets.php) ou avec des appels systèmes?

      Es-tu sur que tu es autorisé à réaliser ce type d'opération?

      EDIT: j'ai repris le code de ton sujet sur le fofo PHP et je l'ai adapté à ma sauce (Linux avec postgresql), j'ai un code tout à fait fonctionnel:

      <?php
      	$host		= "host = 127.0.0.1";
      	$port		= "port = 5432";
      	$dbname		= "dbname = testdb";
      	$credentials	= "user = test password=test";
      
      	$db	= pg_connect( "$host $port $dbname $credentials" );
      
      	if(!$db) {
      		echo "Error : Unable to open database\n";
      	} else {
      		echo "Opened database successfully\n";
      	}
      
      	$sql =<<<EOF
      		SELECT * FROM magasins;
      EOF;
      
          	$ret = pg_query($db, $sql);
      	if(!$ret) {
      		echo pg_last_error($db);
      		exit;
      	}
          	while($row = pg_fetch_row($ret)) {
      ?>
                                      <tr>
                                          <td><?php echo $row[0]; ?></td>
                                          <td><?php echo $row[1]; ?></td>
      <?php
              exec("ping -c 1 ". $row[1], $output, $status);
      	if($status == 0) {
      		$message = "OUI";
      	} else {
      		$message = "NON";
      	}
      ?>
                                          <td><span style="color: red; font-weight: bold;"><?php echo $message; ?></span></td>
                                      </tr>
      <?php
      	}
      	pg_close($db);
      ?>
                                  </tbody>
                              </table>
                          </div>
                      </div>
                  </div>
              </div>
          </body>
      </html>

      Note que j'utilise le code de retour de la commande ping plutôt que sa sortie. C'est beaucoup plus fiable que de parser la sortie.

      Et ma table magasins ressemble à ça

      testdb=# SELECT * FROM magasins;
       nom_mag |     addr_ip     
      ---------+-----------------
       mag1    | 8.8.8.8
       mag2    | 127.0.0.1
       mag3    | 1.1.1.1
       mag4    | 192.168.255.254
      (4 rows)
      

      -
      Edité par KoaTao 16 février 2020 à 14:55:29

      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2020 à 17:06:56

        Merci beaucoup KaoTao pour ta réponse, en fait avant de reprendre mon code avec ma table SQL, je voulais tester avec la page function.php séparément.

        Apparemment j'ai essayé avec des adresses IP des collègues et ca a l'air de fonctionner, seulement j'ai l'impression qu'il y a un petit soucie avec le refresh, ca reste vert continuellement... En fait j'ai l'impression qu'il suffit que je mette le port 80 pour que cela passe en ligne...

        Voici le code de ma page function.php:

        <?php
        
        $ipmagasin1= "ip1";
        $portmagasin1 = "80";
        $ipgmagasin2 = "ip2";
        $portmagasin2 = "80";
        $ipgmagasin3 = "ip3";
        $portmagasin3 = "80";
        $ipgmagasin4 = "ip4";
        $portmagasin4 = "80";
        
        function magasin1($ip, $port)
        {
            error_reporting(0);
            $test = fsockopen($host, $port, $errno, $errstr, 3);
            if (!$test) {
                echo "<b style=\"color:red\">Hors Ligne</b>";
            } else {
                echo "<b style=\"color:green\">En Ligne</b>";
            }
        }
          function magasin2($ipgmod, $portgmod)
          {
              error_reporting(0);
              $sock = fsockopen("udp://".$ipgmod, $portgmod, $num, $error, 3);
              if (!$sock) {
                  echo("<b style=\"color:red;\">Hors Ligne</b>");
              }
              if ($sock) {
                  echo("<b style=\"color:green;\">En Ligne</b>");
                  fclose($sock);
              }
          }
          function magasin3($ipgmod, $portgmod)
          {
              error_reporting(0);
              $sock = fsockopen("udp://".$ipgmod, $portgmod, $num, $error, 3);
              if (!$sock) {
                  echo("<b style=\"color:red;\">Hors Ligne</b>");
              }
              if ($sock) {
                  echo("<b style=\"color:green;\">En Ligne</b>");
                  fclose($sock);
              }
          }
          function magasin4($ipgmod, $portgmod)
          {
              error_reporting(0);
              $sock = fsockopen("udp://".$ipgmod, $portgmod, $num, $error, 3);
              if (!$sock) {
                  echo("<b style=\"color:red;\">Hors Ligne</b>");
              }
              if ($sock) {
                  echo("<b style=\"color:green;\">En Ligne</b>");
                  fclose($sock);
              }
          }
        
        echo 'Heure du test : ',date('d/m/Y H:i:s'),'<br />';
        echo 'Status connexion magasin1 : ',magasin1($ipmagasin1, $portmagasin1),'<hr/>';
        echo 'Status connexion magasin2 : ',magasin2($ipmagasin2, $portmagasin2),'<hr/>';
        echo 'Status connexion magasin3 : ',magasin3($ipmagasin3 ,$portmagasin3),'<hr/>';
        echo 'Status connexion magasin4 : ',magasin4($ipmagasin4, $portmagasin4),'<hr/>';
        
        function console_log( $data ){
          echo '<script>';
          echo 'console.log('. json_encode( $data ) .')';
          echo '</script>';
        } 
        
        ?>

        Et voici le résultat de ce code:

        Si quelqu'un peut m'aider dessus, je vais essayer de reprendre ta logique Kaotao pour ma page index.php, concernant l'autorisation oui en principe depuis mon poste je peux pinger les serveurs des magasins.

        -
        Edité par Seijuro94 17 février 2020 à 17:07:58

        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2020 à 19:30:59

          Du peu que je comprends (j'ai du mal à comprendre pourquoi il y a 4 fois la même fonction avec 4 nom différent) , tu ouvres une connexion UDP vers tes machines (sur le port 80**) accessible dans ton code via un pointeur de fichier.

          Puis tu test si cette connexion est bien ouverte (via le pointeur de fichier), puis tu refermes tout ça.

          J'ai l'impression que si tu es autorisé à ouvrir des connexions, ce code fonctionnera toujours. UDP fonctionne en mode non-connecté, Si tu envoies aucune données, rien ne se passe (et donc rien pour empêcher ou refermer prématurément le stream).

          **Le port 80 est choisi au hasard? Ou est-ce qu'il y a un service en écoute en UDP sur le port 80?

          Avec quel protocole veux/dois-tu vérifier la disponibilité? UDP/TCP/ICMP? Est-ce qu'il y a des restrictions particulière (pare-feu par exemple) au niveau du serveur ou des machine «magasin»?

          Il faudrait mettre ça au clair.

          • Partager sur Facebook
          • Partager sur Twitter
            18 février 2020 à 12:01:03

            Non le port 80 n'est pas choisi au hasard, étant donné que c'est le port sur lequel je code (en localhost). J'en ai discuté avec un directeur technique, il m'a dit d'essayer avec le protocole ICMP en commençant par les pc des collègues.

            J'ai trouvé un script PHP pour tester les retours de ping sur les pc des collègues, avec du FSOCKOPEN, il me semble qu'il s'agit du protocole ICMP.

            <!DOCTYPE html>
            <html>
            <head>
            	<title>Ping via fsocken()</title>
            	<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
            </head>
            <body>
            	<?php
            	function ping($host, $port=80, $timeout=6)
            	{
            	$fsock = fsockopen($host, $port, $errno, $errstr, $timeout);
            	if (! $fsock) {
            		return FALSE;
            	} else {
            		return TRUE;
            		}
            	}
            
            	$host = 'ici l'adresse ip du collègue';
            	$up = ping($host);
            
            	$faClass = ($up) ? 'fa-check-square-o' : 'fa-square-o';
            	echo sprintf('<i class="fa %s"></i> %s', $faClass, $host);
            
            	?>
            </body>
            </html>

            lorsque je mets l'adress ip de collègue, donc quand le retour est TRUE je dois obtenir ce résultat:

            sauf que lorsque je met l'adresse ip d'un collègue (j'ai le même message pour les ip des magasins), j'ai la case non cochée et en plus j'ai ce message d'erreur qui s'affiche:

            Est-ce que je dois faire une demande spécifique auprès de l'admin réseau pour autoriser ces pings? Autre chose mon script est-il pertinent? Si non quelqu'un pourrait me refiler un script PHP test PÏNG pertinent svp si possible avec le protocole ICMP.

            Merci encore KoaToa pour ta réponse, et désolé si je galère mais bon il faut bien commencer un jour ^^

            • Partager sur Facebook
            • Partager sur Twitter
              18 février 2020 à 13:23:26

              Le problème c'est que tu fais un ping avec le protocole TCP (couche 4: transport) et non avec ICMP (couche 3: réseau). Il n'y a pas de notion de port avec ICMP donc.

              Si il n'y a aucun pare-feu ou quoique ce soit et aucun service en écoute sur le port spécifié, la connexion est fermé directement par l'hôte (RST. ACK à ton SYN probablement). TCP à la différence d'UDP est un protocole en mode connecté, il faut donc établir la liaison entre le client et le serveur avant de pouvoir faire quoique ce soit.

              Tu ne pourras pas utiliser ICMP avec fsockopen d'après la doc: https://www.php.net/manual/fr/transports.inet.php.

              Si il n'existe pas de fonction qui le font pour toi en PHP, il va falloir forger un paquet ICMP echo request. Je pense qu'une recherche sur internet devrait te donner des solutions pour le faire en PHP. Ou alors retourner vers l'option commande système avec exec(ping) ou system(ping).

              Je te conseille d'apprendre comment fonctionnent basiquement la pile TCP/IP et ICMP.

              • Partager sur Facebook
              • Partager sur Twitter
                19 février 2020 à 11:11:37

                Bonjour tout le monde.

                Merci pour ta réponse KoaTao

                Quel serait le meilleur protocole à utiliser dans mon cas précis? ICMP?

                Je passe mon temps à faire des recherches google sur des scripts ICMP pour PHP et je ne trouve rien de concluant pour l'instant.

                Sinon est-ce qu'il y aurait une solution plus simple afin de contourner ce problème? Par exemple une fonction PHP qui permet de déterminer si un serveur est allumé ou pas...

                Merci de votre gentillesse tout le monde ^^

                • Partager sur Facebook
                • Partager sur Twitter
                  19 février 2020 à 13:28:43

                  Seijuro94 a écrit:

                  J'en ai discuté avec un directeur technique, il m'a dit d'essayer avec le protocole ICMP en commençant par les pc des collègues.

                  Reste sur ICMP. Si il y a un service particulier en écoute en TCP sur les machines dont tu dois tester la dispo, tu pourrais faire un ping en TCP je dirais.

                  https://www.php.net/manual/fr/function.socket-create.php : il y a plusieurs implémentation d'un ping sur cette page, dont une assez complète. Par contre, ces scripts sont soumis à certaines restrictions pour la création de socket.

                  KoaTao a écrit:

                  Ou alors retourner vers l'option commande système avec exec(ping) ou system(ping).

                  EDIT :

                  Je n'y avais pas pensé tout de suite, mais il existe aussi le protocole SNMP (pour lequel PHP propose une extension : https://www.php.net/manual/en/book.snmp.php) mais il faut que ce soit pris en charge par les machines dont tu souhaites tester la dispo.

                  Le mieux est de rester sur les recommandations du directeur technique.

                  -
                  Edité par KoaTao 20 février 2020 à 13:55:33

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 février 2020 à 9:38:33

                    Hello tout le monde, merci KoaTao pou tes retours. Le truk c'est que je ne vois pas quoi utiliser parmi toutes les fonctions sockets, je suis un peu perdu... Je me renseigne sur google, je vois qu'il y a des scripts "traceroute" mais bon incompréhensibles pour moi, et la DSI a envie de quelque chose de très simple (et moi aussi d'ailleurs ^^).

                    Est-ce qu'il y a besoin que je me forme sur la programmation réseau avec les sockets... Pour l'implémentation du ping je ne vois pas de quel script tu parles en particulier? (ton lien m'affiche toute la liste des fonctions sockets).

                    Je ne pensais pas qu’exécuter un ping serait si compliqué, je bloque complètement XD.

                    Je viens de discuter avec l'Admin Reseau, en gros est-ce qu'il y a moyen de configurer Apache pour rentrer dans le même tunnel VPN ou tout simplement renseigner nos IP ou le DNS pour pouvoir pinger directement les ip routeurs des magasins? 

                    Merci encore pour votre gentillesse!

                    -
                    Edité par Seijuro94 21 février 2020 à 10:11:07

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 février 2020 à 10:56:55

                      Seijuro94 a écrit:

                      Hello tout le monde, merci KoaTao pou tes retours. Le truk c'est que je ne vois pas quoi utiliser parmi toutes les fonctions sockets, je suis un peu perdu... Je me renseigne sur google, je vois qu'il y a des scripts "traceroute" mais bon incompréhensibles pour moi, et la DSI a envie de quelque chose de très simple (et moi aussi d'ailleurs ^^).

                      Est-ce qu'il y a besoin que je me forme sur la programmation réseau avec les sockets... Pour l'implémentation du ping je ne vois pas de quel script tu parles en particulier? (ton lien m'affiche toute la liste des fonctions sockets).

                      Je ne pensais pas qu’exécuter un ping serait si compliqué, je bloque complètement XD.

                      Ah mince, le lien ne redirige pas vers la bonne page, dans la page pour socket_create() tu as une implémentation du ping proposée : https://www.php.net/manual/fr/function.socket-create.php#80775.

                      Mais pourquoi ne pas utiliser ça comme au départ: https://www.php.net/manual/en/book.exec.php. On ne peut pas plus simple.

                      Seijuro94 a écrit:

                      Je viens de discuter avec l'Admin Reseau, en gros est-ce qu'il y a moyen de configurer Apache pour rentrer dans le même tunnel VPN ou tout simplement renseigner nos IP ou le DNS pour pouvoir pinger directement les ip routeurs des magasins?

                      Je suis désolé, mais je ne comprend pas trop la question. Et n'est-ce pas à l'admin sys/réseau de trouver des solutions pour tout ce qui est config sys/réseau?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 février 2020 à 13:58:12

                        Merci pour ton retour Koatao, en fait pour ma question je me demandais s'il était possible de rentrer l'IP de mon pc sur WAMP SERVER, qui fait partie du réseau local de la boîte, est-ce que ça pourrait m'aider dans ce que je veux faire? Dans le sens où si je code depuis mon ip (celle que j'obtiens en faisant un ipconfig depuis l'invit de commande) au lieu du 127.0.0.0 ça pourrait m'aider à pinger les routeurs des magasins ou rien à voir lol?

                        C'est juste une idée comme ça qui m'est venu en parlant avec l'admin réseau, mais je ne suis pas sûr du tout lol. Qu'est-ce que tu en penses?

                        Merci encore pour tout KoaTao.

                        -
                        Edité par Seijuro94 21 février 2020 à 14:34:30

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 février 2020 à 15:20:00

                          Pardon, mais je ne comprends vraiment pas l'idée.

                          De toute façon, c'est assez clair ce que tu dois faire:

                          - écrire une fonction ping() (en créant un socket ou en faisant un appel à une commande du système).

                          - Récupérer/extraire les données nécessaires (depuis une BDD ou autre).

                          - Faire tes tests de dispo.

                          - Afficher le résultat  sur une page web.

                          Fais déjà ça. Comme ton directeur te l'a dit, tu peux tester sur ton réseau local en utilisant les adresses IP des machines des collègues.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 février 2020 à 15:29:34

                            Concernant la fonction exec j'ai essayé de reprendre les éléments de ton code pour les adapter à ma DB, est-ce que tu pourrais me renvoyer un code juste avec l'ip de google (pas de DB stp) pour voir ce qui cloche chez moi, je vais voir avec un echo $status (reprenant ton code) pour vérifier ce qu'il m'affiche.

                            Parce qu’apparemment si ca fonctionne sur mon invit de commande, il n'y a pas de raisons que ca ne devrait pas marcher sur le fichier php. Et je viens d'avoir un autre son de cloche, si mon pc est sur le même réseau et c'est le cas, je n'ai pas besoin d'ICMP apparement, ton code de départ exec devrait suffire.

                            Merci et bon Week-end à toi.

                            -
                            Edité par Seijuro94 21 février 2020 à 16:28:06

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 février 2020 à 16:49:50

                              Attention (si tu n'as pas déjà remarqué), la commande ping dans mon script, c'est une commande Linux, il faut utiliser les arguments équivalents pour Windows.

                              La commande ping utilise justement ICMP.

                              Si ton code t'affiche OUI pour l'adresse IP 127.0.0.1. alors il fonctionne correctement.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              retour ping adresse IP Privée en PHP

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              • Editeur
                              • Markdown