%PDF- %PDF-
Direktori : /proc/thread-self/root/usr/lib/python2.7/site-packages/salt/modules/ |
Current File : //proc/thread-self/root/usr/lib/python2.7/site-packages/salt/modules/nagios.py |
# -*- coding: utf-8 -*- ''' Run nagios plugins/checks from salt and get the return as data. ''' # Import python libs from __future__ import absolute_import, print_function, unicode_literals import os import stat import logging # Import 3rd-party libs from salt.ext import six log = logging.getLogger(__name__) PLUGINDIR = '/usr/lib/nagios/plugins/' def __virtual__(): ''' Only load if nagios-plugins are installed ''' if os.path.isdir(PLUGINDIR): return 'nagios' return (False, 'The nagios execution module cannot be loaded: nagios-plugins are not installed.') def _execute_cmd(plugin, args='', run_type='cmd.retcode'): ''' Execute nagios plugin if it's in the directory with salt command specified in run_type ''' data = {} all_plugins = list_plugins() if plugin in all_plugins: data = __salt__[run_type]( '{0}{1} {2}'.format(PLUGINDIR, plugin, args), python_shell=False) return data def _execute_pillar(pillar_name, run_type): ''' Run one or more nagios plugins from pillar data and get the result of run_type The pillar have to be in this format: ------ webserver: Ping_google: - check_icmp: 8.8.8.8 - check_icmp: google.com Load: - check_load: -w 0.8 -c 1 APT: - check_apt ------- ''' groups = __salt__['pillar.get'](pillar_name) data = {} for group in groups: data[group] = {} commands = groups[group] for command in commands: # Check if is a dict to get the arguments # in command if not set the arguments to empty string if isinstance(command, dict): plugin = next(six.iterkeys(command)) args = command[plugin] else: plugin = command args = '' command_key = _format_dict_key(args, plugin) data[group][command_key] = run_type(plugin, args) return data def _format_dict_key(args, plugin): key_name = plugin args_key = args.replace(' ', '') if args != '': args_key = '_' + args_key key_name = plugin + args_key return key_name def run(plugin, args=''): ''' Run nagios plugin and return all the data execution with cmd.run CLI Example: .. code-block:: bash salt '*' nagios.run check_apt salt '*' nagios.run check_icmp '8.8.8.8' ''' data = _execute_cmd(plugin, args, 'cmd.run') return data def retcode(plugin, args='', key_name=None): ''' Run one nagios plugin and return retcode of the execution ''' data = {} # Remove all the spaces, the key must not have any space if key_name is None: key_name = _format_dict_key(args, plugin) data[key_name] = {} status = _execute_cmd(plugin, args, 'cmd.retcode') data[key_name]['status'] = status return data def run_all(plugin, args=''): ''' Run nagios plugin and return all the data execution with cmd.run_all ''' data = _execute_cmd(plugin, args, 'cmd.run_all') return data def retcode_pillar(pillar_name): ''' Run one or more nagios plugins from pillar data and get the result of cmd.retcode The pillar have to be in this format:: ------ webserver: Ping_google: - check_icmp: 8.8.8.8 - check_icmp: google.com Load: - check_load: -w 0.8 -c 1 APT: - check_apt ------- webserver is the role to check, the next keys are the group and the items the check with the arguments if needed You must to group different checks(one o more) and always it will return the highest value of all the checks CLI Example: .. code-block:: bash salt '*' nagios.retcode webserver ''' groups = __salt__['pillar.get'](pillar_name) check = {} data = {} for group in groups: commands = groups[group] for command in commands: # Check if is a dict to get the arguments # in command if not set the arguments to empty string if isinstance(command, dict): plugin = next(six.iterkeys(command)) args = command[plugin] else: plugin = command args = '' check.update(retcode(plugin, args, group)) current_value = 0 new_value = int(check[group]['status']) if group in data: current_value = int(data[group]['status']) if (new_value > current_value) or (group not in data): if group not in data: data[group] = {} data[group]['status'] = new_value return data def run_pillar(pillar_name): ''' Run one or more nagios plugins from pillar data and get the result of cmd.run The pillar have to be in this format:: ------ webserver: Ping_google: - check_icmp: 8.8.8.8 - check_icmp: google.com Load: - check_load: -w 0.8 -c 1 APT: - check_apt ------- webserver is the role to check, the next keys are the group and the items the check with the arguments if needed You have to group different checks in a group CLI Example: .. code-block:: bash salt '*' nagios.run webserver ''' data = _execute_pillar(pillar_name, run) return data def run_all_pillar(pillar_name): ''' Run one or more nagios plugins from pillar data and get the result of cmd.run_all The pillar have to be in this format:: ------ webserver: Ping_google: - check_icmp: 8.8.8.8 - check_icmp: google.com Load: - check_load: -w 0.8 -c 1 APT: - check_apt ------- webserver is the role to check, the next keys are the group and the items the check with the arguments if needed You have to group different checks in a group CLI Example: .. code-block:: bash salt '*' nagios.run webserver ''' data = _execute_pillar(pillar_name, run_all) return data def list_plugins(): ''' List all the nagios plugins CLI Example: .. code-block:: bash salt '*' nagios.list_plugins ''' plugin_list = os.listdir(PLUGINDIR) ret = [] for plugin in plugin_list: # Check if execute bit stat_f = os.path.join(PLUGINDIR, plugin) execute_bit = stat.S_IXUSR & os.stat(stat_f)[stat.ST_MODE] if execute_bit: ret.append(plugin) return ret