Newsgroups und NNTP

Willemers Informatik-Ecke

Einsatz im Intranet

Auch im Intranet kann ein Newsserver hilfreich sein. Man kann beispielsweise für Projekte oder Kunden eine Gruppe anlegen, die von allen Mitarbeitern als zentraler Informationspool verwendet werden kann. Jede Absprache mit dem Kunden, jeder Vorgang kann schnell für alle sichtbar protokolliert werden. Da Newsgroups hierarchisch gegliedert werden können, können auch einzelne Projekte unter den Kunden angelegt werden. Um an die News zu kommen, benötigt man einen Newsreader, der auf allen Plattformen leicht kostenlos zu bekommen ist. Viele E-Mailprogramme beherrschen auch den Umgang mit News.

News lesen

Es gibt zwei grundsätzlich unterschiedliche Herangehensweisen, die News von einem Newsserver zu lesen. In beiden Fällen benötigt man zunächst einen so genannten Newsreader. Im ersten Fall installiert man ihn in hergebrachter Weise, wie man das unter MS-Windows oder Mac auch täte. Wenn man die News lesen will, startet man auf dem Client den Austausch der News mit dem Server. Als zweite Möglichkeit bietet es sich unter UNIX an, einen Newsserver aufzusetzen, der die gewünschten Newsgroups vom Newsserver saugt und lokal für den eigenen Rechner oder das Intranet anbietet. Das lohnt sich schnell, wenn zwei Personen News lesen und vielleicht die eine oder andere Gruppe sonst doppelt laden würden.

Offline oder Online

Es gibt bei den Newsreadern zwei Kategorien. Die erste geht davon aus, dass der Benutzer ständig zum Newsserver verbunden ist. Wählt man eine Gruppe, beginnt in diesem Augenblick der Client, die Titelzeilen der Nachrichten zu lesen. Wählt man dann einen Header, wird erst dann der Inhalt der Nachricht geholt. Diese Kategorie nennt man Onlinereader. Der Offlinereader lädt die gewünschten Gruppen am Stück, wenn er mit dem Server verbunden ist und speichert sie lokal. Es gibt auch Varianten, die nur die Titel lesen, die man dann zum Download der eigentlichen Nachrichten markiert.

Konfiguration des Newsreaders

Einen Newsreader einzurichten, ist nicht besonders schwierig. Er braucht die Adresse des Newsservers und die Adresse des SMTP-Servers, da man eigene News als E-Mail an die Gruppe schreibt und dazu den E-Mail-Briefkasten verwendet.

Installation des Newsservers inn

Es gibt derzeit zwei wichtige Newsserver: cnews und inn. cnews ist etwas älter und inn gilt als moderner und leichter bedienbar. Darum soll inn beschrieben werden. Nach dem Entpacken des Paketes inn gibt es die folgenden relevanten Verzeichnisse:

Verzeichnis Inhalt
/etc/news Konfiguration
/var/lib/news Abgleichsdaten mit dem fremden Newsserver
/var/spool/news die Ablage der Newsgroup Inhalte
/var/log/news Logdateien.

Der User news

Für die Arbeiten im Newsbereich sollte man einen User namens news anlegen. Dieser User sollte in der eventuell ebenfalls anzulegenden Gruppe news Standardmitglied werden. Letzlich werden die Wartungsarbeiten zwar meist vom Administrator durchgeführt, aber die im Hintergrund laufenden Prozesse für den Newsserver müssen nicht priviligiert ablaufen und dann sollte man dies auch nicht tun.

Einloggen als news

Die meisten Arbeiten sind als User news durchzuführen. Da man diesem User ungern ein eigenes Kennwort gibt, loggt man sich zunächst als root ein (mit entsprechendem Passwort) und wechselt dann per
su nach news und braucht dafür dann kein Passwort mehr, da man ja root war. Entsprechend kann man in der /etc/passwd bzw. /etc/shadow einfach ein x anstelle des verschlüsselten Passwortes eintragen, um einen direkten Zugang von außen zu verhindern.

su -
su - news

Konfigurationsdateien

inn.conf

Zunächst werden in der inn.conf die Basisinformationen abgelegt. Diese Datei ist allerdings bereits weitgehend korrekt vorbesetzt. Hier nur drei Parameter, die vielleicht geändert werden könnten.

# /etc/news/inn.conf
organization:  Sgt. Pepper's Lonely Hearts Club Band
server:        news.willemer.edu
hiscachesize:  256

Konfiguration inn.conf

Bei organization schreibt man normalerweise den Firmennamen hinein. Unter pathserver steht der Rechnername des Newsservers inklusive seiner Domäne. Es ist durchaus sinnvoll, den etwas ausgetretenen Rechnernamen news zu verwenden und dann als Nickname in die /etc/hosts oder im DNS einzutragen. Dadurch kann man dann, falls es erforderlich ist, den Dienst von einer anderen Maschine übernehmen lassen und man muss nur die Zuordnung des Nicknames ändern. Der Parameter hiscachesize bestimmt die Größe des Speichers in KB für das Caching. Bei Newsservern, die sehr gefragt sind, kann die Erhöhung zu einer schnelleren Verarbeitung führen.

incoming.conf

Diese Datei legt fest, welche fremden Rechner in diesen Newsserver Artikel zu stellen. Für die Aufgabenstellung ist es nicht gewünscht, dass fremde Rechner Artikel einstellen. Allerdings soll es dem lokalen Rechner selbst erlaubt sein. Entsprechend steht hier nur ein Eintrag:

# /etc/news/incoming.conf
peer localhost {
  hostname: localhost
}

expire.ctl

Artikel in Newsgroups haben normalerweise ein flüchtiges Dasein. Je nachdem, welchen Umfang die durchlaufenden Nachrichten haben, wird die Festplatte leicht von Nachrichten geflutet, wenn sie nicht nach gewissen Kriterien wieder aufgeräumt werden. Dies steuert die Datei expire.ctl im Verzeichnis /etc/news. Jede Zeile definiert, in welche Gruppen Nachrichten wie lange bleiben können, bevor sie gelöscht werden.

Der erste Eintrag erscheint einmalig und betrifft die Dauer der History Einträge und beginnt mit /remember/:. Es folgt die Anzahl der Tage, die der Eintrag bleibt.

Alle anderen Einträge beginnen mit einem Wildcardmuster für die betroffenen Newsgroups. Dann folgt eine Unterscheidung nach moderierten und unmoderierten Gruppen und schließlich drei Zeitangaben. Sie haben damit zu tun, wann eine Nachricht ausläuft. Manche Nachrichten haben einen Eintrag im Header, wann sie auslaufen. Die erste Zeitangabe sagt, wie lange eine Nachricht mindestens gehalten werden sollte. Die dritte Zeitangabe sagt aus, wann spätestens gelöscht werden soll. Der zweite Eintrag besagt, wann gelöscht wird, wenn die Nachricht keine eigenen Angaben darüber macht, wann sie gelöscht wird. Die vorgegebene expire.ctl hat den folgenden Inhalt:

/remember/:14
*:A:1:10:never

Sie sagt aus, dass Einträge in der History 14 Tage bleiben. Alle Nachrichten in allen Gruppen bleiben mindestens einen Tag, werden normalerweise nach 10 Tagen gelöscht. Der Auslaufvermerk im Header kann aber eine beliebige Dauer vorgeben. Soll der Newsserver als firmeninterner Projektverfolger eingesetzt werden, sollte der zweite Zeitwert von 10 auf never gesetzt werden, um ein Löschen der Nachrichten zu vermeiden.

Die Angaben in zweiten Feld können folgende Zeichen haben:

Zeichen Bedeutung
M moderierte Gruppen
U unmoderierte Gruppen
A Alle Gruppen

Über die Datei expire.ctl gibt es eine ausführliche Manpage.

Lokaler Newsserver

Zunächst soll beschrieben werden, wie der Server als Intranetserver dient, um beispielsweise die Diskussion über Projekte aufzunehmen. Dabei ist keine Anbindung an andere Newsserver vorgesehen. Dies ist auch gar nicht gewünscht, da die Diskussionen ja firmenintern sind und nicht nach außen gehen sollen.

Den Dämon starten

Zunächst wird der inn-Dämon von Hand gestartet. Da der Dämon auf den well known Port 119 zugreifen wird, darf er nur vom Superuser gestartet werden. An dieser Stelle wird der Startskript verwendet, der auch benutzt wird, wenn die Maschine bootet.

gaston# /etc/init.d/inn start

Den Dämon prüfen

Sie können im ersten Schritt prüfen, ob der innd in der Prozessliste auftaucht. Ist dieser gestartet, kann man nachsehen, ob der innd Anfragen an Port 119 beantwortet. Das einfachste Testtool ist telnet, dem man als Parameter den Port 119 mitgibt.

gaston> telnet localhost 119
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 gaston.willemer.edu InterNetNews server INN 2.2.3 18-Jul-2000 ready
quit
205 .
Connection closed by foreign host.
gaston>

Der Befehl quit sorgte dafür, dass die Verbindung zwischen telnet und innd wieder aufgelöst wurde. Gibt es eine andere Meldung, insbesondere eine Meldung >>Connection refused<< ist noch etwas nicht ganz in Ordnung.

Erster Versuch mit einem Newsclient

Mit einem Newsclient erreichen Sie den Server, indem Sie den Rechnernamen oder einfach >>localhost<< als Newsserver angeben. Anschließend versuchen Sie, Gruppen zu abonnieren. Dabei wird der Client normalerweise die Gruppenliste holen. Die besteht zu Anfang aus folgenden Gruppen:

control
control.cancel
junk

Diese Gruppen sind zum Betrieb des Newsservers inn erforderlich.

Administration

Die Administration des Newsgroupservers erfolgt durch das Senden von Kontrollnachrichten. Zu diesem Zweck gibt es das Programm ctlinnd.

Einrichten einer Gruppe

Der erste Parameter von ctlinnd ist ein Kommando an den Newsserver. Zum Einrichten einer Newsgroup lautet er newgroup. Es folgt der Name der Gruppe. Gruppen sind hierarchisch angeordnet und durch Punkte getrennt. Danach folgt die Berechtigung für das Schreiben in die Gruppe und schließlich der Erzeuger der Gruppe.

gaston> ctlinnd newgroup buch y news
gaston> ctlinnd newgroup buch.netzwerk y news
gaston> ctlinnd newgroup buch.netzwerk.news y news

Um Gruppen wieder zu löschen, verwendet man das Kommando rmgroup. Um die Schreibberechtigungen zu korrigieren, kann man changegroup verwenden oder noch einmal das Kommando newgroup mit den richtigen Parametern wiederholen. inn merkt, dass die Gruppe schon existiert und führt das Kommandos als Änderung aus.

Für die Schreibberechtigung der Gruppe steht ein y für die Erlaubnis zu schreiben. n verbietet das Schreiben auf dem lokalen Rechner und x unterbindet jegliches Schreiben in dieser Gruppe, auch von außen. Eine genauere Beschreibung findet sich in der Manpage der Datei active.

Regelmäßige Arbeiten

news.daily

In der crontab des Users news sollte ein Eintrag für news.daily stehen. Ansonsten sendet das news-System dem Postmaster eine Warnmeldung per Mail.

# taegliche Wartungsarbeiten in der crontab
07  01  *   *   *   /usr/lib/news/bin/news.daily

Diese Zeile sagt aus, dass news.daily immer nachts um 1:07 startet. Es wird in diesem Zuge eine E-Mail an den Newsmaster mit einer Statistik gesendet.

Verbindung nach außen

In dieser Konfiguration soll ein Newsserver nicht als internes Diskussionsforum dienen, sondern an einen Newsserver im Internet angebunden werden, so dass Gruppen von dort in den lokalen Server übernommen werden und Beiträge der lokalen Benutzer auch ins Internet gehen.

active und newsgroups

Zunächst werden im Verzeichnis /var/lib/news die Dateien active und newsgroups um die Gruppe de.test ergänzt. Die Datei active enthält den Namen jeder Gruppe, die vom Newsserver bearbeitet wird. Hinter dem Gruppennamen befindet sich höchste Artikelnummer, die in dieser Gruppe bisher gelesen wurde. Die folgende Nummer ist die niedrigste Artikelnummer. Da Artikel auch zurückgezogen worden sein können, ist die Differenz nicht zwingend die Anzahl der vorhandenen Artikel. Zuletzt steht eine Option, die besagt, ob in diese Gruppe Nachrichten eingestellt werden dürfen. Für die Gruppe de.test wird folgende Zeile eingetragen:

de.test 0000000001 0000000001 y

In der Datei newsgroups wird die Gruppe mit einem erläuterndem Text aufgeführt.

de.test                 Testing group

de.test

Die Gruppe de.test ist zum Testen bestimmt. Hier stellen alle diejenigen kurze Tests ab, die prüfen wollen, ob ihre Newssoftware richtig funktioniert. Zum Test, ob die News richtig gelesen werden, eignet sich die Gruppe deswegen sehr, weil dort ständig ein gewisser Verkehr herrscht und die Nachrichten nicht groß sind. Dazu kommt, dass man zum anschließenden Test, ob das Schreiben funktioniert, gerade in der richtigen Gruppe ist.

Nachdem die Gruppen festgelegt sind, wird nun der Newsserver festgelegt, von dem die Nachrichten geholt werden und an den die lokal abgestellten Nachrichten weitergeleitet werden.

newsfeeds

In der Datei /etc/news/newsfeeds wird konfiguriert, von welchem Newsserver der lokale Newsserver gefüttert werden darf. Die meisten Einträge lässt man am besten unberührt. Interessant ist eine Zeile, die man hinzufügen muss, die die Anbindung an einen anderen Newsserver beschreibt. Für den Newsserver von T-Online steht dort beispielsweise:

# /etc/news/newsfeeds
newsserv/news.t-online.de:*:Ap,Tf,Wnm:newsserv

Der Begriff newsserv ist frei gewählt und ist eine Kennung für diesen Eintrag. Hinter dem Schrägstrich erscheinen kommasepariert die Newsserver, von denen Beiträge eingelesen wurden. So wird verhindert, dass die Beiträge des einen Newsservers wieder an den anderen hinausgehen. Hinter dem ersten Doppelpunkt erscheint die Liste der Newsgroups. Der Stern sagt aus, dass alle denkbaren Gruppen des Servers erlaubt sind.

Hinter dem Doppelpunkt erscheinen Flags, die durch Kommata getrennt sind. Wer Newsgroups von einem Newsserver zieht, kann die hier stehenden Parameter verwenden. Weitere Paramater finden sich in der Manpage von newsfeeds. Die hier genannten Flags bedeuten:

Ap
Vor dem Senden soll der Name des Newsservers nicht geprüft werden.
Tf
Das Senden erfolgt in Form einer Datei.
Wnm
Innerhalb der Datei werden die Artikel anhand ihrer Artikelnummer und ihres Namens unterhalb des Spoolverzeichnisses ge­kenn­zeich­net.

Als letztes Feld wird die Kennung vom Anfang wiederholt.

Neueinlesen der Konfigurationsdatei

Falls der Newsserver bereits lief, muss die Konfiguration aktualisiert werden. Dazu kann wieder das Administrationstool ctlinnd verwendet werden. Mit dem Kommando reload newsfeeds wird die Konfigurationsdatei erneut eingelesen.

ctlinnd reload newsfeeds do

Newsgroups saugen

Die Datei sucknewsrc

Im nächsten Schritt wird versucht, ob man Daten von einem Newsserver herunterladen kann. Zu diesem Zweck dient das Programm suck, das Nachrichten von einem Server lädt und in das lokale Newssystem einspeist. Die Konfigurationsdatei heißt sucknewsrc und muss im aktuellen Verzeichnis stehen. Für den ersten Versuch wird eine solche Datei mit nur einer Newsgroup verwendet, der de.test.

de.test  1  100

Hinter dem Gruppennamen steht die Artikelnummer, ab der man aufsetzen möchte. Da nicht bekannt ist, welche Artikelnummer derzeit aktuell ist, verwendet man zunächst die 1. Danach wird beschränkt, wieviele Artikel heruntergezogen werden sollen. 100 Artikel sind mehr als genug und sind in wenigen Sekunden geladen. Dieser dritte Parameter, der die Mengenbegrenzung darstellt, kann auch weggelassen werden. Dann werden alle existierenden Nachrichten geladen.

Aufruf

Der Aufruf für das Programm suck, um die lokalen Newsgroups eines Rechners mit den News des Newsservers news.t-online.de zu füllen, lautet:

suck news.t-online.de -bp -hl localhost

Der Parameter -hl localhost bedeutet, dass die Newsgroups in den eigenen Server gespeist werden. Der Parameter -bp bedeutet batchpost und bewirkt, dass zunächst alle Nachrichten am Stück in eine lokale Datei gespeist werden und von dort im Block in den lokalen Newsserver geschoben werden.

sucknewsrc

Durch den Lauf von suck wird sucknewsrc in suck.newrc umbenannt und die Nummern der als nächstes zu holenden Nachrichten werden darin aktualisiert. Vor dem nächsten Start muss also suck.newrc nach sucknewsrc umkopiert werden, damit die gleichen Nachrichten nicht wieder geholt werden. Damit suck dies selbst tut, verwendet man die Option -c.

Datei active

Man kann auch die Datei active vom Newsserver als Basis für die zu ladenden Newsgroups verwenden. Dies erreicht man mit dem Parameter -A. Allerdings sollte man damit erst eine Weile experimentieren. In bestimmten Fällen scheint dabei die Datei active durcheinander zu geraten.

Newsgruppenliste vom Internet-Newsserver

Abholen der Gruppeninformationen

Die Dateien active und newsgroups im Verzeichnis /var/lib/news kann man sich vom Newsserver herunterladen. Bevor man dies tut, ist es sinnvoll, die bisherigen Dateien active und newsgroups zu sichern.

cd /var/lib/news
getlist -h news.t-online.de active     > active
getlist -h news.t-online.de newsgroups > newsgroups

Jeder getlist zieht jeweils etwa 1 MB über die Leitung. Je nach Geschwindigkeit der Internetanbindung braucht man also etwas Geduld.

Zugriffsrechte auf den News-Server

Die Zugriffsbeschränkungen auf den News-Server werden in der Datei /etc/news/nnrp.access definiert. In jeder Zeile wird beschrieben, welche Rechner welche Rechte auf dem Server haben.

In der ersten Spalte wird die Rechnergruppe, für die diese Zeile gilt. Die Rechneridentität wird durch eine Maske beschrieben. Bei unscharfer Beschreibung gilt die genaueste Beschreibung, die auf den Host zutrifft. Rechner können auf folgende Weisen beschrieben werden.

Ziel Bezeichnungsweise
Hostname wird durch IP-Reverse Auflösung bestimmt
IP-Nummer im dotted decimal Format
Domain beispielsweise *.willemer.edu
Netzwerkname nach /etc/networks
default gilt für alle Rechner

Die zweite Spalte beschreibt die Berechtigungen bzgl. des Austausches von Nachrichten.

Recht Berechtigt zu ...
read Artikel holen
xfer Artikel in den Server hineinschieben
both sowohl read als auch xfer
no verzieh Dich!

Die dritte Spalte ist für das Posten von Artikeln. Dies betrifft einen Client der lokalen Maschine. Eine gepostete Nachricht erhält eine eindeutige Nummer mit dem Rechnernamen.

Parameter Berechtigung
post Artikel "posten"
no keine Artikelerstellung

NNTP Protokollbeschreibung

RFC 977

Das NNTP (Network News Transfer Protocol) ist durch die RFC (Request for Comments) 977 definiert. Die folgende Beschreibung bietet einen Blick hinter die Kulissen eines Internetprotokolls, das durchaus typisch ist. In gewisser Hinsicht arbeitet auch das Mailprotokoll und das HTTP nicht unähnlich. Diese Informationen sind in erster Linie für Programmierer von Programmen interessant, die sich im Protokollumfeld bewegen. Aber es ist auch für den Administrator hilfreich zu wissen, wie solche Kommunikationen ablaufen, um beispielsweise mit telnet das Fehlverhalten von Protokollen herausfinden zu können.

Das Protokoll wird durch den Austausch von Texten zwischen Server und Client bestimmt. Die rein textuelle Übermittlung erspart die typischen Netzprobleme mit Binärdaten wie die interne Zahlendarstellung. Der Server ist nicht statuslos, sondern es wird ein Messagepointer geführt. Aus diesem Grunde ist eine Anmeldung erforderlich und es sollte auch eine Abmeldung erfolgen.

Der Client muss die Kommunikation aufnehmen und sollte in der Lage sein, alle denkbaren Antworten des Servers zumindest soweit zu bearbeiten, dass kein Blockieren im Protokoll entsteht.

Clientanfragen

Vom Client werden die Anfragen an den Server angestoßen. Die wichtigsten Kommandos des Clients sind hier aufgeführt. Sie würden bereits ausreichen, einen einfachen Newsreader zu schreiben.

LIST
Der Client fordert eine Liste der Gruppen an. Das Format entspricht dem der Datei active.

NEWGROUPS Datum Uhrzeit
Es werden die Gruppen angefordert, die seit dem angegebenen Zeitpunkt hinzugekommen sind. Das Datum ist im Format YYMMDD. Da das Jahr zweistellig ist, gilt das Jahrhundert, das näher an der Jahreszahl ist. Die Uhrzeit hat das Format HHMMSS.

NEWNEWS Gruppenname Datum Uhrzeit
Es wird eine Liste von Artikelkennungen gesendet. Jede Kennung belegt eine Zeile, die mit Carriage Return und Line Feed abgeschlossen wird. Das Ende der Liste wird durch einen einzelnen Punkt in einer Zeile signalisiert.

GROUP Gruppenname
Der Client signalisiert, dass er nun in dieser Gruppe arbeiten möchte. Als Antwort erhält der Client die Fehlernummer (siehe unten). Dann folgt die Anzahl der Artikel, die kleinste Artikelnummer und die höchste Artikelnummer. Dann erscheint zur Bestätigung noch einmal der Gruppenname.

Üblicherweise wird dann die niedrigste Nummer als Argument für das Kommando ARTICLE oder STAT verwendet.

ARTICLE Artikelkennung
Als Antwort wird der Artikelkopf (wie bei HEADER), eine leere Zeile und dann der Artikeltext (wie bei BODY) angezeigt.

HEAD
Zeigt von der aktuellen Nachricht den Kopf. Die Übertragung endet mit einem einzelnen Punkt in einer Zeile.

BODY
Zeigt den Inhalt der aktuellen Nachricht. Die Übertragung endet mit einem einzelnen Punkt in einer Zeile.

STAT Artikelkennung
Wie ARTICLE, allerdings wird der Artikel nicht übertragen. Es wird also nur auf die angegebene Artikelkennung positioniert.

NEXT
Fordert den nächsten Artikel an. Als Ergebnis gibt es die Fehlernummer (siehe unten) gefolgt von der Artikelkennung. Um den Artikel zu betrachten, muss HEAD oder BODY verwendet werden.

QUIT
Beendet die Sitzung.

Die Artikelkennung ist in spitzen Klammern angegeben und gilt systemweit oder ist numerisch und gilt für die Gruppe.

Serverantworten

Auf jede Anfrage wird der Server zunächst mit einem dreistelligen Zahlencode reagieren. Erst hinter dieser Zahl steht die eigentliche Antwort. Dabei bedeutet:

Zahlencode Bedeutung
1xx Informativ
2xx Kommando ok
3xx Kommando soweit ok, sende den Rest!
4xx Kommando war korrekt, konnte aber nicht ausgeführt werden.
5xx Kommando unbekannt oder Fehler

Die nächste Stelle sagt etwas über die Kategorie:

Zahlencode Bedeutung
x0x Verbindung, Setup und sonstige Nachrichten
x1x Newsgroupauswahl
x2x Artikelauswahl
x3x Distributionsfunktionen
x4x Senden von Artikeln
x8x Erweiterungen, die nicht standardisiert sind.
x9x Debug-Ausgaben

Das Senden von Artikeln

Nach dem Senden von POST wird der Server zunächst mitteilen, ob ihm das Senden behagt. Der Antwort-Code kann lauten:

Zahlencode Bedeutung
240 Der gesendete Artikel ist ok
340 Sende Artikel. Endekennung ist eine Zeile (CR-LF) mit nur einem Punkt.
440 Posten nicht erlaubt
441 Posten fehlgeschlagen

Anschließend sendet der Client Zeile für Zeile seine Nachricht, die der RFC 850 für das Format einer Nachricht entsprechen muss. Speziell für die Usenet News Artikel gilt die RFC 1036.

Threadverfolgung

Threads sind Diskussionsbäume, die durch Erwiderung auf Artikel entstehen. Im Artikel wird durch Belegen des Feldes References: die Message-ID abgelegt, auf die der Artikel sich bezieht. Es gibt also Rückwärts- aber keine Vorwärtsbezüge.


Homepage (C) Copyright 2002 Arnold Willemer