changeset 4054:691e12f53408

backup action: add missing file
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Sun, 31 Aug 2008 21:02:09 +0200
parents 31617ef6a68b
children b5dfb48bad1c 1d6d0d9a7c9d
files MoinMoin/action/backup.py
diffstat 1 files changed, 114 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/action/backup.py	Sun Aug 31 21:02:09 2008 +0200
@@ -0,0 +1,114 @@
+# -*- coding: iso-8859-1 -*-
+"""
+    MoinMoin - download a backup via http.
+
+    Triggering backup action will check if you are authorized to do a backup
+    and if yes, just send a <siteid>-<date>--<time>.tar.<format> to you.
+    What exactly is contained in your backup depends on your wiki's
+    configuration - please make sure you have everything you need BEFORE you
+    really need it.
+
+    Note: there is no restore support, you need somebody having access to your
+          wiki installation via the server's file system, knowing about tar
+          and restoring your data CAREFULLY (AKA "the server admin").
+
+    @copyright: 2005-2008 by MoinMoin:ThomasWaldmann
+    @license: GNU GPL, see COPYING for details.
+"""
+
+import os, re, time
+
+from MoinMoin import wikiutil
+from MoinMoin.support import tarfile
+
+
+def addFiles(path, tar, exclude_regex):
+    """ Add files in path to tar """
+    for root, dirs, files in os.walk(path):
+        files.sort() # sorted page revs may compress better
+        for name in files:
+            path = os.path.join(root, name)
+            if exclude_regex.search(path):
+                continue
+            tar.add(path)
+
+
+def sendBackup(request):
+    """ Send compressed tar file """
+    dateStamp = time.strftime("%Y-%m-%d--%H-%M-%S-UTC", time.gmtime())
+    filename = "%s-%s.tar.%s" % (request.cfg.siteid, dateStamp, request.cfg.backup_compression)
+    request.emit_http_headers([
+        'Content-Type: application/octet-stream',
+        'Content-Disposition: inline; filename="%s"' % filename, ])
+
+    tar = tarfile.open(fileobj=request, mode="w|%s" % request.cfg.backup_compression)
+    # allow GNU tar's longer file/pathnames
+    tar.posix = False
+    for path in request.cfg.cache.backup_include:
+        addFiles(path, tar, request.cfg.cache.backup_exclude_regex)
+    tar.close()
+
+
+def sendBackupForm(request, pagename):
+    _ = request.getText
+    request.emit_http_headers()
+    request.setContentLanguage(request.lang)
+    title = _('Wiki Backup')
+    request.theme.send_title(title, form=request.form, pagename=pagename)
+    request.write(request.formatter.startContent("content"))
+
+    request.write(_("""= Downloading a backup =
+
+Please note:
+ * Store backups in a safe and secure place - they contain sensitive information.
+ * Make sure your wiki configuration backup_* values are correct and complete.
+ * Make sure the backup file you get contains everything you need in case of problems.
+ * Make sure it is downloaded without problems.
+
+To get a backup, just click here:""", wiki=True))
+
+    request.write("""
+<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data">
+<input type="hidden" name="action" value="backup">
+<input type="hidden" name="do" value="backup">
+<input type="submit" value="%(backup_button)s">
+</form>
+""" % {
+    'baseurl': request.getScriptname(),
+    'pagename': wikiutil.quoteWikinameURL(pagename),
+    'backup_button': _('Backup'),
+})
+
+    request.write(request.formatter.endContent())
+    request.theme.send_footer(pagename)
+    request.theme.send_closing_html()
+
+
+def sendMsg(request, pagename, msg, msgtype):
+    from MoinMoin import Page
+    request.theme.add_msg(msg, msgtype)
+    return Page.Page(request, pagename).send_page()
+
+
+def backupAllowed(request):
+    """ Return True if backup is allowed """
+    action = __name__.split('.')[-1]
+    user = request.user
+    return user.valid and user.name in request.cfg.backup_users
+
+
+def execute(pagename, request):
+    _ = request.getText
+    if not backupAllowed(request):
+        return sendMsg(request, pagename,
+                       msg=_('You are not allowed to do remote backup.'), msgtype="error")
+
+    dowhat = request.form.get('do', [None])[0]
+    if dowhat == 'backup':
+        sendBackup(request)
+    elif dowhat is None:
+        sendBackupForm(request, pagename)
+    else:
+        return sendMsg(request, pagename,
+                       msg=_('Unknown backup subaction: %s.') % dowhat, msgtype="error")
+