29.01.2006
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.
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,
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:
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:
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.
Mangels besserer Bash-Kenntnisse habe ich dies natürlich in Python geschrieben:
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-getDiese 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.
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
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']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:
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
<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_sitewget 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.
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, sysDieses Skript kann mit einem einfach Shell-Aufruf auf sämtliche Dateien angewendet werden:
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)
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
Size
1 kB
-
File type
text/python-source
wgetrc Beispiel
Size
1 kB
-
File type
application/octet-stream
- Category(s)
-
Plone
- The URL to Trackback this entry is:
- http://blog.gocept.com/statische-kopie-einer-plone-site-erzeugen/tbping