~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/action/backup.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mfrom: (0.9.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080622211713-fpo2zrq3s5dfecxg
Tags: 1.7.0-3
Simplify /etc/moin/wikilist format: "USER URL" (drop unneeded middle
CONFIG_DIR that was wrongly advertised as DATA_DIR).  Make
moin-mass-migrate handle both formats and warn about deprecation of
the old one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
    @license: GNU GPL, see COPYING for details.
11
11
"""
12
12
 
13
 
import os, re, time, tarfile
14
 
import cStringIO
 
13
import os, re, time
 
14
 
15
15
from MoinMoin import wikiutil
16
 
from MoinMoin.util import MoinMoinNoFooter
 
16
from MoinMoin.support import tarfile
17
17
 
18
18
def addFiles(path, tar, exclude):
19
19
    """ Add files in path to tar """
26
26
            tar.add(path)
27
27
 
28
28
def sendBackup(request):
29
 
    """ Send compressed tar file """    
 
29
    """ Send compressed tar file """
30
30
    dateStamp = time.strftime("%Y-%m-%d--%H-%M-%S-UTC", time.gmtime())
31
31
    filename = "%s-%s.tar.%s" % (request.cfg.siteid, dateStamp, request.cfg.backup_compression)
32
 
    request.http_headers([
33
 
        "Content-Type: application/octet-stream", 
34
 
        "Content-Disposition: inline; filename=\"%s\"" % filename,])
35
 
    
 
32
    request.emit_http_headers([
 
33
        "Content-Type: application/octet-stream",
 
34
        "Content-Disposition: inline; filename=\"%s\"" % filename, ])
 
35
 
36
36
    tar = tarfile.open(fileobj=request, mode="w|%s" % request.cfg.backup_compression)
37
 
    # allow GNU tar's longer file/pathnames 
 
37
    # allow GNU tar's longer file/pathnames
38
38
    tar.posix = False
39
39
    exclude = re.compile("|".join(request.cfg.backup_exclude))
40
40
    for path in request.cfg.backup_include:
41
41
        addFiles(path, tar, exclude)
42
42
    tar.close()
43
 
    raise MoinMoinNoFooter
44
43
 
45
44
def restoreBackup(request, pagename):
46
45
    _ = request.getText
50
49
    targetdir = request.cfg.backup_restore_target_dir
51
50
    try:
52
51
        tar = tarfile.open(fileobj=file(filename), mode="r|%s" % request.cfg.backup_compression)
53
 
        # allow GNU tar's longer file/pathnames 
 
52
        # allow GNU tar's longer file/pathnames
54
53
        tar.posix = False
55
54
        files = []
56
55
        dirs = []
64
63
        #files = "<br>".join(files)
65
64
        filecount = len(files)
66
65
        dircount = len(dirs)
67
 
        return sendMsg(request, pagename, msg=_(
68
 
            'Restored Backup: %(filename)s to target dir: %(targetdir)s.\nFiles: %(filecount)d, Directories: %(dircount)d' %
69
 
                locals()))
 
66
        return sendMsg(request, pagename,
 
67
            msg=_('Restored Backup: %(filename)s to target dir: %(targetdir)s.\nFiles: %(filecount)d, Directories: %(dircount)d') %
 
68
                locals(), msgtype="info")
70
69
    except:
71
 
        return sendMsg(request, pagename, msg=_("Restoring backup: %(filename)s to target dir: %(targetdir)s failed." % locals()))
 
70
        return sendMsg(request, pagename, msg=_("Restoring backup: %(filename)s to target dir: %(targetdir)s failed.") % locals(), msgtype="info")
72
71
 
73
72
def sendBackupForm(request, pagename):
74
73
    _ = request.getText
75
 
    request.http_headers()
 
74
    request.emit_http_headers()
76
75
    request.setContentLanguage(request.lang)
77
76
    title = _('Wiki Backup / Restore')
78
 
    wikiutil.send_title(request, title, form=request.form, pagename=pagename)
 
77
    request.theme.send_title(title, form=request.form, pagename=pagename)
79
78
    request.write(request.formatter.startContent("content"))
80
 
    
 
79
 
81
80
    request.write(_("""Some hints:
82
81
 * To restore a backup:
83
82
  * Restoring a backup will overwrite existing data, so be careful.
84
83
  * Rename it to <siteid>.tar.<compression> (remove the --date--time--UTC stuff).
85
84
  * Put the backup file into the backup_storage_dir (use scp, ftp, ...).
86
 
  * Hit the [[GetText(Restore)]] button below.
 
85
  * Hit the <<GetText(Restore)>> button below.
87
86
 
88
 
 * To make a backup, just hit the [[GetText(Backup)]] button and save the file
 
87
 * To make a backup, just hit the <<GetText(Backup)>> button and save the file
89
88
   you get to a secure place.
90
89
 
91
90
Please make sure your wiki configuration backup_* values are correct and complete.
92
91
 
93
 
"""))
 
92
""", wiki=True))
94
93
 
95
94
    request.write("""
96
95
<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data">
110
109
    'backup_button': _('Backup'),
111
110
    'restore_button': _('Restore'),
112
111
})
113
 
    
 
112
 
114
113
    request.write(request.formatter.endContent())
115
 
    wikiutil.send_footer(request, pagename)
 
114
    request.theme.send_footer(pagename)
 
115
    request.theme.send_closing_html()
116
116
 
117
 
def sendMsg(request, pagename, msg):
 
117
def sendMsg(request, pagename, msg, msgtype):
118
118
    from MoinMoin import Page
119
 
    return Page.Page(request, pagename).send_page(request, msg=msg)    
 
119
    request.theme.add_msg(msg, msgtype)
 
120
    return Page.Page(request, pagename).send_page()
120
121
 
121
122
def backupAllowed(request):
122
123
    """ Return True if backup is allowed """
123
124
    action = __name__.split('.')[-1]
124
125
    user = request.user
125
 
    return (action not in request.cfg.actions_excluded and
126
 
            user.valid and user.name in request.cfg.backup_users)
 
126
    return user.valid and user.name in request.cfg.backup_users
127
127
 
128
128
def execute(pagename, request):
129
129
    _ = request.getText
130
 
    if not backupAllowed(request):        
131
 
        return sendMsg(request, pagename, 
132
 
                       msg=_('You are not allowed to do remote backup.'))
133
 
    
 
130
    if not backupAllowed(request):
 
131
        return sendMsg(request, pagename,
 
132
                       msg=_('You are not allowed to do remote backup.'), msgtype="error")
 
133
 
134
134
    dowhat = request.form.get('do', [None])[0]
135
135
    if dowhat == 'backup':
136
136
        sendBackup(request)
137
137
    elif dowhat == 'restore':
138
138
        restoreBackup(request, pagename)
139
 
    elif dowhat == None:
 
139
    elif dowhat is None:
140
140
        sendBackupForm(request, pagename)
141
141
    else:
142
 
        return sendMsg(request, pagename, 
143
 
                       msg=_('Unknown backup subaction: %s.' % dowhat))
144
 
 
 
142
        return sendMsg(request, pagename,
 
143
                       msg=_('Unknown backup subaction: %s.') % dowhat, msgtype="error")