#! /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) # On finalise os.system('chmod -R a+r %s/..' % outputdir) os.system('find %s/.. -type d -exec chmod a+x {} \\;' % outputdir) errlog.close() if errcnt: print >>sys.stderr, "*** %d error(s) occurred, see '%s'!" % (errcnt, errfile) def run(): MoinDump().run() if __name__ == "__main__": run()