Całą treśæ tego dokumentu stanowi opis mojej instalacji duetu suck+inn w systemie RedHat5.1, w oparciu o konkretne pakiety (inn-1.7.2-13 i suck-3.9.4-2). 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 minimalnej, działającej konfiguracji bêdzie dla kogoś przydatny.
Wszelkie sugestie i poprawki są mile widziane i należy je wysyłaæ pod adres michu@amg.gda.pl.
W tym dokumencie w paru miejscach porównujê inn'a do leafnode'a, którego wcześniej używałem.
Nastêpujący ludzie przyczynili siê do postania tego dokumentu, taką czy inną drogą, świadomie lub nieświadomie (w kolejności alfabetycznej):
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ąæ).
Jeśli uważasz, że spełnione są poniższe warunki:
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:
Ja skorzystałem z niżej wymienionych adresów:
Zalety inn+suck:
Wady inn+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):
----- 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\
:*,@alt.binaries.warez.*,!junk,!control*,!local*,!foo.*\
/pl,world,usa,na,gnu,bionet,pubnet,u3b,eunet,vmsnet,inet,ddn,k12\
::
## ^^ - to jest to pl
...
----- ciach -----
----- ciach -----
...
pl.comp.ogonki 1
pl.comp.os.linux 1
...
----- ciach -----
UWAGA!!! Zaczynając od pierwszego postu jesteśmy narażeni na
ściąganie dużej ilości danych a co siê z tym wiąże znaczne
koszty. W koñcu i tak zapewne okaże siê, że wiêkszośæ postów jest
za stara i zostanie odrzucona przez inn'a. Lepiej wiêc nie
zaczynaæ od początku ale od kilku(set) postów wstecz. U mnie 57
grup (w całości) z dostêpem online (ethernet "wpiêty do" TASKu,
transfer osiągał 160KB/sec, jednak to było bardziej ograniczenie
zdalnego serwera niż łącza) ściągało siê prawie godzinê,
----- ciach -----
#!/bin/bash
#
# Ten skrypt tworzy automatycznie grupy w inn-ie, ktore podales w pliku
# /usr/lib/suck/sucknewsrc - konfiguracyjnym dla suck-a.
# UWAGA !!!
# Wymagany format tego pliku to:
############################
# nazwa.grupy numer.artykulu
############################
#
# Mozesz podac inna lokalizacje
SUCK_FILE=/usr/lib/suck/sucknewsrc
#
# Podaj sciezke do programu ctlinnd. Skrypt sprobuje sam zgadnac, 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 Blad podczas zakladania grupy $1 !!!
exit
fi
done
----- ciach -----
----- ciach -----
control
junk
test
to
----- ciach -----
Oczywiście grup tych nie należy umieszczaæ w pliku
"/usr/lib/suck/sucknewsrc",
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ą:
Pakiety ssh w wersji miêdzynarodowej (te z literką "i" na koñcu) można ściągnąæ z ftp.task.gda.pl/pub/linux/redhat-crypto/i386/. Podczas pisania tego dokumentu najnowszymi wersjami były: ssh-1.2.26-1i, ssh-clients-1.2.26-1i, ssh-extras-1.2.26-1i i ssh-server-1.2.26-1i.
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:
----- 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 # base directory for articles to be rposted
NEWSDIR=/usr/lib/news # base directory for news binaries
BASEDIR=/usr/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}/out.going/${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
# 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
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"
echo "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
fi
rm -f ${LOCKFILE}
----- ciach -----
Oczywiście należy pamiêtaæ o właściwym ustawieniu zmiennych
REMOTE_HOST i SITE.
----- ciach -----
#!/usr/bin/perl -w
while (not eof(STDIN)) {
@POST = "";
do {
$linia = <>;
push @POST, $linia if $linia !~ /^\.$/;
} until ($linia =~ /^\.$/);
$dlug = length(join('',@POST));
print "#! rnews $dlug\n";
print @POST;
}
----- ciach -----
----- 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
"/usr/lib/suck/get.news.innxmit".
----- ciach -----
...
pl.comp.ogonki O polskich literkach w komputerach.
pl.comp.os.linux Linux - system operacyjny dla kazdego.
...
----- ciach -----
----- ciach -----
#!/usr/bin/perl
$spooldir = "/var/spool/news";
if ( chdir "$spooldir/out.going" && 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/$_") ) {
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 );
}
print $from, " in ", $newsgroups, "\n\t", $subject, "\n",
if ( $subject ne "" && $from ne "" && $newsgroups ne "" );
}
}
}
----- ciach -----
----- ciach -----
...
news.task.gda.pl/news.task.gda.pl\
:!junk,!test,!to\
:Tf,Wnm:
...
----- ciach -----
UWAGA!!! Nie jestem przekonany do tego rozwiązania, ale podobno
działa (w każdym razie komuś taki wpis rozwiązał problem).
----- ciach -----
...
stdin: rejected 437 Unwanted newsgroup "pl.rec.radio" [Path:\
news.task.gda.pl!orion.cst.tpsa.pl...]
...
----- ciach -----
nie należy wpadaæ w panikê. Najprawdopodobniej jest to wynik błêdu
w zdalnym inn'ie (wersja 2.1) związanego z bazami overview.
Prawa autorskie należą do (C) Rafała Czeczótki michu@amg.gda.pl. Dokument ten jest rozpowszechniany na podstawie GPL (Gnu Public License).
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.