diff --git a/dump-wiki.py b/dump-wiki.py new file mode 100755 index 00000000..d3a60d0e --- /dev/null +++ b/dump-wiki.py @@ -0,0 +1,181 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- +# +# Dumpe une partie du Wiki dans le répertoire donné pour créer +# une copie "statique". +# +# Exemple : python dump-wiki.py --regex WiFi/AvoirLeWifi".*" ~/macopie +# Les pages correspondant à la regex donnée seront placées dans +# le répertoire ~/macopie/wiki. Les attachements seront dans +# ~/macopie/attach. +# + + +WIKIDIR='/var/local/lib/wiki' + +__version__ = '0.1' + +import sys +sys.path.append(WIKIDIR) # moin_config +sys.path.append('/usr/lib/python2.3/site-packages/MoinMoin') # MoinMoin + +# On peut modifier cette template +page_template = ''' + +%(pagename)s + + + +

+Cette page est une copie de statique de ce que l'on peut trouver sur le +wiki de l'association. Elle est à destination +des utilisateurs souhaitant configurer le wifi sur leur machine. Elle ne contient +que les pages strictement nécessaires à la configuration. Une fois la configuration effectuée, +vous pourrez accéder au wiki complet. +

+ +

%(pagename)s

+ +%(pagehtml)s + +

+Cette page a été extraite du wiki le %(timestamp)s. +

+ + +''' + +import os, time, cStringIO +from MoinMoin.scripts import _util + +class MoinDump(_util.Script): + def __init__(self): + _util.Script.__init__(self, __name__, "[options] ") + + # --regex=REGEX + self.parser.add_option( + "--regex", metavar="REGEX", dest="regex", + help="Ne copie que les pages correspondant à cette regex" + ) + + + def mainloop(self): + """ moin-dump's main code. """ + + if len(sys.argv) == 1: + self.parser.print_help() + sys.exit(1) + + if len(self.args) != 1: + self.parser.error("Nombre incorrect d'arguments") + + # Prepare output directory + outputdir = self.args[0] + outputdir = os.path.abspath("%s/wiki" % outputdir) + attachdir = os.path.abspath("%s/../attach" % outputdir) + if not os.path.isdir(outputdir): + try: + os.mkdir(outputdir) + _util.log("Created output directory '%s'!" % outputdir) + except OSError: + _util.fatal("Cannot create output directory '%s'!" % outputdir) + if not os.path.isdir(attachdir): + try: + os.mkdir(attachdir) + _util.log("Created attach directory '%s'!" % attachdir) + except OSError: + _util.fatal("Cannot create attach directory '%s'!" % attachdir) + + from MoinMoin import config + if config.default_config: + _util.fatal("Fichier de configuration moin_config.py introuvable.") + + # fix some values so we get relative paths in output html + config.url_prefix = "/wiki" + + # avoid spoiling the cache with url_prefix == "." + # we do not use nor update the cache because of that + config.caching_formats = [] + + # Dump the wiki + from MoinMoin.request import RequestCGI + request = RequestCGI({'script_name': '.'}) + request.form = request.args = request.setup_args() + + from MoinMoin import wikiutil, Page + pages = list(wikiutil.getPageList(config.text_dir)) + if self.options.regex: + # On ne garde que les pages matchant la regexp + import re + pages = filter(lambda x: re.match(self.options.regex, x), pages) + pages.sort() + + wikiutil.quoteWikiname = lambda pagename, qfn=wikiutil.quoteWikiname: qfn(pagename) + ".html" + + errfile = os.path.join(outputdir, '..', 'error.log') + errlog = open(errfile, 'w') + errcnt = 0 + + for pagename in pages: + file = wikiutil.quoteWikiname(pagename) + _util.log('Writing "%s"...' % file) + try: + pagehtml = '' + page = Page.Page(pagename) + try: + request.reset() + out = cStringIO.StringIO() + request.redirect(out) + page.send_page(request, count_hit=0, content_only=1) + pagehtml = out.getvalue() + request.redirect() + except: + errcnt = errcnt + 1 + print >>sys.stderr, "*** Caught exception while writing page!" + print >>errlog, "~" * 78 + import traceback + traceback.print_exc(None, errlog) + finally: + import locale + locale.setlocale(locale.LC_ALL, '') + timestamp = time.strftime("%A %d %B %Y à %H:%M") + filepath = os.path.join(outputdir, file) + fileout = open(filepath, 'w') + fileout.write(page_template % { + 'pagename': pagename, + 'pagehtml': pagehtml.replace('%s/rightsidebar/img' % config.url_prefix, '/img'), + 'timestamp': timestamp, + }) + fileout.close() + # On copie les attachements + try: + source = "%s/data/pages/%s/attachments" % (WIKIDIR, file.replace(".html","")) + if os.path.isdir(source): + # Il y a des attachements + try: + os.makedirs("%s/%s/attachments" % (attachdir, file.replace(".html",""))) + except OSError, e: + # On va dire qu'il existe déjà + pass + os.system("cp -r %s %s/%s/." % + (source, attachdir, file.replace(".html",""))) + except: + errcnt = errcnt + 1 + print >>sys.stderr, "*** Caught exception while copying attachments!" + print >>errlog, "~" * 78 + import traceback + traceback.print_exc(None, errlog) + + # On va copier les images + os.system("rsync -r --delete /usr/share/moin/htdocs/rightsidebar/img %s/.." % outputdir) + + errlog.close() + if errcnt: + print >>sys.stderr, "*** %d error(s) occurred, see '%s'!" % (errcnt, errfile) + +def run(): + MoinDump().run() + +if __name__ == "__main__": + run() +