@@ -30,6 +30,9 @@ except ImportError as e:
30
30
# Constants ====================================================================
31
31
#
32
32
33
+ SIGNALS_TO_NAMES_DICT = dict ((getattr (signal , n ), n )
34
+ for n in dir (signal ) if n .startswith ('SIG' ) and '_' not in n )
35
+
33
36
SYSLOG_IDENTIFIER = "chassisd"
34
37
35
38
CHASSIS_CFG_TABLE = 'CHASSIS_MODULE'
@@ -75,6 +78,10 @@ INVALID_IP = '0.0.0.0'
75
78
MODULE_ADMIN_DOWN = 0
76
79
MODULE_ADMIN_UP = 1
77
80
81
+ # This daemon should return non-zero exit code so that supervisord will
82
+ # restart it automatically.
83
+ exit_code = 0
84
+
78
85
#
79
86
# Helper functions =============================================================
80
87
#
@@ -366,18 +373,21 @@ class ChassisdDaemon(daemon_base.DaemonBase):
366
373
367
374
self .stop = threading .Event ()
368
375
369
- # Signal handler
376
+ # Override signal handler from DaemonBase
370
377
def signal_handler (self , sig , frame ):
371
- if sig == signal .SIGHUP :
372
- self .log_info ("Caught SIGHUP - ignoring..." )
373
- elif sig == signal .SIGINT :
374
- self .log_info ("Caught SIGINT - exiting..." )
375
- self .stop .set ()
376
- elif sig == signal .SIGTERM :
377
- self .log_info ("Caught SIGTERM - exiting..." )
378
+ FATAL_SIGNALS = [signal .SIGINT , signal .SIGTERM ]
379
+ NONFATAL_SIGNALS = [signal .SIGHUP ]
380
+
381
+ global exit_code
382
+
383
+ if sig in FATAL_SIGNALS :
384
+ exit_code = 128 + sig # Make sure we exit with a non-zero code so that supervisor will try to restart us
385
+ self .log_info ("Caught {} signal '{}' - exiting..." .format (exit_code ,SIGNALS_TO_NAMES_DICT [sig ]))
378
386
self .stop .set ()
387
+ elif sig in NONFATAL_SIGNALS :
388
+ self .log_info ("Caught signal '{}' - ignoring..." .format (SIGNALS_TO_NAMES_DICT [sig ]))
379
389
else :
380
- self .log_warning ("Caught unhandled signal '" + sig + "'" )
390
+ self .log_warning ("Caught unhandled signal '{}' - ignoring..." . format ( SIGNALS_TO_NAMES_DICT [ sig ]) )
381
391
382
392
# Run daemon
383
393
def run (self ):
@@ -421,9 +431,6 @@ class ChassisdDaemon(daemon_base.DaemonBase):
421
431
422
432
self .log_info ("Stop daemon main loop" )
423
433
424
- if config_manager is not None :
425
- config_manager .task_stop ()
426
-
427
434
# Delete all the information from DB and then exit
428
435
self .module_updater .deinit ()
429
436
@@ -435,9 +442,11 @@ class ChassisdDaemon(daemon_base.DaemonBase):
435
442
436
443
437
444
def main ():
445
+ global exit_code
438
446
chassisd = ChassisdDaemon (SYSLOG_IDENTIFIER )
439
447
chassisd .run ()
440
448
449
+ sys .exit (exit_code )
441
450
442
451
if __name__ == '__main__' :
443
452
main ()
0 commit comments