Files
monasca-agent/monasca_setup/detection/utils.py
Joe Keen 1ded0b7b1c Fixing flake8 errors now that tox is working again
Change-Id: Id34991711c57f20922f003928008143032723af3
2015-07-30 14:47:02 -06:00

121 lines
3.7 KiB
Python

""" Util functions to assist in detection.
"""
import logging
import subprocess
from subprocess import CalledProcessError
from subprocess import PIPE
from subprocess import Popen
import psutil
from monasca_setup import agent_config
log = logging.getLogger(__name__)
# check_output was introduced in python 2.7, function added
# to accommodate python 2.6
try:
check_output = subprocess.check_output
except AttributeError:
def check_output(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
process = Popen(stdout=PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return output
def find_process_cmdline(search_string):
"""Simple function to search running process for one with cmdline containing.
"""
for process in psutil.process_iter():
try:
for arg in process.cmdline():
if arg.find(search_string) != -1:
return process
except psutil.NoSuchProcess:
continue
return None
def find_process_name(pname):
"""Simple function to search running process for one with pname.
"""
for process in psutil.process_iter():
try:
if pname == process.name():
return process
except psutil.NoSuchProcess:
continue
return None
def find_addr_listening_on_port(port):
"""Return the IP address which is listening on the specified TCP port."""
for conn in psutil.net_connections(kind='tcp'):
if conn.laddr[1] == port and conn.status == psutil.CONN_LISTEN:
return conn.laddr[0].lstrip("::ffff:")
def watch_process(search_strings, service=None, component=None, exact_match=True, detailed=False):
"""Takes a list of process search strings and returns a Plugins object with the config set.
This was built as a helper as many plugins setup process watching
"""
config = agent_config.Plugins()
parameters = {'name': search_strings[0],
'detailed': detailed,
'exact_match': exact_match,
'search_string': search_strings}
dimensions = _get_dimensions(service, component)
if len(dimensions) > 0:
parameters['dimensions'] = dimensions
config['process'] = {'init_config': None,
'instances': [parameters]}
return config
def service_api_check(name, url, pattern, service=None, component=None):
"""Setup a service api to be watched by the http_check plugin.
"""
config = agent_config.Plugins()
parameters = {'name': name,
'url': url,
'match_pattern': pattern,
'timeout': 10,
'use_keystone': True}
dimensions = _get_dimensions(service, component)
if len(dimensions) > 0:
parameters['dimensions'] = dimensions
config['http_check'] = {'init_config': None,
'instances': [parameters]}
return config
def _get_dimensions(service, component):
dimensions = {}
# If service parameter is set in the plugin config, add the service dimension which
# will override the service in the agent config
if service:
dimensions.update({'service': service})
# If component parameter is set in the plugin config, add the component dimension which
# will override the component in the agent config
if component:
dimensions.update({'component': component})
return dimensions