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

Python Discussion :

comparaison dans un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut comparaison dans un fichier
    Bonjour,

    Mon tuteur de stage me demande de faire un script permettant de faire des réservations d'adresse ip. Au sein de l'entreprise, il y a plusieurs réseaux déclarés. Au final lorsqu'on lance le script on doit lui entrer un nom de groupe, chaque nom de groupe pointe vers un fichier précis. Dans ces fichiers, se trouve les adresses ip réservées. Un groupe a son propre réseau ip.

    Mon problème est que je voudrais comparer les adresses ip d'un réseau avec les adresses ip déjà réservées dans un fichier.

    Ex: ./add.py -g grp1

    grp1 pointe vers le fichier 193.49.106.0.net
    Dans ce fichier, il y a des adresses réservées :
    host laptop { hardware ethernet 01:AB:CD:EF:1A:34; fixed-address 193.49.106.1;}
    host laptop { hardware ethernet 02:AB:25:EF:1A:34; fixed-address 193.49.106.2;}
    ....

    J'ai trouvé un module (ipaddr) permettant de calculer toutes les adresses ip d'un plage.

    Et donc je voudrais comparer toutes les adresses ip d'un plage avec les adresses ip réservées dans un fichier.

    Est-ce possible? Quelqu'un aurait-il une solution?

    Merci

    PS: J'espère avoir était suffisament clair pour que vous cerniez mon problème.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour,

    C'est certainement pas bien compliqué, mais je n'ai pas tout compris.
    Citation Envoyé par kevins Voir le message
    Ex: ./add.py -g grp1
    Qu'est censé faire ce script ? Ne manque-t-il pas un argument (une adresse IP peut-être) ? Sinon pq s'appelle-t-il "add.py" ?
    Citation Envoyé par kevins Voir le message
    grp1 pointe vers le fichier 193.49.106.0.net
    Il pointe comment ? Ou se trouve la correspondance nom de groupe <--> nom de fichier ? Elle est codée en dur dans le script ou récupérée dans un autre fichier ? Et comment récupères-tu le masque de sous-réseau ? Le connais-tu également grâce au groupe ? Tous les sous-réseaux utilisent le même masque ? Ou bien tu dois le récupérer dans le fichier .net ?

    Qu'est-ce qui te pose problème exactement ? Récupérer les adresses IP dans le fichier ? Cela doit pouvoir se faire sans difficulté avec une expression régulière.

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut
    Ok je vois que je n'ai pas été assez clair

    Au final, on lance le script de cette manière :
    ./add.py -n laptop -e 00:12:FE:A1:23:B1 -g grp1

    -n: le nom de machine qui sera utilisé pour réserver l'adresse ip.
    -e: adresse mac de la machine cliente
    -g: le groupe

    Selon le groupe choisi, il pointera vers un fichier précis (grp1=193.49.106.0.net ; grp2=193.49.108.0.net...). Oui, il y aura une correspondance dans un fichier (grp1=chemin_du_fichier).

    ==> Pour récupérer le masque de sous-réseaux je ne sais pas encore comment je vais faire, il me semble que le module ipaddr peut m'aider de ce côté là.

    ==> donc non je ne connais pas le masque grâce au groupe.

    ==> Chaque réseaux utilisent des masques différents (il y a des masques standard et d'autres non)

    ==> En ce qui concerne les adresses ip. Lorsqu'on lance le script, ce dernier doit trouver la première adresse ip disponible.
    Par exemple, avec le module ipaddr, je peux calculer toutes les adresses ip de la plage 193.49.106.0 avec un masque en /24 (193.49.106.1 à 193.49.106.254) et comparer ce résultat avec les adresses ip réservées du fichier 193.49.106.0.net pour faire resortir celles qui sont libres et en attribuer une à une machine

    Et donc c'est cette comparaison que je cherches à faire

  4. #4
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut
    Personne pour éclairer ma lanterne?

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Pour récupérer les adresses IP dans le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import re
     
    dhcp_data = open(net_file).read()
    reserved = re.findall("host\s+\w+\s+\{[^\}]*?fixed-address\s+(\d+(?:\.\d+){3})", dhcp_data)
    J'ai mis un minimum de validation dans l'expression régulière, ça devrait suffire...

    Je n'ai pas la librairie ipaddr mais, en me basant sur la PEP 3144, le code pour trouver la première adresse libre devrait ressembler à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    reserved = [IPv4Address(ip) for ip in reserved] # <-- peut-être pas nécessaire
    net = IPv4Network("193.49.106.0/24")
    for ip in net:
        if ip in (net.network, net.broadcast): continue
        if ip not in reserved: break
    else:
        raise Exception("Toutes les adresses sont reservées")
    print ip, "est dispo"

  6. #6
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut
    D'accord je vais essayer de suite.

    De mon côté j'ai continué mon script. Je me suis occupé de la partie calcul des adresses IP dans une plage d'adresse donnée.

    Dans le fichier "liste", j'ai des correspondances sous cette syntaxe:

    admin : 192.168.10.0 : 255.255.254.0
    test : 194.25.78.0 : 255.255.255.0
    Mon script récupère l'adresse réseau et la stocke dans la variable "t" et dans la variable "m" pour le masque.

    liste='/home/kevin/liste'
    arg=raw_input('Entrer un nom de groupe: ')
    def ip(liste):
    objfile = open(liste,"r")
    while 1:
    line=objfile.readline()
    if(line==""):
    objfile.close()
    return False
    elif line.startswith(arg):
    objfile.close()
    return line
    res=ip(liste)
    ipa=res.split(":")
    t=ipa[1]
    m=ipa[2]


    # A partir de là, je calcule l'ensemble des adresses IP pour une plage.

    for addr in ipaddr.IPNetwork(t + '/' + m).iterhosts(): addr
    Quand j'éxécute cette boucle, il m'affiche ce message d'erreur:

    Traceback (most recent call last):
    File "<pyshell#216>", line 1, in <module>
    for addr in ipaddr.IPNetwork(t + '/' + m).iterhosts(): addr
    File "/usr/local/lib/python2.6/dist-packages/ipaddr.py", line 116, in IPNetwork
    address)
    ValueError: ' 194.254.113.0 / 255.255.255.0\n' does not appear to be an IPv4 or IPv6 network
    Je suppose que ce message apparait parce qu'il y a un espace devant le contenu de ma variable "m" (masque) (verifier par un print). Pour remédier à ce problème, j'ai fait un split de la variable "m" mais un autre message d'erreur apparait en me disant qu'il n'est pas possible de concaténer une chaine de caractère et une liste.

    Je bloque sur ce petit point, si quelqu'un a une solution ?

    Merci

Discussions similaires

  1. Comparaison dans un fichier en cours de lecture
    Par CrissCross51 dans le forum Général Python
    Réponses: 3
    Dernier message: 11/04/2011, 09h04
  2. Réponses: 6
    Dernier message: 15/05/2008, 15h20
  3. Réponses: 2
    Dernier message: 29/04/2007, 20h43
  4. [2003] comparaison dans un fichier texte
    Par souaddemaroc dans le forum VB.NET
    Réponses: 14
    Dernier message: 09/02/2007, 09h28
  5. Réponses: 4
    Dernier message: 16/12/2005, 17h43

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