File: //lib/fm-agent/library/maintenance.py
import aggregator
import os
import logging
import traceback
import sys
try:
import configparser
except Exception:
# Python 3
import ConfigParser as configparser
class Maintenance:
def __init__(self, brand, agg_url, version, base_config_dir, pkg_dir, debug=False):
self.brand = brand
self.agg_url = agg_url
self.version = version
self.base_config_dir = base_config_dir
self.pkg_dir = pkg_dir
self.config_dir = os.path.join(self.base_config_dir, self.pkg_dir)
self.config_file = os.path.join(self.config_dir, "%s_agent.cfg" % self.brand)
self.base_log_dir = "/var/log"
self.log_dir = os.path.join(self.base_log_dir, self.pkg_dir)
self.log_file = os.path.join(self.log_dir, "maintenance.log")
self.log = logging.getLogger()
log_format = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(log_format)
self.log.addHandler(stream_handler)
if debug:
self.log.setLevel(logging.DEBUG)
else:
self.log.setLevel(logging.INFO)
try:
handler = logging.FileHandler(self.log_file)
handler.setFormatter(log_format)
self.log.addHandler(handler)
except IOError:
self.log.error(
"Unable to reach log location %s. Please correct" % self.log_file
)
try:
self.config = configparser.RawConfigParser()
self.config.read(self.config_file)
self.server_key = self.config.get("agent", "server_key")
self.agg_url = self.config.get("agent", "aggregator_url") or self.agg_url
self.client = aggregator.Client(
self.agg_url, self.version, server_key=self.server_key
)
except Exception:
self.log.error("Error when getting config file. Exiting")
self.log.error(traceback.format_exc())
sys.exit()
def start(self, duration, metric_tags=None):
"""
Request to the aggregator that we start the maintenance on the server.
"""
self.log.info("Starting maintenance procedure.")
try:
duration = int(duration)
except (TypeError, ValueError):
self.log.warning(
"Unrecognized duration %s. Must be given in minutes. Exiting" % duration
)
sys.exit(1)
try:
response = self.client.maintenance(duration, metric_tags)
except Exception:
self.log.debug(traceback.format_exc())
self.log.info(
"There was an error performing the request. Please try again or contact support"
)
sys.exit(1)
if duration > 1:
text = "minutes"
else:
text = "minute"
self.log.info(
"This instance will go under maintenance for %s %s shortly"
% (str(duration), text)
)
sys.exit(0)
def end(self):
"""
Request to the aggregator that we end all maintenances in the server.
"""
self.log.info("Starting maintenance shutdown.")
try:
response = self.client.end_maintenance()
except Exception:
self.log.debug(traceback.format_exc())
self.log.info(
"There was an error performing the request. Please try again or contact support"
)
sys.exit(1)
self.log.info(
"Any active maintenance periods in the server will be ended immediately."
)
sys.exit(0)