tripleo-image-elements/elements/snmpd/files/check_proc_open_files.py
Ben Nemec 3a4ebd78eb Add +x to executable files
There are a few in the tree that don't have it and should.  This
will allow future enforcement of this to avoid files being
committed with the wrong mode set.

Change-Id: Ie22a663a230f087b678c01a16219e1c5b7e237c0
2014-03-10 15:52:51 +00:00

94 lines
3.2 KiB
Python
Executable File

#! /usr/bin/env python
# Copyright 2013 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import itertools
import shlex
import subprocess
import sys
warn_limit = 90
crit_limit = 95
crit_msg = ''
warn_msg = ''
output_msg = ''
status = {'OK': 0, 'WARNING': 1, 'CRITICAL': 2, 'UNKNOWN': 3}
def _get_open_file_limits(file_handle):
limit = 0
for line in file_handle:
if line.startswith('Max open files'):
limit = line.split()[3]
return limit
# Define an in-line generator, no temporary lists
def _split_lines(lines):
for line in lines:
yield line[0:19].strip().split()
def _get_lsof_pid_list():
# get open files limit per PID exclude any line with a TID.
lsof_cmd = shlex.split("sudo lsof -n")
lsof_proc = subprocess.Popen(lsof_cmd, stdout=subprocess.PIPE)
filtered_lines = itertools.ifilterfalse(lambda line: line[1] == 'PID',
_split_lines(lsof_proc.stdout))
filtered_by_len = itertools.ifilter(lambda line: len(line) == 2,
filtered_lines)
for cmd, pid in itertools.groupby(filtered_by_len, lambda line: line[:2]):
yield cmd, pid
for (pid_cmd, pid_number), count in _get_lsof_pid_list():
pid_count = len(list(count))
pid_limit_file = "/proc/%s/limits" % pid_number
try:
with open(pid_limit_file, 'rb') as limit_file_handle:
pid_limit = _get_open_file_limits(limit_file_handle)
except IOError:
# no limit file skip
continue
pid_usage_pct = pid_count * 100 / int(pid_limit)
if pid_usage_pct >= crit_limit:
crit_msg += ": %s/%s/%s %s" % (pid_number,
pid_count,
pid_limit,
pid_cmd)
elif pid_usage_pct >= warn_limit and pid_usage_pct < crit_limit:
warn_msg += ": %s/%s/%s %s" % (pid_number,
pid_count,
pid_limit,
pid_cmd)
# if any critical services then exit critical (include warnings)
if crit_msg:
output_msg = "Critical: pid/files/limit Proc%s\n%s" % (crit_msg,
warn_msg)
exit_code = status['CRITICAL']
# if not critical and warn not empty exit warning
if warn_msg:
output_msg = "Warning: pid/files/limit Proc%s" % warn_msg
exit_code = status['WARNING']
# All ok here
if not output_msg:
output_msg = "OK - All processes open files with in limits."
exit_code = status['OK']
print(output_msg)
sys.exit(exit_code)