Skip to content

Commit 84bca64

Browse files
keboliujleveque
authored andcommitted
[syseeprom] Add a new daemon to populate syseeprom info to state DB (sonic-net#25)
1 parent 366ac0e commit 84bca64

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed

sonic-syseepromd/scripts/syseepromd

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#!/usr/bin/env python2
2+
3+
'''
4+
syseepromd
5+
Syseeprom information gathering daemon for SONiC
6+
This daemon will be started during the start phase of pmon container, gathering syseeprom info and write to state DB.
7+
It will continue monitoring the state DB for the syseeprom table, if table was deleted, it will write again.
8+
With this daemon, show syseeprom CLI will be able to get data from state DB instead of access hw or cache.
9+
'''
10+
11+
try:
12+
import signal
13+
import threading
14+
from sonic_daemon_base.daemon_base import DaemonBase
15+
from sonic_daemon_base.daemon_base import Logger
16+
from sonic_daemon_base import daemon_base
17+
from swsscommon import swsscommon
18+
except ImportError, e:
19+
raise ImportError (str(e) + " - required module not found")
20+
21+
PLATFORM_SPECIFIC_MODULE_NAME = 'eeprom'
22+
PLATFORM_SPECIFIC_CLASS_NAME = 'board'
23+
24+
EEPROM_INFO_UPDATE_PERIOD_SECS = 60
25+
26+
POST_EEPROM_SUCCESS = 0
27+
ERR_PLATFORM_NOT_SUPPORT = 1
28+
ERR_FAILED_EEPROM = 2
29+
ERR_FAILED_UPDATE_DB = 3
30+
ERR_INVALID_PARAMETER = 4
31+
ERR_EEPROMUTIL_LOAD = 5
32+
33+
EEPROM_TABLE_NAME = 'EEPROM_INFO'
34+
SYSLOG_IDENTIFIER = 'syseepromd'
35+
36+
# Global logger class instance
37+
logger = Logger(SYSLOG_IDENTIFIER)
38+
39+
class DaemonSyseeprom(DaemonBase):
40+
def __init__(self):
41+
DaemonBase.__init__(self)
42+
43+
self.stop_event = threading.Event()
44+
self.eeprom_util = None
45+
46+
state_db = daemon_base.db_connect(swsscommon.STATE_DB)
47+
self.eeprom_tbl = swsscommon.Table(state_db, EEPROM_TABLE_NAME)
48+
self.eepromtbl_keys = []
49+
50+
def load_eeprom_util(self):
51+
try:
52+
self.eeprom_util = self.load_platform_util(PLATFORM_SPECIFIC_MODULE_NAME, PLATFORM_SPECIFIC_CLASS_NAME)
53+
except Exception as e:
54+
logger.log_error("Failed to load eeprom utility: %s" % (str(e)), True)
55+
sys.exit(ERR_EEPROMUTIL_LOAD)
56+
57+
def post_eeprom_to_db(self):
58+
eeprom = self.eeprom_util.read_eeprom()
59+
if eeprom is None :
60+
logger.log_error("Failed to read eeprom")
61+
return ERR_FAILED_EEPROM
62+
63+
err = self.eeprom_util.update_eeprom_db(eeprom)
64+
if err:
65+
logger.log_error("Failed to update eeprom info to database")
66+
return ERR_FAILED_UPDATE_DB
67+
68+
self.eepromtbl_keys = self.eeprom_tbl.getKeys()
69+
70+
return POST_EEPROM_SUCCESS
71+
72+
def clear_db(self):
73+
keys = self.eeprom_tbl.getKeys()
74+
for key in keys:
75+
self.eeprom_tbl._del(key)
76+
77+
def detect_eeprom_table_integrity(self):
78+
keys = self.eeprom_tbl.getKeys()
79+
80+
if len(keys) != len(self.eepromtbl_keys):
81+
return False
82+
83+
for key in self.eepromtbl_keys:
84+
if key not in keys:
85+
return False
86+
87+
return True
88+
89+
# Signal handler
90+
def signal_handler(self, sig, frame):
91+
if sig == signal.SIGHUP:
92+
logger.log_info("Caught SIGHUP - ignoring...")
93+
elif sig == signal.SIGINT:
94+
logger.log_info("Caught SIGINT - exiting...")
95+
self.stop_event.set()
96+
elif sig == signal.SIGTERM:
97+
logger.log_info("Caught SIGTERM - exiting...")
98+
self.stop_event.set()
99+
else:
100+
logger.log_warning("Caught unhandled signal '" + sig + "'")
101+
102+
# Run daemon
103+
def run(self):
104+
logger.log_info("Starting up...")
105+
106+
# Load platform-specific eepromutil class
107+
self.load_eeprom_util()
108+
109+
# Connect to STATE_DB and post syseeprom info to state DB
110+
rc = self.post_eeprom_to_db()
111+
if rc != POST_EEPROM_SUCCESS:
112+
return rc
113+
114+
# Start main loop
115+
logger.log_info("Start daemon main loop")
116+
117+
while not self.stop_event.wait(EEPROM_INFO_UPDATE_PERIOD_SECS):
118+
rc = self.detect_eeprom_table_integrity()
119+
if not rc:
120+
logger.log_info("sys eeprom table was changed, need update")
121+
self.clear_db()
122+
rcs = self.post_eeprom_to_db()
123+
if rcs != POST_EEPROM_SUCCESS:
124+
self.stop_event.set()
125+
126+
logger.log_info("Stop daemon main loop")
127+
128+
# Delete all the information from DB and then exit
129+
self.clear_db()
130+
131+
logger.log_info("Shutting down...")
132+
133+
#
134+
# Main =========================================================================
135+
#
136+
137+
def main():
138+
syseepromd = DaemonSyseeprom()
139+
syseepromd.run()
140+
141+
if __name__ == '__main__':
142+
main()
143+

sonic-syseepromd/setup.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from setuptools import setup
2+
3+
setup(
4+
name='sonic-syseepromd',
5+
version='1.0',
6+
description='Syseeprom gathering daemon for SONiC',
7+
license='Apache 2.0',
8+
author='SONiC Team',
9+
author_email='[email protected]',
10+
url='https://github.com/Azure/sonic-platform-daemons',
11+
maintainer='Kebo Liu',
12+
maintainer_email='[email protected]',
13+
scripts=[
14+
'scripts/syseepromd',
15+
],
16+
classifiers=[
17+
'Development Status :: 4 - Beta',
18+
'Environment :: No Input/Output (Daemon)',
19+
'Intended Audience :: Developers',
20+
'Intended Audience :: Information Technology',
21+
'Intended Audience :: System Administrators',
22+
'License :: OSI Approved :: Apache Software License',
23+
'Natural Language :: English',
24+
'Operating System :: POSIX :: Linux',
25+
'Programming Language :: Python :: 2.7',
26+
'Topic :: System :: Hardware',
27+
],
28+
keywords='sonic SONiC SYSEEPROM syseeprom SYSEEPROMD syseepromd',
29+
)

0 commit comments

Comments
 (0)