From 1e9e1ef04bc999283f02c8a84a3dc97b097713b2 Mon Sep 17 00:00:00 2001 From: Ryan Brandt Date: Mon, 12 Oct 2015 14:24:46 -0600 Subject: [PATCH] Add detection args to the apache plugin Add the option to specify url, user, and password via args to the plugin Also, add option to specify config file location Change-Id: I3faf2acd6cb5d2ce4860e8cc1f12d2feb1877e66 --- monasca_setup/detection/plugins/apache.py | 67 ++++++++++++++--------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/monasca_setup/detection/plugins/apache.py b/monasca_setup/detection/plugins/apache.py index 04965533..40bdbae6 100644 --- a/monasca_setup/detection/plugins/apache.py +++ b/monasca_setup/detection/plugins/apache.py @@ -7,8 +7,9 @@ import monasca_setup.detection log = logging.getLogger(__name__) -apache_conf = '/root/.apache.cnf' +DEFAULT_APACHE_CONFIG = '/root/.apache.cnf' DEFAULT_APACHE_URL = 'http://localhost/server-status?auto' +CONFIG_ARG_KEYS = set(["url", "user", "password"]) class Apache(monasca_setup.detection.Plugin): @@ -32,6 +33,30 @@ class Apache(monasca_setup.detection.Plugin): if monasca_setup.detection.find_process_cmdline('apache2') is not None: self.available = True + def _read_apache_config(self, config_location): + # Read the apache config file to extract the needed variables. + client_section = False + apache_url = None + apache_user = None + apache_pass = None + try: + with open(config_location, "r") as config_file: + for row in config_file: + if "[client]" in row: + client_section = True + continue + if client_section: + if "url=" in row: + apache_url = row.split("=")[1].strip() + if "user=" in row: + apache_user = row.split("=")[1].strip() + if "password=" in row: + apache_pass = row.split("=")[1].strip() + except IOError: + log.warn("\tUnable to read {:s}".format(config_location)) + + return apache_url, apache_user, apache_pass + def build_config(self): """Build the config as a Plugins object and return. @@ -45,34 +70,22 @@ class Apache(monasca_setup.detection.Plugin): # Attempt login, requires either an empty root password from localhost # or relying on a configured /root/.apache.cnf if self.dependencies_installed(): - log.info( - "\tAttempting to use client credentials from {:s}".format(apache_conf)) - # Read the apache config file to extract the needed variables. - client_section = False - apache_url = None - apache_user = None - apache_pass = None - try: - with open(apache_conf, "r") as confFile: - for row in confFile: - if "[client]" in row: - client_section = True - pass - if client_section: - if "url=" in row: - apache_url = row.split("=")[1].strip() - if "user=" in row: - apache_user = row.split("=")[1].strip() - if "password=" in row: - apache_pass = row.split("=")[1].strip() - except IOError: - log.info("\tUnable to read {:s}".format(apache_conf)) - log.info("\tWill try to setup Apache plugin using defaults.") + # If any of the exact keys are present, use them. + if self.args and self.args.viewkeys() & CONFIG_ARG_KEYS: + log.info("Attempting to use credentials from command args") + apache_url = self.args.get("url", None) + apache_user = self.args.get("user", None) + apache_pass = self.args.get("password", None) + elif self.args and self.args.get("apache_config_file"): + config_file = self.args.get("apache_config_file") + apache_url, apache_user, apache_pass = self._read_apache_config(config_file) + else: + apache_url, apache_user, apache_pass = self._read_apache_config(DEFAULT_APACHE_CONFIG) if not apache_url: + log.warn("No url specified, using default url {:s}".format(DEFAULT_APACHE_URL)) apache_url = DEFAULT_APACHE_URL - opener = None if apache_user and apache_pass: password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, @@ -88,7 +101,6 @@ class Apache(monasca_setup.detection.Plugin): opener = urllib2.build_opener(handler) - response = None try: request = opener.open(apache_url) response = request.read() @@ -105,7 +117,8 @@ class Apache(monasca_setup.detection.Plugin): except urllib2.URLError as e: log.error('\tError {0} received when accessing url {1}.'.format(e.reason, apache_url) + '\n\tPlease ensure the Apache web server is running and your configuration ' + - 'information in /root/.apache.cnf is correct.' + error_msg) + 'information is correct.' + error_msg) + # TODO(Ryan Brandt) this exception code is unreachable, will be caught by superclass URLError above except urllib2.HTTPError as e: log.error('\tError code {0} received when accessing {1}'.format(e.code, apache_url) + error_msg) else: