我正在尝试解析 Nagios / Icinga 配置,以便可以使用 Python 对其进行进一步处理。由于我找不到一个工作库来做到这一点(pynag似乎根本不起作用),我正在尝试使用正则表达式编写一个简单的 Python 脚本来做到这一点。
基本上我想从这个配置文件中获取(它使用标签进行缩进):
define host {
address 123.123.123.123
passive_checks_enabled 1
}
define service {
service_description Crondaemon
check_command check_nrpe_1arg!check_crondaemon
}
像这样的 Python 元组:
(
('host', ('address', '123.123.123.123'), ('passive_checks_enabled', '1')),
('service', ('service_description', 'Crondaemon'), ('check_command', 'check_nrpe_1arg!check_crondaemon'))
)
这是我的带有解析逻辑的完整脚本,包括一个测试示例:
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))
不幸的是,我无法让完整的解析工作,它总是匹配所有内容或什么都不匹配。你能给我一个提示如何修复我的正则表达式,以便我可以从我的 Icinga 配置中提取所有键值对吗?