# inn+suck - instalacja.

## Rafał Czeczótka

v4.11, 18 sierpień 2000

Tekst ten opisuje procedurę instalacji lokalnego serwera news (inn), sposób wymiany postów (suck) oraz metodę kompresji newsów w drodze (ssh). Oryginał tego dokumentu można znaleźć na stronie www.amg.gda.pl/~michu/linux.html. Zostało użyte kodowanie ISO-8859-2.

## 1. Wstęp

## 1.1 Przedmowa

Impulsem do napisania tego tekstu były moje początkowo nieudane próby instalacji oraz nikły odzew na moje posty na grupie pl.comp.os.linux (pewnie jak zwykle moje zapytania zaginęły gdzieś w potoku informacji i zapytań docierających tu codziennie). Nie mam zamiaru pretendować do miana fachowca od konfiguracji serwerów news (po prostu u mnie już to działa), tym nie mniej mam nadzieję, że opis działającej konfiguracji będzie dla kogoś przydatny.

Całą treść tego dokumentu stanowi opis mojej instalacji duetu inn+suck w systemie RedHat 6.2, w oparciu o pakiety inn-2.2.2-3 i suck-4.2.2-1. Jeśli dysponujesz inną wersją systemu i/lub pakietów to mogą występić pewne różnice w konfiguracji, mniemam jednak, że nie powinno to stanowić najmniejszego problemu już dla średnio zaawansowanego miłośnika Linux'a.

Wszelkie sugestie i poprawki są mile widziane i należy je wysyłać pod adres michu@amg.gda.pl. Jestem skory do pomocy, proszę jednak o uszanowanie mojego czasu i nie wysyłanie mi listów o lakonicznej treści typu "nie działa mi, CO ROBIĆ???" czy magabajtowych załączników z konfiguracją. Jeśli widzisz, że nic Ci nie wychodzi, to sprawdź czy wykonałeś dokładnie wszystkie kroki (z dokładnością do różnych wersji pakietów/dystrybucji). Jeśli po paru podejściach nadal masz poważne problemy, to lepiej na razie sobie odpuść i spróbuj ponownie za jakiś czas.

W tym dokumencie w paru miejscach porównuję inn'a do leafnode'a, którego wcześniej używałem.

## 1.2 Podziękowania

Następujący ludzie przyczynili się do powstania tego dokumentu, taką czy inną drogą, świadomie lub nieświadomie (w kolejności alfabetycznej):

- Ariadna - wyjechała służbowo na dwa tygodnie, dzięki czemu mogłem m.in. spokojnie spłodzić ten dokument ;-) oraz po powrocie poprawiła wiele literówek (kobiety bywają czasem przydatne :-)
- Andrzej Radecki (radecki@posejdon.wpk.p.lodz.pl) - podał sposób czytania lokalnego archiwum,
- Bartosz Maruszewski z JTZ (B.Maruszewski@jtz.org.pl) - nadesłał dołączony skrypt do dodawania zasubscribowanych grup do inn'a, wspierał mnie moralne (z czego pewnie nie zdawał sobie sprawy :) oraz przekodował ten dokument do SGML,
- Jacek Czerwiński (klik@rubikon.net.pl) - podał rozwiązanie likwidujące problem odsyłania postów,
- Jakub Bogusz (qboosh@priv6.onet.pl) - podał jeszcze jeden sposób, w jaki można rozwiązać problem odsyłania postów,
- Krzysztof Zietara (tarhim@studio.net.pl) - rozwiązał problem ze ściąganiem (a raczej jak ich nie ściągać) grup `control`, `control.cancel`, `junk`, `test` i `to` oraz nadesłał inne uwagi,
- Maciej Miechowicz (miechus@aurora.put.poznan.pl) - dokonał przełożenia niniejszego tekstu na język angielski,
- Marcin Kasperski (Marcin.Kasperski@softax.com.pl) - dodał parę uwag dotyczących instalacji na Debian'ie, wymiany postów z wieloma serwerami oraz podesłał całą sekcję na temat grup moderowanych,
- Michal Kaczmarek (shadow@fanthom.math.put.poznan.pl) - podał kilka istotnych uwag,
- Michał Tyrała (kbns@zeus.polsl.gliwice.pl) - pomógł w rozwiązaniu problemów z wpuszczaniem postów do inn'a przy transferze z kompresją oraz nadesłał odpowiedni skrypt,
- Radosław Gancarz (feanor@zeus.polsl.gliwice.pl) - rozwiązał problemy z odrzucaniem niektórych postów (zmiany w newsfeeds),
- Tomasz Sienicki (tsca@cryogen.com) - podał ciekawego URL'a związanego z tematem,
- Tomasz Szymczak (szymczak@bg.univ.gda.pl) - podał sugestię dotyczącą opcji `-M` w suck'u,
- Inni, nie wymienieni z nazwiska, zwrócili uwagę na parę drobnych niedomówień, niedociągnięć, potknięć i nieścisłości.

## 2. Słowo o programach, instalacja i konfiguracja

## 2.1 Co to jest inn i suck

Inn jest to "InterNetNews daemon" czyli program umożliwiający wielu użytkownikom korzystanie z zasobów news.

Suck jest to zasysacz newsów; pośredniczy on w wymianie newsów pomiędzy dwoma serwerami: naszym i zdalnym (emulując zachowanie normalnego czytnika; protokół wymiany postów pomiędzy serwerami (wbudowany w inn'a) odbywa się na trochę innej zasadzie i wymaga specjalnej konfiguracji po obu stronach, czego chcemy uniknąć).

## 2.2 Kiedy instalować inn+suck

Jeśli uważasz, że spełnione są poniższe warunki:

1. Nudzi Ci się i potrzebujesz jakiejś odmiany (warunek konieczny, bo przecież tak naprawdę jeśli potrzebujesz lokalnego serwera newsów, to z pewnością wystarczy Ci dużo prostszy w konfiguracji i używaniu leafnode, poza tym ten eksperyment może Cię kosztować sporo czasu i nadszarpniętych nerwów),
2. Z newsów na twoim komputerze korzysta więcej niż jeden użytkownik (bo dla jednego usera zupełnie wystarczające są rozwiązania typu `rtin -SQ`) ewentualnie "twój" komputer służy jako serwer news dla całej sieci (np. w firmie),
3. Możliwości leafnode'a już Ci nie wystarczają (potrzebujesz killfile'i, różnych ograniczeń na ściąganą pocztę newsową, ...),
4. Ściąganie newsów trwa u Ciebie zbyt długo i potrzebujesz ich kompresji,

to znaczy, że powinieneś zainstalować duet inn+suck.

Jeśli już będziesz chciał zainstalować to oprogramowanie, to będą Ci potrzebne następujące (lub inne wersje) pakiety:

1. cleanfeed (np. cleanfeed-0.95.7b-7, wymagany tylko w RedHat, aby spełnić zależności RPM'a),
2. inn (np. inn-2.2.2-3),
3. perl-MD5 (np. perl-MD5-1.7-2, podobnie jak cleanfeed wymagany tylko w RedHat),
4. suck (np. suck-4.2.2-1).

## 2.3 Wady i zalety tego rozwiązania

Zalety inn+suck:

1. Szybki (piekielnie),
2. Znaczne możliwości (killfile, ...), choć tu należy raczej patrzeć na możliwości suck'a (ponieważ dopiero po ściągnięciu pliki są przesyłane do inn'a a jak coś już w całości przeszło przez modem, to moim zdaniem niech już zostanie),
3. Można tak skonfigurować inn+suck, że newsy są ściągane skompresowane, czyli czas transmisji można skrócić parokrotnie,
4. Można grep'ować pliki z zawartością grup bez żadnych "skutków ubocznych" (ta uwaga odnosi się do dużo prostszego leafnode'a, gdzie czas do expire jest liczony od daty ostatniego dostępu do pliku, więc jeśli "to się zrobiło", to czas ten oczywiście przedłużał się),
5. Instalując ten serwer jesteś "wśród najlepszych" (większość dużych serwerów news działa właśnie na inn'ie).

Wady inn+suck:

1. Dość pogmatwana konfiguracja i hermetyczna dokumentacja (przynajmniej na początek) ale ten dokument powstał właśnie aby wyeliminować tę niedogodność,
2. Pamięciożerność:
   - Proces innd cały czas pozostaje w pamięci (leafnode wywoływany jest "na żądanie"),
   - Na dysku zajmuje więcej miejsca niż leafnode (choć jest to do przyjęcia).

## 2.4 Podstawowa instalacja i konfiguracja

UWAGA!!! W zależności od dystrybucji i wersji pakietów wymienione poniżej pliki konfiguracyjne mogą występować w innych katalogach (np. `/var/lib/suck/`, `/usr/lib/suck/`, `/etc/suck/`, ...).

Proces instalacji i "konfiguracji" jest prosty (przynajmniej do pierwszego "ruszenia", ale o tym, bez tego wstępu, przeciętny zjadacz newsów możne przekonać się dopiero po parodniowych dociekaniach):

1. Zainstalować inn i suck (i jeszcze parę wymienionych wcześniej drobiazgów),
   UWAGA!!! Ponieważ inn bardzo źle znosi wszelkie zmiany atrybutów plików (jest to przyczyna większości niepowodzeń), najlepiej je gdzieś zapisać:

   > `

   >     ----- ciach -----
   >     ls -ld `rpm -ql inn` > ~/jakiś_plik_z_atrybutami
   >     ----- ciach -----

   > `

   a wszelkie operacje wykonywać jako użytkownik `news`.
2. W pliku `/etc/news/newsfeeds` dodać własną sekcję z feeds, tj.:

   > `

   >     ----- ciach -----
   >     ...
   >     news.task.gda.pl\
   >             :!junk,!test,!to\
   >             :Tf,Wnm:
   >     ...
   >     ----- ciach -----

   > `

   gdzie `news.task.gda.pl` to nazwa mojego serwera news, oraz do definicji dystrybucji akceptowanych przez nasz serwer dodać polską:

   > `

   >     ----- ciach -----
   >     ...
   >     ME\
   >         :*,!junk,!control*,!local*,!foo.*\
   >         /pl,world,usa,na,gnu,bionet,pubnet,u3b,eunet,vmsnet,inet,ddn,k12\
   >         ::
   >     ##   ^^ - to jest to pl
   >     ...
   >     ----- ciach -----

   > `

3. W pliku `/var/lib/suck/get.news.inn` (w Debiani'e jest to plik `/etc/suck/get-news.conf`) wstawić nazwę serwera news (np. `REMOTE_HOST=news.task.gda.pl`) oraz "sajtu" (tego samego co przy definicji feed'u, tj. `SITE=news.task.gda.pl`),
4. W suck'u w pliku `/var/lib/suck/sucknewsrc` zapisać wszystkie interesujące nas grupy i numery postów, od których ma się zacząć "ściąganie", np. aby ściągnąć ostatnich 100 postów należy podać:

   > `

   >     ----- ciach -----
   >     ...
   >     pl.comp.ogonki -100
   >     pl.comp.os.linux -100
   >     ...
   >     ----- ciach -----

   > `

5. Jeśli istnieją pliki `/etc/cron.daily/inn-cron-rnews` oraz `/etc/cron.hourly/inn-cron-nntpsend`, to należy je usunąć (ich funkcje przejmuje suck),
6. Jeśli w pliku `/etc/news/nnrp.access` nie ma wpisu `localhost:` to należy go dodać,
7. Teraz możemy już wystartować serwer np. poleceniem `/etc/rc.d/init.d/innd start`. Można/trzeba także dodać odpowiednie linki do katalogów `/etc/rc.d/rc[0-6].d/` (np. poleceniem `ntsysv`),
8. Dodać grupy do inn'a. Można to zrobić ręcznie poleceniem `ctlinnd newgroup nazwa.grupy` lub skorzystać z poniższego skryptu:

   > `

   >     ----- ciach -----
   >     #!/bin/bash
   >     #
   >     # Ten skrypt tworzy automatycznie grupy w inn'ie, które podałeś w pliku
   >     # /var/lib/suck/sucknewsrc - konfiguracyjnym dla suck-a.
   >     # UWAGA !!!
   >     # Wymagany format tego pliku to:
   >     ############################
   >     # nazwa.grupy numer.artykulu
   >     ############################
   >     #
   >     # Możesz podać inna lokalizacje
   >     SUCK_FILE=/var/lib/suck/sucknewsrc
   >     #
   >     # Podaj ścieżkę do programu ctlinnd. Skrypt spróbuje sam zgadnąć, ale
   >     # lepiej podaj jak wiesz.
   >     CTLINND=`which ctlinnd`

   >     cat ${SUCK_FILE} | while read ln; do
   >             set -e $ln >/dev/null
   >             ${CTLINND} newgroup $1
   >             if [ $? -eq 1 ]; then
   >                     echo Błąd podczas zakładania grupy $1 !!!
   >                     exit
   >             fi
   >     done
   >     ----- ciach -----

   > `

9. Aby nie ściągać grup `control`, `control.cancel`, `junk`, `test` ani `to` (z pewnością nam się nie przydadzą), musimy stworzyć plik `/var/lib/suck/get.news.inn`:

   > `

   >     ----- ciach -----
   >     control
   >     control.cancel
   >     junk
   >     test
   >     to
   >     ----- ciach -----

   > `

   Oczywiście grup tych nie należy umieszczać w pliku `/var/lib/suck/sucknewsrc`,
10. Wymianę newsów ze zdalnym serwerem inicjujemy skryptem `/var/lib/suck/get.news.inn` (lub `/var/sbin/get-news` na Debian'ie),
11. Aby czytać newsy musimy ustawić zmienną środowiskową `NNTPSERVER`. Dla bash'a będzie to komenda:

    > `

    >     export NNTPSERVER=localhost

    > `

## 2.5 Kompresja newsów w drodze

Ponieważ newsy są danymi tekstowymi, więc ich kompresja zdecydowanie skraca czas transmisji, dzięki czemu z pewnością zaoszczędzimy trochę pieniędzy kosztem naszego operatora telekomunikacyjnego (pieniądze te mogą być wysłane do autora powyższego tekstu, za ewentualne straty autor oczywiście nie bierze żadnej odpowiedzialności ;-). Osobiście wydaje mi się, że przedstawione tu rozwiązanie jest najbardziej naturalne i elastyczne. Nie oznacza to oczywiście, że nie można tego zrobić lepiej. Podczas eksperymentów okazało się także, że zwykłe tunelowanie komunikacji w skompresowanym kanale ssh nie daje oczekiwanych rezultatów, stąd wyniknęła potrzeba wywołania suck'a na zdalnym komputerze (po prostu komunikacja pomiędzy komputerami jest na tyle duża, że po uwzględnieniu opóźnień występujących w trakcie transferu, niemal całkowicie niweczony jest efekt zmniejszonej objętości danych).

Opisując poniższe rozwiązanie zakładam, że masz już poprawnie zainstalowane i skonfigurowane pakiety inn+suck. Aby z niego korzystać niezbędne nam także będą:

1. na domowym komputerze musi być zainstalowny klient ssh,
2. musimy mieć dostęp do konta na zdalny komputerze z zainstalowanym systemem Unix'opodobnym, podłączony w miarę szybkim łączem stałym do internetu, z zainstalowanym suck'iem oraz uruchomionym demonem ssh.

Cała przedstawiona poniżej idea opiera się na możliwości uruchomienia suck'a na zdalnym komputerze tak, aby wiadomości były wysyłane w postaci strumienia danych, który jest przesyłany w skompresowanym kanale ssh (opcja `-C`). Dopiero później, lokalnie, za pomocą skryptu filter2rnews, strumień ten jest dzielony na poszczególne wiadomości, które są wpuszczane za pomocą programu rnews do lokalnego serwera innd.

W tym celu musimy:

1. Usunąć z pliku `/var/lib/suck/get.news.inn` całą sekcję służącą do ściągania wiadomości, czyli skrypt ten powinien być postaci:

   > `

   >     ----- ciach -----
   >     #!/bin/sh

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

   >     #NOTE: this script probably needs to be run by root.  Most systems will
   >     # not let a normal user run ctlinnd

   >     REMOTE_HOST=news.task.gda.pl
   >     LOCAL_HOST=localhost

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

   >     CTLINND=${NEWSDIR}/bin/ctlinnd          # location of binary
   >     SHLOCK=${NEWSDIR}/bin/shlock            # location of binary

   >     TMPDIR=${BASEDIR}                       # location for suck.* files
   >     MSGDIR=${BASEDIR}/Msgs                  # where to put MultiFile messages when getting them

   >     SITE=news.task.gda.pl                           # name of site from newsfeeds file

   >     OUTGOING=${SPOOLDIR}/../outgoing/${SITE}        # location of the list of articles to upload
   >     OUTGOINGNEW=${OUTGOING}.new             # file to contain the list temporarily
   >     OUTGOINGFAIL=${OUTGOINGNEW}.fail        # file with failed xfers
   >     SCRIPT=${BASEDIR}/put.news              # my filter for rpost
   >     OUTFILE=/tmp/tmp$$                      # used by rpost as article after it is filtered
   >     LOCKFILE=${BASEDIR}/getnews.lock        # lock file to prevent multiple instances of script
   >     NEWSGROUP=news                          # which group owns the file in out.going, typically either news or uucp.

   >     TESTHOST=testhost
   >     RPOST=rpost
   >     SUCK=suck

   >     HISTORY=/var/lib/news/history           # location of history file

   >     # if we are already running, abort

   >     trap 'rm -f ${LOCKFILE} ; echo "Aborting" ; exit 1' 1 2 3 15
   >     ${SHLOCK} -p $$ -f ${LOCKFILE}
   >     if [ $? -ne 0 ]; then
   >             echo "Already running, can't run two at one time"
   >             exit
   >     fi

   >     # now upload messages
   >     if [ -s ${OUTGOING}  -o -s ${OUTGOINGNEW} ]; then

   >             ${TESTHOST} ${REMOTE_HOST} -s

   >             if [ $? -ne 0 ]; then
   >                     echo "Remote posting host not responding"
   >             else
   >                     # this is needed by INND so that the outgoing file will be
   >                     # properly flushed and we have a new blank file to work with
   >                     # when we are done
   >                     # First mv the current one to a new file name
   >                     # Since innd already has the file open, it doesn't care
   >                     # about the rename.
   >                     # The flush will ensure that all messages to be posted have
   >                     # been written out, close off the old one (already renamed)
   >                     # and create a new one.

   >                     # if the outgoingnew already exists, it means we aborted last time
   >                     # so don't try to do it again
   >                     if [ ! -s ${OUTGOINGNEW} ]; then
   >                             mv ${OUTGOING} ${OUTGOINGNEW}
   >                             ${CTLINND} flush ${SITE}
   >                     fi

   >                     # outgoing messages to post
   >                     ${RPOST} ${REMOTE_HOST} -d -b ${OUTGOINGNEW} -p ${SPOOLDIR} -f \$\$o=${OUTFILE} ${SCRIPT} \$\$i ${OUTFILE}

   >                     ERRLEV=$?
   >                     if [ ${ERRLEV} -eq 0 ]; then
   >                             echo "Remotely posted articles"
   >                             rm ${OUTFILE}
   >                     elif [ ${ERRLEV} -eq 1 ]; then
   >                             echo "Error posting a message"
   >                     elif [ ${ERRLEV} -eq 2 ]; then
   >                             echo "Unable to do NNTP authorization with remote server"
   >                     elif [ ${ERRLEV} -eq 3 ]; then
   >                             echo "Unexpected answer from remote server to a command while doing NNTP authorization"
   >                     elif [ ${ERRLEV} -eq -1 ]; then
   >                             echo "Fatal error"
   >                     fi

   >                     if [ -f ${OUTGOINGFAIL} ]; then
   >                             mv ${OUTGOINGFAIL} ${OUTGOINGNEW}       # so we can re do it
   >                             chown news.${NEWSGROUP} ${OUTGOINGNEW}
   >                             chmod 664 ${OUTGOINGNEW}
   >                     fi
   >             fi
   >             echo "You can hang up the modem now"
   >     fi

   >     rm -f ${LOCKFILE}
   >     ----- ciach -----

   > `

   Oczywiście należy pamiętać o właściwym ustawieniu zmiennych `REMOTE_HOST` i `SITE`.
2. Skopiować z lokalnego katalogu `/var/lib/suck/` pliki `active-ignore`, `suck.killlog`, `suckkillfile` oraz `sucknewsrc` do zdalnego katalogu `$HOME/suck/` (jeśli nie jest tam zainstalowany suck, a tamta maszyna ma taką samą architekturę jak nasza, to możemy skopiować tam także program `/usr/bin/suck`).
3. Stworzyć możliwość logowania się na zdalnym komputerze za pomocą ssh bez użycia hasła (tylko na podstawie znajomości klucza RSA):
   1. wygenerować parę kluczy RSA komendą ssh-keygen (w pass phrase nie podawać hasła),
   2. następnie skopiować plik `$HOME/.ssh/identity.pub` na zdalny komputer do pliku `$HOME/.ssh/authorized_keys`.
   UWAGA!!! Należy zdawać sobie sprawę z tego, że mimo, iż takie rozwiązanie jest o wiele bezpieczniejsze od logowania się za pomocą hasła, to krytyczną rolę dla bezpieczeństwa odgrywa tutaj nie ujawnianie zawartości pliku `$HOME/.ssh/identity`, czyli prywatnej połowy klucza. Istnieje także rozwiązanie umożliwiające wygenerowanie klucza z hasłem i podawanie go tylko raz na sesję (patrz program ssh-agent).
4. Utworzyć skrypt `/usr/local/bin/filter2rnews`:

   > `

   >     ----- ciach -----
   >     #!/usr/bin/perl -w

   >     while (not eof STDIN) {
   >       @POST = ();
   >       while (<>) {
   >         last if /^\.$/;
   >         push @POST, $_;
   >       }
   >       $dlug = length(join('',@POST));
   >       print "#! rnews $dlug\n";
   >       print @POST;
   >     }
   >     ----- ciach -----

   > `

5. Po dokonaniu wszystkich powyższych kroków możemy już pobierać newsy komendą:

   > `

   >     ----- ciach -----
   >     ssh -C -l username serwer.name \
   >       '~/suck/suck news.task.gda.pl -dd ~/suck -dt ~/suck -M -c' | \
   >       filter2rnews | rnews -N -vvv -S localhost
   >     ----- ciach -----

   > `

   gdzie username to nazwa użytkownika na komputerze serwer.name a news.task.gda.pl jest nazwą naszego serwera news. Wiadomości wysyłamy tak jak poprzednio, czyli za pomocą skryptu `/var/lib/suck/get.news.inn`.
6. Pomocnym będzie uaktualnienie bazy overview (rnews nie robi tego automatycznie):

   > `

   >     ----- ciach -----
   >     su news -c 'expireover -s -a'
   >     ----- ciach -----

   > `

## 2.6 CNFS

### Krótka chrakterystyka CNFS

Domyślnie inn skonfigurowany jest w taki sposób, że artykuły przechowywane są w postaci oddzielnych plików, w strukturze katalogów odpowiadającej pozycji grupy w hierarchii. Podstawową zaletą tego rozwiązania jest prostota oraz wynikająca z niej łatwość tworzenia rozwiązań pomocniczych. Jednak taki sposób przechowywania ma co najmniej dwie poważne wady. Pierwszą jest to, że artykuły przechowywane są z użyciem mechanizmów systemu operacyjnego, które to nie są zoptymalizowane do obsługi wielu plików o małym rozmiarze, konsekwencją czego jest wolny dostęp i duża ilość zmarnowanego miejsca. Drugą wadą jest to, że nigdy nie wiemy, jak dużo miejsca będą nam zajmowały newsy, co grozi przepełnieniem partycji.

Wymienione powyżej niedogodności tradycyjnego przechowywania plików eliminuje CNFS (Cyclic News File System). Ten sposób przechowywania artykułów polega na tym, że zapisywane są one w pliku o specjalnym formacie. Gdy skończy się miejsce, nowe artykuły automatycznie nadpisują najstarsze. Rozwiązanie takie jest bardzo szybkie i nie grozi nam już przepełnienie partycji. Jedyną jego wadą jest to, że teraz utrudniony jest "samodzielny" dostęp do pojedynczych artykułów.

### Instalacja i konfiguracja CNFS

Aby zainstalować CNFS należy (wszystkie te czynności oczywiście najlepiej wykonać jako użytkownik `news`):

1. W pliku `/etc/news/inn.conf` ustawić opcję `storageapi` na `on`,
2. W pliku `/etc/news/newsfeeds`:
   1. Wyrzucić wpis `crosspost:...`,
   2. Zmienić wpis `overview` na:

      > `

      >     ----- ciach -----
      >     overview!:*:Tc,Ao,WhR:/usr/bin/overchan
      >     ----- ciach -----

      > `

3. W pliku `/etc/news/cycbuff.conf` umieścić definicję naszego bufora cyklicznego, np.:

   > `

   >     ----- ciach -----
   >     cycbuff:ONE:/var/spool/news/one:131072
   >     metacycbuff:BIGAREA:ONE
   >     ----- ciach -----

   > `

   gdzie `ONE` jest symboliczną nazwą bufora, `/var/spool/news/one` jest plikiem bufora, `131072` rozmiarem bufora a `BIGAREA` jest nazwą metabufora cyklicznego,
4. W `/etc/news/storage.conf` definiujemy jakie artykuły mają być przechowywane w buforze. Ponieważ my mamy tylko jeden bufor, gdzie powinny znaleźć się wszystkie artykuły, to u nas ten plik będzie wyglądał następująco:

   > `

   >     ----- ciach -----
   >     method cnfs {
   >       newsgroups: *
   >       class: 1
   >       size: 0,1000000
   >       options: BIGAREA
   >     }
   >     ----- ciach -----

   > `

5. Z poziomu shell'a tworzymy bufor zdefiniowany w pliku `/etc/news/cycbuff.conf`:

   > `

   >     ----- ciach -----
   >     dd if=/dev/zero of=/var/spool/news/one bs=1k count=131072
   >     chmod 0664 /var/spool/news/one
   >     ----- ciach -----

   > `

6. Ponieważ teraz do treści artykułów nie dostaniemy się przez nazwę pliku (np. komendą `cat`) lecz token (program `sm`), to musimy w konfiguracji `suck`'a:
   1. W skrypcie `/var/lib/suck/get.news.inn` usunąć w wywołaniu `rpost`'a parametr `-p nazwa_katalogu`,
   2. Zamienić skrypt `put.news` na `put.news.sm` (powinien być w przykładach lub źródłach),
7. I możemy zaczynać ściągać news'y.

### Podstawowe różnice

Podstawową różnicą w stosunku do standardowego sposobu przechowywania artykułów jest to, że nie ma potrzeby ich expirowania, teraz dzieje się to automatycznie, bez naszej pomocy (czasem być może wbrew naszej woli ;-).

Inną konsekwencją jest to, że pewne czynności wykonuje się w zupełnie inny sposób. Np. do odtworzenia bazy overview należy zamiast komendy `expireover` używać komendy `expireindex` (baza overview znajduje się teraz w katalogu `/var/spool/news/uniover/`). Ponieważ nie mamy teraz bezpośredniego dostępu do artykułów, czasem jest potrzeba wspomożenia się komendą `makehistory` (więcej informacji w manualach).

## 2.7 Grupy moderowane

[ RCz: sekcja napisana w całości przez Marcina Kasperskiego ]

W normalnej konfiguracji inn+suck grupy moderowane traktowane są tak samo, jak wszystkie pozostałe: wysyłane na nie artykuły trafiają od razu na lokalne grupy (bez akceptacji moderatora) i są wysyłane do serwera z którego pobieramy newsy. Dopiero ten serwer przesyła posty do moderatora.

Sprawia to następujące problemy:

- nie wiemy, czy nasze posty naprawdę trafiły na grupę, czy nie (tj. czy moderator je zaakceptował czy odrzucił - i kiedy)
- jeśli wymieniamy suck'iem posty z kilkoma serwerami, możemy podpaść moderatorom bo będziemy wysyłać po kilka razy ten sam list (każdy z serwerów sforward'uje post do moderatora)
- część grup moderowanych jakoś nie jest dobrze obsługiwana (nie udało mi się przez tpnet wysłać listu na comp.lang.perl.moderated)
- jeśli z naszego hosta korzysta grupa osób, widzą one grupę inaczej niż pozostali, mogą wysyłać odpowiedzi zanim moderator zaakceptował pytanie itp.

Problemy te możemy rozwiązać konfigurując grupy jako moderowane na naszym własnym serwerze. Wówczas inn nie będzie automatycznie umieszczał na grupie wysyłanych postów a zamiast tego wyśle je pocztą do moderatora. Zaakceptowane posty "spłyną" do nas kiedyś tam suck'iem - tak jak to się dzieje normalnie.

W celu takiej konfiguracji należy (lokalizacje plików poniżej odpowiadają Debianowi):

1. Tworzymy plik `/etc/news/moderators` z następującą treścią:

   > `

   >     # Uniwersalny adres moderatorów grup polskich
   >     pl.*:%s@usenet.pl
   >     # Uniwersalny adres moderatorów grup światowych
   >     *:%s@moderators.isc.org

   > `

2. W pliku `/etc/news/inn.conf` ustawiamy fromhost na adres jakiejś maszyny widocznej w światowym DNS'ie (nasz host maskaradujący, nasz provider, my sami jeśli jesteśmy wbici). Najlepiej, jeśli jesteśmy w stanie czytać pocztę dostawaną przez konto news na tym hoście (listy które nie doszły) ale nie jest to zdaje się absolutnie konieczne. Przy konfiguracji poczty smarthost najlepiej nadaje się tu adres naszego serwera mailowego. Mój plik `inn.conf` zawiera pola organization, server (prawdziwa nazwa mojego serwera) i fromhost (nazwa serwera pocztowego). Uwaga: straciłem dobry dzień zgadując czemu moje posty nie dochodzą póki na to nie wpadłem - miałem wcześniej jako fromhost pewien adres z sieci lokalnej i jakiś mailer po drodze wywalał pocztę do kosza - nie przysyłając żadnej informacji zwrotnej, bo nie miał jak.
3. Sprawdzamy dla pewności, czy jesteśmy w stanie wysłać pocztę z palca z konta news, przy pomocy sendmail'a na jakieś konto w internecie (np. na friko), ustawiając jako From `news@to-co-wpisaliśmy-jako-fromhost`.
4. Charakteryzujemy grupy jako moderowane

   > `

   >     ----- ciach -----
   >     ...
   >     ctlinnd changegroup pl.rec.humor.najlepsze m
   >     ctlinnd changegroup comp.lang.c++.moderated m
   >     ...
   >     ----- ciach -----

   > `

5. Próbujemy coś wysłać - najlepiej na grupę z której przychodzą powiadomienia o zakolejkowaniu.

## 2.8 Uwagi i kruczki

### Jeśli coś może pójść źle, to z pewnością pójdzie

1. Bardzo pomocnym programem jest `inncheck`, który sprawdza poprawność konfiguracji, atrybuty plików oraz wyświetla potencjalne źródła problemów. Jeśli coś nam nie działa to diagnostykę powinniśmy zacząć właśnie od uruchomienia tego programu.
2. W razie problemów należy także sprawdzić właścicieli oraz prawa dostępu do plików z pakietu inn'a (np. z plikiem `~/jakiś_plik_z_atrybutami` który czujnie zrobiliśmy na początku instalacji).
3. Jeśli podczas ściągania newsów pojawi się komunikat `GROUP command not recognized, try the -M option` oczywiście dodaj w pliku `/var/lib/suck/get.news.inn` opcję `-M` do wywołania suck'a.
4. Jeśli wysyłane przez nas posty nie pojawiają się w naszej kolejce wyjściowej (tzn. pliki w katalogu `/var/spool/news/outgoing/` są puste), to może pomóc dodanie wpisu `*,` w pliku `/etc/news/newsfeeds`:

   > `

   >     ----- ciach -----
   >     ...
   >     news.task.gda.pl\
   >             :*,!junk,!test,!to\
   >             :Tf,Wnm:
   >     ...
   >     ----- ciach -----

   > `

5. Jeśli nasz serwer odsyła z powrotem ściągnięte posty do zdalnego serwera, to przyczyną może być to, że nazwa zdalnego feed'u (np. `news.task.gda.pl`) jest inna niż nazwa umieszczona w polu Path: (np. `tasknews.task.gda.pl`). Aby temu zaradzić należy sprawdzić jaka nazwa jest w tym polu (najbardziej z lewej) i zmodyfikować plik `/etc/news/newsfeeds` w następujący sposób:

   > `

   >     ----- ciach -----
   >     ...
   >     news.task.gda.pl/tasknews.task.gda.pl\
   >             :!junk,!test,!to\
   >             :Tf,Wnm:
   >     ...
   >     ----- ciach -----

   > `

   Innym rozwiązaniem tego problemu jest dodanie parametru `H1` do opcji feedu, czyli `:Tf,Wnm,H1:`.

### Inn na co dzień, czyli rzeczy o których warto wiedzieć

1. Usuwanie grup odbywa się przez `ctlinnd rmgroup nazwa.grupy` (jeśli wywołujemy suck'a lokalnie, to on sam usunie taką grupę z pliku sucknewsrc, jeśli zdalnie (patrz kompresja) to musimy to zrobić ręcznie),
   UWAGA!!! Nie należy usuwać grup `control`, `control.cancel`, `junk`, `test` ani `to`, inn bardzo źle to znosi.
2. Opisy grup można dodawać w pliku `/var/lib/news/newsgroups`, np.:

   > `

   >     ----- ciach -----
   >     ...
   >     pl.comp.ogonki O polskich literkach w komputerach.
   >     pl.comp.os.linux Linux - system operacyjny dla kazdego.
   >     ...
   >     ----- ciach -----

   > `

   Możemy je ściągnąć np. komendą

   > `

   >     testhost news.task.gda.pl -d > jakiś_plik

   > `

   (jeśli na serwerze z którego ściągamy opisy jest dużo grup (może być ich nawet parędziesiąt tysięcy), to może to potrwać parę minut).
3. Dane o przeterminowaniach (nie dotyczy CNFS) są w pliku `/etc/news/expire.ctl`, usuwanie przeterminowanych postów można wymusić uruchamiając skrypt `/etc/cron.daily/inn-cron-expire` (przecież nie każdy ma włączony komputer całą dobę).
4. Aby usunąć limit linii dla postów ściągniętych przez inn'a (już po zaakceptowaniu przez suck'a) należy dodać w pliku `/etc/rc.d/rc.news` do opcji FLAGS flagę `-l0`.
5. Jeśli nie chcemy aby inn odrzucał stare posty, powinniśmy zwiększyć wartość parametru `artcutoff` w pliku `/etc/news/inn.conf`.
6. Od czasu do czasu można wyczyścić skrytkę pocztową użytkownika news np. z konta root'a komendą `su - news -c pine`.
7. W pliku `/etc/news/inn.conf` możemy zmienić parametry `organization` (bo napis `A poorly-installed InterNetNews site` w postach wygląda nieelegancko) oraz ustawić `pathhost` (ułatwia czytanie logów).
8. Jeśli przy próbie połączenia z inn'em pojawia się komunikat `You have no permision to talk. Goodbye` należy zaktualizować zawartość pliku /etc/news/nnrp.access, np. poniżej dodaliśmy możliwość dostępu z sieci 192.168.1.0:

   > `

   >     ----- ciach -----
   >     # Default to no access
   >     *:: -no- : -no- :!*
   >     # Allow access from localhost
   >     localhost:Read Post:::*
   >     192.168.1.0/24:Read Post:::*
   >     ----- ciach -----

   > `

9. Jeśli chcemy założyć lokalną (local) hierarchię, to wystarczy założyć odpowiednie grupy local.* oraz zmienić wpis w `/etc/news/newsfeeds`:

   > `

   >     ----- ciach -----
   >     ...
   >     news.task.gda.pl\
   >             :!junk,!test,!to,!local.*\
   >             :Tf,Wnm:
   >     #                       ^^^^^^^^^ ten wpis
   >     ...
   >     ----- ciach -----

   > `

   aby nasze lokalne posty nie wędrowały gdzieś po świecie.
10. Jeśli ściągamy newsy z kilku serwerów, to wystarczy jeśli umieścimy w pliku `/etc/news/newsfeeds` odpowiednie wpisy:

    > `

    >     ----- ciach -----
    >     ...
    >     news.task.gda.pl/news.tpnet.pl,news.icm.edu.pl\
    >             :!junk,!test,!to\
    >             :Tf,Wnm:

    >     news.tpnet.pl/news.task.gda.pl,news.icm.edu.pl\
    >             :!junk,!test,!to\
    >             :Tf,Wnm:
    >     ...
    >     ----- ciach -----

    > `

11. Jeśli przy uruchomieniu suck'a pojawia się komunikat typu `Can not open /usr/news/db/history, Skipping` warto podlinkować `/usr/news/db/` do katalogu z bazą history (zazwyczaj `/var/lib/news/`). Jeśli zdarza nam się używać kilku serwerów, to suck nie będzie ponownie ściągał postów, które już są w naszym serwerze.
12. Sprawdzenie kolejki postów wychodzących można dokonać poniższym skryptem (jest to przerobiony skrypt newsq z pakietu leafnode):

    > `

    >     ----- ciach -----
    >     #!/usr/bin/perl

    >     use MIME::Words qw(:all);

    >     $spooldir = "/var/spool/news";

    >     if ( chdir "$spooldir/outgoing" && opendir( DIR, "." ) ) {
    >         @sites = readdir( DIR );
    >         closedir( DIR );

    >         foreach (@sites) {
    >             if ( open(F, "< $_") ) {
    >                 while(<F>) {
    >                     push @posts, (split)[0];
    >                 }
    >                 close F;
    >             }
    >         }

    >         undef $/;
    >         foreach (@posts) {
    >             if ( open(F, "< $spooldir/articles/$_") ) {
    >     #       if ( open(F, "sm $_ |") ) {  # zamienić te linie dla CNFS
    >                 undef $subject, $newsgroups, $from;
    >                 $_ = <F>;
    >                 close F;
    >                 s/\n\n.*//s;
    >                 s/\r//gs;
    >                 s/\n\s+/ /sg;
    >                 foreach ( split( /\n/, $_ ) ) {
    >                     $subject = $1 if ( /^Subject:\s+(.*)/i );
    >                     $newsgroups = $1 if ( /^Newsgroups:\s+(.*)/i );
    >                     $from = $1 if ( /^From:\s+(.*)/i );
    >                 }
    >                 if ( $subject ne "" && $from ne "" && $newsgroups ne "" ) {
    >                   $from=decode_mimewords($from);
    >                   $newsgroups=decode_mimewords($newsgroups);
    >                   $subject=decode_mimewords($subject);
    >                   print $from . " in " . $newsgroups . "\n\t" . $subject . "\n";
    >                 }
    >             }
    >         }
    >     }
    >     ----- ciach -----

    > `

13. Jeśli chcemy aby było robione lokalne archiwum (np. grup z hierarchii pl.comp), to wystarczy jeśli dopiszemy do pliku `/etc/news/newsfeeds`:

    > `

    >     ----- ciach -----
    >     source-archive:!*,pl.comp.*\
    >       :Tc,Wn\
    >       :/usr/bin/archive -i /var/spool/news/archive/INDEX
    >     ----- ciach -----

    > `

    Archiwum to możemy czytać używając tin'a, np.:

    > `

    >     export TIN_SPOOLDIR=/var/spool/news/archive
    >     export TIN_LIBDIR=/var/lib/news
    >     tin

    > `

14. Jeśli mamy już wcześniej ściągnięte pliki z postami, to możemy spróbować przenieść te zasoby do inn'a, np. komendą:

    > `

    >     ----- ciach -----
    >     (for i in [0-9]*; do cat $i; echo .; done) \
    >       | filter2rnews | rnews -N -vvv -S localhost
    >     ----- ciach -----

    > `

    wykonywaną po kolei w każdym katalogu (z postami).

## 3. Inne dokumenty związane z tematem

- Dokumentacja dostarczana z pakietem (część może być dostępna tylko z pakietem ze źródłami),
- INN FAQ,
- Newsy w Polsce,
- Newsy na świecie,
- Pakiet załatwiający modemowcom sprawę "inn+suck z kilku serwerów" tak, że prościej nie można,
- Pakiet umożliwiający ściąganie skompresowanych paczek newsów przez WWW.

## 4. Do zrobienia

- Transport newsów po UUCP.

## 5. Prawa autorskie/legalność

Prawa autorskie należą do © Rafała Czeczótki. Dokument ten jest rozpowszechniany na podstawie GPL (Gnu Public License). Aby otrzymać kopię tej licencji napisz do Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Znaki towarowe należą do ich właścicieli. Nie ma żadnych gwarancji co do dokładności czy przydatności informacji zawartych w tym dokumencie.