]> Frank Brehm's Git Trees - my-stuff/nagios.git/commitdiff
Umstrukturierung
authorFrank Brehm <frank@brehm-online.com>
Sat, 27 Nov 2010 23:58:13 +0000 (23:58 +0000)
committerFrank Brehm <frank@brehm-online.com>
Sat, 27 Nov 2010 23:58:13 +0000 (23:58 +0000)
git-svn-id: http://svn.brehm-online.com/svn/my-stuff/nagios/trunk@135 ec8d2aa5-1599-4edb-8739-2b3a1bc399aa

bin/nagios/config/__init__.py [new file with mode: 0755]
bin/nagios/config/struct.py [new file with mode: 0755]

diff --git a/bin/nagios/config/__init__.py b/bin/nagios/config/__init__.py
new file mode 100755 (executable)
index 0000000..58e5493
--- /dev/null
@@ -0,0 +1,4 @@
+#!/usr/bin/python
+
+
+# vim: fileencoding=utf-8 filetype=python ts=4
diff --git a/bin/nagios/config/struct.py b/bin/nagios/config/struct.py
new file mode 100755 (executable)
index 0000000..cc6cc36
--- /dev/null
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# $Id$
+# $URL$
+
+import os
+import re
+
+from nagios.object.verify import NagiosVerifyError, NagiosObjectVerifier
+
+class NagiosConfigStructError(Exception):
+    """Base class for exceptions in this module."""
+    pass
+
+class NagiosConfigStruct(object):
+    """Capsulating class for handling with nagios object structures."""
+
+    #------------------------------------------------------
+    def __repr__( self ):
+        "Dumper of hitself"
+
+        dump = {}
+
+        return repr(dump)
+
+    #------------------------------------------------------
+    def __init__( self, logger = None ):
+        "Constructor."
+
+        # Logging-Setup
+        if logger is None:
+
+            self.logger = logging.getLogger('nagiosConfig')
+            self.logger.setLevel(logging.DEBUG)
+
+            ch = logging.StreamHandler()
+            ch.setLevel(logging.DEBUG)
+
+            formatter = logging.Formatter("%(name)s - %(funcName)s(%(lineno)d) - %(levelname)s - %(message)s")
+            ch.setFormatter(formatter)
+
+            self.logger.addHandler(ch)
+
+        else:
+            self.logger = logger
+
+    #------------------------------------------------------
+    def __del__( self ):
+        "Destructor"
+
+        self.logger.debug( "Mayday - someone destroys me!!" )
+
+    #------------------------------------------------------
+    def get_valid_object_types( self ):
+        """Returns a set with all valid Nagios object types"""
+
+        return set( {
+            'host',
+            'hostgroup',
+            'service',
+            'servicegroup',
+            'contact',
+            'contactgroup',
+            'timeperiod',
+            'command',
+            'servicedependency',
+            'serviceescalation',
+            'hostdependency',
+            'hostescalation',
+            'hostextinfo',
+            'serviceextinfo',
+        } )
+
+    #------------------------------------------------------
+    def get_object_identifier_name( self, object_type ):
+        """Returns an ordered list withe the names of the identifiers of the given object_type."""
+
+        if object_type == 'host':
+            return [ 'host_name' ]
+
+        if object_type == 'hostgroup':
+            return [ 'hostgroup_name' ]
+
+        if object_type == 'service':
+            return [ 'host_name', 'service_description' ]
+
+        if object_type == 'servicegroup':
+            return [ 'servicegroup_name' ]
+
+        if object_type == 'contact':
+            return [ 'contact_name' ]
+
+        if object_type == 'contactgroup':
+            return [ 'contactgroup_name' ]
+
+        if object_type == 'timeperiod':
+            return [ 'timeperiod_name' ]
+
+        if object_type == 'timeperiod':
+            return [ 'timeperiod_name' ]
+
+        if object_type == 'command':
+            return [ 'command_name' ]
+
+        if object_type == 'servicedependency':
+            return [ 'dependent_host_name', 'dependent_service_description', 'host_name', 'service_description' ]
+
+        if object_type == 'serviceescalation':
+            return [ 'host_name', 'service_description', 'first_notification' ]
+
+        if object_type == 'hostdependency':
+            return [ 'dependent_host_name', 'host_name' ]
+
+        if object_type == 'hostescalation':
+            return [ 'host_name', 'first_notification' ]
+
+        if object_type == 'hostextinfo':
+            return [ 'host_name' ]
+
+        if object_type == 'serviceextinfo':
+            return [ 'host_name', 'service_description' ]
+
+        raise NagiosConfigStructError( "Object type {0!r} is invalid.".format( object_type ) ) 
+
+    #------------------------------------------------------
+    def check_line_syntax( self, line, object_type, file, rownum ):
+        """Verifying a given line as a property of a Nagios object of given object type."""
+
+        # Check for some strange timeperiod definitions
+        if object_type == 'timeperiod':
+            result = self.check_timeperiod_line_syntax( line )
+            if result is not None:
+                return result
+
+        # Split line into key and value
+        match = re.search( r'^\s*(\w+)\s+(.*)', line )
+        if match is None:
+            raise NagiosConfigStructError( "Couldn't evaluate line {0!r}.".format( line ) )
+
+        key = match.group(1)
+        value = match.group(2)
+
+        # User defined definitions
+        if re.match( r'^_', key ):
+            key_upper = key.upper()
+            return ( key_upper, value )
+
+        verifier = NagiosObjectVerifier( logger = logger )
+        res = None
+        args = dict( file = file, row = rownum )
+
+        # Generic properties for inheritance
+        generic_property = dict(
+            'name'     = 'string',
+            'use'      = 'array',
+            'register' = 'bool',
+        )
+
+        if key in generic_property:
+            try:
+                res = verifier.verify_property( value, generic_property[key], args )
+                return ( key, res )
+            except NagiosVerifyError as e:
+                raise NagiosConfigStructError( "Property error for {0} definition: {1}".format( object_type, e ) )
+
+
+        return ( key, value )
+
+    #------------------------------------------------------
+    def get_key_checktype( self, key, object_type ):
+        """Returns the checktype and some check parameters of the given key
+dependend to the given object_type.
+Returns None if the key is invalid."""
+
+        key_def = dict(
+            'host' = dict(
+                'host_name'                    = ( 'string',   None ),
+                'alias'                        = ( 'string',   None ), 
+                'display_name'                 = ( 'string',   None ),
+                'address'                      = ( 'string',   None ),
+                'parents'                      = ( 'array',    None ),
+                'hostgroups'                   = ( 'array',    None ),
+                'check_command'                = ( 'string',   None ),
+                'initial_state'                = ( 'set',      dict( valid_values = set( [ 'o', 'd', 'u' ] ) ) ),
+                'max_check_attempts'           = ( 'int',      None ),
+                'check_interval'               = ( 'int',      None ),
+                'retry_interval'               = ( 'int',      None ),
+                'active_checks_enabled'        = ( 'bool',     None ),
+                'passive_checks_enabled'       = ( 'bool',     None ),
+                'check_period'                 = ( 'string',   None ),
+                'obsess_over_host'             = ( 'bool',     None ),
+                'check_freshness'              = ( 'bool',     None ),
+                'freshness_threshold'          = ( 'int',      None ),
+                'event_handler'                = ( 'string',   None ),
+                'event_handler_enabled'        = ( 'bool',     None ),
+                'low_flap_threshold'           = ( 'int',      None ),
+                'high_flap_threshold'          = ( 'int',      None ),
+                'flap_detection_enabled'       = ( 'bool',     None ),
+                'flap_detection_options'       = ( 'set',      dict( valid_values = set( [ 'o', 'd', 'u' ] ) ) ),
+                'process_perf_data'            = ( 'bool',     None ),
+                'retain_status_information'    = ( 'bool',     None ),
+                'retain_nonstatus_information' = ( 'bool',     None ),
+                'contacts'                     = ( 'array',    None ),
+                'contact_groups'               = ( 'array',    None ),
+                'notification_interval'        = ( 'int',      None ),
+                'first_notification_delay'     = ( 'int',      None ),
+                'notification_period'          = ( 'string',   None ),
+                'notification_options'         = ( 'set',      dict( valid_values = set( [ 'd', 'u', 'r', 'f', 's' ] ) ) ),
+                'notifications_enabled'        = ( 'bool',     None ),
+                'stalking_options'             = ( 'set',      dict( valid_values = set( [ 'o', 'd', 'u' ] ) ) ),
+                'notes'                        = ( 'string',   None ),
+                'notes_url'                    = ( 'string',   None ),
+                'action_url'                   = ( 'string',   None ),
+                'icon_image'                   = ( 'string',   None ),
+                'icon_image_alt'               = ( 'string',   None ),
+                'vrml_image'                   = ( 'string',   None ),
+                'statusmap_image'              = ( 'string',   None ),
+                '2d_coords'                    = ( 'intarray', dict( count_min = 2, count_max = 2 ) ),
+                '3d_coords'                    = ( 'intarray', dict( count_min = 3, count_max = 3 ) ),
+            ),
+        )
+        
+        if object_type not in key_def:
+            return None
+
+        if key not in key_def[object_type]:
+            return None
+
+        return key_def[object_type][key]
+
+    #------------------------------------------------------
+    def check_timeperiod_line_syntax( self, line ):
+        """Verifies the line against a possible timeperiod definition,
+returns a key/value pair on success,
+returns None on failure"""
+
+        # Currently only a stub
+        return None
+
+    #------------------------------------------------------
+
+# vim: fileencoding=utf-8 filetype=python ts=4 expandtab