[lldpmgrd] Inherit DaemonBase class from sonic-py-common package (#5370)

Eliminate duplicate logging and signal handling code by inheriting from DaemonBase class in sonic-py-common package.
This commit is contained in:
Joe LeVeque 2020-09-15 10:55:55 -07:00 committed by Abhishek Dosi
parent 930526f6f8
commit c3117bc35e

View File

@ -16,11 +16,10 @@
try: try:
import os import os
import signal
import subprocess import subprocess
import sys import sys
import syslog
import os.path from sonic_py_common import daemon_base
from swsscommon import swsscommon from swsscommon import swsscommon
except ImportError as err: except ImportError as err:
raise ImportError("%s - required module not found" % str(err)) raise ImportError("%s - required module not found" % str(err))
@ -30,50 +29,7 @@ VERSION = "1.0"
SYSLOG_IDENTIFIER = "lldpmgrd" SYSLOG_IDENTIFIER = "lldpmgrd"
# ========================== Syslog wrappers ========================== class LldpManager(daemon_base.DaemonBase):
def log_debug(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_DEBUG, msg)
syslog.closelog()
def log_info(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_INFO, msg)
syslog.closelog()
def log_warning(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_WARNING, msg)
syslog.closelog()
def log_error(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_ERR, msg)
syslog.closelog()
# ========================== Signal Handling ==========================
def signal_handler(sig, frame):
if sig == signal.SIGHUP:
log_info("Caught SIGHUP - ignoring...")
return
elif sig == signal.SIGINT:
log_info("Caught SIGINT - exiting...")
sys.exit(128 + sig)
elif sig == signal.SIGTERM:
log_info("Caught SIGTERM - exiting...")
sys.exit(128 + sig)
else:
log_warning("Caught unhandled signal '" + sig + "'")
# ============================== Classes ==============================
class LldpManager(object):
""" """
Class which subscribes to notifications of changes in the PORT table of Class which subscribes to notifications of changes in the PORT table of
the Redis State database and updates LLDP configuration accordingly for the Redis State database and updates LLDP configuration accordingly for
@ -86,7 +42,9 @@ class LldpManager(object):
""" """
REDIS_TIMEOUT_MS = 0 REDIS_TIMEOUT_MS = 0
def __init__(self): def __init__(self, log_identifier):
super(LldpManager, self).__init__(log_identifier)
# Open a handle to the Config database # Open a handle to the Config database
self.config_db = swsscommon.DBConnector("CONFIG_DB", self.config_db = swsscommon.DBConnector("CONFIG_DB",
self.REDIS_TIMEOUT_MS, self.REDIS_TIMEOUT_MS,
@ -114,12 +72,16 @@ class LldpManager(object):
# Get the oper-status for the port # Get the oper-status for the port
if port_table_dict.has_key("oper_status"): if port_table_dict.has_key("oper_status"):
port_oper_status = port_table_dict.get("oper_status") port_oper_status = port_table_dict.get("oper_status")
log_info("Port name {} oper status: {}".format(port_name, port_oper_status)) self.log_info("Port name {} oper status: {}".format(port_name, port_oper_status))
return port_oper_status == "up" return port_oper_status == "up"
else: else:
return False return False
else: else:
log_error("Port '{}' not found in {} table in App DB".format(port_name, swsscommon.APP_PORT_TABLE_NAME)) # Retrieve PortInitDone entry from the Port table
(init_status, init_fvp) = port_table.get("PortInitDone")
#The initialization procedure is done, but don't have this port entry
if init_status:
self.log_error("Port '{}' not found in {} table in App DB".format(port_name, swsscommon.APP_PORT_TABLE_NAME))
return False return False
def generate_pending_lldp_config_cmd_for_port(self, port_name): def generate_pending_lldp_config_cmd_for_port(self, port_name):
@ -139,14 +101,14 @@ class LldpManager(object):
# Get the port alias. If None or empty string, use port name instead # Get the port alias. If None or empty string, use port name instead
port_alias = port_table_dict.get("alias") port_alias = port_table_dict.get("alias")
if not port_alias: if not port_alias:
log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name)) self.log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name))
port_alias = port_name port_alias = port_name
# Get the port description. If None or empty string, we'll skip this configuration # Get the port description. If None or empty string, we'll skip this configuration
port_desc = port_table_dict.get("description") port_desc = port_table_dict.get("description")
else: else:
log_error("Port '{}' not found in {} table in Config DB. Using port name instead of port alias.".format(port_name, swsscommon.CFG_PORT_TABLE_NAME)) self.log_error("Port '{}' not found in {} table in Config DB. Using port name instead of port alias.".format(port_name, swsscommon.CFG_PORT_TABLE_NAME))
port_alias = port_name port_alias = port_name
lldpcli_cmd = "lldpcli configure ports {0} lldp portidsubtype local {1}".format(port_name, port_alias) lldpcli_cmd = "lldpcli configure ports {0} lldp portidsubtype local {1}".format(port_name, port_alias)
@ -155,7 +117,7 @@ class LldpManager(object):
if port_desc: if port_desc:
lldpcli_cmd += " description '{}'".format(port_desc) lldpcli_cmd += " description '{}'".format(port_desc)
else: else:
log_info("Unable to retrieve description for port '{}'. Not adding port description".format(port_name)) self.log_info("Unable to retrieve description for port '{}'. Not adding port description".format(port_name))
# Add the command to our dictionary of pending commands, overwriting any # Add the command to our dictionary of pending commands, overwriting any
# previous pending command for this port # previous pending command for this port
@ -166,7 +128,7 @@ class LldpManager(object):
to_delete = [] to_delete = []
for (port_name, cmd) in self.pending_cmds.iteritems(): for (port_name, cmd) in self.pending_cmds.iteritems():
log_debug("Running command: '{}'".format(cmd)) self.log_debug("Running command: '{}'".format(cmd))
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@ -180,7 +142,7 @@ class LldpManager(object):
if proc.returncode == 0: if proc.returncode == 0:
to_delete.append(port_name) to_delete.append(port_name)
else: else:
log_warning("Command failed '{}': {}".format(cmd, stderr)) self.log_warning("Command failed '{}': {}".format(cmd, stderr))
# Delete all successful commands from self.pending_cmds # Delete all successful commands from self.pending_cmds
for port_name in to_delete: for port_name in to_delete:
@ -194,6 +156,13 @@ class LldpManager(object):
Subscribe to CONFIG_DB - get notified of port config changes Subscribe to CONFIG_DB - get notified of port config changes
Update LLDP configuration accordingly. Update LLDP configuration accordingly.
""" """
self.log_info("Starting up...")
if not os.geteuid() == 0:
self.log_error("Must be root to run this daemon")
print("Error: Must be root to run this daemon")
sys.exit(1)
# Set select timeout to 10 seconds # Set select timeout to 10 seconds
SELECT_TIMEOUT_MS = 1000 * 10 SELECT_TIMEOUT_MS = 1000 * 10
@ -242,21 +211,14 @@ class LldpManager(object):
# ============================= Functions ============================= # ============================= Functions =============================
def main(): def main():
log_info("Starting up...")
if not os.geteuid() == 0:
log_error("Must be root to run this daemon")
print "Error: Must be root to run this daemon"
sys.exit(1)
# Register our signal handlers
signal.signal(signal.SIGHUP, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# Instantiate a LldpManager object # Instantiate a LldpManager object
lldpmgr = LldpManager() lldpmgr = LldpManager(SYSLOG_IDENTIFIER)
# Log all messages from INFO level and higher
lldpmgr.set_min_log_priority_info()
lldpmgr.run() lldpmgr.run()
if __name__ == "__main__": if __name__ == "__main__":
main() main()