10
10
@license: GNU GPL, see COPYING for details.
13
import os, re, time, tarfile
15
15
from MoinMoin import wikiutil
16
from MoinMoin.util import MoinMoinNoFooter
16
from MoinMoin.support import tarfile
18
18
def addFiles(path, tar, exclude):
19
19
""" Add files in path to tar """
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,])
32
request.emit_http_headers([
33
"Content-Type: application/octet-stream",
34
"Content-Disposition: inline; filename=\"%s\"" % filename, ])
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
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)
43
raise MoinMoinNoFooter
45
44
def restoreBackup(request, pagename):
46
45
_ = request.getText
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' %
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")
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")
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"))
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.
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.
91
90
Please make sure your wiki configuration backup_* values are correct and complete.
96
95
<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data">
110
109
'backup_button': _('Backup'),
111
110
'restore_button': _('Restore'),
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()
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()
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
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.'))
130
if not backupAllowed(request):
131
return sendMsg(request, pagename,
132
msg=_('You are not allowed to do remote backup.'), msgtype="error")
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)
140
140
sendBackupForm(request, pagename)
142
return sendMsg(request, pagename,
143
msg=_('Unknown backup subaction: %s.' % dowhat))
142
return sendMsg(request, pagename,
143
msg=_('Unknown backup subaction: %s.') % dowhat, msgtype="error")