Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[syseeprom] Add a new daemon to populate syseeprom info to state DB #25

Merged
merged 16 commits into from
Jun 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions sonic-syseepromd/scripts/syseepromd
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#!/usr/bin/env python2

'''
syseepromd
Syseeprom information gathering daemon for SONiC
This daemon will be started during the start phase of pmon container, gathering syseeprom info and write to state DB.
It will continue monitoring the state DB for the syseeprom table, if table was deleted, it will write again.
With this daemon, show syseeprom CLI will be able to get data from state DB instead of access hw or cache.
'''

try:
import signal
import threading
from sonic_daemon_base.daemon_base import DaemonBase
from sonic_daemon_base.daemon_base import Logger
from sonic_daemon_base import daemon_base
from swsscommon import swsscommon
except ImportError, e:
raise ImportError (str(e) + " - required module not found")

PLATFORM_SPECIFIC_MODULE_NAME = 'eeprom'
PLATFORM_SPECIFIC_CLASS_NAME = 'board'

EEPROM_INFO_UPDATE_PERIOD_SECS = 60

POST_EEPROM_SUCCESS = 0
ERR_PLATFORM_NOT_SUPPORT = 1
ERR_FAILED_EEPROM = 2
ERR_FAILED_UPDATE_DB = 3
ERR_INVALID_PARAMETER = 4
ERR_EEPROMUTIL_LOAD = 5

EEPROM_TABLE_NAME = 'EEPROM_INFO'
SYSLOG_IDENTIFIER = 'syseepromd'

# Global logger class instance
logger = Logger(SYSLOG_IDENTIFIER)

class DaemonSyseeprom(DaemonBase):
def __init__(self):
DaemonBase.__init__(self)

self.stop_event = threading.Event()
self.eeprom_util = None

state_db = daemon_base.db_connect(swsscommon.STATE_DB)
self.eeprom_tbl = swsscommon.Table(state_db, EEPROM_TABLE_NAME)
self.eepromtbl_keys = []

def load_eeprom_util(self):
try:
self.eeprom_util = self.load_platform_util(PLATFORM_SPECIFIC_MODULE_NAME, PLATFORM_SPECIFIC_CLASS_NAME)
except Exception as e:
logger.log_error("Failed to load eeprom utility: %s" % (str(e)), True)
sys.exit(ERR_EEPROMUTIL_LOAD)

def post_eeprom_to_db(self):
eeprom = self.eeprom_util.read_eeprom()
if eeprom is None :
logger.log_error("Failed to read eeprom")
return ERR_FAILED_EEPROM

err = self.eeprom_util.update_eeprom_db(eeprom)
if err:
logger.log_error("Failed to update eeprom info to database")
return ERR_FAILED_UPDATE_DB

self.eepromtbl_keys = self.eeprom_tbl.getKeys()

return POST_EEPROM_SUCCESS

def clear_db(self):
keys = self.eeprom_tbl.getKeys()
for key in keys:
self.eeprom_tbl._del(key)

def detect_eeprom_table_integrity(self):
keys = self.eeprom_tbl.getKeys()

if len(keys) != len(self.eepromtbl_keys):
return False

for key in self.eepromtbl_keys:
if key not in keys:
return False

return True

# Signal handler
def signal_handler(self, sig, frame):
if sig == signal.SIGHUP:
logger.log_info("Caught SIGHUP - ignoring...")
elif sig == signal.SIGINT:
logger.log_info("Caught SIGINT - exiting...")
self.stop_event.set()
elif sig == signal.SIGTERM:
logger.log_info("Caught SIGTERM - exiting...")
self.stop_event.set()
else:
logger.log_warning("Caught unhandled signal '" + sig + "'")

# Run daemon
def run(self):
logger.log_info("Starting up...")

# Load platform-specific eepromutil class
self.load_eeprom_util()

# Connect to STATE_DB and post syseeprom info to state DB
rc = self.post_eeprom_to_db()
if rc != POST_EEPROM_SUCCESS:
return rc

# Start main loop
logger.log_info("Start daemon main loop")

while not self.stop_event.wait(EEPROM_INFO_UPDATE_PERIOD_SECS):
rc = self.detect_eeprom_table_integrity()
if not rc:
logger.log_info("sys eeprom table was changed, need update")
self.clear_db()
rcs = self.post_eeprom_to_db()
if rcs != POST_EEPROM_SUCCESS:
self.stop_event.set()

logger.log_info("Stop daemon main loop")

# Delete all the information from DB and then exit
self.clear_db()

logger.log_info("Shutting down...")

#
# Main =========================================================================
#

def main():
syseepromd = DaemonSyseeprom()
syseepromd.run()

if __name__ == '__main__':
main()

29 changes: 29 additions & 0 deletions sonic-syseepromd/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from setuptools import setup

setup(
name='sonic-syseepromd',
version='1.0',
description='Syseeprom gathering daemon for SONiC',
license='Apache 2.0',
author='SONiC Team',
author_email='linuxnetdev@microsoft.com',
url='https://github.com/Azure/sonic-platform-daemons',
maintainer='Kebo Liu',
maintainer_email='kebol@mellanox.com',
scripts=[
'scripts/syseepromd',
],
classifiers=[
'Development Status :: 4 - Beta',
'Environment :: No Input/Output (Daemon)',
'Intended Audience :: Developers',
'Intended Audience :: Information Technology',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: Apache Software License',
'Natural Language :: English',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 2.7',
'Topic :: System :: Hardware',
],
keywords='sonic SONiC SYSEEPROM syseeprom SYSEEPROMD syseepromd',
)