fork and reboot instead of just reboot; hopefully will make sure a mail
is sent from cron even if a reboot happens
This commit is contained in:
parent
b6dc7b39ea
commit
5eda3b6e85
125
bin/sau
125
bin/sau
@ -11,47 +11,7 @@ import sau
|
|||||||
import sau.services
|
import sau.services
|
||||||
import sau.platforms
|
import sau.platforms
|
||||||
|
|
||||||
|
def init():
|
||||||
def main():
|
|
||||||
conf = sau.config
|
|
||||||
log = logging.getLogger(sau.LOGNAME)
|
|
||||||
platform = sau.platforms.get_platform()
|
|
||||||
|
|
||||||
reboot_required = False
|
|
||||||
reboot_recommended = False
|
|
||||||
|
|
||||||
if conf.getboolean('default', 'do_system_upgrade', fallback=True):
|
|
||||||
reboot_required = platform.system_upgrade()
|
|
||||||
|
|
||||||
if conf.getboolean('default', 'do_package_upgrade', fallback=True):
|
|
||||||
platform.pkg_upgrade()
|
|
||||||
|
|
||||||
if conf.getboolean('default', 'do_service_restart', fallback=True):
|
|
||||||
reboot_recommended = sau.services.restart_services()
|
|
||||||
|
|
||||||
if conf.getboolean('default', 'do_reboot', fallback=False):
|
|
||||||
if reboot_required:
|
|
||||||
log.warning('Rebooting because of a system upgrade')
|
|
||||||
elif reboot_recommended:
|
|
||||||
log.warning('Rebooting because service restarts did not close all deleted files')
|
|
||||||
if reboot_required or reboot_recommended:
|
|
||||||
# sleep a little to make sure the above log-messages has reached
|
|
||||||
# syslog before we reboot
|
|
||||||
time.sleep(1)
|
|
||||||
os.system('/sbin/reboot')
|
|
||||||
|
|
||||||
def _conf_level_to_logging_level(conf_level):
|
|
||||||
if conf_level.lower() == 'debug':
|
|
||||||
return logging.DEBUG
|
|
||||||
if conf_level.lower() == 'info':
|
|
||||||
return logging.INFO
|
|
||||||
if conf_level.lower() == 'warning':
|
|
||||||
return logging.WARNING
|
|
||||||
if conf_level.lower() == 'error':
|
|
||||||
return logging.error
|
|
||||||
return logging.DEBUG
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sau.config = configparser.SafeConfigParser()
|
sau.config = configparser.SafeConfigParser()
|
||||||
conf = sau.config
|
conf = sau.config
|
||||||
|
|
||||||
@ -82,4 +42,87 @@ if __name__ == '__main__':
|
|||||||
handler.setFormatter(formatter)
|
handler.setFormatter(formatter)
|
||||||
handler.setLevel(conf_level)
|
handler.setLevel(conf_level)
|
||||||
log.addHandler(handler)
|
log.addHandler(handler)
|
||||||
|
|
||||||
|
|
||||||
|
def fork_and_reboot():
|
||||||
|
log = logging.getLogger(sau.LOGNAME)
|
||||||
|
try:
|
||||||
|
pid = os.fork()
|
||||||
|
if pid != 0:
|
||||||
|
sys.exit(0)
|
||||||
|
except OSError as err:
|
||||||
|
log.error("Fork #1 failed when going for reboot: {}".format(err))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
os.chdir('/')
|
||||||
|
os.setsid()
|
||||||
|
os.umask(0)
|
||||||
|
|
||||||
|
try:
|
||||||
|
pid = os.fork()
|
||||||
|
if pid != 0:
|
||||||
|
sys.exit(0)
|
||||||
|
except OSError as err:
|
||||||
|
log.error("Fork #2 failed when going for reboot: {}".format(err))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.flush()
|
||||||
|
stdin = open(os.devnull, 'r')
|
||||||
|
stdout = open(os.devnull, 'a+')
|
||||||
|
stderr = open(os.devnull, 'a+')
|
||||||
|
|
||||||
|
os.dup2(stdin.fileno(), sys.stdin.fileno())
|
||||||
|
os.dup2(stdout.fileno(), sys.stdout.fileno())
|
||||||
|
os.dup2(stderr.fileno(), sys.stderr.fileno())
|
||||||
|
|
||||||
|
log.warning("New fork!")
|
||||||
|
|
||||||
|
# sleep for a short while to give parent time to exit
|
||||||
|
time.sleep(30)
|
||||||
|
try:
|
||||||
|
#log.error('would reboot now')
|
||||||
|
os.execv('/sbin/reboot', ['/sbin/reboot'])
|
||||||
|
except OSError as err:
|
||||||
|
log.error('Could not reboot: {}'.format(err))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
conf = sau.config
|
||||||
|
log = logging.getLogger(sau.LOGNAME)
|
||||||
|
platform = sau.platforms.get_platform()
|
||||||
|
|
||||||
|
reboot_required = False
|
||||||
|
reboot_recommended = False
|
||||||
|
|
||||||
|
if conf.getboolean('default', 'do_system_upgrade', fallback=True):
|
||||||
|
reboot_required = platform.system_upgrade()
|
||||||
|
|
||||||
|
if conf.getboolean('default', 'do_package_upgrade', fallback=True):
|
||||||
|
platform.pkg_upgrade()
|
||||||
|
|
||||||
|
if conf.getboolean('default', 'do_service_restart', fallback=True):
|
||||||
|
reboot_recommended = sau.services.restart_services()
|
||||||
|
|
||||||
|
if conf.getboolean('default', 'do_reboot', fallback=False):
|
||||||
|
if reboot_required:
|
||||||
|
log.warning('Rebooting because of a system upgrade')
|
||||||
|
elif reboot_recommended:
|
||||||
|
log.warning('Rebooting because service restarts did not close all deleted files')
|
||||||
|
if reboot_required or reboot_recommended:
|
||||||
|
fork_and_reboot()
|
||||||
|
|
||||||
|
def _conf_level_to_logging_level(conf_level):
|
||||||
|
if conf_level.lower() == 'debug':
|
||||||
|
return logging.DEBUG
|
||||||
|
if conf_level.lower() == 'info':
|
||||||
|
return logging.INFO
|
||||||
|
if conf_level.lower() == 'warning':
|
||||||
|
return logging.WARNING
|
||||||
|
if conf_level.lower() == 'error':
|
||||||
|
return logging.error
|
||||||
|
return logging.DEBUG
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
init()
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
|
Loading…
Reference in New Issue
Block a user