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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
'''This module implements a Nagios configuration generator'''
import glob
import logging
import os
import re
import socket
import Bcfg2.Server.Plugin
LOGGER = logging.getLogger('Bcfg2.Plugins.NagiosGen')
host_config_fmt = \
'''
define host{
host_name %s
alias %s
address %s
'''
class NagiosGen(Bcfg2.Server.Plugin.Plugin,
Bcfg2.Server.Plugin.Generator):
'''NagiosGen is a Bcfg2 plugin that dynamically generates
Nagios configuration file based on Bcfg2 data.'''
name = 'NagiosGen'
__version__ = '0.6'
__author__ = 'bcfg-dev@mcs.anl.gov'
def __init__(self, core, datastore):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
Bcfg2.Server.Plugin.Generator.__init__(self)
self.Entries = {'Path':
{'/etc/nagiosgen.status' : self.createhostconfig,
'/etc/nagios/nagiosgen.cfg': self.createserverconfig}}
self.client_attrib = {'encoding':'ascii',
'owner':'root',
'group':'root',
'type':'file',
'perms':'0400'}
self.server_attrib = {'encoding':'ascii',
'owner':'nagios',
'group':'nagios',
'type':'file',
'perms':'0440'}
def createhostconfig(self, entry, metadata):
'''Build host specific configuration file'''
host_address = socket.gethostbyname(metadata.hostname)
host_groups = [grp for grp in metadata.groups if \
os.path.isfile('%s/%s-group.cfg' % (self.data, grp))]
host_config = host_config_fmt % \
(metadata.hostname, metadata.hostname, host_address)
if host_groups:
host_config += ' hostgroups %s\n' % (",".join(host_groups))
if hasattr(metadata, 'Properties') and \
'NagiosGen.xml' in metadata.Properties and \
metadata.Properties['NagiosGen.xml'].data.find(metadata.hostname) \
is not None:
directives = list(metadata.Properties['NagiosGen.xml'].data.find(metadata.hostname))
for item in directives:
host_config += ' %-32s %s\n' % (item.tag, item.text)
else:
host_config += ' use default\n'
host_config += '}\n'
entry.text = host_config
[entry.attrib.__setitem__(key, value) for \
(key, value) in self.client_attrib.iteritems()]
try:
fileh = open("%s/%s-host.cfg" % \
(self.data, metadata.hostname), 'w')
fileh.write(host_config)
fileh.close()
except OSError, ioerr:
LOGGER.error("Failed to write %s/%s-host.cfg" % \
(self.data, metadata.hostname))
LOGGER.error(ioerr)
def createserverconfig(self, entry, _):
'''Build monolithic server configuration file'''
host_configs = glob.glob('%s/*-host.cfg' % self.data)
group_configs = glob.glob('%s/*-group.cfg' % self.data)
host_data = ""
group_data = ""
for host in host_configs:
hostfile = open(host, 'r')
host_data += hostfile.read()
hostfile.close()
for group in group_configs:
group_name = re.sub("(-group.cfg|.*/(?=[^/]+))", "", group)
if host_data.find(group_name) != -1:
groupfile = open(group, 'r')
group_data += groupfile.read()
groupfile.close()
entry.text = group_data + host_data
[entry.attrib.__setitem__(key, value) for \
(key, value) in self.server_attrib.iteritems()]
try:
fileh = open("%s/nagiosgen.cfg" % (self.data), 'w')
fileh.write(group_data + host_data)
fileh.close()
except OSError, ioerr:
LOGGER.error("Failed to write %s/nagiosgen.cfg" % (self.data))
LOGGER.error(ioerr)
|