Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/09/2013, à 00:34

l.mery

[Résolu] Comparaison entre deux paragraphes

Salut,

Je suis débutante en Shell, j'aimerais bien votre aide.

Je dois faire un script qui va parcourir un fichier de configuration et voir si mes paramètres sont corrects en se basant sur un ensemble de préconisations.

exemple :
pour mon fichier de configuration dns named.conf
le script doit aller lire la configuration de la zone "home4" et confirmer qu'elle est correcte en faisant la comparaison avec la directive suivante :

#configuration home4 :
zone "home4.fr" {
type master;
file "/etc/bind/zones/db.home4.fr";
allow-transfer {213.186.3.120;};
};

avez- vous une idée sur la commande que je peux utiliser pour cette comparaison ?

merci par avance pour votre aide

Mer

edit modo : suppression de la mention « Urgent » du titre.

Dernière modification par l.mery (Le 28/09/2013, à 19:00)

Hors ligne

#2 Le 26/09/2013, à 01:44

nesthib

Re : [Résolu] Comparaison entre deux paragraphes

Puisqu'il s'agit de parser un fichier de configuration (c'est une opération complexe), je te conseille d'utiliser python et la bibliothèque iscpy.

Tu peux installer iscpy via PIP :

sudo apt-get install python-pip
sudo pip install iscpy

Ensuite iscpy fait (presque) tout le travail :

with open('/…/named.conf') as f:
    conf = iscpy.ParseISCString(f.read())

default_values = {'allow-transfer': {'213.186.3.120': True},
                                  'file': '"/etc/bind/zones/db.home4.fr"',
                                  'type': 'master'}

ok = False
if conf.has_key('zone "home4.fr"'):
    ok = True
    for key, value in default_values.iteritems():
        if not (conf['zone "home4.fr"'].has_key(key) and conf['zone "home4.fr"'][key] == value):
            ok = False ; break

print('fichier de configuration %s' % ('correct' if ok else 'incorrect'))

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 26/09/2013, à 04:11

nesthib

Re : [Résolu] Comparaison entre deux paragraphes

Oui, tu peux très bien faire ça avec awk, mais à moins d'y passer beaucoup de temps, tu n'auras pas un vrai parseur (ce qui est requis pour réellement vérifier que la syntaxe est correcte). La comparaison sera donc limitée. Si tu dois juste vérifier que le bloc est présent tel quel dans le fichier de conf, la solution est triviale tongue
Pour utiliser awk, il te faudra jouer avec les séparateurs d'enregistrements.

Puisqu'il semble que ta demande soit pour répondre à un exercice, je ne te donnerai pas de solution toute faite et je t'invite plutôt à essayer par toi même et à proposer ici une solution.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#4 Le 26/09/2013, à 04:38

l.mery

Re : [Résolu] Comparaison entre deux paragraphes

Ok Merci,  je travaillerai dessus et je le posterai ici une fois terminée smile

[Pour précision , ce n'est pas un exercice, c'est plutôt un projet/besoin interne dont l'objectif est de parcourir/vérifier  non seulement les fichiers de conf dns mais aussi ceux d'un grand nombre de  serveurs Postfix , dhcpd, NFS , squid...et voir si c'est conforme aux préconisations (je viens d'intégrer le service, du coup on me donne pas tous les droits sur les machines hmm ) ]

Hors ligne

#5 Le 27/09/2013, à 04:08

nesthib

Re : [Résolu] Comparaison entre deux paragraphes

Je réitère ma suggestion d'utiliser python. La plupart des distribution GNU/Linux ont python d'installé car ce langage fait partie intégrante du système, es-tu sûre que python n'est pas installé ? En ce qui concerne la bibliothèque que je te suggérait, elle n'est pas installée par défaut mais ça n 'est pas un problème, tu peux soit l'installer en tant qu'utilisateur, soit mettre le module dans le dossier de ton script. Tout ceci ne requiert pas les droits admin.

Pourquoi est-ce que j'insiste sur python ? Parce qu'il y a une différence énorme entre vérifier qu'un bloc fixe de texte est présent et vérifier que sémantiquement des instructions sont présentes. Avec un simple grep/awk/… tu pourras vérifier le premier cas, mais s'il y a de légères variations (commentaires, espaces, tabulations, ordre des lignes…) tu pourras te retrouver avec des faux négatifs. À l'inverse, un parseur analyse la « grammaire » de ton fichier de configuration et ne se souciera pas de ces variations. La question est donc d'avoir à disposition un parseur qui va analyser ton fichier de conf. Tu as plusieurs langages de haut niveau qui possèdent des bibliothèque effectuant ce travail, par exemple perl et python. Je pense que python est le plus simple d'accès si tu est débutante.

Si ton script doit être utilisé dans un véritable environnement de production, je t'assure que la méthode consistant à chercher le bloc tel quel n'est pas propre.

En ce qui concerne les autres fichiers de configuration, il te faudra vérifier le type de fichier de config et adapter en conséquence.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 27/09/2013, à 19:01

l.mery

Re : [Résolu] Comparaison entre deux paragraphes

Merci beaucoup pour toutes ces informations

Hors ligne