mirror of
git://slackware.nl/current.git
synced 2024-12-30 10:24:23 +01:00
281 lines
11 KiB
Text
281 lines
11 KiB
Text
|
NNTP SUPPORT
|
||
|
------------
|
||
|
|
||
|
This file describes the NNTP support available in nn release 6.5. The
|
||
|
NNTP support was implemented by Rene' Seindal, seindal@diku.dk.
|
||
|
|
||
|
|
||
|
PREREQUISITES
|
||
|
-------------
|
||
|
|
||
|
First of all, you need read-access to an NNTP-server, and if you want
|
||
|
to post, the server must allow that.
|
||
|
|
||
|
If you have news on one of your systems, and want to run an NNTP
|
||
|
server on that system to feed other local systems, you need to get and
|
||
|
install the nntp-1.5 distribution with at least patches 1-3 (I think
|
||
|
patch 8 is the latest). It is available from several ftp-sites in the
|
||
|
USA. It is also available on freja.diku.dk (ip 129.142.96.1).
|
||
|
|
||
|
However, just to run nn on you local system with or without NNTP, you
|
||
|
don't need anything besides the nn 6.5 distribution!!
|
||
|
|
||
|
The necessary modules to access a remote NNTP server is an integrated
|
||
|
part of nn, so if you specify to use NNTP, the necessary code is
|
||
|
automatically included.
|
||
|
|
||
|
HOW IT WORKS
|
||
|
------------
|
||
|
|
||
|
NNTP is supported both in nn and nnmaster. When NNTP is used, the
|
||
|
database with the header information used by nn is still maintained on
|
||
|
the local system (because NNTP does not know about the nn database
|
||
|
(yet?)).
|
||
|
|
||
|
When the master is set up to use NNTP, it will connect to the NNTP-
|
||
|
server in each iteration of the collection (the interval set with -r),
|
||
|
get a copy of the active file, and incorporate the new articles into the
|
||
|
database. To do this, the master will temporarily transfer one article
|
||
|
at a time from the NNTP-server to the local system.
|
||
|
|
||
|
When the articles are read with nn, it will use the local database to
|
||
|
present the menus, and fetch the articles from the NNTP-server as they
|
||
|
are requested by the user. It will connect to the NNTP server the first
|
||
|
time it is necessary to fetch an article.
|
||
|
|
||
|
Neither nnmaster, nor nn will use NNTP if they run on the NNTP-server
|
||
|
itself (they will directly access the news files).
|
||
|
|
||
|
Both nn and nnmaster access the server in reading mode. The master and
|
||
|
all client MUST use the same server at all times, since the local
|
||
|
database contains article numbers, that are only unique for each
|
||
|
NNTP-server.
|
||
|
|
||
|
|
||
|
SHARING THE DATABASE
|
||
|
--------------------
|
||
|
|
||
|
You must also decide whether you want to share the database between your
|
||
|
local news clients, and how you are going to do it.
|
||
|
|
||
|
The database will take up some disk space, normally about 1Mb per 10.000
|
||
|
articles. There are several ways to manage this space.
|
||
|
|
||
|
This simplest solution, is to let each client run it own master, i.e.,
|
||
|
have its own database. This means, of course, no sharing.
|
||
|
|
||
|
Alternatively, one host can run the master, and distribute the database
|
||
|
to the others via e.g., rdist. This doesn't save disk space, but saves
|
||
|
load on the NNTP-server.
|
||
|
|
||
|
Last, the database can be shared with NFS/RFS (see the description of
|
||
|
NETWORK_DATABASE in the config.h file).
|
||
|
|
||
|
The possibility of making a `nndb-server' stands open. It could be
|
||
|
realized either as a separate server, running under inetd, or it could
|
||
|
be incorporated into nntpd. It has not been implemented, but might be
|
||
|
part of a future release (any volunteers?).
|
||
|
|
||
|
|
||
|
CONFIGURATION
|
||
|
-------------
|
||
|
|
||
|
To use NNTP in nn, you must edit the relevant parts of config.h:
|
||
|
|
||
|
NNTP
|
||
|
You enable the use of NNTP by defining the macro NNTP.
|
||
|
|
||
|
NNTP_SERVER
|
||
|
Both the master and the clients will look up their NNTP-server
|
||
|
in the file given by the macro NNTP_SERVER. If the name is not
|
||
|
an absolute path name, it is taken to be relative to
|
||
|
LIB_DIRECTORY.
|
||
|
|
||
|
The format of the file is compatible with the one used in
|
||
|
clientlib.c in the nntp-1.5 distribution, i.e., the first
|
||
|
non-blank line, not starting with '#' is taken to be the name of
|
||
|
the NNTP-server. This file MUST be present, and must contain a
|
||
|
valid host name.
|
||
|
|
||
|
NEWS_LIB_DIRECTORY & INEWS
|
||
|
If either is defined, they specify the destination of the
|
||
|
mini-inews program when installed below with INEWS being used
|
||
|
if both are defined. If neither is defined, it will be
|
||
|
installed in /usr/lib/news/inews.
|
||
|
|
||
|
|
||
|
TUNING
|
||
|
------
|
||
|
|
||
|
Both the server and each client maintains a cache of recently accessed
|
||
|
articles, to minimize communication with the server (mainly to avoid
|
||
|
fetching large digests continuously). The master needs the cache when
|
||
|
it splits digests, and the clients need it, because nn has a tendency to
|
||
|
reopen the articles several times.
|
||
|
|
||
|
The master's cache is kept in LIB_DIRECTORY, and each client's cache are
|
||
|
kept in the users .nn directory. The constant NNTPCACHE (defined in
|
||
|
nntp.c but can be redefined in config.h) defines the size of the cache,
|
||
|
whose optimal size depends on the amount of news kept on line on the
|
||
|
NNTP-server. Values of 5-10 gives reasonable results. The effect is
|
||
|
most striking when reading digested news.
|
||
|
|
||
|
The location and size of the cache can also be changed on a per-user
|
||
|
basis via the related nntp- variables (see nn.1).
|
||
|
|
||
|
|
||
|
INSTALLATION
|
||
|
------------
|
||
|
|
||
|
Making and installing nn using NNTP does not differ from a non-NNTP nn
|
||
|
installation, except for the differences in the configuration and the
|
||
|
need to specify the NNTP server in the NNTP_SERVER file.
|
||
|
|
||
|
Notice however, that the NNTP_SERVER file must be properly initialized
|
||
|
before doing the 'make initdb'.
|
||
|
|
||
|
If something goes wrong in the initialization of the database, you will
|
||
|
have to run 'nnmaster -I' again by hand.
|
||
|
|
||
|
|
||
|
ERROR HANDLING
|
||
|
--------------
|
||
|
|
||
|
The handling of errors have been improved since the initial release.
|
||
|
|
||
|
The master will handle most errors by closing the connection, and
|
||
|
returning to the main loop. All errors in the master are logged, with
|
||
|
a code of `N,' so they can be inspected with the `n' command in
|
||
|
nnadmin's Log menu.
|
||
|
|
||
|
A few errors are considere fatal. If any of these occur operation will
|
||
|
be discontinued. These errors are such as failure to find the NNTP
|
||
|
server, failure to find the NNTP service, and responses from the NNTP
|
||
|
server in the 500 range (ill-formed requests, access denied, ...)
|
||
|
|
||
|
NNTP server timeouts are handled specially. If the NNTP server times
|
||
|
out, both nn and the master will attempt to restart it (by connecting
|
||
|
again). This shouldn't happen in the master (which won't leave sockets
|
||
|
idle for that long), but it can easily happen in nn, if it is left
|
||
|
suspended for too long. If the server responds with code 400 (Service
|
||
|
discontinued), a reconnect is also tried.
|
||
|
|
||
|
|
||
|
PROBLEMS
|
||
|
--------
|
||
|
|
||
|
I am not certain what should happen if the server sends back responses
|
||
|
in the 1xx range. I do not know whether a NNTP server is allowed to
|
||
|
return one of these responses on its own initiative. If it is, nn
|
||
|
should probably ignore (or display) the messages. Currently, nothing is
|
||
|
done to treat these responses in any way.
|
||
|
|
||
|
I have seen a strange thing happen to the master, which I have not been
|
||
|
able to reproduce. The master ran on a Sun-4 running SunOS 4.0, and the
|
||
|
NNTP server was a VAX 785 running MORE/bsd. The NNTP software was
|
||
|
version 1.5.3. The master was stuck in a read from the NNTP server. A
|
||
|
netstat on the Sun show an established connection to nntpd on the Vax,
|
||
|
but a netstat on the Vasx did not show any NNTP connections. There was
|
||
|
no nntpd running, and no messages on the console indicating any
|
||
|
failures.
|
||
|
|
||
|
[ It is now known that this problem is related to the socket not
|
||
|
having the KEEP ALIVE flag set, but I have not got the necessary
|
||
|
patches to fix it, ++Kim ]
|
||
|
|
||
|
|
||
|
SPONTANEOUS NNTP ERROR 502
|
||
|
--------------------------
|
||
|
|
||
|
Sometimes nn or nnmaster may stop with the following message:
|
||
|
|
||
|
NNTP 502 You only have permission to transfer, sorry.
|
||
|
|
||
|
This particular case is probably the result of the NNTP server trying to
|
||
|
turn your IP address into a fully qualified domain name (FQDN) so it can
|
||
|
look you up in its access file.
|
||
|
|
||
|
The NNTP server probably uses the domain name server (DNS) to map IP
|
||
|
addresses into FQDNs. If the local DNS doesn't already know the answer, it
|
||
|
has to go out over the network to find it. This can take a few seconds, and
|
||
|
the library routine that does all this for the NNTP server might time out
|
||
|
before the answer gets back to it. If this happens, the NNTP server doesn't
|
||
|
know your FQDN, so it gives you the default access specified in the server's
|
||
|
nntp_access file, which is usually "xfer" (article transfer only).
|
||
|
|
||
|
In the time it takes for you to run nn again the DNS usuallu has its answer
|
||
|
back, so things usually work the second time.
|
||
|
|
||
|
One way to work around this problem is to specify the IP address of the
|
||
|
client in the nntp server's access file; then it is not necessary to lookup
|
||
|
the FQDN.
|
||
|
|
||
|
Thanks to Tim Ramsey and Nick Sayer for this information.
|
||
|
|
||
|
|
||
|
DEBUGGING NNTP CONNECTIONS
|
||
|
--------------------------
|
||
|
|
||
|
If you want to debug the nntp connection, you can run the nnmaster
|
||
|
with the option -D2 (or -D3 which also turns on the normal -D verbose
|
||
|
output). In the nn client, you can turn on the nntp-debug variable in
|
||
|
the init file.
|
||
|
|
||
|
The debug output from nnmaster will be placed in $TMP/nnmaster.log
|
||
|
while the output in the client will appear on the message line.
|
||
|
|
||
|
|
||
|
POSSIBLE EXTENTIONS TO THE NNTP SERVER
|
||
|
--------------------------------------
|
||
|
|
||
|
The new expire method used in release 6.5 is very efficient on local
|
||
|
systems, because it will just read the spool directories to get a list
|
||
|
of available articles in each group.
|
||
|
|
||
|
However, with nntp, the only way I know of to get a list of available
|
||
|
articles in a group with nntp is the XHDR request. However, this will
|
||
|
open every article in the group to extract the desired field, but the
|
||
|
only thing I am interested in is the article number itself.
|
||
|
|
||
|
So I suggest to add a LISTGROUP request to the NNTP server to return
|
||
|
the equivalent of
|
||
|
ls $GROUPDIR | sed -n '/^[0-9][0-9]*$/p'
|
||
|
(in any order - nnmaster will sort the list itself).
|
||
|
|
||
|
Currently nnmaster will test whether this request works before using
|
||
|
the XHDR request, so no changes to nnmaster will be required to take
|
||
|
advantage of such a fix.
|
||
|
|
||
|
|
||
|
Another possible performance increase would be if there was a request
|
||
|
to get the current modification time of the ACTIVE file. This is the
|
||
|
check nnmaster will do to see if there might be work to do on a local
|
||
|
system, but with NNTP it has to read the active file from the server
|
||
|
and compare it to a local copy to determine whether there is work to
|
||
|
do. A simple ACTIVESTAT request returning the active file's age and
|
||
|
size would fix this.
|
||
|
|
||
|
Currently nnmaster is not prepared to use such a request, but it would
|
||
|
be easy to add.
|
||
|
|
||
|
|
||
|
ALTERNATIVES
|
||
|
------------
|
||
|
|
||
|
Alternative implementations can be conceived, especially in the master.
|
||
|
The master normally collects articles by rereading the active file,
|
||
|
looking for changed article numbers. For each group with new articles,
|
||
|
it reads the new articles and adds them to the database. This scheme
|
||
|
has been kept in the NNTP-based master, to keep the changes at a
|
||
|
minimum.
|
||
|
|
||
|
An alternative solution could be to use NEWNEWS to get a list of new
|
||
|
articles since last collect, and fetch each article in sequence. The
|
||
|
newsgroups and article numbers within each group could then be found in
|
||
|
the Xref: field. This would probably improve efficiency, since the
|
||
|
master would then generate fewer failing requests (for non-existent
|
||
|
articles), and it would only read cross-posted articles once. This
|
||
|
solution would, however, require some surgery on the current structure
|
||
|
of the masters main loop.
|
||
|
|