#! /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. # # Actuellement, j'utilise : # sudo python /usr/scripts/dump-wiki.py --regex 'WiFi(/PositionnementDesBornes|/AvoirLeWifi.*)?' ~/mointest 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

Ce site est une copie statique et partielle de ce que l'on peut trouver sur le wiki de l'association. Si vous êtes ici, alors que vous avez demandé un autre site, c'est sans doute que vous êtes connecté au réseau wifi de l'association mais que vous n'avez pas encore complété toutes les étapes nécessaires pour avoir une connexion pleinement fonctionnelle. Ce site contient donc les infos pour configurer correctement votre connexion.

%(pagenamewithlinks)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) # On construit le nom de la page avec les liens (peut sans doute mieux faire) pagenamewithlinks = [''] for composant in pagename.split("/"): pagenamewithlinks.append(pagenamewithlinks[-1]+'/'+composant) pagenamewithlinks = " / ".join(map(lambda x: '%s' % ( wikiutil.quoteWikiname(x[1:]), x[1:].split("/")[-1]), pagenamewithlinks[1:])) _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, 'pagenamewithlinks': pagenamewithlinks, '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()