summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Plugins/NagiosGen.py
blob: 30ac9398458af25c87435b7899acc56459858ac6 (plain)
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
'''This module implements a Nagios configuration generator'''

import re, os, glob, socket, logging
import Bcfg2.Server.Plugin

LOGGER = logging.getLogger('Bcfg2.Plugins.NagiosGen')
class NagiosGen(Bcfg2.Server.Plugin.Plugin):
    '''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)
        self.Entries = {'ConfigFile':
                {'/etc/nagiosgen.status'   : self.createhostconfig,
                '/etc/nagios/nagiosgen.cfg': self.createserverconfig}}
        
        self.client_attrib = {'encoding': 'ascii', 'owner':'root', \
                         'group':'root',   'perms':'0400'}
        self.server_attrib = {'encoding': 'ascii', 'owner':'nagios', \
                         'group':'nagios', 'perms':'0440'}

    def createhostconfig(self, entry, metadata):
        '''Build host specific configuration file'''
        host_address = socket.gethostbyname(metadata.hostname)
        host_groups = filter(lambda x: os.path.isfile('%s/%s-group.cfg' % \
                            (self.data, x)), metadata.groups)
        host_config = \
   'define host{\n\
    use             default\n\
    host_name       %s\n\
    alias           %s\n\
    address         %s\n' % \
        (metadata.hostname, metadata.hostname, host_address )
        if host_groups:
            host_config += ' hostgroups      %s\n' % (",".join(host_groups))
        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, metadata):
        '''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)