#!${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