summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interface-definitions/wireguard.xml2
-rwxr-xr-xsrc/op_mode/powerctrl.py237
2 files changed, 128 insertions, 111 deletions
diff --git a/interface-definitions/wireguard.xml b/interface-definitions/wireguard.xml
index 5e9c41ace..51876d6d6 100644
--- a/interface-definitions/wireguard.xml
+++ b/interface-definitions/wireguard.xml
@@ -29,7 +29,7 @@
</valueHelp>
<multi/>
<constraint>
- <validator name="interface-address"/>
+ <validator name="ip-prefix"/>
</constraint>
</properties>
</leafNode>
diff --git a/src/op_mode/powerctrl.py b/src/op_mode/powerctrl.py
index 8a66b3afd..5a0345fbf 100755
--- a/src/op_mode/powerctrl.py
+++ b/src/op_mode/powerctrl.py
@@ -2,141 +2,158 @@
import os
import sys
import argparse
+import subprocess
from datetime import datetime, timedelta, time as type_time, date as type_date
-from subprocess import check_output,CalledProcessError,STDOUT
+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")
+ 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:
- return datetime.strptime(s, "%H:%M").time()
- except ValueError:
- return None
+ try:
+ return datetime.strptime(s, "%H:%M").time()
+ except ValueError:
+ return None
def valid_date(s):
+ try:
+ return datetime.strptime(s, "%d%m%Y").date()
+ except ValueError:
try:
- return datetime.strptime(s, "%d%m%Y").date()
+ return datetime.strptime(s, "%d/%m/%Y").date()
except ValueError:
+ try:
+ return datetime.strptime(s, "%d.%m.%Y").date()
+ except ValueError:
try:
- return datetime.strptime(s, "%d/%m/%Y").date()
+ return datetime.strptime(s, "%d:%m:%Y").date()
except ValueError:
- try:
- return datetime.strptime(s, "%d.%m.%Y").date()
- except ValueError:
- try:
- return datetime.strptime(s, "%d:%m:%Y").date()
- except ValueError:
- return None
+ return None
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")
+ 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)
+ 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)
-
- action = "-r" if reboot else "-P"
-
- if len(time) == 0:
- cmd = check_output(["/sbin/shutdown",action,"now"],stderr=STDOUT)
- print(cmd.decode().split(",",1)[0])
- return
-
- # Try to extract date from the first argument
- if len(time) == 1:
- time = time[0].split(" ",1)
-
- if len(time) == 1:
- ts=valid_time(time[0])
- if time[0].isdigit() or valid_time(time[0]):
- cmd = check_output(["/sbin/shutdown",action,time[0]],stderr=STDOUT)
- else:
- sys.exit("Timestamp needs to be in format of 12:34")
-
- elif len(time) == 2:
- ts = valid_time(time[0])
- ds = valid_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 = check_output(["/sbin/shutdown",action,str(t2)],stderr=STDOUT)
- else:
- sys.exit("Timestamp needs to be in format of 12:34\nDatestamp in the format of DD.MM.YY")
+ 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)
+
+ action = "-r" if reboot else "-P"
+
+ if len(time) == 0:
+ ### T870 legacy reboot job support
+ chk_vyatta_based_reboots()
+ ###
+
+ cmd = check_output(["/sbin/shutdown",action,"now"],stderr=STDOUT)
+ print(cmd.decode().split(",",1)[0])
+ return
+
+ # Try to extract date from the first argument
+ if len(time) == 1:
+ time = time[0].split(" ",1)
+
+ if len(time) == 1:
+ ts = valid_time(time[0])
+ if time[0].isdigit() or valid_time(time[0]):
+ cmd = check_output(["/sbin/shutdown",action,time[0]],stderr=STDOUT)
+ else:
+ sys.exit("Timestamp needs to be in format of 12:34")
+
+ elif len(time) == 2:
+ ts = valid_time(time[0])
+ ds = valid_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 = check_output(["/sbin/shutdown",action,str(t2)],stderr=STDOUT)
else:
- sys.exit("Could not decode time and date")
+ sys.exit("Timestamp needs to be in format of 12:34\nDatestamp in the format of DD.MM.YY")
+ else:
+ sys.exit("Could not decode time and date")
- print(cmd.decode().split(",",1)[0])
+ 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()
+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/<name>.job
+ ### name is the node of scheduled the job, commit-confirm checks for that
- 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")
+ f = r'/var/run/confirm.job'
+ if os .path.exists(f):
+ jid = open(f).read().strip()
+ if jid != 0:
+ subprocess.call(['sudo', 'atrm', jid])
+ os.remove(f)
+
+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 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()
+ main()