#!/usr/bin/env python import argparse import sys import syslog import subprocess def get_command_result(command): """Executes command and return the exit code, stdout and stderr. Args: command: A string contains the command to be executed. Returns: An integer contains the exit code. A string contains the output of stdout. A string contains the output of stderr. """ command_stdout = "" command_stderr = "" try: proc_instance = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True) command_stdout, command_stderr = proc_instance.communicate() if proc_instance.returncode != 0: return 1, command_stdout.strip(), command_stderr.strip() except (OSError, ValueError) as err: return 2, command_stdout.strip(), err return 0, command_stdout.strip(), command_stderr.strip() def reset_failed_flag(service_name): """Reset the failed status of a service. Args: service_name: Name of the service. Returns: None """ reset_failed_command = "sudo systemctl reset-failed {}.service".format(service_name) syslog.syslog(syslog.LOG_INFO, "Resetting failed status of service '{}' ..." .format(service_name)) exit_code, command_stdout, command_stderr = get_command_result(reset_failed_command) if exit_code == 0: syslog.syslog(syslog.LOG_INFO, "Succeeded to reset failed status of service '{}.service'." .format(service_name)) else: syslog.syslog(syslog.LOG_ERR, "Failed to reset failed status of service '{}'. Error: {}" .format(service_name, command_stderr)) def restart_service(service_name): """Reset the failed status of a service and then restart it. Args: service_name: Name of specified service. Returns: None. """ restart_command = "sudo systemctl restart {}.service".format(service_name) reset_failed_flag(service_name) syslog.syslog(syslog.LOG_INFO, "Restarting service '{}' ...".format(service_name)) exit_code, command_stdout, command_stderr = get_command_result(restart_command) if exit_code != 0: syslog.syslog(syslog.LOG_ERR, "Failed to restart the service '{}'. Error: {}" .format(service_name, command_stderr)) def main(): parser = argparse.ArgumentParser(description="Restart a specific service", usage="/usr/bin/restart_service ") parser.add_argument("service_name", help="service name") args = parser.parse_args() restart_service(args.service_name) if __name__ == "__main__": main()