From afc74ce8cbc642dfd043a2dd37e5174616d4f5bf Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 26 Apr 2020 12:54:59 +0200 Subject: powerctl: T2010: reformat with autopep8 --- src/op_mode/powerctrl.py | 279 +++++++++++++++++++++++++---------------------- 1 file changed, 146 insertions(+), 133 deletions(-) (limited to 'src/op_mode/powerctrl.py') diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py index 4ab91384b..4210c3bbe 100755 --- a/src/op_mode/powerctrl.py +++ b/src/op_mode/powerctrl.py @@ -28,155 +28,168 @@ from vyos.util import STDOUT systemd_sched_file = "/run/systemd/shutdown/scheduled" -def parse_time(s): - try: - if re.match(r'^\d{1,2}$', s): - return datetime.strptime(s, "%M").time() - else: - return datetime.strptime(s, "%H:%M").time() - except ValueError: - return None -def parse_date(s): - for fmt in ["%d%m%Y", "%d/%m/%Y", "%d.%m.%Y", "%d:%m:%Y", "%Y-%m-%d"]: +def parse_time(s): try: - return datetime.strptime(s, fmt).date() + if re.match(r'^\d{1,2}$', s): + return datetime.strptime(s, "%M").time() + else: + return datetime.strptime(s, "%H:%M").time() except ValueError: - continue - # If nothing matched... - return None + return None + + +def parse_date(s): + for fmt in ["%d%m%Y", "%d/%m/%Y", "%d.%m.%Y", "%d:%m:%Y", "%Y-%m-%d"]: + try: + return datetime.strptime(s, fmt).date() + except ValueError: + continue + # If nothing matched... + return None + def get_shutdown_status(): - if os.path.exists(systemd_sched_file): - # Get scheduled from systemd file - with open(systemd_sched_file, 'r') as f: - data = f.read().rstrip('\n') - r_data = {} - for line in data.splitlines(): - tmp_split = line.split("=") - if tmp_split[0] == "USEC": - # Convert USEC to human readable format - r_data['DATETIME'] = datetime.utcfromtimestamp(int(tmp_split[1])/1000000).strftime('%Y-%m-%d %H:%M:%S') - else: - r_data[tmp_split[0]] = tmp_split[1] - return r_data - return None + if os.path.exists(systemd_sched_file): + # Get scheduled from systemd file + with open(systemd_sched_file, 'r') as f: + data = f.read().rstrip('\n') + r_data = {} + for line in data.splitlines(): + tmp_split = line.split("=") + if tmp_split[0] == "USEC": + # Convert USEC to human readable format + r_data['DATETIME'] = datetime.utcfromtimestamp( + int(tmp_split[1])/1000000).strftime('%Y-%m-%d %H:%M:%S') + else: + r_data[tmp_split[0]] = tmp_split[1] + return r_data + return None + def check_shutdown(): - output = get_shutdown_status() - if output and 'MODE' in output: - if output['MODE'] == 'reboot': - print("Reboot is scheduled", output['DATETIME']) - elif output['MODE'] == 'poweroff': - print("Poweroff is scheduled", output['DATETIME']) - else: - print("Reboot or poweroff is not scheduled") + output = get_shutdown_status() + if output and 'MODE' in output: + if output['MODE'] == 'reboot': + print("Reboot is scheduled", output['DATETIME']) + elif output['MODE'] == 'poweroff': + print("Poweroff is scheduled", output['DATETIME']) + else: + print("Reboot or poweroff is not scheduled") + def cancel_shutdown(): - output = get_shutdown_status() - if output and 'MODE' in output: - timenow = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - try: - cmd('/sbin/shutdown -c --no-wall') - except OSError as e: - sys.exit("Could not cancel a reboot or poweroff: %s" % e) - message = "Scheduled %s has been cancelled %s" % (output['MODE'], timenow) - run(f'wall {message}') - else: - print("Reboot or poweroff is not scheduled") - -def execute_shutdown(time, reboot = True, ask=True): - if not ask: - action = "reboot" if reboot else "poweroff" - if not ask_yes_no("Are you sure you want to %s this system?" % action): - sys.exit(0) - - action = "-r" if reboot else "-P" - - if len(time) == 0: - ### T870 legacy reboot job support - chk_vyatta_based_reboots() - ### - - out = cmd(f'/sbin/shutdown {action} now', stderr=STDOUT) - print(out.split(",",1)[0]) - return - elif len(time) == 1: - # Assume the argument is just time - ts = parse_time(time[0]) - if ts: - cmd(f'/sbin/shutdown {action} {time[0]}', stderr=STDOUT) + output = get_shutdown_status() + if output and 'MODE' in output: + timenow = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + try: + cmd('/sbin/shutdown -c --no-wall') + except OSError as e: + sys.exit("Could not cancel a reboot or poweroff: %s" % e) + message = "Scheduled %s has been cancelled %s" % ( + output['MODE'], timenow) + run(f'wall {message}') else: - sys.exit("Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) - elif len(time) == 2: - # Assume it's date and time - ts = parse_time(time[0]) - ds = parse_date(time[1]) - if ts and ds: - t = datetime.combine(ds, ts) - td = t - datetime.now() - t2 = 1 + int(td.total_seconds())//60 # Get total minutes - cmd('/sbin/shutdown {action} {t2}', stderr=STDOUT) + print("Reboot or poweroff is not scheduled") + + +def execute_shutdown(time, reboot=True, ask=True): + if not ask: + action = "reboot" if reboot else "poweroff" + if not ask_yes_no("Are you sure you want to %s this system?" % action): + sys.exit(0) + + action = "-r" if reboot else "-P" + + if len(time) == 0: + # T870 legacy reboot job support + chk_vyatta_based_reboots() + ### + + out = cmd(f'/sbin/shutdown {action} now', stderr=STDOUT) + print(out.split(",", 1)[0]) + return + elif len(time) == 1: + # Assume the argument is just time + ts = parse_time(time[0]) + if ts: + cmd(f'/sbin/shutdown {action} {time[0]}', stderr=STDOUT) + else: + sys.exit( + "Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) + elif len(time) == 2: + # Assume it's date and time + ts = parse_time(time[0]) + ds = parse_date(time[1]) + if ts and ds: + t = datetime.combine(ds, ts) + td = t - datetime.now() + t2 = 1 + int(td.total_seconds())//60 # Get total minutes + cmd('/sbin/shutdown {action} {t2}', stderr=STDOUT) + else: + if not ts: + sys.exit( + "Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) + else: + sys.exit( + "Invalid time \"{0}\". A valid format is YYYY-MM-DD [HH:MM]".format(time[1])) else: - if not ts: - sys.exit("Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) - else: - sys.exit("Invalid time \"{0}\". A valid format is YYYY-MM-DD [HH:MM]".format(time[1])) - else: - sys.exit("Could not decode date and time. Valids formats are HH:MM or YYYY-MM-DD HH:MM") - check_shutdown() + sys.exit( + "Could not decode date and time. Valids formats are HH:MM or YYYY-MM-DD HH:MM") + check_shutdown() + def chk_vyatta_based_reboots(): - ### T870 commit-confirm is still using the vyatta code base, once gone, the code below can be removed - ### legacy scheduled reboot s are using at and store the is as /var/run/.job - ### name is the node of scheduled the job, commit-confirm checks for that + # T870 commit-confirm is still using the vyatta code base, once gone, the code below can be removed + # legacy scheduled reboot s are using at and store the is as /var/run/.job + # name is the node of scheduled the job, commit-confirm checks for that + + f = r'/var/run/confirm.job' + if os.path.exists(f): + jid = open(f).read().strip() + if jid != 0: + call(f'sudo atrm {jid}') + os.remove(f) - f = r'/var/run/confirm.job' - if os.path.exists(f): - jid = open(f).read().strip() - if jid != 0: - call(f'sudo atrm {jid}') - os.remove(f) def main(): - parser = argparse.ArgumentParser() - parser.add_argument("--yes", "-y", - help="Do not ask for confirmation", - 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 is not None: - execute_shutdown(args.reboot, reboot=True, ask=args.yes) - if args.poweroff is not None: - execute_shutdown(args.poweroff, reboot=False,ask=args.yes) - if args.cancel: - cancel_shutdown() - if args.check: - check_shutdown() - except KeyboardInterrupt: - sys.exit("Interrupted") + parser = argparse.ArgumentParser() + parser.add_argument("--yes", "-y", + help="Do not ask for confirmation", + 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 is not None: + execute_shutdown(args.reboot, reboot=True, ask=args.yes) + if args.poweroff is not None: + 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() +if __name__ == "__main__": + main() -- cgit v1.2.3 From 748201ba9517c4ca7098025afaed98d947df2bbe Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 26 Apr 2020 13:40:23 +0200 Subject: powerctl: import less --- src/op_mode/powerctrl.py | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) (limited to 'src/op_mode/powerctrl.py') diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py index 4210c3bbe..a70418801 100755 --- a/src/op_mode/powerctrl.py +++ b/src/op_mode/powerctrl.py @@ -15,16 +15,13 @@ # along with this program. If not, see . import os -import sys -import argparse import re +from argparse import ArgumentParser from datetime import datetime, timedelta, time as type_time, date as type_date -from vyos.util import ask_yes_no -from vyos.util import cmd -from vyos.util import call -from vyos.util import run -from vyos.util import STDOUT +from sys import exit + +from vyos.util import ask_yes_no, cmd, call, run, STDOUT systemd_sched_file = "/run/systemd/shutdown/scheduled" @@ -85,7 +82,7 @@ def cancel_shutdown(): try: cmd('/sbin/shutdown -c --no-wall') except OSError as e: - sys.exit("Could not cancel a reboot or poweroff: %s" % e) + exit("Could not cancel a reboot or poweroff: %s" % e) message = "Scheduled %s has been cancelled %s" % ( output['MODE'], timenow) run(f'wall {message}') @@ -97,7 +94,7 @@ def execute_shutdown(time, reboot=True, ask=True): if not ask: action = "reboot" if reboot else "poweroff" if not ask_yes_no("Are you sure you want to %s this system?" % action): - sys.exit(0) + exit(0) action = "-r" if reboot else "-P" @@ -115,8 +112,7 @@ def execute_shutdown(time, reboot=True, ask=True): if ts: cmd(f'/sbin/shutdown {action} {time[0]}', stderr=STDOUT) else: - sys.exit( - "Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) + exit("Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) elif len(time) == 2: # Assume it's date and time ts = parse_time(time[0]) @@ -128,14 +124,11 @@ def execute_shutdown(time, reboot=True, ask=True): cmd('/sbin/shutdown {action} {t2}', stderr=STDOUT) else: if not ts: - sys.exit( - "Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) + exit("Invalid time \"{0}\". The valid format is HH:MM".format(time[0])) else: - sys.exit( - "Invalid time \"{0}\". A valid format is YYYY-MM-DD [HH:MM]".format(time[1])) + exit("Invalid time \"{0}\". A valid format is YYYY-MM-DD [HH:MM]".format(time[1])) else: - sys.exit( - "Could not decode date and time. Valids formats are HH:MM or YYYY-MM-DD HH:MM") + exit("Could not decode date and time. Valids formats are HH:MM or YYYY-MM-DD HH:MM") check_shutdown() @@ -153,7 +146,7 @@ def chk_vyatta_based_reboots(): def main(): - parser = argparse.ArgumentParser() + parser = ArgumentParser() parser.add_argument("--yes", "-y", help="Do not ask for confirmation", action="store_true", @@ -188,8 +181,7 @@ def main(): if args.check: check_shutdown() except KeyboardInterrupt: - sys.exit("Interrupted") - + exit("Interrupted") if __name__ == "__main__": main() -- cgit v1.2.3 From d6384b2014c5877cb1cc7e24b1ab2c8562c5f126 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 26 Apr 2020 13:41:32 +0200 Subject: powerctl: T2010: report reboot time in current timezone Do not inform the user when the reboot will happen in UTC, use the local timezone instead. --- src/op_mode/powerctrl.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/op_mode/powerctrl.py') diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py index a70418801..d33f8633d 100755 --- a/src/op_mode/powerctrl.py +++ b/src/op_mode/powerctrl.py @@ -20,11 +20,16 @@ import re from argparse import ArgumentParser from datetime import datetime, timedelta, time as type_time, date as type_date from sys import exit +from time import time from vyos.util import ask_yes_no, cmd, call, run, STDOUT systemd_sched_file = "/run/systemd/shutdown/scheduled" +def utc2local(datetime): + now = time() + offs = datetime.fromtimestamp(now) - datetime.utcfromtimestamp(now) + return datetime + offs def parse_time(s): try: @@ -66,11 +71,12 @@ def get_shutdown_status(): def check_shutdown(): output = get_shutdown_status() + dt = datetime.strptime(output['DATETIME'], '%Y-%m-%d %H:%M:%S') if output and 'MODE' in output: if output['MODE'] == 'reboot': - print("Reboot is scheduled", output['DATETIME']) + print("Reboot is scheduled", utc2local(dt)) elif output['MODE'] == 'poweroff': - print("Poweroff is scheduled", output['DATETIME']) + print("Poweroff is scheduled", utc2local(dt)) else: print("Reboot or poweroff is not scheduled") -- cgit v1.2.3 From c1e3de49463c7aea8e5f6dbbe6c72aa59d58362f Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 26 Apr 2020 13:48:34 +0200 Subject: powerctl: T2010: fix "wall" complaining about inapproriate ioctl wall: cannot get tty name: Inappropriate ioctl for device - script is run in the background where there is normally no tty available - silently discard this warning. --- src/op_mode/powerctrl.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/op_mode/powerctrl.py') diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py index d33f8633d..b2fb5fe5a 100755 --- a/src/op_mode/powerctrl.py +++ b/src/op_mode/powerctrl.py @@ -86,12 +86,12 @@ def cancel_shutdown(): if output and 'MODE' in output: timenow = datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: - cmd('/sbin/shutdown -c --no-wall') + run('/sbin/shutdown -c --no-wall') except OSError as e: exit("Could not cancel a reboot or poweroff: %s" % e) - message = "Scheduled %s has been cancelled %s" % ( - output['MODE'], timenow) - run(f'wall {message}') + + message = 'Scheduled {} has been cancelled {}'.format(output['MODE'], timenow) + run(f'wall {message} > /dev/null 2>&1') else: print("Reboot or poweroff is not scheduled") -- cgit v1.2.3