Archive for the ‘HTML’ Category

Mittels wget eine dynamische Webseite in eine statische Struktur umwandeln

Oftmals erstellt man eine Webseite unter Nutzung eines dynamischen Systems, beispielsweise eines Content-Management-Systems, eines Wikis oder einer Blogsoftware. Viele dieser Seiten werden einige Zeit lang gepflegt und danach nicht mehr aktiv genutzt. Insbesondere bei dynamischen Systemen müsste man die Seite aus Sicherheitsgründen eigentlich vom Netz nehmen.

Um jedoch die Inhalte der Seite weiterhin verfügbar zu halten bietet es sich an, eine statische Kopie der Seite mittels wget zu erzeugen. Hier erhält man nur noch statische HTML-Dateien und muss sich um Sicherheit keine Sorgen machen.

Der folgende Befehl lädt die Inhalte der Domain example.com herunter und speichert sie im Ordner /tmp/example.com:

wget -nc -nH -E -r -k -P /home/you/example.com -np http://example.com/

Die Links werden entsprechend auf die neue Struktur umgeschrieben. Oftmals ist anschließend noch ein bisschen Handarbeit nötig, da wget in CSS-Anweisungen referenzierte Bilder nicht mitkopiert. Diese müssen somit manuell in das entsprechende Verzeichnis kopiert werden. Weitere Fehlerquellen sind Umlaute und Sonderzeichen in den ursprünglichen URLs (selten).

Mittels CSS DIV-Elemente mit 100% Höhe erzeugen

Um in HTML ein DIV-Element zu erzeugen, welches tatsächlich die gesamte Höhe des Fensters ausfüllt, reicht es nicht, diesem per CSS die Höhe 100% zuzuweisen.

Zusätzlich müssen nämlich noch sämtliche Elternknoten die Höhe 100% annehmen, dazu gehören insbesondere die Element HTML und Body.

Der folgende CSS-Code zeigt, wie es richtig geht:

html{
  height: 100%;
}

body{
  height: 100%;
}

div#fullHeight{
  height: 100%;
}

Natürlich muss das DIV-Element in diesem Fall direkt unterhalb des BODY-Elements eingefügt werden, andernfalls ist auch für alle zwischenliegenden Knoten die Höhenangabe obligatorisch.

Den Fehler “no database selected” im Typo3 Installtool beheben

Die Typo3 version 4.3.3 scheint einen Fehler im Installtool aufzuweisen. Bei der Erstinstallation im 1-2-3-Mode werden auf der ersten Seite zunächst die Datenbankparameter abgefragt. Nach einem Klick auf Submit wird man auf eine Fehlerseite weitergeleitet, die nur folgende Meldung enthält:

no database selected

Außerdem werden in der localconf.php keinerlei Datenbankparameter hinterlegt und es gibt keine Möglichkeit, mit der Installation fortzufahren.

Ein einfacher Workaround hierzu ist es, die Datenbankparameter direkt in der Konfigurationsdatei einzufügen. Dazu öffnet man einfach die Datei typo3conf/localconf.php mit einem Texteditor und passt die folgenden Zeilen an die eigenen Gegebenheiten an:

$typo_db_username = 'user';
$typo_db_password = 'password';
$typo_db_host = 'localhost';
$typo_db = 'dbname';

Anschließend kann man die Fehlerseite im Installtool neu laden und die Installation mit dem Importieren des Datenbankdumps fortfahren.

Tipp: Falls man das Installtool schon weggeklickt hat oder nicht mehr im 1-2-3-Mode ist nutzt man den folgenden Link:

http://serveradresse/typo3/install/index.php?mode=123&step=2

AWStats-Statistiken statisch generieren

Das Logdateien-Analyseprogramm AWStats eignet sich hervorragend zur Auswertung einer Vielzahl von Logs, insbesondere für Access-Logs eines Webservers.

Im Normalfall werden die Statistiken direkt von AWStats als CGI-Skript verfügbar gemacht. Wem das aber zu unsicher ist (weil direkter Zugriff auf das CGI-Skript bestehen muss) oder die Performance wichtig ist (etwa wenn viele Kunden gleichzeitig auf ihre Statistiken zugreifen wollen) kann die Statistiken auch per CronJob generieren und statisch ausliefern.

Um das Ganze etwas zu automatisieren habe ich eine Kombination aus Python-Skript (zum automatischen Auswerten) und einem PHP-Skript (zur sortierten Ausgabe) erstellt.

Wer nur die Statistiken des aktuellen Monats auswerten kann benötigt das PHP-Skript nicht und kann direkt auf die vom Python-Skript erzeugten Statistiken zugreifen.

Vorraussetzungen

Wir gehen von einem Webserver aus, der einem User die Statistiken unter /srv/www/htdocs/stats/DomainName verfügbar machen will.

Das AWStats-Programm inklusive dem Helfer-Programm awstats_buildstaticpages.pl muss natürlich installiert werden. Entweder als distributionseigenes Paket (zu Empfehlen wegen automatischen Updates) oder von der AWStats-Homepage.

Ausserdem muss bereits eine Konfiguration für die jeweilige Domain in /etc/awstats vorhanden sein mit Namen awstats.DomainName.conf. Hinweise zum Erstellen der AWStats-Konfiguration erhält man auf der AWStats-Homepage.

Hinweis: Für alle Seiten, die man statisch generieren will (also bspw. Keywords) muss natürlich der entsprechende Eintrag gesetzt sein (hier also ShowKeywordsStats=1).

Python-Skript

Das Python-Skript erstellt per Cron-Job jeweils die Statistiken des aktuellen Monats für eine Domain. Zur Zeit ist es noch of eine Domain ausgelegt, wird aber in Zukunft erweitert.

#!/usr/bin/python
import time
import datetime
import os

#Basis-Pfad wo die Statistiken gespeichert werden soll
baseDir="/srv/www/htdocs/stats/DomainName"
#Standard-Pfad unter Suse, an Distribution anpassen
awStatsCmd="/srv/www/cgi-bin/awstats.pl"
#Das Helfer-Programm muss evtl. nachinstalliert werden
awStatsStaticCmd="/usr/sbin/awstats_buildstaticpages.pl"
#Name der Konfigurationsdatei, für awstats.DomainName.conf also:
cfgName="DomainName"

#aktuelles Datum (Jahr,Monat und Tag)
year,month,day=str(datetime.date.today()).split("-")

#Gibt es schon Verzeichnisse für dieses Jahr und diesen Monat?
#Jahr:
if os.path.isdir(baseDir+year)==False:
        os.makedirs(baseDir+year)
#Monat:
if os.path.isdir(baseDir+year+"/"+month)==False:
        os.makedirs(baseDir+year+"/"+month)

#Aktualisiere die Statistiken für das aktuelle Jahr und den Monat
awCmd=awStatsStaticCmd+" -awstatsprog="+awStatsCmd+" -config="+cfgName+" -update -output -staticlinks -dir="+baseDir+year+"/"+month+"/ -year="+year+" -month="+month
result=os.system(awCmd)

#Umbenennung der Index-Datei: Anpassen falls nicht xml benutzt wird!
result=os.system("/bin/mv "+baseDir+year+"/"+month+"/awstats."+cfgName+".xml "+baseDir+year+"/"+month+"/index.html")

#Ausgabe: Falls nicht gewünscht einfach weglassen
print result

Das Skript generiert für den aktuellen Monat (im aktuellen Jahr) die Statistiken. Dabei legt es, sofern noch nicht vorhanden, die Verzeichnisse für Jahr und Monat an. Nach Aufruf liegen die Statistiken als (X)HTML-Dateien im entsprechenden Verzeichnis vor.

Für Januar 1984 lautet das  Verzeichnis in diesem Fall: /srv/www/htdocs/stats/DomainName/1984/01/

PHP-Skript

Damit man eine komfortable Index-Datei erhält, die man nicht für jeden Monat und jedes Jahr aktualisiern muss übernimmt ein kleines PHP-Skript die Anzeige. Dabei wird dem Skript mitgeteilt, zu welchem Zeitpunkt erstmalig Statistiken vorlagen. Daraus berechnet das Skript dann alle Kombinationen bis heute. Wer es gerne noch einfach mag lässt das Skript das Stats-Verzeichnis nach Ordnern und Unterordnern durchsuchen. Das kostet aber mehr Performance…

<html>
<head>
<title>Navigation für Statistiken</title>
</head>
<body>
<div style="width: 200px; height: 100%; float: left; clear: both; background-color: #000000; color: #FFFFFF;">
<?php

$config=array();
//Name der Konfiguration
$config['name']='9null.de';
//Wann das erste Mal gelaufen?
$config['firstRun']=array(1,2008);

//Alle verfügbaren Monate in URL-Form
$months=array("01","02","03","04","05","06","07","08","09","10","11","12");

//Alle Jahre durchgehen
$years=array();
for($year=$config['firstRun'][1];$year<=date("Y");$year++){
        //Monate für das Jahr anzeigen
        echo "<h3>$year</h3>\n<ul>";
        for($month=(($year==$config['firstRun'][1])?$config['firstRun'][0]:1);$month<=(($year==date("Y"))?date("m"):12);$month++)
                echo "<li><a href=\"./$year/".$months[$month-1]."/index.html\" target=\"conFrame\">".$month.'-'.$year."</a></li>\n";
        //Listenende & Spacer
        echo "</ul><br /><br />\n\n";
}

//Aktuellen Monat als ersten anzeigen
$showCurrent="./".date("Y")."/".date("m")."/index.html";

?>
</div>
<iframe name="conFrame" style="position: absolute; top: 0px; left: 205px;height: 100%; min-width: 800px; width: 80%;float: left; clear: none;" src="<?php echo $showCurrent; ?>" />
</body></html>

Schlußwort

Mit der gegebenen Kombination ist es sehr einfach möglich, AWStats-Statistiken einer Domain statisch verfügbar machen. Ein CronJob auf das Python-Script zu einem günstigen Zeitpunkt (etwa jede Nacht) sorgt für regelmäßige Akualisierung. Von Sicherheitslücken im CGI von AWStats ist man (mal ausgenommen von Lücken beim Log-Parsing) befreit und auch Performace-Einbußen durch die CGI-Nutzung sind kein Problem mehr.

Als Erweiterungen bleiben also noch:

  1. Eine vernünftige Konfiguration für mehrere Domains.
  2. Evtl. das Speichern der statischen Logs in einer Datenbank…
Return top