Teste de la connectivité de différentes IP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Teste de la connectivité de différentes IP

par Lyche » 08 janv. 2007, 09:27

mon problème principale, c'est mon patron, qui refuse d'avoir une personne seule a connaitre un langage... sinon je l'aurais fais avec autre chose que php.. En tout cas grand merci pour votre aide.

Je suis en train de regarder pour cURL, mais je galère un max en faite, je comprend pas tout. Mais ca viendra.

par Ripat » 05 janv. 2007, 18:53

+1 pour la solution script shell.

J'ai une préférence pour CURL sur wget. Dans ton cas tu pourrais facilement obtenir des statistiques sur la réactivité du site (connexion et service de la page) et sa vitesse de téléchargement. Exemple:

verif.ip.sh

Code : Tout sélectionner

#! /bin/sh FORMAT='%{http_code} %{time_total} %{time_connect} %{speed_download}' curl -o /tmp/curl.tmp -s -w "$FORMAT" $1

Code : Tout sélectionner

verif.ip.sh phpfrance.com
Va retourner quelque-chose comme:

Code : Tout sélectionner

200 0,219 0,022 67792,000
Faire man curl (option -w/--write-out) pour voir la liste de toutes les variables disponibles.

Tu peux utiliser le script de Naholyr pour faire une gestion des options. A ce sujet, il me semble qu'il y ait une petite erreur de logique dans le traitement des valeurs par défaut des options.

Code : Tout sélectionner

port=`[[ $# -ge 2 ]] && echo $2 || echo $default_port`
plutôt que

Code : Tout sélectionner

port=`[[ $# -ge 2 ]] && echo $default_port || echo $2`
Non?

PS: toutes les variables que CURL renvoie sont également dispo dans l'API de PHP -> curl_getinfo()

par naholyr » 05 janv. 2007, 15:10

Un script shell sera bien plus adapté pour aller chatouiller les IP. Tu pourras lancer 200 taches simultanées pour tes requêtes, et donc ce script donnera un résultat très rapide.

Tu peux te baser sur ce script que j'avais bidouillé l'année dernière :

Code : Tout sélectionner

#!/bin/sh # Usage : # testserver <ip> [<port> [<timeout> [<tries> [<datadirectory>]]]] # Constantes du script default_port=80 default_timeout=10 default_tries=1 default_datadir=. # Test des parametres if [ $# == 0 ]; then echo "Usage :" echo "$0 <ip> [<port> [<timeout> [<tries> [<datadir>]]]]" echo -e "\tip\tIP du serveur web a tester" echo -e "\tport\tPort du serveur web a tester (defaut: $default_port)" echo -e "\ttimeout\tDuree limite de la requete (defaut: $default_timeout)" echo -e "\ttries\tNombre d'essais (defaut: $default_tries)" echo -e "\tdatadir\tRepertoire de sauvegarde des logs (defaut: $default_datadir)" exit 1 fi # Lecture des parametres passes au script ip=$1 port=`[[ $# -ge 2 ]] && echo $default_port || echo $2` timeout=`[[ $# -ge 3 ]] && echo $default_timeout || echo $3` tries=`[[ $# -ge 4 ]] && echo $default_tries || echo $4` datadirectory=`[[ $# -ge 5 ]] && echo $default_datadir || echo $5` # Generation des parametres a passer a la commande log=$datadirectory/$ip-$port.log output=$datadirectory/$ip-$port.html url=http://$ip:$port # Contact du serveur web distant wget -T $timeout -o $log -O $output -t $tries $url # Affichage et retour (pour plus de souplesse) du code de retour de la commande retour=$? echo $retour echo $retour > $datadirectory/$ip-$port.status exit $retour

Code : Tout sélectionner

Usage : testwebserver.sh <ip> [<port> [<timeout> [<tries> [<datadir>]]]] ip IP du serveur web a tester port Port du serveur web a tester (defaut: 80) timeout Duree limite de la requete (defaut: 10) tries Nombre d'essais (defaut: 1) datadir Repertoire de sauvegarde des logs (defaut: .)
On peut aisément l'utiliser dans un crontab (qui effectue les taches en parallèle, donc on pourra contacter par exemple 200 serveurs en 1 minutes alors même qu'on est censé prendre 20 secondes par serveur inaccessible), en utilisant soit son code de retour (0 en cas de réussit, 1 en cas de serveur inaccessible) ou son affichage (idem) soit le fichier généré ("ip"-"port".status dans le dossier "datadirectory" spécifié).

Par exemple en mettant ceci dans mon crontab :

Code : Tout sélectionner

* * * * * /usr/local/bin/testwebserver.sh 192.168.1.5 * * * * * /usr/local/bin/testwebserver.sh 192.168.1.6 * * * * * /usr/local/bin/testwebserver.sh 192.168.1.7
J'ai en temps réel l'état de mes 3 serveurs web (1.5, 1.6, 1.7) à 1 minute près, en lisant le fichier /home/naholyr/192.168.1.X-80.status (qui contient 0 si OK, 1 si HS).

par fab » 05 janv. 2007, 13:31

tiens nous au courant du résultat

par Lyche » 05 janv. 2007, 09:23

ca c'est une idée qui est bonne !
Je teste ca dans la journée.

merci :)

par fab » 04 janv. 2007, 18:21

fait des recherches sur crontab pour éxécuter le script a intervalle régulier et sinon utilise en php en mode console et set_time_limit() pour dépasser cette barrière.
Le principe est donc de faire un script qui s'éxécute grace a crontab a intervalle régulier et qui génére un fichier xml par exemple que tu récupères depuis l'application web pour en exploiter les résultats

par Lyche » 04 janv. 2007, 16:46

alors pour tout t'expliquer, je suis dans une entreprise qui a son propre server UNIX. Sur ce même server une base MySQL à été implantée et a partir de cette base je dois créer un logiciel, plutot un petit programme, qui me permet soit à interval régulier, soit a chaque demande de l'utilisateur, d'exécuter un ping pour chaque IP de la base. Il y a une IP par magasin de l'entreprise soit 206 IP.

ce qui me bloque c'est les 60sec de MySQL qui passé ce délai te dis clairement, "tu prens trop de temps dégage".

Donc je voudrais pouvoir tester les 20x IP de la base de données soit en moins de 60 sec, soit de facon séparée par petits groupes de 15-20, pour éviter le délai trop long. Je m'arrache les cheveux depuis 1semaine pour ce trucs et j'ai l'impression de pas avancer :(.

Merci de vos réponses.
Lyche !

par fab » 04 janv. 2007, 16:22

Il y a peut etre une solution simple a ton probleme ? dispose tu d'un dédié pour l'hébergement?
Si oui tu peux faire tourner un script toutes les 5 minutes par exemple en mode console, ce script généré un fichier txt contenant les informations que ton appli veut exploiter. Et depuis l'appli tu récupères seulement le fichier texte

par Lyche » 04 janv. 2007, 16:19

je viens de tester ta formule. Elle marche très bien, mis à part le fait que cela me prend plus de 60sec à l'executer donc je me fait ejecter en cour de d'analyse... je trouverais bien une solution. Merci beaucoup pour ton aide.
Je ferais passer en résolu dès que j'aurais trouvé :)

par fab » 04 janv. 2007, 15:22

http://fr.php.net/manual/fr/function.passthru.php , cette fonction ne se contente pas d'éxécuter la commande mais te permet aussi te récuprer le résultat. Cependant tu risques quand même de dépasser les 60 s

Teste de la connectivité de différentes IP

par Lyche » 04 janv. 2007, 12:57

Bonjour,
Je suis en train de développer un système de monitoring sur php/flash, mais j'ai un petit problème quant-au teste de ping.

soit j'utilise la fonction exec (ping $ip etc..);
soit j'utilise la fonction fsockopen($ip, 80, $errno, $errstr, 30);

Malheureusement dans le premier cas, je me retrouve avec 200 fenêtres ping qui s'ouvrent (je dois tester, pour le moment sur 205IP) et qui se ferment immédiatement.. ce qui n'est pas spécialement agréable pour l'utilisateur. De plus, je n'arrive pas à récupérer, par cette commande, le retour qui me dit si le ping a fonctionné ou si l'ip testée n'est pas connectée.

Dans le deuxième cas.. je dois mal faire quelque chose parce qu'il m'affiche les 2 voir les 3 premiers résultats, puis me fait une érreure en me disant que ma requète à dépassé les 60sec donc il m'envoie balader.

Je n'arrive pas à trouver la formule idéale pour pinger chaque IP de ma DB et ca fait plus d'une semaine que j'y suis dessus.. dites moi que je suis nul


Code :
<?							
$ip = $row[1];
$fp = fsockopen($ip, 80, $errno, $errstr, 30);
if (!$fp)
  {
    $color = "green";
    $statut = "up";
  }
else
  {
    $color = "red";
    $statut = "down";
  }
fclose($fp);
?>
ca c'est le code que j'utilise avec la commande fsockopen. Il me renvoie une érreure comme ci dessous :


Citation:
Warning: fsockopen() [function.fsockopen]: unable to connect to xxx.xx.xx.x:80 (Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu. ) in C:\Program Files\xampp\htdocs\xampp\monitoring\recuperationIP.php on line 45


Je commence a me dire que j'ai pas fais le bon choix de langage, mais je souhaitait quelque chose de graphique grace a flash..

PS : j'ai cherché partout sur le forum, mais je ne suis pas très doué dans ce domaine la. Je n'ai absolument rien trouvé d'équivalent à mes critères.

Merci d'avance. Lyche