diff options
author | Bala.FA <barumuga@redhat.com> | 2014-04-16 17:07:34 +0530 |
---|---|---|
committer | Sahina Bose <sabose@redhat.com> | 2014-05-16 03:55:21 -0700 |
commit | 272b5c54c3ab0f3c7117feec2bfdeb5d62cfdead (patch) | |
tree | 225081012d0cb943127deca9cd76634062ab81c5 /plugins/network.py | |
parent | aa44342bc8ddc2e24b66542ff07118cb416fcc93 (diff) |
network: show only interfaces having IP addresses
Network plugin for Nagios provides status and performance data of
network interfaces. By default, it provides details of all the
interfaces having IP addresses
The plugin can be used to
get status of specific interface:
$ python network.py -i em1
get status except specific interface:
$ python network.py -e em1
get status of all interfaces:
$ python network.py -a
Change-Id: If3cc2e4c00c866ce1a3c839a643d63b1e23ff8ea
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1085237
Signed-off-by: Bala.FA <barumuga@redhat.com>
Reviewed-on: http://review.gluster.org/7588
Reviewed-by: Sahina Bose <sabose@redhat.com>
Tested-by: Sahina Bose <sabose@redhat.com>
Diffstat (limited to 'plugins/network.py')
-rwxr-xr-x | plugins/network.py | 151 |
1 files changed, 101 insertions, 50 deletions
diff --git a/plugins/network.py b/plugins/network.py index d25c848..c740514 100755 --- a/plugins/network.py +++ b/plugins/network.py @@ -16,71 +16,122 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # -import sadf +import sys import argparse +import ethtool +import logging + +import sadf from glusternagios import utils +_description = "Network plugin for Nagios provides status and performance " \ + "data of network interfaces. By default, it provides " \ + "details of all the interfaces having IP addresses" _sadfNetCommand = ["sadf", "-x", "--", "-n", "DEV"] +_defaultExcludeList = ['lo'] + +class InterfaceStatus: + UP = 'UP' + DOWN = 'DOWN' + + +def parse_cmdargs(): + parser = argparse.ArgumentParser(description=_description) + sadf.add_common_args(parser) -def parse_input(): - parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-e", "--exclude", action="append", - help="Parameters to be excluded") + help="exclude given interface") group.add_argument("-i", "--include", action="append", - help="Parameters to be included") - sadf.add_common_args(parser) + help="add given interface for monitoring") + group.add_argument("-a", "--all", action="store_true", default=False, + help="get status of all interfaces") + args = parser.parse_args() return args -def showNetStat(s, iface_list=None, list_type=None): - pl_op = {} - if not s: - pl_op["message"] = ("IFACE UNKNOWN") - pl_op['exit_status'] = utils.PluginStatusCode.UNKNOWN - return pl_op +def _getNetworkInterfaces(interfaces=()): + if interfaces: + devices = interfaces + else: + devices = ethtool.get_active_devices() + + info = {} + for dev in devices: + try: + info[dev] = {'ipaddr': ethtool.get_ipaddr(dev), + 'flags': ethtool.get_flags(dev)} + except IOError as e: + logging.error("unable to get ipaddr/flags for %s: %s" % (dev, e)) + info[dev] = {'ipaddr': None, + 'flags': None} + + return info + + +def _getStatMessage(stat, all=False, includes=(), excludes=()): + excludeList = _defaultExcludeList + if excludes: + excludeList += excludes + + rc = utils.PluginStatus.OK + interfaces = _getNetworkInterfaces() devNames = [] perfLines = [] - try: - for dev in s['network']['net-dev']: - if list_type == "exclude": - if dev['iface'] in iface_list: - continue - elif list_type == "include": - if dev['iface'] not in iface_list: - continue - devNames.append(dev['iface']) - perfLines.append("%s.rxpck=%s %s.txpck=%s %s.rxkB=%s %s.txkB=%s" - % (dev['iface'], dev['rxpck'], - dev['iface'], dev['txpck'], - dev['iface'], dev['rxkB'], - dev['iface'], dev['txkB'])) - except (KeyError, ValueError, TypeError) as e: - pl_op["message"] = "key: %s not found" % str(e) - pl_op["exit_status"] = utils.PluginStatusCode.UNKNOWN - return pl_op - - pl_op["message"] = ("IFACE OK: %s |%s" % (", ".join(devNames), - " ".join(perfLines))) - pl_op['exit_status'] = utils.PluginStatusCode.OK - return pl_op -if __name__ == '__main__': - args = parse_input() + for info in stat['network']['net-dev']: + ipaddr = interfaces.get(info['iface'], {}).get('ipaddr') + flags = interfaces.get(info['iface'], {}).get('flags') + if flags and (flags & ethtool.IFF_UP): + status = InterfaceStatus.UP + else: + status = InterfaceStatus.DOWN + + if includes: + if info['iface'] not in includes: + continue + elif not all: + if not ipaddr: + continue + elif info['iface'] in excludeList: + continue + + if includes and (status == InterfaceStatus.DOWN): + rc = utils.PluginStatus.WARNING + + devNames.append("%s:%s" % (info['iface'], status)) + perfLines.append("%s.rxpck=%s %s.txpck=%s %s.rxkB=%s %s.txkB=%s" + % (info['iface'], info['rxpck'], + info['iface'], info['txpck'], + info['iface'], info['rxkB'], + info['iface'], info['txkB'])) + + return (getattr(utils.PluginStatusCode, rc), + "%s: %s |%s" % (rc, + ",".join(devNames), + " ".join(perfLines))) + + +def main(): + args = parse_cmdargs() + try: - st = sadf.getLatestStat(sadf.sadfExecCmd(_sadfNetCommand), - args.interval if args.interval else 1) + stat = sadf.getLatestStat(sadf.sadfExecCmd(_sadfNetCommand), + args.interval) + (rc, msg) = _getStatMessage(stat, all=args.all, + includes=args.include, + excludes=args.exclude) + print msg + sys.exit(rc) except (sadf.SadfCmdExecFailedException, - sadf.SadfXmlErrorException) as e: - print str(e) - exit(utils.PluginStatusCode.UNKNOWN) - if args.exclude: - d = showNetStat(st, args.exclude, "exclude") - elif args.include: - d = showNetStat(st, args.include, "include") - else: - d = showNetStat(st) - print d["message"] - exit(d['exit_status']) + sadf.SadfXmlErrorException, + KeyError) as e: + logging.error("unable to get network status: %s" % e) + print "UNKNOWN" + sys.exit(utils.PluginStatusCode.UNKNOWN) + + +if __name__ == '__main__': + main() |