|
| 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 | + |
0 commit comments