Filtrer un string

Charlie
Filtrer un string

Bonjour,
j'ai fait un script qui ping un IP et me donne les résultats du
ping à l'aide de la command print bien entendu.

Mais voilà, je voudrais être en mesure de filtré comme ds ce
cas ci, 100% lost pour les compiler avec
mes autres stats pour en faire une moyenne. (ex je ping 5 ip et je veux faire une moyenne des packets perdus (100+66/2) que me suggérez-vous ?

voici le print ds mon idle:

Pinging 10.2.3.6 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.

Ping statistics for 10.2.3.6:
Packets: Sent = 3, Received = 0, Lost = 3 (100% loss)
----------------------------------------------------------------------------------

Pinging 10.2.3.6 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 10.2.3.6:
Packets: Sent = 3, Received = 2, Lost = 1 (66% loss),

fredericmazue

Je pense que tu pourras atteindre ton but en filtrant les chaînes à coup d'expressions régulières.
Vois les fonctionnalités exposées par le module "re" de ton Python

Charlie
Filtrer un string - débutant

Bonjour fredericmazue,

atteindre ton but en filtrant les chaînes à coup d'expressions régulières.
Vois les fonctionnalités exposées par le module "re

Bien entendu, étant débutant en la matière, j'ai essayé plusieurs tutos; dive into python, et des quick ref card etc... mais en vain ca me semble assez difficile comme tâche, python n'a pas beaucoup d'exemple qui pourrait m'éclairer vraiment. Tu aurais une suggestion de syntaxe ?

Merci / Chawn01

fredericmazue

Voici un exemple tout simple qui montre comment chercher "loss" dans un chaine.
Pour commencer avec les expressions régulières en Python, le point important est de savoir que le test ne retourne pas un booléen, mais un objet de classe MatchObject. On peut tester cet objet directement avec if et en appeler ses méthodes pour avoir par exemple la position de la sous chaîne trouvée dans la chaine testée.

import re

chaine = "Packets: Sent = 3, Received = 0, Lost = 3 (100% loss)"

mo = re.search("loss", chaine)

if mo:
	print "trouve a ", mo.start() ,mo.end()
Charlie

Bonjour fredericmazue,

Merci pour ta réplique ...
Apres l'ajout de ta ligne de commande, j'ai ce msg d'erreur:

Traceback (most recent call last):
File "E:/Carl Python/13 Sept 2007/test1.txt", line 104, in
mo = re.search("loss", chaine)
File "C:\Python25\lib\re.py", line 134, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

tu aurais une petite idée sur la façon d'améliorer mon script ce-dessous ?


class testit(Thread):
   def __init__ (self,ip):
      Thread.__init__(self)
      self.ip = ip
      self.status = -1
   def run(self):
      pingaling = os.popen("ping "+self.ip+" -n 10 ","r")
      
# This code is what each parallel thread does
# the 'run' method is triggered when 'start' is called
      while 1:
         #read, readline, readlines
         line = pingaling.read()
         if not line: break
         print
         print line

def chaine():
      while 1: 
         chaine = "Packets: Sent = 3, Received = 0, Lost = 3 (100% loss)" 
mo = re.search("loss", chaine) 

if mo: 
   print "trouve a ", mo.start() ,mo.end() 
  
else:
    print 'not working'

fredericmazue

Telle une locomotive une chaine peut en cacher une autre.

Quand tu fais
mo = re.search("loss", chaine)
Tu ne passes pas la chaine de nom chaine qui n'est pas dans la portée, mais la fonction (def chaine(): ) de nom chaine qui elle est dans la portée.
Ca ne peut donc pas marcher puisque search attend une (vraie) chaine

Maintenant je ne devrais sans doute pas me mêler de ce qui ne me regarde pas, mais:

def chaine():
         while 1: 
                   chaine = "Packets: Sent = 3, Received = 0, Lost = 3 (100% loss)" 

Qu'est-ce que tu as voulu faire là, avec ce truc qui boucle sur lui même ?
Je ne serais pas surpris si tu devais constater que ta machine se ralentit un peu quand la fonction chaine est appelée....

Charlie
Filtrer un string

Bonjour fredericmazue,

bien j'essai tout simplement de filtrer la chaine:
(100% loss) de ma commande ping. En effet, je veux filter mes résultats (ds ce cas ci-le nombre se trouvant avant loss)
pour en faire des stats mais je sais pas comment introduire ta ligne de command (string) ds mon script, je sais pas quelle syntaxe utilisée, je suis un newbies : )

Les lignes de commande que tu m'as données étaient:

import re 

chaine = "Packets: Sent = 3, Received = 0, Lost = 3 (100% loss)" 

mo = re.search("loss", chaine) 

if mo: 
   print "trouve a ", mo.start() ,mo.end() 

fredericmazue

Quote:
bien j'essai tout simplement de filtrer la chaine:

Je sais bien.
Quote:
Les lignes de commande que tu m'as données étaient:

Les lignes que je t'ai données fonctionnent, mais ce n'est qu'un exemple brut en dehors de tout contexte. Tu avais demandé un exemple sur comment utiliser les fonctionnalités du module re. C'est ce que je t'ai donné.
Il est bien évident que tu ne dois pas le reprendre à lettre et le copier/coller dans ton script. C'est à toi d'écrire ce qu'il faut dans ton script, je peux difficilement le faire à ta place. Toutefois il me semble que quelque chose sur la base de
line = pingaling.read() 
mo = re.search("loss", line) 

te donnera de meilleurs résultats
Charlie
string - ping

Bonjour à tous et à fredericmazue,

J'ai été en mesure de filtrer une chaine de caractere avec ceci (voir mes caracteres gras), mais ne filtre que la premiere statistique donné par le premier IP de ma list et ne continue pas plus loin pour mes autres IP, quelqu'un pourrait m'indiquer pourquoi ? :

class testit(Thread):
def __init__ (self,ip):
Thread.__init__(self)
self.ip = ip
self.status = -1
def run(self):
pingaling = os.popen("ping "+self.ip+" -n 10 ","r")

# This code is what each parallel thread does
# the 'run' method is triggered when 'start' is called
while 1:
line = pingaling.read()
startopenbracket = line.find("(") #<-----??????????????
startloss = line.find("loss")
print line[startopenbracket+1:startloss]

if not line: break

fredericmazue

Quote:
quelqu'un pourrait m'indiquer pourquoi ?

Rien de plus simple. Tu fais le ping pour une IP seulement (self.ip) et après tu boucles (while 1) sur le résultat de cet unique ping.

Puis je me permettre quelques remarques ? Oui ? (si non je les fais quand même :) )

- filtrer une chaîne dans laquelle on doit trouver "loss" en cherchant d'abord "(" ne semble pas une bonne approche.

- depuis le début tu sembles t'entêter à faire tes manips dans un thread. Et AMHA ça te complique l'existence. Bon je n'ai pas une vue d'ensemble de ce que tu fais, mais AMHA, nul besoin de s'enquiquiner avec un ou plusieurs threads pour faire quelques ping.

Charlie

Bonjour fredericmazue,

bon voici un bon exemple de ce que j'essai de faire,
bien que novice en la matière, j'ai cherché, trouvé et embriqué divers script depuis 1 mois, je travaille très fort, voici, j'essai de (séduler) le programme pour qu'à un moment voulu, je puisse pinger divers serveurs/PC et d'avoir les résultats de ces pings pour compiler des statistiques et évaluer l'état du réseau.

mais j'ai 2 problèmes majeurs qui se posent :
a) comment séduler ce script
b) comment compiler mes stats, ds ce cas, ci, je n'ai qu'un résultat (soit: 0% mais devrait en avoir 2 autres).

Tu pourrais m'indiquer comment résoudre ces 2 litiges; a) et b)

voici à quoi ressemble mon Idle de Python lorsque j'exécute mon script:


Enter your IPs
Press 0 to start ping
_________________________________________________ 

#IP no. 1: 10.2.3.5          <-------j'entre mes IP
#IP no. 2: 10.100.3.18     <------ j'entre mes IP
#IP no. 3: 10.20.0.160     <------ j'entre mes IP
#IP no. 4: 0                    <------ presse 0 pour démarrer
              
['10.2.3.5', '10.100.3.18', '10.20.0.160']  <------- contenu de ma liste

Mmm DD HH:MM 2007: Sep 20 15:40 2007
['Sep 19 10:00 2007'] <-------- faudra que j'ajoute date du début et de fin
None    <--------------- je sais pas pourquoi ca m'indique None???
Thu Sep 20 15:42:53 2007
Please wait...
>>> 0%  <----- aucun résultat de mes 2 autres ping pour 
                        ip : 10.100.3.18 et 10.20.0.160 

Voici mon script:


import re 
import os
import time
import sys
from threading import Thread


#format de l'IP

def validIP(ipAddress): 
    ipRegex = r"^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$" 
    re_ip = re.compile(ipRegex) 
    return re_ip.match(ipAddress)

print 
print ("Enter your IPs")
print ("Press 0 to start ping")
print
print
def read_ip(N):
    valid_ip1 = []
    i = 1
    while (i<=N or N==0):
        ipAddress = raw_input("#IP no. %d: " %i)
        if N==0 and ipAddress=="0":
            return valid_ip1  
        if validIP(ipAddress):
            valid_ip1.append(ipAddress)
            i += 1
        else:
            print "IP invalid. start again"

ip_list = read_ip(0)
print ip_list

#format de la date


def validIP1(ipAddress1):
 ipRegex1=r'''^ 
 #   (?P<Weekday>Sun|Mon|Tue|Wed|Thu|Fri|Sat) 
 #\s 
    (?P<Month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) 
 \s 
    (?P<Date>[1-2][0-9]|0?[1-9]|30|31) 
 \s 
    (?P<Hour>[01]?[0-9]|2[0-3]) 
 : 
    (?P<Minute>[0-5]?[0-9]) 
 #: 
 #   (?P<Second>[0-5]?[0-9]) 
 \s 
    (?P<Year>\d{4}) 
 $ 
 ''' 
 re_ip1=re.compile(ipRegex1,re.VERBOSE)
 return re_ip1.match(ipAddress1)

def read_ip1(N):
    valid_ip2 = []
    ipAddress1 = raw_input("Mmm DD HH:MM 2007: " )
    if N==0 and ipAddress1=="0":
            return valid_ip2  
    if validIP1(ipAddress1):
            valid_ip2.append(ipAddress1)
            print valid_ip2
            
            #i += 1
    else:             
            print "Date invalid. start again /Or press 0 to exit"
            return read_ip1(N)
                       
ip_list1 = read_ip1(0)
print ip_list1

#-------------------------------------

class testit(Thread):
   def __init__ (self,ip):
      Thread.__init__(self)
      self.ip = ip
      self.status = -1
   def run(self):
      pingaling = os.popen("ping "+self.ip+" -n 10 ","r")
      
# This code is what each parallel thread does
# the 'run' method is triggered when 'start' is called
      while 1:
         line = pingaling.read()
         startopenbracket = line.find("(")
         startloss = line.find("loss")
         print line[startopenbracket+1:startloss]
         if not line: break
         print
    
pinglist = []

for ip in ip_list:

# create a thread, add it to a thread list
   current = testit(ip)
   pinglist.append(current)
   
# start the thread running
current.start()

print time.ctime()
print ('Please wait...')

fredericmazue

Réponse très rapide. Il est tard et je m'en vais là...

Quote:
comment séduler ce script

Oui je sais bien ce que tu es en train de faire. On a en déjà parlé et je t'ai déjà dit que dans Windows il y avait un beau planificateur de tâches. Tu devrais l'utiliser, vu que tu l'as payé :lol:

Sinon, j'ai jeté un (très et sans doute trop rapide :oops:) coup d'oeil à ton script. Et même si j'ai été très vite je te redis qu'il n'y a aucun intérêt à lancer un thread par ping. Ni même de s'embêter avec un thread.
Pourquoi ne pas faire tous les pings dans une simple boucle, les uns à la suite des autres ?
Si tu débutes, fais *simple*. D'ailleurs moi qui ne débute pas en Python, je ferais comme je te dis . Les solutions simples et directes sont toujours les meilleures.

Pour les détails, on en reparle lundi. Je dois filer là...

Charlie

Bonjour fredericmazue,

Ha! avec un loop ? tu pourrais me donner un exemple,
je te jure que le thread me donne des mots de tête. Oui, mon problème
ce trouve au niveau de la conception, moi, ce que j'ai fait c'est de reprendre tout simplement un script que je croyais adapté pour faire le boulot quoi ! Je vais essayé de trouver un exemple de loop puis l'appliquer sur un ping. Je veux pas non plus t'embêter avec mon truc mais j'aimerais tellement le rendre fonctionnel. Bon je te reviens Lundi.

Merci/Charlie A+

fredericmazue

Quote:
Ha! avec un loop ? tu pourrais me donner un exemple,

Je me demande bien quel est le problème à écrire une boucle, ping ou pas :evil:

Quote:
je te jure que le thread me donne des mots de tête. Oui, mon problème

donc pas besoin de thread, faire les pings les uns après les autres, tout simplement.
Et puis aussi un peu de concision et de simplicité pour lire dans le tube, ça n'est pas plus mal :D

Voici donc (c'est mon jour de bonté) un script qui fait le travail, essayé sur trois machines de mon réseau.
Bon attention, il te reste à mettre en forme les sorties émises. mais faut bien qu'il te reste quelque chose à faire n'est-ce pas ? ;)

import os
import re

results = []

ips = ['192.168.1.51', '192.168.1.52', '192.168.1.53', ]


def print_results():
    for result in results:
        for line in result:
            print line

def analyse():
    for result in results:
        for line in result:
            mo = re.search("loss", line)
            if(mo):
                print "perte d'octets"
        

def build_commande(ip):
    return "ping -n 4" + " " + ip


def do_command(command):
    results.append("---------------------------------")
    tube = os.popen(command, "r")
    results.append(tube.readlines())
    tube.close()


for ip in ips:
    command = build_commande(ip)
    do_command(command)

print_results()
analyse()
Charlie

Bonjour fredericmazue,
:D :lol: :wink:

J'apprécie grandement ton script, c'est vraiment plus compréhensible Je peux maintenant voir mes stats une en dessous de l'autre et ce pour plusieur IP. :D ça m'a pris un temps fou pour rajouter mes éléments à ton script mais j'y suis parvenu :idea:

En fait, j'ai changé d'idée à propos du sheduler, je vais faire en sorte que le script s'active lorsque je press D, et A pour l'arrêter, et le rajout d' un timer stop apres 24 hrs par défaut devrait suffir. Mais je veux pas t'embêter plus longtemps avec mon truc.

Tu m'as bien aidé, en plus, j'ai comparé les 2 scripts et ça me donne vraiment une bonne idée du comment cela doit être fait proprement.

Merci encore 1000 x

Charlie

Bonjour fredericmazue,

J'ai essayé d'envoyer mes données ds un fichier : c:/tmp/workfile.txt
tout semble super, mais seulement une seule ligne apparaît ds mon dossier ? J'ai presque tout essayé, genre créer un objet appellé file_open()
mais en vain. Voici ce que j'écris (voir en gras):


import os 
import re 



def validIP(ipAddress): 
    ipRegex = r"^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$" 
    re_ip = re.compile(ipRegex) 
    return re_ip.match(ipAddress)

def read_ip(N): 
    valid_ip1 = [] 
    i = 1 
    while (i<=N or N==0): 
        ipAddress = raw_input("#IP no. %d: " %i) 
        if N==0 and ipAddress=="0": 
            return valid_ip1  
        if validIP(ipAddress): 
            valid_ip1.append(ipAddress) 
            i += 1 
        else: 
            print "IP invalid. start again" 


ips = read_ip(0)
print ips


results = [] 


def print_results(): 
    for result in results: 
        for line in result: 
            print line

            

def analyse(): 
    for result in results: 
        for line in result: 
            mo = re.search("loss" , line)
            if(mo):
             startopenbracket = line.find("(") 
             startloss = line.find("loss") 
             print line [startopenbracket+1:startloss]
             print line
             f=open('c:/tmp/workfile.txt', 'w')
             f.write(line)
             f.close()
def build_commande(ip): 
    return "ping -n 4" + " " + ip 


def do_command(command): 
    results.append("-----------") 
    tube = os.popen(command, "r") 
    results.append(tube.readlines())  
    tube.close() 


for ip in ips: 
    command = build_commande(ip) 
    do_command(command) 

print_results() 
analyse() 

fredericmazue

Quote:
Bonjour fredericmazue,

Bonjour :)
Mais .. heu.. je pense que je ne suis pas le seul à venir sur ce forum.

Quote:
une seule ligne apparaît ds mon dossier

Ma foi dans la mesure où l'écriture dans le fichier est faite dans un test, cette écriture n'est effectuée que si le test est vrai. On peut bien imaginer que cela n'arrive qu'une fois, voire pas du tout.
Il y a autre chose. Même si le test est vrai moult fois, il semble normal qu'il n'y ait qu'une ligne dans le fichier: la dernière.

Quote:
f=open('c:/tmp/workfile.txt', 'w')

ouvre le fichier en écriture avec troncature. Donc chaque fois qu'il est ouvert, le contenu précédent est écrasé.

f=open('c:/tmp/workfile.txt', 'a+')

marchera sans doute mieux.

Heu oui, on me m'a rien demandé, mais je ne peux m'en empêcher. J'aime la simplicité (ce qu'apporte Python), alors du coup je n'arrive pas à lire ni à comprendre validIP et read_ip. Quelle idée de saisir à chaque fois les ips ? :evil:

Il serait tellement plus simple de les écrire à tête reposée dans un fichier, avec une IP par ligne.

Exemple:

contenu du fichier les_ips:
192.168.1.51
192.168.1.52
192.168.1.53

alors on peut faire

ips = open("les_ips").readlines()
for ip in ips: # etc, etc

Ce qui est quand même plus simple :lol:

Charlie

Bonjour fredericmazue,

j'ai continué mon script aujourd'hui,
mes logs me donnaient seulement la dernière ligne
mais j'ai enfin trouvé le problème, je peux maintenant afficher tous mes logs.

Tu sais je ne peux pas entrer les IP ds une liste parceque les
ip sont configurées dynamiquement, ils changent constament sur le réseau
que je ping alors, c'est pour cette raison que je dois les entrer manuellement.

tu vois, par exemple, je ping un client considéré problématique, qui se trouve dans un secteur à montréal alors, je cherche quelques clients qui habitent tout près pour voir si la déconnexion des IP secondaires éprouvent le même montant de perte de paquet. Cela me donne une meilleure visibilité de l'état du réseau pour les problèmes intermittents ds un secteur donné.

Bon j'espère que j'ai répondu à ta question
:lol:

Je devrais avoir quelques questions sur ce forum dès Lundi,

A+

fredericmazue

Quote:
mais j'ai enfin trouvé le problème

Trouver le problème est une chose.
Mais as tu vu que je t'ai donné la solution dans mon post précédent :?: ;)

Quote:
Tu sais je ne peux pas entrer les IP ds une liste parceque les
ip sont configurées dynamiquement, ils changent constament sur le réseau
que je ping alors, c'est pour cette raison que je dois les entrer manuellement.

Bien sûr que si.
D'abord je trouve dommage que tu n'ais pas présenté le problème tel qu'il est. Sinon je n'aurais pas perdu mon temps à te conseiller plusieurs fois de mettre les ip dans un fichier alors qu'il y a une autre solution pour toi. Déjà dans l'autre fil de discussion c'était le cas. J'ai essayé de te conseiller sur un problème pas formulé, ou du moins très incomplètement.
Ensuite je trouve dommage que tu fasses autant de résistance aux conseils de bons sens que j'essaie de te donner pour te faciliter la vie.

Donc bien sûr que si disais-je...
Si les ips sont variables comment les récupères tu donc ? D'après leur nom de domaine, ou nom de machines. Mais il se trouve que Python sait très bien faire ça.
Donc si tu mets tes nom de domaines/machines dans une liste, il y a une ligne de code pour constituer la liste des ip à partir de ça.
Par exemple là je mets un nom de machine sur mon réseau, et et le nom de domaine de mon fournisseur d'accès et une ligne de code suffit pour avoir la listes d'ips:

import socket

domaines = ['soleil', 'wanadoo.fr']
ips = map(socket.gethostbyname, domaines)
print ips

Et si tu mets les noms de domaines dans un fichier ça marche aussi, pourvu que tu fasses attention au "\n" de fin de ligne si tu te sert de readlines.

Tu sais un langage de programmation, ça sert à éviter de toujours faire les mêmes tâches répétitives à la main :evil:

Allez bonne continuation :)

Charlie

Bonjour fredericmazue,

Excuse moi de ne pas avoir été claire ds mes explications,
mais habituellement quand il y a trop d'élément d'un coup, personne
ne répond :x

Les IP, je dois les prendre manuellement pour un simple raison puisqu'ils faut absolument connaître la géographie de la région ainsi que les adresses de rue pour sélectionner les IP appropriées.

Mais éventuellement, je devrais ajouter une autre fonction à mon script pour récupérer mes adresses IP à partir d'adresses MAC (placées ds des tables MySQL) à partir d'une liste que je fabrique, je garde cela pour le futur.

Pour l'instant, mon script que tu as modifié, pour ne pas dire reconstruis :D va à merveille. Donc;

1)mes IP sont pinger
2)j'ai le résultat dans le Idle de Python

mais je me demande comment faire en sorte de pinger mon IP primaire en boucle. c'est-à-dire, que si par exemple je presse sur D (pour démarrer), UN seul IP primaire devra être pinger en boucle (jusqu'à l'arrêt lorsque que je presse sur A (pour arrêter).

Bien entendu, le ping devra s'effectuer à chaque 60 secondes et si ce IP à une valeur égale ou plus de 2% alors ce log devra être envoyé ds un fichier et, mes IP secondaires devront etre pinger à leur tour (si plus de 2% de packet lost)...on devrait avoir les résultats s'ajouter à la suite.

J'ai essayé de faire des loop ce genre de loop à l'aide d'un timer, mais en vain. Tu aurais une suggestion du comment je pourrais créér ce genre de loop additionner d'un timer ?

fredericmazue

Quote:
Les IP, je dois les prendre manuellement

Puisque tu le dis...

Quote:
Mais éventuellement, je devrais ajouter une autre fonction à mon script pour récupérer mes adresses IP à partir d'adresses MAC (placées ds des tables MySQL)

J'aimerais comprendre
1) ce n'est plus du manuel ça...
2) tu m'as dit que les IP "changeaient tout le temps", alors je ne vois pas comment l'adresse MAC pourrait correspondre à une IP. Ou alors c'est que les tables sont mises à jour régulièrement. Mais alors tu n'as pas à prendre les IPs manuellement

Bref je ne comprends rien et tout cela me dépasse :)

Charlie

Bonjour fredericmazue,

Ce sont des entrés manuel, pour l'instant c'est OK et surtout beaucoup moins compliqué. :shock:

Éventuellement je pourrais faire évoluer ce script pour aller chercher le IP correspondant à la bonne MAC et ensuite comparer les IP d'origine et voir si ces IP n'ont pas changé après l'opération.
ex. mon IP d'origine pour la MAC 0015.e000.009c = 72.21.12.12 mais ce dernier peut changer apres 8 hrs si par exemple le modem est (reseté). Donc si je fais des stats, mon script doit tjrs vérifier le IP corresondant pour voir si il ne change pas, si il change, alors ont doit pinger ce nouveau IP pour ne pas fausser les statistiques.

Comme je crois, une simple entré manuelle et faire un comparatif visuel pour éliminer les IP qui ont changé des mes stats devra faire l'affaire pour l'instant. :wink:

À quoi ressemblerait une boucle pour pinger mon IP primaire constament à chaque 60 secondes jusqu'à ce que je presse D pour démarrer, et S pour Arrêter et si ma perte de paquet est plus grand ou = à 2% alors les logs vont ds un fichier ?

Merci/Charlie

fredericmazue

Donc si je comprends bien, il faut pouvoir démarrer et arrêter à la main, pour pouvoir saisir les IP à la main, c'est bien ça ?
Mais alors dans ce cas et dans cette logique, pourquoi ne pas faire les ping à la main :?:

Désolé... j'ai pas pu m'en empêcher :oops: :oops: :oops:

Accessoirement, je me demande ce que c'est que que ce réseau qui perd tant de paquets.
C'est quand même pas que les paquets sont envoyés à la main hein ? :twisted:

Oui je sais, je ne devrais pas, c'est mal :oops:

Mais bon, donc ton problème du moment:

Quote:
À quoi ressemblerait une boucle pour pinger mon IP primaire constament à chaque 60 secondes jusqu'à ce que je presse D pour démarrer, et S pour Arrêter et si ma perte de paquet est plus grand ou = à 2% alors les logs vont ds un fichier ?

concrètement ça veut dire: comment faire pour lire une saisie au clavier en même temps qu'on boucle sur un ping ?
Tu te rends bien compte que là, la difficulté de programmation elle n'existe que parce que tu veux du "à la main" hein ? :twisted:
Et bien dans ce cas, je dirais qu'il va falloir travailler avec un thread.
Mais ne fait pas comme Grock qui déplace le piano au lieu de déplacer la chaise.
Je veux dire: ne fait pas les ping chacun dans un thread (tu te rappelles tes difficultés d'avant, n'est-ce pas ?)
Place un read() dans un thread qui affecte une variable si action de l'utilisateur, et dans la boucle du ping, à chaque itération, va voir si le contenu de la variable en question a changé.
fredericmazue

Charlie,

Je pensais à toi ce matin, avec un peu de culpabilité. Je me suis dit que je n'aurais pas être pas du te plaisanter autant.
Bon quoiqu'il en soit, pour me faire pardonner, voici un petit script qui montre un organisation possible pour faire ce que tu veux. Que bien sûr tu adapteras à tes besoins.

Mais, vraiment, il me semble que tu n'abordes pas ton problème de la meilleure manière qui soit.

import time
import thread

action = None

def attendre_action_dans_un_thread():
    global action
    action = raw_input()
    


# c'est parti mon kiki

thread.start_new_thread(attendre_action_dans_un_thread, ())

while not action:
    print "je fais un ping"
    # on attend un peu
    time.sleep(1)

print "fini :)"
print "utilisateur a appuye sur", action 
Charlie

Bonjour Fred, :wink:

Excuse moi, pour ce qui est d'expliquer, je crois que je suis meilleur en Anglais :( (c'est plus facile, direct et surtout plus court), malheureusement, m'a spécialité n'est pas la conception et programmation d'applications dans les domaines industriels et scientifiques, pour te citer :wink:

Merci pour ton script, je vais le modifier cette fin de semaine (si j'en suis capable). Pour l'instant, je suis encore au niveau de filtrer les résultats de mes ping afin de les envoyer dans un fichier, je filtre partiellement mes chaînes de caratères ( 0% , 10.67.90.87) mais je ne peux enlever le signe de % mais bon, je suis patient, j'y arriverais avec un .strip

Merci encore pour ton aide et surtout d'avoir pensé à moi, ce newbies ! :D En passant, dit bonjour à Nathalie ! :lol:

A+/Charlie

fredericmazue

Quote:
je crois que je suis meilleur en Anglais

Ah ?
Hum j'ai regardé ton IP. Tu es au Canada ?
Je comprends tes difficultés d'expression.
Tu sais, dans ton cas, si l'ensemble de ton post est en françias, tu peux bien y mettre aussi une phrase en anglais pour préciser ta pensée. Pas de problème.

Quote:
mais je ne peux enlever le signe de %

Très facile:
chaine = " ( 0% , 10.67.90.87)"
nouvelle_chaine = chaine.replace("%", "")
print nouvelle_chaine

Quote:
En passant, dit bonjour à Nathalie !

Je n'y manquerai pas :)
Charlie

Bonjour fredericmazue,

Oui, du Québec :D et bien encore chanceux de parler français, avec
ces quelques 300 000 000 de rosbif qui nous entour, ça relève de la haute voltige le fait de s'exprimer en français malheureusement ns perdons du terrain de plus en plus :cry:

il parraît que votre président, Nicolas Sarkozy viendra faire un tour
pour le 400 ième de Québec, il pourra saluer son
grand copain, Paul Desmarais (milliardaire Québécois, de la Power Corporation) et bien entendu actionnaire chez
la pétrolière française: Totale

Bon retournons à nos moutons :)

j'ai fait quelques essais avec le script ce-dessous,


import re
import time 
import thread 
import os
import msvcrt
import sys


def validIP(ipAddress): 
    ipRegex = r"^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$" 
    re_ip = re.compile(ipRegex) 
    return re_ip.match(ipAddress)

def read_ip():
    ipAddress = raw_input("# Enter Primary IP: ")
    if validIP(ipAddress):
        os.remove("c:/tmp/workfile.txt")
        f=open('c:/tmp/workfile.txt', 'a+')
        f.write(ipAddress)
        f.close()
        print ipAddress
    else:
        print "Wrong syntax"
        return read_ip()
read_ip()
    

print ('Pls press enter to Start')

action = None 

def attendre_action_dans_un_thread(): 
    global action 
    action = raw_input() 
    


# c'est parti mon kiki 

thread.start_new_thread(attendre_action_dans_un_thread, ()) 

while not action: 
    print "je fais un ping" 
    pingaling =os.popen("ping %s" %(ipAddress),"r")
    line = pingaling.read() 
    print line
    print ('-----------------')
    print ('Please wait')
    print ('-----------------') 
    # waiting
    time.sleep(1)

print "fini :)" 
print "utilisateur a appuye sur", action

Voilà le message d'erreur,
tu pourrais m'aider?


Traceback (most recent call last):
  File "E:/Carl Python/10 Octo 2007/test1.txt", line 46, in <module>
    pingaling =os.popen("ping %s" %(ipAddress),"r")
NameError: name 'ipAddress' is not defined

Mon ip n'est pas défini ??? hmmmm

fredericmazue

Quote:
malheureusement ns perdons du terrain de plus en plus

Ici aussi :cry:
Quote:
l parraît que votre président, Nicolas Sarkozy viendra faire un tour

On pourrait pas parler d'autre chose ?

Quote:
Voilà le message d'erreur,
tu pourrais m'aider?

Sur le principe je devrais dire non. Tu me refiles un script dans lequel faut entrer les IP à la main pour essayer, je n'aime pas.... Mais bon parce que c'est toi. :)

D'abord il y a ça:
os.remove("c:/tmp/workfile.txt")
Ca marche parce que tu as déjà fait plein d'essais et que le fichier workfile.txt existe.
Si tu essaies ton script sur une nouvelle machine, donc avec un fichier workfile.txt absent, tu verras que ça va planter. (you will see that it will crash ;) )

Bon tu me diras que ça ne concerne pas ton erreur:

Quote:
Mon ip n'est pas défini ??? hmmmm

Si, elle est définie. Avec tout le soin que tu as pris pour le saisir à la main, ça serait un comble ;) :lol:

MAIS

ipAddress est définie en tant que variable LOCALE dans la fonction read_ip. Cette variable est donc invisible dans la boucle while. (the ipAddress variable is not in the scope of the while loop ;) )

Bon je ne peux pas m'empêcher de te le dire: si tu ne t'entêtais pas à faire tes saisies d'IP à la main, tu n'aurais pas le problème. Tu devrais vraiment aborder ton problème sainement, si tu veux en sortir un jour.