# Newsy-Minimum

## Kenneth M. Lewis, Jr., <kent@fiona.umsmed.edu>
v?, 25 maja 1995
Wersja polska: Tomasz 'tsca' Sienicki, <tsca@edb.dk>
v1.02, 13 grudnia 2001

Dokument opisuje użycie serwera INN do obsługi niewielkiej ilości grup dyskusyjnych off-line.

## 1. O dokumencie

## 1.1 Aktualny status dokumentu

(Stan na dzień 14.10.1997)
Dokument Newsy-Minimum nie jest już aktualizowany przez autora. Jeśli chciałbyś podjąć się opieki nad tym dokumentem, skontaktuj się z <tjbynum@metalab.unc.edu>.

## 1.2 Prawa autorskie

Copyright (c) May 25, 1995 Kent Lewis (Kenneth M. Lewis, Jr.)

Jeśli dokument ten zostanie zaakceptowany przez Linux Documentation Project, wolno będzie rozpowszechniać go zgodnie z zasadami opisanymi w LDP HOWTO z zastrzeżeniem, że autor chciałby przejrzeć ostateczną formę niniejszego dokumentu przed włączeniem go do ww. zasobów.

## 2. Wstęp

Używam Linuksa, a z siecią łączę się za pomocą modemu. Do niedawna musiałem utrzymywać stałe połączenie z siecią aby móc czytać grupy dyskusyjne. Nie mogę jednak zbyt długo pozostawać on-line -- korzystam z usług odległego dostawcy łącza, za czas on-line płacę więc stawki międzymiastowe; oznacza to wysokie rachunki telefoniczne. Dlatego zacząłem się zastanawiać nad zminimalizowaniem kosztów dostępu do sieci bez utraty korzyści z tego dostępu płynących. Sposób taki znalazłem; mam nadzieję, że przyda się on również innym.

Dokument niniejszy opisuje jak używać INNa z niewielkim tylko zestawem grup. Za pomocą prostego skryptu perlowego artykuły są jednocześnie ściągane i wysyłane podczas krótko trwającego połączenia z siecią. Całość jest w wersji ,,alfa'' -- jeśli pojawią się nie opisane tu problemy, będziesz musiał sam sobie z nimi poradzić.

## 3. Opis sytemu ,,Newsy-Minimum''

## 3.1 Wymagania

Musisz mieć dostęp do serwera news (NNTP). Żeby sprawdzić, czy możesz z danego serwera czytać grupy i na nie pisać, sprawdź programem telnet port 119 tego serwera -- pojawi się informacja na temat Twoich uprawnień. Jeśli już używasz danego serwera, to wiesz, że dostęp masz -- w takim wypadku nie ma co sprawdzać. :-) Natomiast jeśli dostępu nie masz, postaraj się o niego przed przeczytaniem reszty niniejszego dokumentu.

Musisz mieć wystarczającą ilość miejsca na twardym dysku na składowanie artykułów. Moja linuksowa partycja ma 300 MB, a dwudniowy urobek około piętnastu grup zajmuje wg. `df` zaledwie od 1 do 2% pojemności dysku. Na wszelki jednak wypadek najlepiej zacząć od niewielkiej ilości grup i sukcesywnie dodawać kolejne.

Potrzebujesz Perla i INNa. Jeśli ich nie masz, ściągnij je z ftp://sunsite.unc.edu (lub któregoś z mirrorów). Perla prawdopodobnie znajdziesz w katalogu `/pub/Linux/devel/perl`, a INNa w `/pub/Linux/system/Mail/news`.

Jeśli jeszcze tego nie zrobiłeś, zainstaluj te dwa programy. Ja swojego INNa wziąłem z dystrybucji Slackware 2.2. Dołączona dokumentacja była bardzo dobra, po zapoznaniu się z nią nie powinieneś mieć problemu z instalacją. Perl, już skompilowany, również dołączony jest do Slackware 2.2 -- postaraj się zdobyć wersję skompilowaną, dokument niniejszy nie zawiera pomocy w instalacji i konfiguracji Perla.

## 3.2 Instalacja i rozruch

Nie zapomnij o założeniu grup ,,junk'' i ,,control'' -- bez nich program innd nie ruszy. Będziesz musiał założyć je ręcznie, ponieważ polecenie `ctlinnd` zakłada, że demon innd jest już uruchomiony. Po wystartowaniu tego demona utwórz poleceniem `ctlinnd newgroup ... ...` katalog do składowania newsów. Szczegółów szukaj w podręczniku systemowym (`man ctlinnd`).

Teraz musisz zmodyfikować plik `/etc/news/newsfeeds` -- dzięki temu INN utworzy plik w katalogu `/usr/spool/news/out.going/`; plik ten wykorzystywany będzie przez zamieszczony poniżej skrypt perlowy do publikowania napisanych off-line artykułów. Informacje na temat zawartości `/etc/news/newsfeeds` znajdziesz w dokumentacji INNa; przeczytaj też odpowiednią stronę podręcznika systemowego (`man newsfeeds`). WAŻNE: wpisy w `/etc/news/newsfeeds` powinny być umieszczone w takiej kolejności, aby pierwszym polem w pliku `/usr/spool/news/out.going/$NEWSFEED` były pełne ścieżki do artykułów, które chcesz wysłać. Jeśli pierwsze pole będzie zawierało co innego, skrypt będzie próbował wysłać na newsy owo ,,co innego'' zamiast Twoich artykułów, co z pewnością wywoła niepożądane efekty.

Nie zapomnij o zablokowaniu w pliku `control.ctl` możliwości automatycznego zakładania nowych grup. Jeśli tego nie zrobisz, to w miarę napływania z nadrzędnego serwera wiadomości kontrolnych liczba ściąganych grup będzie się powiększała, co spowoduje zwiększenie obciążenia i spowolnienie twojego systemu -- a w niniejszym HOWTO chodzi przecież o coś zupełnie przeciwnego.

Wejdź do wybranego przez siebie katalogu i wykonaj w nim polecenie
`touch -t $WCZORAJ lastget`
Zamiast `$WCZORAJ` użyj ciągu oznaczającego dzień wczorajszy (w formacie opisanym w podręczniku systemowym (`man touch`)).

Umieść poniższy skrypt w tym katalogu i nadaj mu prawa wykonywania. Zmień `$NEWSPATH` na katalog, w którym zainstalowałeś INNa (u mnie jest to `/usr/lib/news`). Zmień `$SCRIPTPATH` na ścieżkę do katalogu, w którym umieściłeś skrypt (u mnie `/usr/lib/news`). W tym samym katalogu znajdować się musi wspomniany wyżej plik `lastget`. Zmień `$PROVIDER` na adres serwera news, z którego będziesz korzystać. Zmień `$NEWSFEED` na nazwę feedu, której użyłeś w `/etc/news/newsfeeds`.

Przeczytaj strony ,,inews'' i ,,nntpsend'' podręcznika systemowego, aby zorientować się w działaniu poniższego skryptu.

    -----------------------------------------------------------------------------

    #!/usr/bin/perl

    ##
    ## pobierz nowe artykuly
    ##

    open(LIST, "$NEWSPATH/active")
            || die "nie moglem otworzyc listy grup do pobrania!";

    while (<LIST>) {
     @newsgroup = split(' ', $_); ## dzieli kolejne linie pliku active wg spacji,
                                  ## umieszcza dane w tablicy @newsgroup
                                  ## @newsgroup[0] zawiera teraz nazwę grupy

      system "$NEWSPATH/bin/nntpget -f $SCRIPTPATH/lastget -n @newsgroup[0] -o -v $PROVIDER"
            || print "nie moglem sciagnac postow z grupy @newsgroup[0]\n";
      }

    close(LIST);

    system "touch $SCRIPTPATH/lastget";

    ##
    ## usun naglowek "NNTP-Posting-Host: " z postow do wyslania
    ##

    open(LIST, "/usr/spool/news/out.going/$NEWSFEED")
          || die "nie moglem otworzyc listy postow do przygotowania do wyslania";

    while (<LIST>) {
      if (@article = split(' ', $_)) {
        $article = @article[0];
        rename("$article", "$article" . '.bak');
        $backup = "$article.bak";
        open(OUTPUT, ">> $article");
        open(INPUT, "$backup");
        select(OUTPUT);
        while (<INPUT>) {
          print unless ?^NNTP-Posting-Host.*\n?
          }
        close(OUTPUT);
        close(INPUT);
        unlink("$backup");
        reset;
      }
    }
    select(STDOUT);

    close(LIST);

    ##
    ## wyslij posty
    ##

    $ENV{'NNTPSERVER'} = "$PROVIDER";

    open(LIST, '/usr/spool/news/out.going/$NEWSFEED')
            || die "nie moglem otworzyc listy postow do wyslania";

    while (<LIST>) {
      if (@article = split(' ', $_)) {
        $article = @article[0];
        system "inews -h $article";
        }
      }

    close(LIST);

    ------------------------------------------------------------------------------

## 3.3 Sposób użycia

Powiedzmy, że nazwałeś powyższy skrypt ,,foonews''. Przy następnym połączeniu z siecią wykonaj polecenie `$SCRIPTPATH/foonews`. Jeśli przez ekran zaczną przewijać się identyfikatory wiadomości (Message-ID), to znaczy, że wszystko działa jak powinno. Być może będziesz musiał poczekać kilka sekund na pojawienie się pierwszych Message-ID. Po zakończeniu tej operacji powinieneś mieć na dysku wszystkie wiadomości wysłane na newsy od czasu ostatniej modyfikacji pliku `$SCRIPTPATH/lastget`, a wszystkie napisane przez Ciebie posty powinny być wysłane do serwera, z którym się łączyłeś; serwer rozpropaguje te wiadomości dalej. Po wszystkim plik `$SCRIPTPATH/lastget` będzie miał dzisiejszą datę ostatniej modyfikacji; jutro, kiedy ponownie uruchomisz ,,foonews'', skrypt ściągnie newsy wysłane na newsy między tą datą, a momentem uruchomienia skryptu.

Będziesz musiał ręcznie usuwać zawartość pliku `/usr/local/news/out.going/$NEWSFEED`. Umyślnie nie dopisałem tej funkcji do skryptu, żeby móc sprawdzić, czy moje artykuły rzeczywiście zostały wysłane... i jakoś nie zabrałem się jeszcze do zautomatyzowania tego zadania. Po pierwszym uruchomieniu skryptu najpierw sprawdziłem, czy artykuły zostały wysłane, a dopiero potem usunąłem zawartość tego pliku; możesz zrobić tak samo.

Jeśli poprawnie skonfigurowałeś INNa, to skrypt `$NEWSPATH/bin/news.daily` zajmie się poprawnym działaniem całej konstrukcji.

W tej chwili wszystko robię ręcznie, jednak nic nie szkodzi na przeszkodzie, aby proces ten zautomatyzować. Kilka wpisów w cronie powinno załatwić sprawę.

I ostatnia uwaga: wcale nie uważam, że mój skrypt jest elegancko napisany, ani że sposób jest idiotoodporny i niezawodny. Ale SOA#1 -- u mnie działa -- więc postanowiłem się nim podzielić.

## 4. Podziękowania...

...dla wszystkich, dzięki którym Linux jest taki fajny!

Kent Lewis
`kent@fiona.umsmed.edu`

## 5. Od tłumacza

## 5.1 Inne źródła informacji

Polskie tłumaczenia pozostałych dokumentów HOWTO znajdują się pod adresem http://www.jtz.org.pl/. Z pewnością szczególnie zainteresuje Cię INN+SUCK mini HOWTO, które znacznie poszerza informacje zawarte w niniejszym dokumencie. Problem czytania newsów off-line rozwiązać możesz też za pomocą odpowiedniego czytnika, więcej na ten temat znajdziesz w FAQ grupy pl.news.czytniki.

## 5.2 O tłumaczeniu

Dokument oryginalny dostępny jest wyłącznie w formacie txt (patrz http://sunsite.unc.edu/LDP/); znaczniki sgml i podział na rozdziały pochodzą ode mnie.

Copyright for the translation:
(c) 2001 by Tomasz `tsca' Sienicki, tsca@edb.dk