From 519192f0d82aa920b9870547b92d8f1a22837158 Mon Sep 17 00:00:00 2001 From: Runar Borge Date: Thu, 16 Aug 2018 20:00:43 +0200 Subject: T689: Rewritten poweroff/reboot script to use systemd-shutdownd service --- op-mode-definitions/poweroff.xml | 34 ++++++++----- op-mode-definitions/reboot.xml | 28 +++++++---- src/op_mode/powerctrl.py | 102 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 23 deletions(-) create mode 100755 src/op_mode/powerctrl.py diff --git a/op-mode-definitions/poweroff.xml b/op-mode-definitions/poweroff.xml index 07cea7927..e6cab0222 100644 --- a/op-mode-definitions/poweroff.xml +++ b/op-mode-definitions/poweroff.xml @@ -2,37 +2,45 @@ - Poweroff the system + Shutdown the system - /opt/vyatta/bin/sudo-users/vyatta-poweroff.pl --action poweroff + sudo ${vyos_op_scripts_dir}/powerctrl.py --poweroff now + - Poweroff the system without confirmation + Shutdown the system imidiently - /opt/vyatta/bin/sudo-users/vyatta-poweroff.pl --action poweroff --now + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --poweroff now - + - Cancel a pending poweroff + Cancel a pending reboot - /opt/vyatta/bin/sudo-users/vyatta-poweroff.pl --action poweroff_cancel + sudo ${vyos_op_scripts_dir}/powerctrl.py --cancel + + + Reboot in X minutes + + Minutes + + + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --poweroff '$3' + + - Poweroff at a specific time + Reboot at a specific time HH:MM - MMDDYY - midnight - noon - /opt/vyatta/bin/sudo-users/vyatta-poweroff.pl --action poweroff_at --at_time '$3' - + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --poweroff '$3' + diff --git a/op-mode-definitions/reboot.xml b/op-mode-definitions/reboot.xml index 2c5a85d95..ebdd5691a 100644 --- a/op-mode-definitions/reboot.xml +++ b/op-mode-definitions/reboot.xml @@ -4,35 +4,43 @@ Reboot the system - /opt/vyatta/bin/sudo-users/vyatta-reboot.pl --action reboot + sudo ${vyos_op_scripts_dir}/powerctrl.py --reboot now + - Reboot the system without confirmation + Reboot the system imidiently - /opt/vyatta/bin/sudo-users/vyatta-reboot.pl --action reboot --now + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --reboot now - + Cancel a pending reboot - /opt/vyatta/bin/sudo-users/vyatta-reboot.pl --action reboot_cancel + sudo ${vyos_op_scripts_dir}/powerctrl.py --cancel + + + Reboot in X minutes + + Minutes + + + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --reboot $3 + + Reboot at a specific time HH:MM - MMDDYY - midnight - noon - /opt/vyatta/bin/sudo-users/vyatta-reboot.pl --action reboot_at --at_time '$3' - + sudo ${vyos_op_scripts_dir}/powerctrl.py --yes --reboot $3 + diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py new file mode 100755 index 000000000..0200a09e8 --- /dev/null +++ b/src/op_mode/powerctrl.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +import os +import sys +import argparse +from datetime import datetime, timedelta, time as type_time, date as type_date +from subprocess import check_output,CalledProcessError,STDOUT +import re + +def yn(msg, default=False): + default_msg = "[Y/n]" if default else "[y/N]" + while True: + sys.stdout.write("%s %s " % (msg,default_msg)) + c = input().lower() + if c == '': + return default + elif c in ("y", "ye","yes"): + return True + elif c in ("n", "no"): + return False + else: + sys.stdout.write("Please respond with yes/y or no/n\n") + + +def valid_time(s): + try: + a = datetime.strptime(s, "%H:%M") + return True + except ValueError: + return False + + +def check_shutdown(): + try: + cmd = check_output(["/bin/systemctl","status","systemd-shutdownd.service"]) + #Shutodwn is scheduled + r = re.findall(r'Status: \"(.*)\"\n', cmd.decode())[0] + print(r) + except CalledProcessError as e: + #Shutdown is not scheduled + print("Shutdown is not scheduled") + +def cancel_shutdown(): + try: + cmd = check_output(["/sbin/shutdown","-c"]) + except CalledProcessError as e: + sys.exit("Error aborting shutdown: %s" % e) + +def execute_shutdown(time, reboot = True, ask=True): + if not ask: + action = "reboot" if reboot else "poweroff" + if not yn("Are you sure you want to %s this system?" % action): + sys.exit(0) + + if not (time.isdigit() or valid_time(time) or time.lower() == "now"): + sys.exit("minutes (45), valid time (12:34) or 'now' needs to be specified") + + action = "-r" if reboot else "-P" + cmd = check_output(["/sbin/shutdown",action,time],stderr=STDOUT) + + print(cmd.decode().split(",",1)[0]) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--yes", "-y", + help="dont as for shutdown", + action="store_true", + dest="yes") + action = parser.add_mutually_exclusive_group(required=True) + action.add_argument("--reboot", "-r", + help="Reboot the system", + nargs="?", + metavar="Minutes|HH:MM") + + action.add_argument("--poweroff", "-p", + help="Poweroff the system", + nargs="?", + metavar="Minutes|HH:MM") + + action.add_argument("--cancel", "-c", + help="Cancel pending shutdown", + action="store_true") + + action.add_argument("--check", + help="Check pending chutdown", + action="store_true") + args = parser.parse_args() + + try: + if args.reboot: + execute_shutdown(args.reboot, reboot=True, ask=args.yes) + if args.poweroff: + execute_shutdown(args.poweroff, reboot=False,ask=args.yes) + if args.cancel: + cancel_shutdown() + if args.check: + check_shutdown() + except KeyboardInterrupt: + sys.exit("Interrupted") + + +if __name__ == "__main__": + main() -- cgit v1.2.3