Refactored daemon base API: added Logger. (#2672)

* Refactored daemon base API: added Logger.

Signed-off-by: Nazarii Hnydyn <nazariig@mellanox.com>
This commit is contained in:
Nazarii Hnydyn 2019-04-04 16:12:59 +03:00 committed by Andriy Moroz
parent 67113ad051
commit ab2c42ea8a

View File

@ -4,82 +4,111 @@ try:
import imp
import signal
import subprocess
import os
import sys
import syslog
from swsscommon import swsscommon
except ImportError, e:
raise ImportError (str(e) + " - required module not found")
#============================= Constants =============================
#
# Constants ====================================================================
#
# Redis DB information
REDIS_HOSTNAME = 'localhost'
REDIS_PORT = 6379
REDIS_TIMEOUT_MSECS = 0
# Platform root directory inside docker
PLATFORM_ROOT_DOCKER = "/usr/share/sonic/platform"
PLATFORM_ROOT_DOCKER = '/usr/share/sonic/platform'
SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen'
HWSKU_KEY = 'DEVICE_METADATA.localhost.hwsku'
PLATFORM_KEY = 'DEVICE_METADATA.localhost.platform'
# Port config information
PORT_CONFIG = 'port_config.ini'
PORTMAP = 'portmap.ini'
EEPROM_MODULE_NAME = 'eeprom'
EEPROM_CLASS_NAME = 'board'
class DaemonBase(object):
# Redis DB information
redis_hostname = "localhost"
redis_port = 6379
redis_timeout_msecs = 0
#
# Helper functions =============================================================
#
def db_connect(db):
return swsscommon.DBConnector(db,
REDIS_HOSTNAME,
REDIS_PORT,
REDIS_TIMEOUT_MSECS)
#
# Helper classes ===============================================================
#
class Logger(object):
def __init__(self, syslog_identifier):
syslog.openlog(ident=syslog_identifier, logoption=syslog.LOG_NDELAY, facility=syslog.LOG_DAEMON)
def __del__(self):
syslog.closelog()
def log_error(self, msg, also_print_to_console=False):
syslog.syslog(syslog.LOG_ERR, msg)
if also_print_to_console:
print msg
def log_warning(self, msg, also_print_to_console=False):
syslog.syslog(syslog.LOG_WARNING, msg)
if also_print_to_console:
print msg
def log_notice(self, msg, also_print_to_console=False):
syslog.syslog(syslog.LOG_NOTICE, msg)
if also_print_to_console:
print msg
def log_info(self, msg, also_print_to_console=False):
syslog.syslog(syslog.LOG_INFO, msg)
if also_print_to_console:
print msg
def log_debug(self, msg, also_print_to_console=False):
syslog.syslog(syslog.LOG_DEBUG, msg)
if also_print_to_console:
print msg
#
# Daemon =======================================================================
#
class DaemonBase(object):
def __init__(self):
self.log_info("Starting up...")
# Register our signal handlers
signal.signal(signal.SIGHUP, self.signal_handler)
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
def __del__(self):
self.log_error("Return from daemon, exiting...")
def run(self):
raise NotImplementedError()
# ========================== Connect to DB ============================
def db_connect(self, db):
return swsscommon.DBConnector(db,
self.redis_hostname,
self.redis_port,
self.redis_timeout_msecs)
# ========================== Syslog wrappers ==========================
def log_info(self, msg):
syslog.openlog()
syslog.syslog(syslog.LOG_INFO, msg)
syslog.closelog()
def log_warning(self, msg):
syslog.openlog()
syslog.syslog(syslog.LOG_WARNING, msg)
syslog.closelog()
def log_error(self, msg):
syslog.openlog()
syslog.syslog(syslog.LOG_ERR, msg)
syslog.closelog()
#========================== Signal Handling ==========================
# Signal handler
def signal_handler(self, sig, frame):
if sig == signal.SIGHUP:
self.log_info("Caught SIGHUP - ignoring...")
return
syslog.syslog(syslog.LOG_INFO, "Caught SIGHUP - ignoring...")
elif sig == signal.SIGINT:
self.log_info("Caught SIGINT - exiting...")
syslog.syslog(syslog.LOG_INFO, "Caught SIGINT - exiting...")
sys.exit(128 + sig)
elif sig == signal.SIGTERM:
self.log_info("Caught SIGTERM - exiting...")
syslog.syslog(syslog.LOG_INFO, "Caught SIGTERM - exiting...")
sys.exit(128 + sig)
else:
self.log_warning("Caught unhandled signal '" + sig + "'")
return
syslog.syslog(syslog.LOG_WARNING, "Caught unhandled signal '" + sig + "'")
#============ Functions to load platform-specific classes ============
# Returns platform and HW SKU
# Returns platform and hwsku
def get_platform_and_hwsku(self):
try:
proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY],
@ -98,12 +127,11 @@ class DaemonBase(object):
proc.wait()
hwsku = stdout.rstrip('\n')
except OSError, e:
self.log_error("Cannot to detect platform")
raise OSError("Cannot detect platform")
raise OSError("Failed to detect platform: %s" % (str(e)))
return (platform, hwsku)
# Returns path to hwsku
# Returns path to platform and hwsku
def get_path_to_platform_and_hwsku(self):
# Get platform and hwsku
(platform, hwsku) = self.get_platform_and_hwsku()
@ -114,6 +142,21 @@ class DaemonBase(object):
return (platform_path, hwsku_path)
# Returns path to port config file
def get_path_to_port_config_file(self):
# Get platform and hwsku path
(platform_path, hwsku_path) = self.get_path_to_platform_and_hwsku()
# First check for the presence of the new 'port_config.ini' file
port_config_file_path = "/".join([hwsku_path, PORT_CONFIG])
if not os.path.isfile(port_config_file_path):
# port_config.ini doesn't exist. Try loading the legacy 'portmap.ini' file
port_config_file_path = "/".join([hwsku_path, PORTMAP])
if not os.path.isfile(port_config_file_path):
raise IOError("Failed to detect port config file: %s" % (port_config_file_path))
return port_config_file_path
# Loads platform specific psuutil module from source
def load_platform_util(self, module_name, class_name):
platform_util = None
@ -125,8 +168,7 @@ class DaemonBase(object):
module_file = "/".join([platform_path, "plugins", module_name + ".py"])
module = imp.load_source(module_name, module_file)
except IOError, e:
self.log_error("Failed to load platform module '%s': %s" % (module_name, str(e)))
return None
raise IOError("Failed to load platform module '%s': %s" % (module_name, str(e)))
try:
platform_util_class = getattr(module, class_name)
@ -136,8 +178,10 @@ class DaemonBase(object):
else:
platform_util = platform_util_class()
except AttributeError, e:
self.log_error("Failed to instantiate '%s' class: %s" % (class_name, str(e)))
return None
raise AttributeError("Failed to instantiate '%s' class: %s" % (class_name, str(e)))
return platform_util
# Runs daemon
def run(self):
raise NotImplementedError()