From 210d45670586001e4d85b88fa3f898ff88fedd0a Mon Sep 17 00:00:00 2001
From: hagbard <vyosdev@derith.de>
Date: Wed, 10 Oct 2018 12:51:35 -0700
Subject: T870: Commit-confirm restarts the server even after commit

      - adding removal of the at job and /var/run/confirm.job
      - indent fixed
---
 src/op_mode/powerctrl.py | 237 +++++++++++++++++++++++++----------------------
 1 file changed, 127 insertions(+), 110 deletions(-)

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()
-- 
cgit v1.2.3