appypod-rattail/bin/restore.py

94 lines
4.3 KiB
Python

# ------------------------------------------------------------------------------
import sys, time, os, os.path
from optparse import OptionParser
# ------------------------------------------------------------------------------
class RestoreError(Exception): pass
ERROR_CODE = 1
# ------------------------------------------------------------------------------
class ZodbRestorer:
def __init__(self, storageLocation, backupFolder, options):
self.storageLocation = storageLocation
self.backupFolder = backupFolder
self.repozo = options.repozo or 'repozo.py'
self.restoreDate = options.date
self.python = options.python
def run(self):
startTime = time.time()
datePart = ''
if self.restoreDate:
datePart = '-D %s' % self.restoreDate
repozoCmd = '%s %s -Rv -r %s %s -o %s' % (self.python,
self.repozo, self.backupFolder, datePart, self.storageLocation)
print('Executing %s...' % repozoCmd)
os.system(repozoCmd)
stopTime = time.time()
print('Done in %d minute(s).' % ((stopTime-startTime)/60))
# ------------------------------------------------------------------------------
class ZodbRestoreScript:
'''usage: python restore.py storageLocation backupFolder [options]
storageLocation is the storage that will be created at the end of the
restore process (ie /tmp/Data.hurrah.fs);
backupFolder is the folder used for storing storage backups
(ie /data/zodbbackups).'''
def checkArgs(self, options, args):
'''Check that the scripts arguments are correct.'''
# Do I have the correct number of args?
if len(args) != 2:
raise RestoreError('Wrong number of arguments.')
# Check that storageLocation does not exist.
if os.path.exists(args[0]):
raise RestoreError('"%s" exists. Please specify the name of a ' \
'new file (in a temp folder for example); you ' \
'will move this at the right place in a second '\
'step.' % args[0])
# Check backupFolder
if not os.path.isdir(args[1]):
raise RestoreError('"%s" does not exist or is not a folder.' % \
args[1])
# Try to create storageLocation to check if we have write
# access in it.
try:
f = file(args[0], 'w')
f.write('Hello.')
f.close()
os.remove(args[0])
except OSError, oe:
raise RestoreError('I do not have the right to write file ' \
'"%s".' % args[0])
def run(self):
optParser = OptionParser(usage=ZodbRestoreScript.__doc__)
optParser.add_option("-p", "--python", dest="python",
help="The path to the Python interpreter running "\
"Zope",
default='python2.4',metavar="REPOZO",type='string')
optParser.add_option("-r", "--repozo", dest="repozo",
help="The path to repozo.py",
default='', metavar="REPOZO", type='string')
optParser.add_option("-d", "--date", dest="date",
help="Date of the image to restore (format=" \
"YYYY-MM-DD-HH-MM-SS). It is UTC time, " \
"not local time. If you don't specify this " \
"option, it defaults to now. If specified, " \
"hour, minute, and second parts are optional",
default='', metavar="DATE", type='string')
(options, args) = optParser.parse_args()
try:
self.checkArgs(options, args)
backuper = ZodbRestorer(args[0], args[1], options)
backuper.run()
except RestoreError, be:
sys.stderr.write(str(be))
sys.stderr.write('\n')
optParser.print_help()
sys.exit(ERROR_CODE)
# ------------------------------------------------------------------------------
if __name__ == '__main__':
ZodbRestoreScript().run()
# ------------------------------------------------------------------------------