Das Usenet anzapfen
Ein recht leistungsfähiges Paket ist "InterNetNews", kurz INN, von Rich $alz. Den INN zu bändigen ist nicht ganz einfach. Wer sendmail geschafft hat, kann sich freuen: es wird schwieriger...!
Das Holen und Senden von News könnte zwar auch der INN übernehmen, wir werden uns aber der intelligenteren Hilfe von newsflash und postit bedienen.
Wieder gehe ich von der S.u.S.E.-Linuxdistribution aus. INN kann man sich hier sehr schön hinzuinstallieren (mit dem Tool "YaST"). Es wird bei der Installation in das Verzeichnis /usr/lib/news gesetzt. Wer die neue S.u.S.E. 4.2 sein Eigen nennt, kann sich übrigens einen (leider nicht besonders hilfreichen) Überblick unter /usr/lib/news/README.linux verschaffen. Dort ist der INN bereits vorinstalliert (wenn man das im YaST vermerkt hat), leider fehlt ihm aber die gesamte Dokumentation. Diese kann man sich beschaffen, indem man eine email an majordomo@warren.mentorg.com schreibt:
Subject: egal sendme faq-inn-1 sendme faq-inn-2 sendme faq-inn-3Dann kommt eine ausführliche FAQ, in der die Funktion des INN und das Beheben vieler Fehler erklärt werden. Desweiteren sollte man sich die Anleitung news-0.3.ps von Markus Dickebohm beschaffen, die eine Installation eines INN/newsflash/postit-Systems hervorragend beschreibt. Man sehe sich auf diesem Server um, vielleicht gibt es inzwischen eine neuere Version. Auch kann man gleich die Pakete newsflash und postit mitnehmen (siehe unten unter "Geben und Nehmen").
nntp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.nntpdDas muß unbedingt mit einem "#" auskommentiert werden, sonst weigert sich der innd, anzuspringen (diese Erkenntnis hat mich Tage gekostet). INN läuft auch nicht mit C-News und anderen News-Dämonen zusammen. Ist auch nicht notwendig!
Und nochwas muß man tun. Wenn dem INN etwas nicht paßt, schreibt er an "usenet@localhost". Den User "usenet" muß man dem System bekanntgeben - wie einige andere neue Mailadressen auch. Dies geschieht, indem man der Datei /etc/aliases folgende Zeile anfügt (eventuell muß man diese Datei neu erzeugen):
/etc/aliases news: root newsadm: news newsadmin: news usenet: newsDamit Sendmail Bescheid kriegt, muß man daraus einen Datenbanksatz machen:
root:# newaliases root:# _Ab sofort geht also alle Post, die mit dem Usenetsystem zu tun hat, an root.
Jetzt müssen wir in unsere /etc/hosts-Datei noch die Adresse unseres Newsservers eingeben. Die Adresse muß man sich aus der Datenbank holen oder bei der Hotline seines Providers erfragen. Man schreibe hinzu:
/etc/hosts (Ausschnitt) <IP-Adresse> <Name_des_Newsservers> getnews
/var/lib/news/inn.conf (Slackware: /usr/lib/news/inn.conf) # Grundeinrichtumg des INN server: Rechner.name organization: wie's beliebt fromhost: Email_adresse@Host.Rechner # erscheint in PostingsHierzu kam ein Hinweis von Thomas Schoepf <schoepf@informatik.tu-muenchen.de>: Falls beim INN-Start die Fehlermeldung ME: cant GetConfigValue pathhost... auftritt, ist noch die Zeile pathhost: <Host.Fuer.News.Path> einzufügen.
/var/lib/news/hosts.nntp (Slackware: /usr/lib/news/hosts.nntp) # Welcher Rechner füttert unsere Newsreader? localhost: Rechner.name: /var/lib/news/nnrp.access (Slackware: /usr/lib/news/nnrp.access) # Welche Rechner dürfen uns anzapfen? localhost:Read Post:::* (none):Read Post:::* Rechner.name:Read Post:::* /var/lib/news/newsfeeds (Slackware: /usr/lib/news/newsfeeds) # Wohin gehen die News von uns aus? # Unsere News geben wir nicht mehr weiter ME\ :*:: # für NOV Übersichtsdatenbank @overview:*:Tc,WO:/usr/lib/news/bin/overchan # Den Provider füttern wir mit allem, was wir haben: get/providername\ :*:Ap,Tf,Wnm:getZur genauen Erklärung ziehe man bitte die INN-Doku zu Rate. providername ist der Name, der bei Usenetnews vom Provider im Header unter "Path:" vermerkt wird. Dieser muß exakt so geschrieben werden. Unterläßt man das, werden die Verhandlungen über neue/vorhandene Artikel unnötig verlängert.
Es fehlen einige aktuelle Dateien, die man sich von seinem Newsserver holen muß. Man bedient sich dabei am besten des Scripts getlist, welches dem INN-Paket beiliegen sollte. Wenn nicht, kann man es per ftp beziehen:
unix.hensa.ac.uk/mirrors/yggdrasil.fall95.disk1/usr/lib/news/bin/getlist.Man bringt es in /usr/lib/news/bin unter und macht es mit "chmod news getlist" ausführbar.
Nun also holt man sich mit getlist zwei Dateien von lrznews:
root:# /usr/lib/news/bin/getlist -h getnews active >/var/lib/news/active.raw root:# /usr/lib/news/bin/getlist -h getnews newsgroups >/var/lib/news/newsgroups root:# _Bei der Slackware ist das /var/lib/news gegen /usr/lib/news zu ersetzen.
Man kann das auch "zu Fuß", also ohne "getlist", erledigen, indem man zwei Telnetverbindungen macht:Die frisch geholte Datei active muß noch bearbeitet werden. Sie enthält alle abonnierbaren Usenet-Groups und die aktuellen Artikelnummern. Warnung: Diese Datei ist empfindlich. Sie verträgt keine Änderungen in Bezug auf die Anzahl der Worte pro Zeile, der "white spaces" oder der Ziffernzahl! Nichts außer der im folgenden genannten Änderungen darf gemacht werden!!!root: # telnet getnews 119 >/var/lib/news/active.raw nun 10 sec. warten - es erscheint *kein* Prompt! list active wieder ein paar Sekunden warten quit nun warten, bis der Heimatprompt erscheint (dauert etwas): root: # telnet getnews 119 >/var/lib/news/newsgroups nun 10 sec. warten - es erscheint *kein* Prompt! list newsgroups wieder ein paar Sekunden warten quit wieder warten, bis der Heimatprompt erscheint: root: # _
Zweierlei Dinge sind erforderlich.
Erstens werden wir alle Artikelnummern auf
Null setzen. Das geht so:
root:# cd /var/lib/news # Slackware: /usr/lib/news root:# sed 's/ [0-9]* [0-9]* / 0000000000 0000000001 /' active.raw > active root:# _Zweitens muß nachgesehen werden, ob folgende drei Einträge enthalten sind - falls sie fehlen, muß man sie nachträglich eintragen:
to 0000000000 0000000001 y junk 0000000000 0000000001 y control 0000000000 0000000001 y
root:# chown root.root /var/run # (und nicht root.uucp!) root:# _(eventuell muß man noch mit den Zugriffsrechten spielen.)
Zur Kontrolle sehe man auch unter /var/spool/news nach, ob die Verzeichnisse in.coming, news.archive, out.going und over.view vorhanden sind - eventunnell mit mkdir erzeugen!
Zum Schluß muß man unbedingt alle Dateien in /var/lib/news (Slackware: /usr/lib/news und in /var/spool/news dem User news zuweisen:
root:# chown -R news.news /usr/lib/news/* # bei Slackware nur dieses Vz. root:# chown -R news.news /var/lib/news/* # falls vorhanden root:# chown -R news.news /var/spool/news/* # falls vorhanden root:# _Zur abschließenden Grundeinrichtung läßt man auch noch erstmalig ein paar Hilfsprogramme laufen: makehistory und news.daily. Das macht man als User news (wichtig!):
root# cd / root# su news -c "/usr/lib/news/bin/makehistory -o" root# su news -c "/usr/lib/news/bin/news.daily" root# _
root:# /usr/lib/news/etc/rc.news Starting innd. root:# telnet localhost 119 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 200 Eigener.Rechner InterNetNews NNRP server INN Version Datum ready (posting ok). Es kommt kein Prompt!Kommt diese Meldung, kann man dreimal tief durchatmen und laut "uff!!!" sagen. Mit quit entkommt man wieder.
Ansonsten ist längere Fehlersuche angesagt, bei der man sich durch die INN-FAQ helfen lassen sollte. Vielleicht ist auch eine Mail an "usenet" - und damit an "root" - abgeschickt worden, aus der man bereits entnehmen können sollte, was schiefgelaufen ist. Fehlt die Mail, kann man immer noch auf das syslog, auf /var/log/messages oder auf die diversen logs in /var/lib/news/log zurückgreifen.
Bei mir war die Montage reichlich nervenaufreibend und hat über einen Monat gedauert. Ich habe versucht, hier alle Fehlerquellen zu berücksichtigen, habe aber das dumpfe Gefühl, daß mir das nicht vollständig gelungen sein wird. Leider verhält sich der INN bei der Fehlersuche nicht sehr kooperativ... Dennoch denke ich, daß ich Euch das meiste bereits abgenommen habe.
Wieder haben wir es entweder mit simpleinit oder mit sysvinit zu tun. Hier beide Varianten:
/etc/rc.d/rc.M; Sektion "# Initialize the NET subsystem." . /etc/rc.d/rc.inet1 . /etc/rc.d/rc.isdn . /etc/rc.d/rc.inet2 . /usr/lib/news/etc/rc.news # <-- diese Zeile einfügen!Ferner muß man sich die Datei suchen, die beim Reboot des Rechners aufgerufen wird (oft die Datei /etc/rc.d/rc.6). Hier sollte man vor den eigentlichen Shutdown-Routinen eintragen:
/etc/rc.d/rc.6 echo -n "Shutting down NNTP port:" /usr/lib/news/bin/ctlinnd throttle "shutdown" /usr/lib/news/bin/ctlinnd shutdown "shutdown" [weitere Shutdown-Befehle]Sonst kommt es zu einer Reihe von (harmlosen) Fehlermeldungen beim Herunterfahren.
/sbin/init.d/news # (Red Hat: /etc/rc.d/news) #! /bin/sh # Author: Bernhard Hailer <dl4mhk@lrz.uni-muenchen.de>, 24-Jun-96 # /sbin/init.d/news case "$1" in start) echo "Initializing NNTP port. (INN)" /usr/lib/news/etc/rc.news # rc.news wird beim INN mitgeliefert ;; stop) echo -n "Shutting down NNTP port:" /usr/lib/news/bin/ctlinnd throttle "shutdown" /usr/lib/news/bin/ctlinnd shutdown "shutdown" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0Damit sie beim Herauf- und Herunterfahren der Maschine erkannt wird, muß man noch einige Soft-Links setzen:
root:# cd /sbin/init.d/rc2.d # Bei anderen Distributionen root:# ln -s ../news K20news # gelten andere Pfade! root:# ln -s ../news S20news root:# _Jetzt sollte beim Bootvorgang auch der Start von INN angezeigt werden - zusammen mit dem Sendmail-Dämon. Das Herunterfahren sollte ebenfalls "zivilisiert" ablaufen.
/var/cron/tabs/news # (oder evtl. /var/spool/cron/crontabs/news) PATH=/usr/lib/news/bin:/usr/lib/news/etc:/usr/lib/news:/usr/bin:/usr/sbin 10 07 * * * /usr/lib/news/bin/news.dailyUnd das machen wir dem crond kenntlich:
root:# chown news.news /var/cron/tabs/news root:# crontab -u news /var/cron/tabs/news root:# _Jetzt sollte das Script täglich um 7 Uhr 10 automatisch aufgerufen werden.
news.daily erledigt das Aufräumen. Alte Newsartikel werden gelöscht, und alte Spuren wie veraltete Logfiles etc. werden beseitigt. Zwei Steuerdateien sind vielleicht noch ganz interessant:
/var/lib/news/expire.ctl # Slackware: /usr/lib/news/expire.ctl # Wenn Artikel gelöscht, erinnern wir uns noch 14 Tage an # seine ID, damit er uns nicht erneut angeboten wird: /remember/:14 # (A)lle Artikel werden mindestens 3, normalerweise 10 und maximal 30 Tage # lang behalten (min. und max. bei gesetztem Expiredatum an der Nachricht) *:A:3:10:30 # Sonder-Newsgroups bleiben viel kürzer: junk:A:1:1:2 control:A:1:1:2 /var/lib/news/control.ctl # Slackware: /usr/lib/news/control.ctl # Voreinstellung: Meckereinen des INN gehen per Mail an admin. all:*:*:mail
Zwar ist das suck-Paket bekannter, doch habe ich mich wegen der guten Konfigurierbarkeit für die (sehr kompakten) Programme von Chris Blum entschieden. Dazu kommt, daß diese die Telefonleitung sehr effizient nutzen und die Übertragung in mehrere Unterprozesse aufteilen. Während der Newsserver zum Bleistift gerade ein Newspaket schnürt, laufen parallel gerade Verhandlungen für die nächste Newsgroup.
Die genannten Programme holt man sich per ftp bei
pople.pc.uni-koeln.de/pub/newsflash-0.99.tgz pople.pc.uni-koeln.de/pub/postit-jun96.tar.gz(nachsehen, ob es neuere Versionen gibt!). Man verstaut sie im Verzeichnis /usr/src und entpackt sie dort mit
root:# tar zxfv newsflash-0.99.tgz root:# tar zxfv postit-jun96.tar.gz root:# _
Vor der Compilation sollte man sich /usr/src/newsflash/config.h ansehen und die dort eingestellten Pfade einstellen (/var/lib/news oder bei Slackware /usr/lib/news/newsflash). Dann:
root:# cd /usr/src/newsflash root:# make dep ... root:# make ... root:# cp newsflash /usr/lib/news/bin root:# cp printdate /usr/lib/news/bin root:# _Damit newsflash weiß, welche Newsgroups es holen soll, muß man ihm in einer Datei mitteilen, wo er die Auflistung der gewünschten Newsgroups findet:
/var/lib/news/serverlist # oder Pfad entsprechend config.h! get1 getnews 119 /var/lib/news/packet1 timestamp get2 getnews 119 /var/lib/news/packet2 timestamp get3 getnews 119 /var/lib/news/packet3 timestamp get4 getnews 119 /var/lib/news/packet4 timestampHier werden vier Pakete abgewickelt, alle laufen über den News-Server des Providers. Das erste Wort in der Zeile ist eine Kennung, das zweite der Server (definiert in /etc/hosts), die 119 ist der Standard-Usenet-Port. Dann kommt die Paketbeschreibung und zum Schluß eine Zeitmarke (timestamp). Eine aktuelle Zeitmarke kann man mit einem Umrechenprogramm namens printdate, welches dem Newsflash-Paket beiliegt, erzeugen; die erzeugte neunstellige Zahl ist die Zahl der seit dem 1.1.1970 um Mitternacht verstrichenen Sekunden. Um die Usenet-News der beiden Vortage zu bekommen, zieht man etwa 150000 ab (ein Tag sind 86400 Sekunden) und trägt das Ergebnis als timestamp ein.
Nun erzeugt man noch die Paketdateien, die man gerade eingetragen hat. Newsflash kann die Datenübertragung sehr gut optimieren, indem es parallel mehrere Pakete abarbeitet. Hier macht man ihm die Vorgabe, wie das zu geschehen hat:
/var/lib/news/packet1 # Slackware: /usr/lib/news/newsflash/packet1 de.comm.isdn fido.ger.isdn de.comp.os.linux.networking /var/lib/news/packet2 # Slackware: /usr/lib/news/newsflash/packet2 de.comp.os.linux.networking fido.ger.isdn de.comm.isdn /var/lib/news/packet3 # Slackware: /usr/lib/news/newsflash/packet3 de.comp.os.linux.misc de.comp.os.linux.hardware de.comp.os.linux.x lrz.* /var/lib/news/packet4 # Slackware: /usr/lib/news/newsflash/packet4 lrz.* de.comp.os.linux.x de.comp.os.linux.hardware de.comp.os.linux.miscWie an sieht, haben die Pakete 1/2 und 3/4 den jeweils gleichen Inhalt, nur die Reihenfolge ist vertauscht. Auf diese Weise wird ein Paket gleichzeitig von zwei Seiten abgearbeitet, die Übertragung wird optimiert. Die Pakete sollten jeweils das etwa gleiche Newsaufkommen besitzen.
root:# cd /usr/src/postit root:# make dep ... root:# make ... root:# cp postit /usr/lib/news/bin root:# cp samples/sendnews /usr/lib/news/bin root:# _Die hier zuletzt auftauchende Datei /usr/lib/news/bin/sendnews muß editiert werden:
/usr/lib/news/bin/sendnews SPOOLPATH=/var/spool/news OUTGOING=${SPOOLPATH}/out.going BINPATH=/usr/lib/news/bin ${BINPATH}/ctlinnd flush get mv ${OUTGOING}/get ${OUTGOING}/get.postit ${BINPATH}/ctlinnd begin get ${BINPATH}/postit get.postit getnews
Wenn's nicht klappt, bleibt nur eine Fehlersuche mit Hilfe der READMEs übrig... In der Regel muß man etwas mit den Einträgen in hosts.nntp, nnrp.access, newsfeeds etc. herumspielen.
Ansonsten kann man jetzt mit einem Newsreader (z.B. nn, tin oder Netscape) die Newsgroups durchackern, die man per newsflash geordert hat.
Zum Holen der Dateien kann man sich wieder ein Script machen, das dem Email-Hol-Script sehr ähnlich ist:
/sbin/transnews #!/bin/sh # transnews: gets and sends usenet news. # Author: Bernhard Hailer <dl4mhk@lrz.uni-muenchen.de> # Version: 4.0 (27-Jan-97) PATH=/sbin:/usr/sbin:/bin:/usr/bin . /etc/i4l.provider . /etc/i4l.secrets cd / # against PATH=. effect echo ----------------------------------------------------------------------- echo -e "Starting news transfer: \c"; date . /sbin/connect on echo "Checking news server..." set `ping -qc5 -i1 getnews | grep transmitted` if [ $4 -gt 0 ]; then echo "8-) News server online - starting news poll" echo "Sending news..." su news -c "/usr/lib/news/bin/sendnews" echo "Again sleeping 1 sec for PPP handshaking" sleep 1 echo "Fetching news..." su news -c "/usr/lib/news/bin/newsflash -v" echo "Again sleeping 1 sec for PPP handshaking" sleep 1 else echo ":-[ Sorry - news server is down. Try later..." fi . /sbin/isdn off echo -e "Finished news transfer: \c"; date
# Transfer news every night at 04:29 a.m. 29 04 * * * /sbin/transnews 1>> /var/log/news-log 2>> /var/log/news-logWie schon im email-Kapitel beschrieben muß der cron mit der neuen crontab aufgerufen werden. Es empfiehlt sich, die Übertragung der Newsgroups eine Minute vor dem Emailtransfer (nicht gleichzeitig!!) zu starten, dann kann man eventuell eine Tarifeinheit sparen. Würde der Transfer gleichzeitig gestartet, würde eine der beiden Anwendungen eine vermeintlich bereits offene Leitung erkennen und sofort loslegen, obwohl die Verbindung gerade erst aufgebaut wird. Die Übertragung würde abgebrochen.
Viel Spaß mit den News!