#!${buildout:executable}

equeue_database = '${equeue:database}'
equeue_lockfile = '${equeue:lockfile}'
takeover_script = '${resiliency-takeover-script:wrapper-takeover}'

import cgi
import cgitb
import datetime
import gdbm
import os
import shutil
import subprocess
import sys
import tempfile
cgitb.enable()

def getLatestBackupDate():
  """
  Get the date of the latest successful backup.
  """
  # Create a copy of the db (locked by equeue process)
  temporary_directory = tempfile.mkdtemp()
  equeue_database_copy = os.path.join(temporary_directory, 'equeue.db')
  shutil.copyfile(equeue_database, equeue_database_copy)
  db = gdbm.open(equeue_database_copy)
  # Usually, there is only one callback (so only one key
  # in the db), but if there are several:
  # Take the "oldest" one (oldest value).
  last_backup = db[db.keys()[0]]
  for callback in db.keys():
    timestamp = float(db[callback])
    if timestamp < last_backup:
      last_backup = timestamp
  return datetime.datetime.fromtimestamp(last_backup)

def isBackupInProgress():
  """
  Check if backup is in progress (importer script is running)
  by checking if equeue lockfile exists.
  """
  # XXX: check if file is valid
  return os.path.exists(equeue_lockfile)

print "Content-Type: text/html"
print

form = cgi.FieldStorage()
if "password" not in form:
  print """<html>
<body>
  <h1>This is takeover web interface.</h1>
  <p>Calling takeover will stop and freeze the current main instance, and make this clone instance the new main instance, replacing the old one.</p>
  <p><b>Warning: submit the form only if you understand what you are doing.</b></p>
  <p>Note: the password asked here can be found within the parameters of your SlapOS instance page.</p>
  <p>Last valid backup: %s</p>
  <p>Importer script(s) of backup in progress: %s</p>
  <form action="/">
    Password: <input type="text" name="password">
    <input type="submit" value="Take over" style="background: red;">
  </form>
</body>
</html>""" % (getLatestBackupDate().strftime('%Y-%m-%d %H:%M:%S'), isBackupInProgress())
  sys.exit(0)

if form['password'].value != '${:password}':
  print "<H1>Error</H1>"
  print "Password is invalid."
  sys.exit(1)

# XXX hardcoded location
result = subprocess.check_output([takeover_script], stderr=subprocess.STDOUT)
print 'Success.'
print '<pre>%s</pre>' % result