check_netconnections.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/python
  2. from monitoringplugin import MonitoringPlugin
  3. import re
  4. plugin = MonitoringPlugin(pluginname='check_netconnections', tagforstatusline='NETCONNS', description='Count network connections', version='0.1')
  5. plugin.add_cmdlineoption('-p', '', 'port', 'port number', default=None)
  6. plugin.add_cmdlineoption('-t', '--tcp', 'tcp', 'count TCP connections (default)', action='store_true')
  7. plugin.add_cmdlineoption('-u', '--udp', 'udp', 'count TCP connections', action='store_true')
  8. plugin.add_cmdlineoption('-4', '', 'v4', 'count IPv4 connections (default)', action='store_true')
  9. plugin.add_cmdlineoption('-6', '', 'v6', 'count IPv6 connections', action='store_true')
  10. plugin.add_cmdlineoption('-w', '', 'warn', 'warning thresold', default='20')
  11. plugin.add_cmdlineoption('-c', '', 'crit', 'warning thresold', default='50')
  12. plugin.parse_cmdlineoptions()
  13. # Need a port number
  14. if not plugin.options.port:
  15. plugin.back2nagios(3, 'No port number specified!')
  16. else:
  17. plugin.options.port = int(plugin.options.port)
  18. # Settings defaults
  19. if not plugin.options.udp and not plugin.options.tcp:
  20. plugin.options.tcp = True
  21. if not plugin.options.v4 and not plugin.options.v6:
  22. plugin.options.v4 = True
  23. # RegExp
  24. v4match = re.compile('^\s*\d*:\s*([0-9A-Fa-f]{8}):([0-9A-Fa-f]{4})\s+([0-9A-Fa-f]{8}):([0-9A-Fa-f]{4})')
  25. v6match = re.compile('^\s*\d*:\s*([0-9A-Fa-f]{32}):([0-9A-Fa-f]{4})\s+([0-9A-Fa-f]{32}):([0-9A-Fa-f]{4})')
  26. # Prepare
  27. count = 0
  28. protos = []
  29. versions = []
  30. if plugin.options.tcp:
  31. protos.append('tcp')
  32. if plugin.options.udp:
  33. protos.append('udp')
  34. if plugin.options.v4:
  35. versions.append('')
  36. if plugin.options.v6:
  37. versions.append('6')
  38. # Go!
  39. for version in versions:
  40. if version == '6':
  41. matcher = v6match
  42. else:
  43. matcher = v4match
  44. for proto in protos:
  45. filename = '/proc/net/%s%s' % (proto, version)
  46. f = file(filename)
  47. lines = f.readlines()
  48. for line in lines:
  49. m = matcher.match(line)
  50. if m:
  51. port = int(m.group(2), 16)
  52. if port == plugin.options.port and m.group(3) not in ['00000000','00000000000000000000000000000000']:
  53. count += 1
  54. returncode = plugin.value_wc_to_returncode(count, plugin.options.warn, plugin.options.crit)
  55. plugin.add_returncode(returncode)
  56. plugin.add_output('%s network connections on port %s' % (count, plugin.options.port))
  57. plugin.format_add_performancedata('netconnections', count, '', warn=plugin.options.warn, crit=plugin.options.crit)
  58. plugin.exit()