J'essaye d'analyser une config Nagios/Icinga pour pouvoir continuer le traitement avec Python. Comme je ne pouvais pas trouver une bibliothèque de travail pour le faire (pynag ne semble pas fonctionner du tout), j'essaye d'écrire un simple script Python en utilisant des regexes pour le faire.Parse Nagios/Icinga Config avec Python Regex
Fondamentalement, je veux obtenir de cette configfile (il utilise des onglets pour l'indentation):
define host {
address 123.123.123.123
passive_checks_enabled 1
}
define service {
service_description Crondaemon
check_command check_nrpe_1arg!check_crondaemon
}
à quelque chose comme ce tuple Python:
(
('host', ('address', '123.123.123.123'), ('passive_checks_enabled', '1')),
('service', ('service_description', 'Crondaemon'), ('check_command', 'check_nrpe_1arg!check_crondaemon'))
)
Ceci est mon plein script avec la logique d'analyse syntaxique, y compris un exemple à tester:
import re
# white spaces are tabs!
TEST_STR = """
define host {
address 123.123.123.123
passive_checks_enabled 1
}
define service {
service_description Crondaemon
check_command check_nrpe_1arg!check_crondaemon
}
"""
cfg_all_regex = re.compile(
r'define\s+(\w+)\s*\{'
'(.*?)'
'\t}',
re.DOTALL
)
# basic regex works
print(re.findall(cfg_all_regex, TEST_STR))
cfg_all_regex = re.compile(
r'define\s+(\w+)\s*{\n'
'(\t(.*)?\t(.*)?\n)*'
'\t}',
re.DOTALL
)
# more specific regex to extract all key values fails
print(re.findall(cfg_all_regex, TEST_STR))
Malheureusement, je ne peux pas obtenir l'analyse complète pour travail, il correspond toujours à tout ou rien. Pouvez-vous me donner un indice sur la façon de réparer mon regex afin de pouvoir extraire toutes les paires de valeurs clés de ma config Icinga?
Wow ne s'attendait pas à ce que cela ne puisse pas être résolu avec une simple regex. Mais votre solution fonctionne comme un charme et je pourrais compléter mon analyseur. La logique finale peut être trouvée ici: https://gist.github.com/ifischer/6e8aa105c5f644fd3803f8b41dcbe4f3 Merci beaucoup pour votre aide, m'a sauvé beaucoup de temps au violon! – ifischer
Nous venons de découvrir que [regex] (https://pypi.python.org/pypi/regex/) prend en charge des captures répétées. Peut-être qu'avec cela la solution pourrait être beaucoup simplifiée. Mais ne vaut pas les efforts pour l'instant – ifischer
Vous avez raison. Si l'installation de bibliothèques tierces est viable dans votre projet, le module regex est une meilleure option. – alvarez