From 8841eece9470744d4fe541611bcbb667ce473515 Mon Sep 17 00:00:00 2001 From: Vitali Kari Date: Sun, 13 Nov 2016 20:46:05 +0100 Subject: [PATCH] feature: Adds support for enabling / disabling modules per OS (#4963) * fixes #4946 first try, should be checked first only discovery first * add OS modules status indication * add debug output add os poller module support * fix some whitespaces * fix missing semicolon * fix some whitespaces * Modify the modules page It now shows unset for unset device settings. Also, `$os_module_status = $config['os'][$device['os']]['poller_modules'][$module];` doesn't work like you would expect. Fix that behavior. * Fix mangled tabs * optimize debug output add docs * text highlighting * Streamline docs #1 * Update docs * Spell out Global, OS, Device. --- doc/Support/Discovery Support.md | 14 +++++++++ doc/Support/Poller Support.md | 14 +++++++++ html/pages/device/edit/modules.inc.php | 40 +++++++++++++++++++++++--- includes/discovery/functions.inc.php | 13 +++++++-- includes/polling/functions.inc.php | 15 ++++++++-- 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/doc/Support/Discovery Support.md b/doc/Support/Discovery Support.md index 8034a3ce65..1cb845c4d4 100644 --- a/doc/Support/Discovery Support.md +++ b/doc/Support/Discovery Support.md @@ -88,6 +88,20 @@ $config['discovery_modules']['services'] = 1; $config['discovery_modules']['charge'] = 1; ``` +#### OS based Discovery config + +You can enable or disable modules for a specific OS by add corresponding line in `includes/definitions.inc.php` +OS based settings have preference over global. Device based settings have preference over all others + +Discover performance improvement can be achieved by deactivating all modules that are not supported by specific OS. + +E.g. to deactivate spanning tree but activate discovery-arp module for linux OS + +```php +$config['os']['linux']['discovery_modules']['stp'] = 0; +$config['os']['linux']['discovery_modules']['discovery-arp'] = 1; +``` + #### Discovery modules `os`: Os detection. This module will pick up the OS of the device. diff --git a/doc/Support/Poller Support.md b/doc/Support/Poller Support.md index a906b246ef..3d98254553 100644 --- a/doc/Support/Poller Support.md +++ b/doc/Support/Poller Support.md @@ -76,6 +76,20 @@ $config['poller_modules']['cisco-asa-firewall'] = 1; $config['poller_modules']['mib'] = 0; ``` +#### OS based Poller config + +You can enable or disable modules for a specific OS by add corresponding line in `includes/definitions.inc.php` +OS based settings have preference over global. Device based settings have preference over all others + +Poller performance improvement can be achieved by deactivating all modules that are not supported by specific OS. + +E.g. to deactivate spanning tree but activate unix-agent module for linux OS + +```php +$config['os']['linux']['poller_modules']['stp'] = 0; +$config['os']['linux']['poller_modules']['unix-agent'] = 1; +``` + #### Poller modules `unix-agent`: Enable the check_mk agent for external support for applications. diff --git a/html/pages/device/edit/modules.inc.php b/html/pages/device/edit/modules.inc.php index 659e810011..42e176a685 100644 --- a/html/pages/device/edit/modules.inc.php +++ b/html/pages/device/edit/modules.inc.php @@ -13,6 +13,7 @@ Module Global + OS Device @@ -33,6 +34,22 @@ foreach ($poller_modules as $module => $module_status) { echo('Disabled'); } + echo(' + + '); + + if (isset($config['os'][$device['os']]['poller_modules'][$module])) { + if ($config['os'][$device['os']]['poller_modules'][$module]) { + echo('Enabled'); + $module_status = 1; + } else { + echo('Disabled'); + $module_status = 0; + } + } else { + echo('Unset'); + } + echo(' @@ -47,11 +64,10 @@ foreach ($poller_modules as $module => $module_status) { $module_checked = ''; } } else { + echo('Unset'); if ($module_status == 1) { - echo('Enabled'); $module_checked = 'checked'; } else { - echo('Disabled'); $module_checked = ''; } } @@ -78,6 +94,7 @@ foreach ($poller_modules as $module => $module_status) { Module Global + OS Device @@ -101,6 +118,22 @@ foreach ($discovery_modules as $module => $module_status) { echo('Disabled'); } + echo(' + + '); + + if (isset($config['os'][$device['os']]['discovery_modules'][$module])) { + if ($config['os'][$device['os']]['discovery_modules'][$module]) { + echo('Enabled'); + $module_status = 1; + } else { + echo('Disabled'); + $module_status = 0; + } + } else { + echo('Unset'); + } + echo(' '); @@ -114,11 +147,10 @@ foreach ($discovery_modules as $module => $module_status) { $module_checked = ''; } } else { + echo('Unset'); if ($module_status == 1) { - echo('Enabled'); $module_checked = 'checked'; } else { - echo('Disabled'); $module_checked = ''; } } diff --git a/includes/discovery/functions.inc.php b/includes/discovery/functions.inc.php index 530331f09a..74aa279d2e 100644 --- a/includes/discovery/functions.inc.php +++ b/includes/discovery/functions.inc.php @@ -135,9 +135,16 @@ function discover_device($device, $options = null) } } foreach ($config['discovery_modules'] as $module => $module_status) { - if ($force_module === true || $attribs['discover_' . $module] || ( $module_status && !isset($attribs['discover_' . $module]))) { + $os_module_status = $config['os'][$device['os']]['discovery_modules'][$module]; + d_echo("Modules status: Global" . (isset($module_status) ? ($module_status ? '+ ' : '- ') : ' ')); + d_echo("OS" . (isset($os_module_status) ? ($os_module_status ? '+ ' : '- ') : ' ')); + d_echo("Device" . (isset($attribs['discover_' . $module]) ? ($attribs['discover_' . $module] ? '+ ' : '- ') : ' ')); + if ($force_module === true || + $attribs['discover_' . $module] || + ($os_module_status && !isset($attribs['discover_' . $module])) || + ($module_status && !isset($os_module_status) && !isset($attribs['discover_' . $module]))) { $module_start = microtime(true); - echo "#### Load disco module $module ####\n"; + echo "\n#### Load disco module $module ####\n"; include "includes/discovery/$module.inc.php"; $module_time = microtime(true) - $module_start; $module_time = substr($module_time, 0, 5); @@ -145,6 +152,8 @@ function discover_device($device, $options = null) echo "#### Unload disco module $module ####\n\n"; } elseif (isset($attribs['discover_' . $module]) && $attribs['discover_' . $module] == '0') { echo "Module [ $module ] disabled on host.\n\n"; + } elseif (isset($os_module_status) && $os_module_status == '0') { + echo "Module [ $module ] disabled on os.\n\n"; } else { echo "Module [ $module ] disabled globally.\n\n"; } diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index eecdea46ab..a59df48c60 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -247,7 +247,14 @@ function poll_device($device, $options) } } foreach ($config['poller_modules'] as $module => $module_status) { - if ($force_module === true || $attribs['poll_'.$module] || ( $module_status && !isset($attribs['poll_'.$module]))) { + $os_module_status = $config['os'][$device['os']]['poller_modules'][$module]; + d_echo("Modules status: Global" . (isset($module_status) ? ($module_status ? '+ ' : '- ') : ' ')); + d_echo("OS" . (isset($os_module_status) ? ($os_module_status ? '+ ' : '- ') : ' ')); + d_echo("Device" . (isset($attribs['poll_' . $module]) ? ($attribs['poll_' . $module] ? '+ ' : '- ') : ' ')); + if ($force_module === true || + $attribs['poll_'.$module] || + ($os_module_status && !isset($attribs['poll_'.$module])) || + ($module_status && !isset($os_module_status) && !isset($attribs['poll_' . $module]))) { $module_start = 0; $module_time = 0; $module_start = microtime(true); @@ -274,9 +281,11 @@ function poll_device($device, $options) unlink($oldrrd); } } elseif (isset($attribs['poll_'.$module]) && $attribs['poll_'.$module] == '0') { - echo "Module [ $module ] disabled on host.\n"; + echo "Module [ $module ] disabled on host.\n\n"; + } elseif (isset($os_module_status) && $os_module_status == '0') { + echo "Module [ $module ] disabled on os.\n\n"; } else { - echo "Module [ $module ] disabled globally.\n"; + echo "Module [ $module ] disabled globally.\n\n"; } }