Statische Kopie einer Plone-Site erzeugen

by Christian Theune posted at 2006-01-29 14:19 last modified 2006-01-29 14:30

Hier eine kleine Anleitung, wie man eine statische Kopie einer Plone-Site mit Hilfe von wget erzeugt.

Umgebung


Unsere Beispielumgebung ist die Webseite der Assembly. Die dortige Plone-Installation ist bereits etwas betagt und beinhaltet einige speziell entwickelte Produkte und Inhaltstypen, sowie den gefürchteten I18NLayer. Das Ziel besteht darin, die Seite so zu spiegeln, dass jedes Jahr ein "Schnappschuss" kurz nach der Veranstaltung aufgenommen werden kann um diese dann unter archive.assembly.org zur Verfügung zu stellen. Dabei soll ein Apache ausreichen um dieses Archiv zu bedienen. Dabei sollen alle Bilder aufgenommen werden, Stylesheets,

Übersicht der Lösung

  • Schritt 1 besteht daraus, wget und Plone etwas vorzubereiten, um ein möglichst gutes automatisches Ergebnis zu erzielen, das nur noch minimal nachbearbeitet werden muss.
  • Schritt 2 lädt die Seite herunter.
  • Schritt 3 korrigiert Stylesheets und lädt fehlende Bilder herunter.
  • Schritt 4 deaktiviert defekte Links.

Schritt 1: Vorbereitung von wget und Plone


Die folgenden wget-Optionen habe ich in einer E-Mail von Herb Schilling gefunden und noch minimal angepasst. Die Datei ~/.wgetrc sollte dann etwa folgenden Inhalt haben:
input = urls-to-get
convert_links = on
recursive = on
reclevel = inf
page_requisites = on
wait = 0
quota = 1000m
no_parent = on
dir_prefix = assembly-fi
reject = author,copyright,sendto_form,folder_listing,topic*,*changeLanguage*
restrict_file_names = windows
robots = off
header = Accept-Language: fi
Diese Optionen sorgen zum einen dafür, dass ich die finnische Ausgabe der Webseite herunterlade (ich habe dieWebseite einmal englisch, einmal finnisch archiviert). Ausserdem wird mit der Option reject dafür gesorgt, dass ich nicht tausende falsche Kopien von Seiten herunterlade, besonders solche, die durch Sprachwechsel bedingt werden. Die Option dir_prefix sorgt dafür, dass sämtliche heruntergeladene Daten in einem gemeinsamen Wurzelverzeichnis landen. Und sich nicht quer durch das eigene Benutzerverzeichnis verstreuen.

Zusätzlich habe ich ein Pythonskript benutzt, dass mir einige Skin-Elemente mitliefert (dieses Skript stammt von ZopeLabs). Dieses Skript wird einfach in die Wurzel der Plone-Seite installiert. Ich habe dazu die Id "archive_site" vergeben:
style_sheets = ['plone.css','ploneColumns.css','ploneCustom.css']
graphics = ['bullet.gif','portal_logo']
index = 'index.html'

print "<a href='%s'>site entry point</a><br>" % context.absolute_url()
print "<a href='%s/%s'>site index</a><br>" % (context.absolute_url(), index)
for item_name in style_sheets + graphics:
print "<a href='%s/%s'>%s</a><br>" % (context.absolute_url(), item_name, item_name)

for dir in context.portal_catalog(portal_type='Folder', review_state='published'):
print "<a href='%s/%s'>%s</a><br>" % (dir.getURL(), index, dir.id)

return printed
Als letztes habe ich noch (nach Hinweis zu dem vorhergehenden Skript) eine DTML-Methode mit der Id "index.html" angelegt, die nur folgenden Code enthält:
<dtml-var index_html>
Dies sorgt dafür, dass das Archiv bereits korrekte index.html-Dateien enthält und damit von Apache richtig ausgeliefert werden kann.

Schritt 2: Spiegeln der Webseite

Jetzt kommt der eigentliche Schritt des Kopierens:
wget http://meineseite/archive_site
wget nimmt jetzt die Arbeit auf und zeigt dabei, welche Dateien er gerade herunterlädt. Je nach Größe der Installation kann dies sehr lange dauern. Dabei sollte man im Auge behalten welche Dateien er mehrfach anfasst. In meinem Fall war es ok, dass einige Dateien mehrfach heruntergeladen wurden. Stellt man jedoch fest, dass einige Links dafür sorgen, dass wget im Kreis läuft, sollte man den Vorgang abbrechen und die Option reject in der benutzten wgetrc anpassen.

Das Ergebnis liegt jetzt in dem angegeben Verzeichnis unter dem Rechnernamen der Seite. Testweise kann man bereits mit einem Browser darauf zugreifen. Dabei sollten bis auf einige Bilder alle Stile stimmen. Navigation und Inhaltsverknüpfung sollte ebenfalls weitestgehend richtig sein.

Schritt 3: Korrektur der Stylesheets, Download von fehlenden Bildern

In den meisten Fällen dürften jetzt noch einige Bilder fehlen, die durch Stylesheets eingebunden wurden. wget ist leider immernoch nicht in der Lage diese korrekt herunterzuladen und anzupassen. Daher fällt jetzt ein bisschen Arbeit an, diese Bilder aufzuspüren, und selbst herunterzuladen. Zwei Hinweise dazu:
  • Die heruntergeladenen Bilder einfach in das Wurzelverzeichnis der Kopie legen
  • In den CSS-Dateien können die Referenzen ohne jegliche Pfadangabe gemacht werden.
Nach diesem Schritt sollte das Layout der Seite überall wieder stimmen.

Schritt 4: Deaktivierung von nicht korrigierten/nicht erfassten Links

Alle Links, die jetzt noch auf die ursprüngliche Adresse der Webseite verweisen sind weitestgehend mit etwas Programmcode des Zope-Servers verbunden. Dazu zählen Suche, Sprachwechsel und ähnliche Links. Diese habe ich einfach deaktiviert, indem ich mit einem regulären Ausdruck einfach alle Dateien des Archivs überarbeitet habe. Dabei werden alle Links zum Ziel "#" umgeschrieben, so dass diese einfach keine Funktion mehr haben ohne den Benutzer zu verwirren.

Mangels besserer Bash-Kenntnisse habe ich dies natürlich in Python geschrieben:
import re, sys
filename = sys.argv[1]
pattern = re.compile('"(http:\/\/www\.meinesite\.de.*)"')
data = open(filename, "r").read()
data = pattern.sub('"#"', data)
file(filename, "w").write(data)
Dieses Skript kann mit einem einfach Shell-Aufruf auf sämtliche Dateien angewendet werden:
find | xargs -n 1 python /home/ctheune/fixlinks.py

Fazit

Mit dieser Methode kommt man relativ schnell zu einem sehr brauchbaren Ergebnis um eine Plone-Seite statisch zu spiegeln. Möchte man dies wiederholbar machen, kann man die Vorbereitung des Schritts 1 sowie Schritt 2 noch automatisieren und so eine Seite immer wieder spiegeln.


Skript mit regulärem Ausdruck um URL gegen # auszutauschen Skript mit regulärem Ausdruck um URL gegen # auszutauschen
Size 1 kB - File type text/python-source
by Christian Theune last modified 2006-01-29 14:30
wgetrc Beispiel wgetrc Beispiel
Size 1 kB - File type application/octet-stream
by Christian Theune last modified 2006-01-29 14:30
Category(s)
Plone Plone
The URL to Trackback this entry is:
http://blog.gocept.com/statische-kopie-einer-plone-site-erzeugen/tbping