[ lamepage · Linux · News · Server INN ]

Einrichtung eines News-Systems unter Linux

(anhand der S.u.S.E 5.1 - Distribution)

Übersicht:

Vorwort:

Dieser Text soll eine Hilfestellung zur Einrichtung eines Offline-Newssystem unter Linux sein. Denn wer kann es sich schon auf Dauer leisten, News online zu lesen. Obwohl die Telekom sich bestimmt mächtig freuen würde. Im Prinzip geht es also darum, ausgewählte Newsgruppen auf seinen Rechner herunterzuladen, und bei Bedarf eigene Artikel in Newsgruppen zu posten. Dabei gibt es verschiedene Möglichkeiten.Im Folgenden wird aber nur auf die Konfiguration von inn (internet news, dem lokalen Newsserver) und suck (Artikeltransfer per NNTP vom/zum uplink) eingegangen.
Alle Angaben und Hinweise entsprechen nur meinem Kenntnisstand der Materie. Für irgendwelche Fehler oder Datenverluste anhand dieser Anleitung bin ich nicht verantwortlich zu machen. Gebrauch also ohne Gewähr! Ich hoffe natürlich, daß alles glatt verläuft und ich mit meinen Ausführungen behilflich sein kann. Denn mich selbst hat die Ersteinrichtung fast zum verzweifeln gebracht. :-)
Zu weiteren Informationen gibt es das NEWS-HOWTO(?), FAQs zum inn und suck, sowie deren man-pages.


Benötigte Pakete:

Sämtliche Pakete (außer Netscape) liegen der S.u.S.E Distribution unter der Serie n bei.

Konfiguration:

Hinweis: Alle Beispiele beziehen sich auf meinen Rechner. Somit sind entsprechende IP-Adressen oder sonstige Rechner-und Providerabhängige Einträge auf persönliche Belange abzuändern! Danke.

Vorbereitung:

Als erstes sollten die Paktete mittels Yast installiert werden. Dann muß in der Konfigurationsdatei(/etc/rc.config, oder mittels Yast) folgendes geändert werden:

NNTPSERVER=localhost
FROM_HEADER=t-online.de       # hier die eigene Domain eintragen!
START_INN=yes

In der Datei/etc/inetd.conf muß der nntpd-Eintrag auskommentiert sein:

# nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd

Bevor jetzt die weitere Konfiguration in runlevel 1 weitergeht, müssen noch zwei Dateien vom Providernewsserver geholt werden. Und zwar die active-Datei, in der alle verfügbaren Gruppen enthalten sind, sowie die newsgroups-Datei, die die einzelnen Gruppen beschreibt.
Für diesen Zweck gibt es das Programm getlist, welches in /usr/lib/news/bin zu finden ist.
Um diese Dateien abzuholen, muß das Kommando als user news folgendermaßen aufgerufen werden: (Onlinegehen nicht vergessen)

cybania:/# su news
cybania:/# /usr/lib/news/bin/getlist -h news.btx.dtag.de active >/var/lib/news/active
cybania:/# /usr/lib/news/bin/getlist -h news.btx.dtag.de newsgroups >/var/lib/news/newsgroups
cybania:/#

Bei einigen Providern (z.B. T-Online) fehlt in der active-Datei eine Gruppe namens "junk". Diese Gruppe ist nur eine interne, die für den inn aber wichtig ist. Um das zu überprüfen kann man folgendes machen:

cybania:/# fgrep junk /var/lib/news/active
junk 0000000000 0000000001 y
cybania:/#

Sollte diese Gruppe nicht auftauchen wird sie einfach erzeugt mit:

cybania:/ # echo "junk 0000000000 0000000001 y" >>/var/lib/news/active

Ebenfalls muß dann diese Gruppe an die newsgroup-Datei angehängt werden:

cybania:/ # echo "junk		News server internal group" >>/var/lib/news/newsgroups

inn:

Jetzt geht es an die eigentlich Konfiguration des Newsservers. Das macht man am besten in runlevel 1 und als user news:

cybania:/ # init 1
cybania:/ # su news
cybania:/ # cd /var/lib/news

In dem Verzeichnis /var/lib/news befinden sich alle Konfigdateien des inn. In den meisten Dateien sind jeweils Beschreibungen der Variablen enthalten, die zur Konfiguration wichtig sind. Also einfach mal ansehen, durchlesen und wundern ;-)

Los gehts mit der Datei inn.conf:

#
domain:		cybania.t-online.de
fromhost:	t-online.de
organization:	my private newsserver
server:		localhost

Weiter gehts mit hosts.nntp:

#
localhost:

Dann gibt es noch nnrp.access:

#
localhost:Read Post:::*

Es geht noch weiter mit newsfeeds:  (Achtung, jetzt geht es ein wenig ins Eingemachte!)

# default entry. feeds all except junk, control and localhost*
#
ME\
	:*,!junk,!control*,!localhost*/!local\
	::

# for NOV overview database
OVERVIEW!:*:Tc,WO:/usr/lib/news/bin/overchan

# news.btx.dtag.de - NNTP (T-Online)
#
dtag/newsfeed00.btx.dtag.de,news.btx.dtag.de\
	:*,!junk,!control*,!localhost*/!local\
	:Tf,Wnm:

Anmerkung: Diese Datei stellt den zentralen Verteiler für inn dar. Hier wird vor allem festgelegt, welche Newsgruppen an welch sites gehen.
Interessant ist dabei die letzte Zeile.

Wenn ein Artikel gepostet wird, erzeugt inn eine Datei mit dem Namen dtag in /var/spool/news/out.going, in welcher ein Verweis auf diesen Artikel im Spoolverzeichnis ist (Newsgroup, Artikelnummer, MessageID). Der Name dtag entspricht in diesem Fall dem Newsfeed, den wir Postings zukommen lassen wollen. (Eigentlich ist der Name hier belanglos, aber der Übersicht wegen vorzuziehen.) Die vom inn erzeugte Datei im out.going (dtag) verwendet suck dann, um feststellen zu können, welche Artikel gesendet werden sollen. Dazu später mehr.

Der dazugehörige Newsserver ist news.btx.dtag.de, wobei nur der Eintrag des Newsservers, wie er im Path: einer jeden Message vorkommt, wichtig ist. Das heißt, Nachrichten, die newsfeed00.btx.dtag.de, oder news.btx.dtag.de im Path: enthalten, werden nicht mehr an unseren Feed (dtag) geliefert. Das ist sehr wichtig, denn Nachrichten, die mit suck vom Newsserver abgeholt wurden, enthalten diese Zeile. Würde dieses nun nicht berücksichtigt werden, würden alle Nachrichten, die gerade abgeholt wurden, erneut an unseren Feed (dtag) zurückgeliefert. Und das darf unter keinen Umständen passieren.

Gerade bei Newsservern, die bei eigehenden Artikeln die MessageID überschreiben, wird es dann zu Dupes kommen, wenn man hier nicht aufpaßt. Also lieber zweimal prüfen, daß der sogenannte Pathexclude in der newsfeed- Datei korrekt ist.
Bei T-Online verewigen sich immer mindestens 2 Server im Path:, so daß dem hier auch Rechnung getragen werden kann. Laut Posting vom T-Online-Team im Dezember 1998 (nach der Umstellung der Server) soll es für die Zukunft ausreichen, die folgenden Server im Pathexclude einzutragen: newsmm00.btx.dtag.de und newsmm01.btx.dtag.de.

Um das zu verdeutlichen, hier einmal eine typische Path:-Zeile:

Path: cybania.t-online.de!news01.btx.dtag.de!newsfeed00.btx.dtag.de!jupiter.NIC.DTAG.DE!
newsfeed.metronet.de!howland.erols.net!newsfeed.cwix.com!193.174.75.110!
news-was.dfn.de!news-fra1.dfn.de!news.uni-mainz.de!not-for-mail

Hier kann man sehen, über welche Systeme diese Nachricht gelaufen ist. Mit news01.btx.dtag.de und newsfeed00.btx.dtag.de haben sich die Provider-Newsserver verewigt, und mit dem eigenen Hostnamen (cybania.t-online.de) userer lokaler inn. Inn schaut jetzt  in jede Nachricht, ob sie schon bei dtag war. Wenn ja, wird sie nicht weitergegeben. Und genau das soll ja erreicht werden. Wenn nun eigene Postings verfaßt werden, befindet sich newsfeed00.btx.dtag.de natürlich noch nicht in der Path:-Zeile, und somit wird inn diese Artikel auch an dtag ausliefern. Alles klar? :-)

Also im jeden Fall darauf achten, daß dieser Eintrag korrekt ist!

Auf der sicheren Seite sind wir, wenn wir nach dem Newssaugen mit suck mal nachschauen, wie unser Verzeichnis /var/spool/news/out.going aussieht. Nach dem Ablauf von suck sollte die Datei dtag null Bytes groß sein!

Nun denn, dieses wichtige Zeile enthält noch mehr. Nach dem Doppelpunkt werden die Newsgruppen angegeben, die an unseren Feed weitergegeben werden dürfen. Im Normalfall sind das alle. Diese werden praktischer Weise  mit dem wildcard * angeben. Einzelne Gruppen, die nicht weitergehen sollen, kann man mit einem vorangestellten ! ergänzen, in dem Fall die Gruppe !junk, und die Hirachie !control*. Weitere interessante Informationen dazu gibt es auf der Seite von Peter Sobisch: "Erweiterung  von INN um mehrere Newsserver".  (unter dem Punkt newsfeeds)

Was kommt nun? Ach ja whoami:

t-online.de

Anmerkung:  Diese Datei wird von manchen Newsreadern ausgewertet, um die From:-Zeile zu generieren. Leider klappt das im seltensten Fall, jedoch haben wir ja noch suck und seiner Helfer-Scripts, so daß es eigentlich kein Problem darstellt. Genaueres siehe dann bei suck.

Der Vollständigkeit halber mailname:

t-online.de

Anmerkung: Siehe whoami, bloß beim mailreply.

Jetzt kommt das Haltbarkeitsdatum von den News, in expire.ctl:

/remember/:14

## Keep for 1-10 days, allow Expires headers to work.
*:A:1:10:never

# Some other recommendations.  Uncomment if you want
# .announce groups tend to be low-traffic, high signal.
# *.announce:M:1:30:90
# Weather forecasts
# *.weather:A:1:2:7
# test posts
*.test:A:2:2:2
*.comp.sys.amiga.*:A:5:6:7

Anmerkung: Diese Datei regelt quasi das Löschen von Artikeln, die ein bestimmtes Alter erreicht haben. Man kann ja nicht alle Artikel bis zur Ewigkeit aufbewaren, sonst besteht die Gefahr eines Plattenüberlaufs. Details über den Aufbau dieser Datei liefert man expire.ctl.

Damit auch regelmäßig aufgeräumt wird, muß diese Aufräumaktion natürlich ab und zu mal gestartet werden. Dazu bietet sich selbstverständlich ein cron-Eintrag unter User news, der mindestens einmal täglich ausgeführt wird, an. Als User news kann man die crontab ändern, indem man crontab -e eingibt und folgendes hinzufügt, bzw. überprüft, ob diese Zeilen existieren:

# min hour day month dayofweek (1=Mon, 7=Su) command
30 00 * * * /usr/lib/news/bin/news.daily expireover delayrm < /dev/null

Ist dieses nun alles erledigt, ist es an der Zeit, einen ersten Test zu fahren. Dazu wird wieder in runlevel 2 gewechselt: init 2
Es sollte sinngemäß sowas bei den Meldungen dabei sein: Starting News-server INN. Starting innd.

Um genauer zu prüfen, ob der Server läuft, kann man ein telnet auf den nntp-Port machen:

vossy@cybania:~ > telnet localhost nntp
Trying 127.0.0.1...
Connected to cybania.t-online.de.
Escape character is '^]'.
200 cybania.t-online.de InterNetNews NNRP server INN 1.7 16-Oct-1997 ready (posting ok).
quit
205 .
Connection closed by foreign host.
vossy@cybania:~ >

Wenn das geklappt hat, läuft der inn.

Jetzt sollte man mal den Newsreader tin starten, um ein Test-Posting abzusetzen. Dazu subscribed man im tin irgendeine Test-Gruppe (z.B. t-online.test). Da tin beim ersten Start keine Gruppen anzeigt, kann man y drücken, um alle verfügbaren anzuzeigen. Bei der gewünschten Gruppe drückt  man s, um sie zu abbonieren. Dann mittels w ein neues Posting verfassen. Wenn das volbracht ist, tin mit shift-q beenden und schauen, was innd in /var/spool/news/out.going erzeugt hat. Es sollte dort eine Datei mit dem Namen, der in newsfeeds angegeben wurde, vorhanden sein. (Im Beispielfall dtag). Sie sollte ungefähr so aussehen:

t-online/test/12269 <736d98$7c4$1@cybania.t-online.de>

Sie enthält also einen Verweis auf das gerade eben erzeugtes Posting. Später wird suck dann diesen Artikel an den Provider-Server senden.

Wenn das soweit alles geklappt hat, ist der inn richtig konfiguriert, und funktionsfähig. Glückwunsch!

suck:

In dem suck-Paket ist auch eine Datei mit dem Namen get.news enthalten (Zu finden in /usr/doc/packages/suck/get.news.innxmit). Diese Datei muß auf die lokalen Gegebenheiten angepaßt werden, d.h. im wesentlichen müssen die Einträge für den REMOTE_HOST, LOCAL_HOST, SITE (wichtig!), etc angepaßt werden. Die Variable SITE muß den Namen enthalten, welcher bei der inn-Config unter newsfeeds (im Beispielfall dtag) angegeben wurde. Im folgenden Fall wird davon ausgegangen, daß sich die suck-Dateien in /var/lib/news/suck/ befinden. Falls diese woanders liegen, muß die Variable BASEDIR entsprechend angepaßt werden.

Diese Datei, namens get.news wird dann einfach beim nächsten Anruf beim Provider aufgerufen. Sie erledigt den Newsaustauch, d.h. das herunterladen der ausgewählten Newsgroups, sowie das Senden von eigenen Artikeln. Sie muß vom User news aufgerufen werden!

Hier eine Beispieldatei:

#!/bin/sh

# BEFORE USING - check to ensure all the paths defined below are correct!!

REMOTE_HOST=news.btx.dtag.de
LOCAL_HOST=localhost

SPOOLDIR=/var/spool/news		# base directory for articles to be rposted
NEWSDIR=/usr/lib/news			# base directory for news binaries
BASEDIR=/var/lib/news/suck		# base directory for scripts and data files

LOCALPOST=${NEWSDIR}/bin/innxmit	# location of binary
CTLINND=${NEWSDIR}/bin/ctlinnd		# location of binary

TMPDIR=${BASEDIR}			# location for suck.* files
MSGDIR=${BASEDIR}/Msgs			# where to put MultiFile messages when getting them
BATCHFILE=${TMPDIR}/batch		# Name of batchfile to build for rnews or innxmit
SITE=dtag				# name of site from newsfeeds file
OUTGOING=${SPOOLDIR}/out.going/${SITE}	# location of the list of articles to upload
OUTGOINGNEW=${OUTGOING}.new		# file to contain the list temporarily
SCRIPT=${BASEDIR}/put.news		# my filter for rpost
OUTFILE=/tmp/tmp$$			# used by rpost as article after it is filtered

[Der Rest der Datei braucht nicht angepaßt werden...]

ACHTUNG: Neuere Versionen von suck beinhalten eine etwas andere Version dieser Datei (get.news.innxmit). Persönlich empfehle ich eher zu der ältern Version, da hier bei fehlerhafter newsfeeds-Datei nicht alle eingegangen Artikel sofort wieder versendet werden, sondern erst beim nächsten Anruf. So hat man mehr Kontrolle, imho. Eine alte Version gibt es hier.
Weiterhin interessant ist die Datei put.news. Da doch einige, wenn nicht die meisten, Newsreader es so praktizieren, den FQDN (Full Qualified Domain Name - Name der Maschine) für die From-Zeile zu nehmen, hat man eben das Problem, mit einer falschen Absenderadressee zu posten. Um dies zu verhindern, können in der put.news-Datei einige Filter eingebaut werden, in dem u.a. die Absenderadresse berichtigt wird. Desweiteren mögen es manche Newsserver nicht, wenn die Artikel die Header-Zeilen NNTP-Posting-Host, Path sowie Xref enthalten. Auch dieses Dillemma wird in put.news eliminiert. Ein funktionierendes Beispiel ist hier aufgeführt, wobei SEDCMD0 angepaßt werden muß:
#!/bin/sh

# this is just a simple script to use sed to strip off the
# NNTP_Posting_Host and Xref headers that my ISP's newsfeed
# doesn't like.  this could be written as a one liner
# sed -e SEDCMD1 $1 | sed SEDCMD2 > $2
#
# Extended version: strips off the Path-Line, too and
# replaces the From-Line to the valid address
#

if [ $# -ne 2 ]; then
    echo
    echo "Usage `basename $0` infile outfile <RETURN>"
    echo
    exit -1
fi

SEDCMD0="/^From/s/cybania.t-online.de/t-online.de/1"
SEDCMD1="/^Path/d"
SEDCMD2="/^NNTP-Posting-Host/d"
SEDCMD3="/^Xref/d"
OUTFILE=$2
INFILE=$1

echo "put.news: stripping headers from ${INFILE} to ${OUTFILE}"

if [ -f ${INFILE} ]; then
    sed -e ${SEDCMD0} ${INFILE} | sed -e ${SEDCMD1} | sed -e ${SEDCMD2} | sed -e ${SEDCMD3} > ${OUTFILE}

    if [ $? -ne 0 ]; then
	echo "Error"
	exit -1
    fi
else
    echo "$1 does not exist"
    exit -1
fi

Nachteil dieser Lösung ist, daß hier alle Zeilen eines Postings gelöscht werden, die die Schlüsselworte in SEDCMD1 bis SEDCMD3 am Anfang einer jeden Zeile enthalten. Abhilfe schafft eine etwas anderenVariante, die von Peter Sobisch gebastelt wurde. Hierbei muß aber awk installiert sein. Für die Korrektur der From:-Zeile ist wie im obigen script SEDCMD zuständig. Die anderen zu löschenden Header werden in  TO_STRIP eingetragen:

#!/bin/sh
#
# put.news
# a script to remove some headers and to correct
# the From: line. The awk-part has been done by peter@lamepage.de

if [ $# -ne 2 ]; then
    echo
    echo "Usage `basename $0` infile outfile <RETURN>"
    echo
    exit -1
fi

echo "put.news: stripping headers from $1 to $2"

if [ -f $1 ]; then

# correct the From: line
SEDCMD="/^From/s/cybania.t-online.de/t-online.de/1"

# remove some headers
TO_STRIP="Path: Sender: NNTP-Posting-Host: Xref:"

awk 'BEGIN { HEADER=1 }
    length == 0 { HEADER=0 }
    HEADER == 1 { strip = 0
	n = split("'"$TO_STRIP"'", field)
	for (i=1; i<=n; i++) { if ($1 == field[i]) { strip = 1 } }
	if (strip == 0) { print } }
    HEADER == 0 { print }
' $1 | sed -e ${SEDCMD} >$2

    if [ $? -ne 0 ]; then
	echo "Error"
	exit -1
    fi
else
    echo "$1 does not exist"
    exit -1
fi

Wenn das script dann auch angepaßt ist,  fehlt nur noch die Datei sucknewsrc. Hier wird festgelegt, welche Newsgroups man beziehen möchte. Man schreibt einfach die Namen der Groups hinein, die man haben will. Eine Übersicht der Verfügbaren gibt die active-Datei. Beim ersten Mal (da tuts noch weh ;-), wo noch nicht feststeht, wieviele Artikel downzuloaden sind, schreibt man einfach eine negative Zahl (z.B. -10) hinter die entsprechenden Newsgroupnamen. Somit holt suck dann z.B. 10 alte Artikel aus der jeweiligen Gruppe und ersetzt die negative Zahl durch die aktuellen Artikelnummern.
Ein Beispiel gefällig? Klaro, so würde es aussehen, wenn man das erste mal News holen will:

de.comp.sys.amiga.advocacy -1
de.comp.sys.amiga.misc -10
de.soc.zensur -1
de.sci.astronomie -1
de.comp.os.linux.misc -5
alt.sys.abox -1

Nach dem Anruf beim Provider, und demAblauf von get.news, sieht es dann so aus:

de.comp.sys.amiga.advocacy 16163
de.comp.sys.amiga.misc 48525
de.soc.zensur 8263
de.sci.astronomie 5185
de.comp.os.linux.misc 42736
alt.sys.abox 0

Wenn man jetzt noch Artikel haben will (kann ja sein :), kann man natürlich diese Datei nach belieben edieren, also die Artikelnummern um einige Stellen heruntersetzen. Wie auch immer, beim nächsten Anruf, und Aufruf von get.news (als User news!), werden dann die neuen News heruntergeladen, also auf den lokalen Newsserver. Da es etwas mühselig ist, sich immer als news einzuloggen, wenn man den Newsaustausch erledigen will, gibt es auf der Tips&Tricks-Seite unter  pppd: nach Verbindungsaufbau Programme automatisch starten ein paar nüetzliche Hinweise dazu.
Anschließend kann man dann seinen bevorzugten Newsreader anwerfen und sich am Usenet erfreuen. Wobei die Konfiguration eines Newsreaders natürlich wieder neue Fragen aufwirft :-).

Viel Erfolg und Spaß mit Linux!