#

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!