IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Générer un JSON avec SCAPY [Python 2.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai Avatar de Lignite
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Générer un JSON avec SCAPY
    Bonjour,

    je suis débutant en Python. J’ai commencé à écrire un petit programme qui utilise SCAPY pour sniffer les données reçues d'une application sur le web.

    '@U:1234:Jacques DUPUITS:312'
    '@U:2456:Jean MARIE:285'
    '@U:2987:Elodie FRESNES:225'
    '@U:1234:Jacques DUPUITS:360'
    '@U:1234:Jacques DUPUITS:360'
    '@U:1234:Jacques DUPUITS:370'
    '@U:2987:Elodie FRESNES:125'
    J’aimerais que Python me crée un fichier JSON qui aurait cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
     "users":[
       {
        "id":1234,
        "user":"Jacques DUPUITS",
        "qte":370
       },
       {
        "id":2456,
        "user":"Jean MARIE",
        "qte":285
       },
       {
        "id":2987,
        "user":"Elodie FRESNES",
        "qte":125
       }
      ]
    }
    Je ne vous demande pas une solution toute faite mais plutôt des pistes pour avancer. Ma problématique est de laisser SCAPY en fonction en permanence et mettre à jour/créer des entrées dans le fichier JSON.
    Les paquets s’enchaînent environ toutes les 25e de seconde, trop vite pour faire la mise à jour d’un fichier ?

  2. #2
    Membre à l'essai Avatar de Lignite
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    j'avance un peu mais j'ai une question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from scapy.all import *
    flux = sniff(filter="host 10.20.30.40", count=0, prn=None, timeout=10, iface="ath0")
     
    print "Content-type: text/html; charset=utf-8\n"
     
    print "<html><body><p>", flux[0].getlayer(Raw).load , "</p></body></html>"
    le système attend la fin du timeout pour m'afficher ma page qui contient ici la première ligne. Y-a t-il une méthode pour afficher les lignes au fur et à mesure ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Lignite Voir le message
    Je ne vous demande pas une solution toute faite mais plutôt des pistes pour avancer. Ma problématique est de laisser SCAPY en fonction en permanence et mettre à jour/créer des entrées dans le fichier JSON.
    Les paquets s’enchaînent environ toutes les 25e de seconde, trop vite pour faire la mise à jour d’un fichier ?
    Il faut commencer par regarder ce que sait faire la bibliothèque json =, stocker { "id":1234, "user":"Jacques DUPUITS", "qte":370 } sur une seule ligne et utiliser la fin de ligne comme "séparateur" d'objets (la bibliothèque standard ne sachant stocker qu'un seul objet).
    note: il serait plus simple de stocker cela sous la forme de lignes simples et récupérer les informations avec des regexp.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre à l'essai Avatar de Lignite
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    note: il serait plus simple de stocker cela sous la forme de lignes simples et récupérer les informations avec des regexp.
    ok je retiens cette idée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/python3
    # -*- coding: utf-8 -*
     
    # threading
    import threading 
     
    from scapy.all import *
     
    i=0
     
    print "Content-type: text/html; charset=utf-8\n"
    print "<html><body>"
     
    """Thread sniffant l'adresse IP."""
     
    def Sniffeur():
        flux = sniff(filter="host 10.20.30.40", count=0, prn=None, timeout=10, iface="ath0")
        i += 1
        return flux, i
     
    def Afficheur(flux):
        """Code à exécuter pendant l'exécution du thread."""
        print "<p>", flux[i].getlayer(Raw).load , "</p>"
     
    a = threading.Thread(None, Sniffeur, None)
    b = threading.Thread(None, Afficheur, None, flux)
    a.start() 
    b.start()
     
    print "</body></html>"
    Pour la question du timeout, j'ai essayé le threading mais je ne sais pas comment passer la variable flux et accessoirement i au second thread. Est-ce possible ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Lignite Voir le message
    Pour la question du timeout, j'ai essayé le threading mais je ne sais pas comment passer la variable flux et accessoirement i au second thread. Est-ce possible ?
    Si vous voulez que la page contienne quelque chose à afficher, il faut attendre que "sniff" ait retourné quelque chose... ou soit parti en timeout. Je ne vois pas ce qu'apportent les threads ici: pendant que çà attend, difficile de faire autre chose qu'attendre...

    Il serait plus simple d'avoir deux processus séparé. Un daemon qui remplit un fichier séquentiel de paquets reçus avec un horodatage et la construction de la page HTML avec ce qu'on trouve à la fin du fichier serait plus simple (et sans attente).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai Avatar de Lignite
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous voulez que la page contienne quelque chose à afficher, il faut attendre que "sniff" ait retourné quelque chose... ou soit parti en timeout. Je ne vois pas ce qu'apportent les threads ici: pendant que çà attend, difficile de faire autre chose qu'attendre...

    Il serait plus simple d'avoir deux processus séparé. Un daemon qui remplit un fichier séquentiel de paquets reçus avec un horodatage et la construction de la page HTML avec ce qu'on trouve à la fin du fichier serait plus simple (et sans attente).
    Merci pour cette confirmation de ce que je pressentais. Pour le daemon, je comprends bien son utilité mais n'est-ce pas trop d'écrire 4 lignes par seconde dans un fichier ? Même si c'est ok, est-ce qu'il est raisonnable de déclencher la mise à jour de la page HTML 10 fois par seconde pour être sûr de ne rater aucun message ?

    Je vais changer ma stratégie. Je peux télécharger un fichier sur le serveur distant toutes les 2 minutes qui compile les données "live". Je vais utiliser SCAPY seulement pour pousser des données à la fois dans ma page HTML et sur le serveur distant.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Lignite Voir le message
    MPour le daemon, je comprends bien son utilité mais n'est-ce pas trop d'écrire 4 lignes par seconde dans un fichier ? Même si c'est ok, est-ce qu'il est raisonnable de déclencher la mise à jour de la page HTML 10 fois par seconde pour être sûr de ne rater aucun message ?
    Les messages étant stockés dans un fichier, on ne rate rien... on risque juste à terme d'avoir un disque plein. La page HTML est construite qu'à la réception d'une requête HTTP, on peut faire 10 requêtes par secondes pour récupérer 10 messages, une seule requête par seconde qui retournera les 10 derniers messages, ou une requête qui retourne les N messages plus anciens que ceux qu'on à déjà reçu.
    Si on se passe du fichier, çà veut dire 2 threads: une qui remplit une liste conservant les N derniers messages, l'autre qui répond aux requêtes HTTP avec une page HTML construite avec les informations de cette liste. Mais c'est pas un script CGI qui pourra faire cela...

    Les solutions pour utiliser de façon raisonnable les ressources système qu'on a à sa disposition en fonction de l'application ne manquent pas.

    Citation Envoyé par Lignite Voir le message
    Je vais changer ma stratégie. Je peux télécharger un fichier sur le serveur distant toutes les 2 minutes qui compile les données "live". Je vais utiliser SCAPY seulement pour pousser des données à la fois dans ma page HTML et sur le serveur distant.
    Il n'est pas interdit de changer de stratégie parce que de ce côté là, la pente est un peu trop raide.
    Ceci dit vous intuitez que vous avez différents composants asynchrones: récupération des données via scapy, mise à disposition pour un client HTTP, compilation des données,...
    Qui fait quoi? Jusqu'où? Comment? Si vous n'êtes pas très clair la dessus, pas la peine d'essayer de coder... Et le langage de programmation ne répondra pas aux questions de conception que vous avez laissé ouvertes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre à l'essai Avatar de Lignite
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Déjà un grand merci pour le temps passé à me répondre…

    Citation Envoyé par wiztricks Voir le message
    Les messages étant stockés dans un fichier, on ne rate rien... on risque juste à terme d'avoir un disque plein. La page HTML est construite qu'à la réception d'une requête HTTP, on peut faire 10 requêtes par secondes pour récupérer 10 messages, une seule requête par seconde qui retournera les 10 derniers messages, ou une requête qui retourne les N messages plus anciens que ceux qu'on à déjà reçu.
    Si on se passe du fichier, çà veut dire 2 threads: une qui remplit une liste conservant les N derniers messages, l'autre qui répond aux requêtes HTTP avec une page HTML construite avec les informations de cette liste. Mais c'est pas un script CGI qui pourra faire cela...
    C'était mon postulat de départ. Un daemon avec un mime type en JSON et une page HTML AJAX en asynchrone pour utiliser ces données. Première difficulté, je ne peux pas faire un prétraitement pour éliminer des données redondantes et j'ai bien peur qu'il sera difficile de le faire avec de l'AJAX côté client. Du moins, cela me paraît hors de ma portée.

    Citation Envoyé par wiztricks Voir le message
    Il n'est pas interdit de changer de stratégie parce que de ce côté là, la pente est un peu trop raide.
    Ceci dit vous intuitez que vous avez différents composants asynchrones: récupération des données via scapy, mise à disposition pour un client HTTP, compilation des données,...
    Qui fait quoi? Jusqu'où? Comment? Si vous n'êtes pas très clair la dessus, pas la peine d'essayer de coder... Et le langage de programmation ne répondra pas aux questions de conception que vous avez laissé ouvertes.
    Effectivement, je tâtonne encore mais j'ai l'impression quand même d'y voir plus clair grâce à tes réponses. Je vais travailler sur une page unique (avec wx) qui lira le fichier txt avec les données pré-traités mais seulement toutes les deux minutes. Ce fichier, je n'en ai pas la maîtrise, il est présent sur le site qui sera la destination des datas envoyées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data = '=A:1234:', CS
    a = IP(dst='10.20.30.40') / TCP() / Raw(load=data)
    sendp(a)
    Si tout marche bien, je retrouverai dans les données compilées le résultat de ma commande.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer des statistiques avec graphiques, histogrammes
    Par nico33307 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/11/2005, 16h03
  2. génrer fichier html avec template
    Par ramir dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2005, 13h30
  3. Générer du SVG avec le bon encoding...
    Par TOM-Z dans le forum XMLRAD
    Réponses: 3
    Dernier message: 24/08/2005, 12h34
  4. [XML][DTD] Générer un XML avec une DTD ?
    Par elitost dans le forum Valider
    Réponses: 6
    Dernier message: 04/05/2005, 12h48
  5. [XSLT] Générer un HTML avec du FO
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/04/2005, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo