Source code for safe_reboot.safe_reboot

"""Console script for safe_reboot."""
import subprocess
import sys
import argparse
import shlex
import platform
import pwd


[docs]def get_all_user_tty_mac(): cmd = shlex.split("ps axo user,tty") out = subprocess.check_output(cmd).decode("utf-8") lines = out.strip().split('\n') lines = [x.split() for x in lines[1:]] users = dict() for line in lines: # Only consider non root and non system user ttys if line[0].startswith("_") or line[0] == 'root' or line[1] == "??": continue else: if line[0] not in users.keys(): users[line[0]] = set() users[line[0]].add(line[1]) return users
[docs]def get_all_user_tty_linux(): cmd = shlex.split("ps axno user,tty") out = subprocess.check_output(cmd).decode("utf-8") lines = out.strip().split('\n') lines = [x.split() for x in lines[1:]] users = dict() for line in lines: # Only cconsider user ids if int(line[0]) < 1000 or int(line[0]) >= 65530 or line[1] == "?": continue else: if line[0] not in users.keys(): users[line[0]] = set() users[line[0]].add(line[1]) # Assign names to users: u = dict() for key in users.keys(): user_name = pwd.getpwuid(int(key))[0] u[user_name] = users[key] return u
[docs]def is_it_safe_to_reboot(show=False): if platform.system() == 'Darwin': users = get_all_user_tty_mac() elif platform.system() == 'Linux': users = get_all_user_tty_linux() else: print("OS not supported!: {}" .format(platform.system()), file=sys.stderr) sys.exit(-1) if len(users.keys()) > 1 or show: print("Following users are active on the system:") for key in users.keys(): print("{} has {} active ttys.".format(key, len(users[key]))) if len(users.keys()) > 1: print("WARNING: It is not safe to reboot this machine. " "Other users are currently working here!") if len(users.keys()) > 1: return False else: return True
[docs]def main(): end_param = [] if '--' in sys.argv: idx = sys.argv.index('--') begin_param = sys.argv[:idx] end_param = sys.argv[idx:] end_param.pop(0) else: begin_param = sys.argv parser = argparse.ArgumentParser(description="Wrapper around reboot. Checks if other users are logged in or have active screen or tmux sessions. All arguments after '--' are passed to the reboot command.") parser.add_argument('-f', '--force', help="Force reboot", action="store_true") parser.add_argument('-s', '--show', help="Only show active users", action="store_true") parser.add_argument('-d', '--dry', help="Do not perform reboot", action="store_true") args = parser.parse_args(begin_param[1:]) """Console script for safe_reboot.""" safe = is_it_safe_to_reboot(args.show) try: if (safe or args.force) and not args.dry and not args.show: print("CAUTION! Do you really want to restart? If so type 'yes':") response = input('').lower().strip() if response == "yes": print("rebooting ...") try: subprocess.check_output(["/sbin/reboot"] + end_param) except subprocess.CalledProcessError: print("Do you have the correct permissions?", file=sys.stderr) sys.exit(-1) else: print("abort reboot") except KeyboardInterrupt: print("abort reboot") return 0
if __name__ == "__main__": sys.exit(main()) # pragma: no cover