Linux
Das Usenet anzapfen


Auch das Usenet bietet reichlich Informationen - ich möchte auf so einige Newsgroups nicht verzichten müssen.

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-3
Dann 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").

InterNetNews

Zuerst werden wir uns des INN annehmen. Vorbedingung ist ein bereits installierter sendmail.

Vorarbeiten

Der INN-Dämon innd beißt sich mit allem, was sonst noch am News-Port "horcht", und ein fataler Fehler kann eine Zeile in /etc/inetd.conf sein:
  nntp stream tcp  nowait root  /usr/sbin/tcpd /usr/sbin/in.nntpd
Das 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: news
Damit 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

INN-Konfigurationsdateien

Nun sind wieder ein paar Konfigurationsdateien fällig:
/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 Postings
Hierzu 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:get
Zur 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:
  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: # _
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!!!

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

Politur

Es hat sich auf dem harten Wege gezeigt, daß der INN auch vollständigen Zugang zum Verzeichnis /var/run benötigt.
  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# _

Die große Frage: Funktioniert's?

Ein Versuchsstart geht so:
  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.

Einbau beim Rechnerstart

Der INN wird auch beim Neustart des Rechners mit rc.news gestartet. Man muß das in sie Startup-Sequenz einfügen.

Wieder haben wir es entweder mit simpleinit oder mit sysvinit zu tun. Hier beide Varianten:

simpleinit (z.B. Slackware)

In der Datei /etc/rc.d/rc.M geben wir eine weitere Startup-Datei bekannt:
/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.

sysvinit (z.B. S.u.S.E., Caldera, Red Hat...)

Im Falle des sysvinit der SuSE 4.2 ist es ein klein wenig komplizierter. Als erstes entwirft man eine Start/Stop-Datei:
/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 0
Damit 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.

Täglicher Kleinkram

Das bereits manuell aufgerufene Script news.daily muß von nun an täglich aufgerufen werden, sonst beschwert sich der INN per email beim User usenet. Wir entwerfen also eine kleine Crontab für den User news, der alleine dieses Script ausführen sollte:
/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.daily 
Und 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

Geben und Nehmen

Zum Posten und News-Holen gibt es einige Pakete, die dem INN zuspielen können, beispielsweise newsflash+postit von Chris Blum oder suck+rpost von Tim Smith. INN hat eigentlich selbst Scripten "an Bord", mit denen man das erledigen könnte. Da aber das NNTP-Handshaking recht aufwendig ist und die Telefonleitung möglichst effektiv ausgelastet werden soll, ist es durchaus sinnvoll, auf ein intelligentes Programm zurückzugreifen.

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:# _

Installation von newsflash

Newsflash holt ausgewählte Newsgroups (zumindest das, was noch nicht am heimischen Rechner ist).

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 timestamp
Hier 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.misc
Wie 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.

Installation von postit

Auch hier: Vor der Compilation sollte man sich /usr/src/postit/config.h ansehen und die dort eingestellten Pfade einstellen (/var/spool/news). In der Regel paßt diese Datei aber auf Anhieb.
  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

Die zweite große Frage: Klappt's immer noch?

Der Aufruf von newsflash sollte nun für einige Minuten die ISDN-Leitung zum Glühen bringen. Auf der Konsole sollten jede Menge Meldungen kommen, was gerade so abläuft. Da das Programm optimal parallelisiert, mag das alles etwas durcheinander aussehen.

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 

Für dauerlaufende Rechner...

... muß man sich die crontab des Users root vornehmen und folgenden Eintrag hinzufügen:
  # Transfer news every night at 04:29 a.m.
  29 04 * * *       /sbin/transnews 1>> /var/log/news-log 2>> /var/log/news-log
Wie 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!


Copyright © (GPL V 2) 1996 Bernhard Hailer
Letzte Änderung: 20-Feb-97 BeH