[leafnode-list] [PATCH] doc: convert README to Markdown

Matěj Cepl mcepl at cepl.eu
Mon Mar 24 09:31:51 CET 2025


Hopefully, I have fixed whole automake machinery as well. Adds
pandoc (https://pandoc.org) as a requirement.
---
 Makefile.am  |   16 +-
 README       |  807 ++++++++++++++++++++++
 README.html  | 1860 +++++++++++++++++++++++---------------------------
 README.md    |  816 ++++++++++++++++++++++
 configure.ac |    2 +-
 5 files changed, 2493 insertions(+), 1008 deletions(-)
 create mode 100644 README
 create mode 100644 README.md

diff --git a/Makefile.am b/Makefile.am
index defa8b2..bc837b9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -289,7 +289,7 @@ store_test_CXXFLAGS	= $(AM_CXXFLAGS) -std=c++20
 CLEANFILES = FAQ.aux FAQ.log FAQ.toc \
 	     README-FQDN.aux README-FQDN.log README-FQDN.toc
 
-DISTCLEANFILES = $(BUILT_SOURCES) README $(GENERATED_MANS) \
+DISTCLEANFILES = $(BUILT_SOURCES) README README.html $(GENERATED_MANS) \
 	config.table.sorted
 
 # GENERATED SOURCES ========================================
@@ -374,10 +374,16 @@ doxygen:
 	-rm -rf $(srcdir)/dox/html/
 	cd $(srcdir) && doxygen
 
-README:	README.html $(LYNX)
-	if test "$(LYNX)" != "no" ; then \
-		rm -f README ; \
-		$(LYNX) -dump $(srcdir)/README.html >$@ ; \
+README:	README.md $(PANDOC)
+	if test "$(PANDOC)" != "no" ; then \
+		rm -f $@ ; \
+		$(PANDOC) -f markdown -t plain $< -o $@ ; \
+	fi
+
+README.html:	README.md $(PANDOC)
+	if test "$(PANDOC)" != "no" ; then \
+		rm -f $@ ; \
+		$(PANDOC) -f markdown -t html -s --toc $< -o $@ ; \
 	fi
 
 .PHONY:	rpm
diff --git a/README b/README
new file mode 100644
index 0000000..d4cc363
--- /dev/null
+++ b/README
@@ -0,0 +1,807 @@
+------------------------------------------------------------------------
+
+1. OVERVIEW
+
+Leafnode is a USENET software package designed for small sites, with a
+few tens of readers and only a slow link to the net. It is developed on
+Linux, but has been reported to compile and run also under any BSD
+flavour, Solaris and Irix.
+
+The Leafnode package consists of several programs, three essential ones
+and several add-ons.
+
+-   Leafnode is the NNTP server. It talks to the normal news clients,
+    and stores readership data.
+-   Fetchnews is the NNTP news-gatherer. It looks at the readership data
+    Leafnode stores, and selects what groups to pull news from. It also
+    transfers your contributions to one or more upstream servers.
+-   Texpire is responsible for deleting old and uninteresting news. It
+    deletes all discussion threads that are old and not recently read.
+
+These are the additional tools:
+
+-   Applyfilter lets you delete articles from your local news spool
+    which fit a certain pattern.
+-   Checkgroups inserts the titles of newsgroups into the newsgroup
+    database.
+-   Newsq shows which news are waiting to be transferred to your
+    upstream server(s).
+-   Rnews sorts an UUCP batch or articles downloaded by other means into
+    the news spool.
+
+Only groups that someone has been reading in the past week are fetched
+from the upstream NNTP server. When someone stops reading a group,
+fetchnews will stop reading that group a week later (this is the default
+which can be configured), and when someone starts reading a group,
+fetchnews will grab all the articles it can in that group the next time
+it runs.
+
+Leafnode's distinguishing features are:
+
+-   Leafnode is written with the novice user in mind. It is very easy to
+    install and configure and requires no manual intervention once
+    installed. Leafnode tries very hard to recover automatically from
+    error situations.
+-   Compared to other servers, leafnode uses very little disk space and
+    bandwidth. Of course this also depends on how many users are
+    accessing your server and is probably not true for 300-user sites.
+-   The newsspool can be easily manipulated by small scripts because it
+    is maintained in plain file format. Some tiny examples are in the
+    subdirectory tools/ .
+
+The current version of leafnode is available from
+http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/
+
+There is also a leafnode mailing list. Send mail to
+
+leafnode-list-subscribe at dt.e-technik.tu-dortmund.de
+
+to subscribe, or visit
+http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/.
+
+------------------------------------------------------------------------
+
+2. INSTALLATION
+
+1.  Leafnode does not currently work on SunOS 4.
+
+2.  Leafnode depends on the PCRE regular-expression matching library. It
+    ships as binary package with many current Linux/BSD distributions,
+    and is also available as port for *BSD (Debian users: try "apt-get
+    install libpcre3 libpcre3-dev"). Just install the binary package for
+    your operating system if it ships with one. If it comes without
+    PCRE, don't worry, the installation from source is simple. To
+    install PCRE, do (AS NORMAL USER, NOT AS root!)
+
+    1.  Download the current PCRE version from http://www.pcre.org/.
+    2.  Unpack PCRE: gunzip -c | tar xvf -
+    3.  cd pcre-3.9
+        (This is for PCRE-3.9, for other versions, replace that by the
+        path that tar wrote when unpacking.)
+    4.  type ./configure && make
+        there should be no errors
+    5.  become root
+    6.  as root, do make install
+    7.  as root, do ldconfig
+        this may not be needed on all systems, but better safe than
+        sorry
+    8.  exit your root shell
+    9.  DONE!
+
+3.  Leafnode uses GNU autoconf to determine the configuration of the
+    machine it will be compiled on. It also uses GNU automake for all
+    the standard features that GNU automake offers. Type (AS NORMAL
+    USER, NOT AS root!)
+
+                 /bin/sh ./configure
+
+    to create an appropriate Makefile and config.h. If leafnode cannot
+    find your PCRE, it is probably an old version without pcre-config,
+    or pcre-config is not in your path. Either add the directory
+    containing pcre-config to your $PATH, or call configure like this
+    (we assume PCRE is in /opt/pcre-3.9):
+
+                 env CPPFLAGS="-I/opt/pcre-3.9" LDFLAGS="-L/opt/pcre-3.9" /bin/sh ./configure
+
+    NOTE: on some machines, when PCRE is linked against a shared
+    library, you will need to add /opt/pcre-3.9 to LD_LIBRARY_PATH or to
+    /etc/ld.so.conf.
+
+    The configure script can take some flags (replace DIR by a directory
+    name, FILE by a file name):
+
+        --enable-spooldir=DIR  To override the default /var/spool/news,
+                               where leafnode puts its news spool unless
+                               --localstatedir is given or --prefix is given and
+                               different from /usr, in the latter case, the
+                               default is $localstatedir/spool/news
+
+        --prefix=DIR           Leafnode installs itself normally in the /usr/local/sbin
+                               directory. If you want to use another directory, use this
+                               flag. For example, if you want to install leafnode in
+                               /usr/sbin, use --prefix=/usr
+
+        --sysconfdir=DIR       Default path for configuration is /etc/leafnode when
+                               --prefix is not used or set to /usr, and PREFIX/etc
+                               otherwise.  You can use this to change the config file
+                               location from its default.
+
+        --with-dmalloc         Lets leafnode include dmalloc header files and link
+                               against libdmalloc. Only useful for debugging, not
+                               needed for normal operation. This option requires
+                               dmalloc, available from http://dmalloc.com/.
+
+        --with-runas-user=USER Lets leafnode run as user USER, defaults to "news".
+
+        --with-pam             Enable PAM (pluggable authentication modules)
+                               support.
+
+    BEWARE: Former versions always defaulted their sysconfdir to
+    /etc/leafnode. Current versions only override sysconfdir to
+    /etc/leafnode if configured without --prefix or with --prefix=/usr.
+    That way, if --prefix=/opt/leafnode, the sysconfdir goes to
+    /opt/leafnode/etc, which is more appropriate.
+
+4.  Type
+
+                  make
+
+    There should be no errors.
+
+5.  Become root.
+
+6.  As root, create user and group "news" (or the configured user and
+    group) if you don't have those already.
+
+7.  Type
+
+                  make install
+
+    If you prefer an installation with the binaries stripped free of
+    symbols, use
+
+                  make install-strip
+
+    instead.
+    For packagers: if you want to prefix all installation paths with a
+    common prefix, e. g. to support RPM's BuildRoot feature: You can use
+    make install-strip DESTDIR=/var/tmp/leafnode-root.
+
+8.  Configure syslog so it captures news logging, most systems do NOT
+    log news stuff by default.
+
+    1.  Edit /etc/syslog.conf. Unless you already have news.info
+        logging, add a line like this:
+
+            news.info               /var/log/news
+
+        Note that if you want to send in a bug report and need debug
+        logging, you'll have to replace news.info by news.debug (and
+        send a SIGHUP, as shown below).
+
+        Your syslog.conf may already suggest a different file. If your
+        syslog.conf suggests news.info logging, use that, but be sure to
+        activate it in case it's commented out: remove leading hash
+        marks and white space.
+
+        Also make sure you use TABs between news.info and the path.
+
+    2.  Create the /var/log/news file, type: touch /var/log/news.
+
+    3.  Send syslogd a HUP signal. kill -1 \cat /var/run/syslogd.pid``
+        usually does the job, if it doesn't, retry with "syslogd"
+        replaced by "syslog".
+
+9.  If you are updating leafnode from a previous version, see the
+    section "Updating" below.
+
+10. Edit $(LIBDIR)/config. $(LIBDIR) defaults to /etc/leafnode, but can
+    be adjusted at build time. For documentation, see below or
+    config.example and leafnode(8). Mandatory edits to the config file
+    are:
+
+    -   server -- this must point to your upstream news server.
+    -   expire -- how many days will downloaded articles remain in the
+        spool.
+
+    Make sure the environment variable $NNTPSERVER or /etc/nntpserver
+    points to your own host so clients will talk to leafnode rather than
+    try to go to the upstream server.
+
+    If you want to use filtering of the incoming spool, see the section
+    on the filter file below.
+
+11. the systemd/ directory of the tarball contains example service and
+    timer files that can be used on systemd-based systems instead of the
+    inetd/xinetd and cron[tab] settings shown below.
+
+12. Set up a cron job (as user "root" or "news") to run texpire every
+    night or maybe every week. Here is my crontab line, which runs
+    nightly:
+
+        0 4 * * * /usr/local/sbin/texpire
+
+    I did "crontab -u news -e" as root to edit the crontab file, and
+    added this line. Substituting "1" for the third "*", thus:
+
+        0 4 * * 1 /usr/local/sbin/texpire
+
+    tells cron to run texpire at 4am every Monday morning.
+
+13. Make sure fetchnews is run at the appropriate time. If you have a
+    full-time link, run it out of cron (as "news" again); if not, run it
+    when your connection to the net is established. If it is run as root
+    it will change to user "news". If you use PPP, you can run fetchnews
+    from /etc/ppp/ip-up (or /etc/ppp/ip-up.local, depending on your OS).
+
+14. We assume that you have tcpd installed, it ships with most
+    distributions. If you don't have it, fetch it from
+    ftp://ftp.porcupine.org/pub/security/, it's in tcp_wrappers, and
+    install it. It's preferable if you compile it with -DHOSTS_OPTIONS,
+    and the examples below assume you did.
+
+15. Choose either of these alternatives:
+
+    -   Alternative #1: If your system uses inetd (most commercial
+        unices, *BSD). Edit /etc/inetd.conf so that $(BINDIR)/leafnode
+        is executed for incoming NNTP connections. Here is my inetd.conf
+        line:
+
+            nntp    stream  tcp     nowait  news    /usr/sbin/tcpd /usr/local/sbin/leafnode
+
+        Note: some systems install tcpd to a different path, but it's
+        uncommon. Change the first path accordingly if your tcpd resides
+        in /usr/etc or /usr/lbin. After these changes, force inetd to
+        read the changed configuration file by sending it the HANGUP
+        signal. To achieve this, issue the following command (as root):
+
+            kill -HUP `cat /var/run/inetd.pid`
+
+    -   Alternative #2: If your system has xinetd instead. Add this to
+        your xinetd.conf (this example assumes xinetd 2.3.3 or newer):
+
+            service nntp
+            {
+                    flags           = NAMEINARGS NOLIBWRAP
+                    socket_type     = stream
+                    protocol        = tcp
+                    wait            = no
+                    user            = news
+                    server          = /usr/sbin/tcpd
+                    server_args     = /usr/local/sbin/leafnode
+                    instances       = 7
+                    per_source      = 3
+            }
+
+        Then send xinetd an USR2 signal to make it reread its
+        configuration. See the xinetd.conf(5) manual page for details.
+        Note: some systems install tcpd to a different path, but it's
+        uncommon. Change the first path accordingly if your tcpd resides
+        in /usr/etc or /usr/lbin.
+
+16. Write the following into /etc/hosts.deny:
+
+        leafnode: ALL
+
+    and into /etc/hosts.allow:
+
+        leafnode: 127.0.0.1
+
+    to protect your news server from abuse. If you want to make leafnode
+    accessible to additional IP numbers/domains, add them in
+    /etc/hosts.allow in the format described above. See hosts_access(5)
+    and hosts_options(5) (if applicable) for more information about tcp
+    wrappers.
+
+17. (optional) If you want to allow read-only access, you can set the
+    NOPOSTING environment variable, for example, put this into
+    /etc/hosts.allow:
+
+        leafnode: 192.168.0.4: setenv NOPOSTING "You may only read."
+
+    The contents of this variable are printed at the end of the banner,
+    with control characters (as per iscntrl(3)) replaced by an
+    underscore.
+
+18. (optional) If you want to allow clients read access to local or
+    global subscribed groups, but do not want to allow them to subscribe
+    to new groups, you can set the NOSUBSCRIBE environment variable.
+    When this variable is set, a client will never see a pseudo article.
+    For example, if clients from 127.0.0.1 and 192.168.0.42 may
+    subscribe new groups, and all other 192.168.0.* hosts may read the
+    existing groups but not subscribe to new groups, put this into
+    /etc/hosts.allow (this assumes libwrap/tcpd have been compiled with
+    -DPROCESS_OPTIONS):
+
+        leafnode: 127.0.0.1 192.168.0.42: ALLOW
+        leafnode: 192.168.0.0/255.255.255.0: setenv NOSUBSCRIBE 1
+        leafnode: ALL: DENY
+
+19. Run fetchnews. The first run will take some time since fetchnews
+    reads a list of all newsgroups from your upstream server. In the
+    worst case, this can take up to 60 minutes, depending on how many
+    newsgroups your provider offers and how reliable your modem
+    connection is. To see fetchnews working, run it with -vvv.
+
+20. Run texpire. It will create directories missing after the first
+    install.
+
+21. Exit your root shell.
+
+22. Read news using an NNTP client (with $NNTPSERVER or /etc/nntpserver
+    pointing to your own host). Select the groups you want to read in
+    the future. You will find them empty except a default article.
+    Reading this article is necessary with some newsreaders to select
+    the groups for further fetching.
+
+    After this, you should have empty files in
+    /var/spool/news/interesting.groups/ for every group you want to
+    read.
+
+23. Become root and run fetchnews again, then exit your root shell. This
+    run should pick up all the groups you want to read.
+
+------------------------------------------------------------------------
+
+3. UPDATE FROM PREVIOUS VERSIONS
+
+3.1 Update from versions < 2.0b8_ma8
+
+The local.groups and groupinfo files and the hash function for
+message.id have changed from any former version to 2.0b8_ma8.
+
+IMPORTANT: To fix the "remote" groups, run fetchnews -f -- it will take
+some time, because it refetches the whole active file, but that's needed
+anyhow to figure the group status (posting allowed/not allowed/moderated
+group).
+
+To fix local.groups, if you have perl installed:
+
+      perl -ple 's /\s+/\ty\t/' -i.bak /etc/leafnode/local.groups
+
+This will make a backup of your original /etc/leafnode/local.groups in
+/etc/leafnode/local.groups.bak.
+
+If you don't have Perl, use a text editor that preserves HTAB
+characters, change all while space to TAB and insert an additional field
+reading just y:
+
+  Before: local.test some test group
+  After: local.testTAByTABsome test group
+
+Use the real TAB character rather than TAB.
+To fix the spool for message.ids, run texpire -r
+The changes written in section 3.2 below also apply.
+
+3.2 Update from versions < 2.0
+
+From 1.9.x to 2.0 there were some changes to options in the main
+configuration file. The options "maxage", "maxlines", "minlines",
+"maxbytes" and "maxcrosspost" have become obsolete in the main
+configuration file and have to be specified in the filter file instead.
+The advantage of this is that you can do much finer selection on these
+criteria now.
+
+To replace, for example, a "maxage = 5" specification in the main
+configuration file, you should add the following to your filter file:
+
+    newsgroups = .*
+    maxage = 5
+    action = kill
+
+The leafnode programs will issue warnings if they encounter obsolete
+specifications in the main config file.
+
+3.3 Update from versions < 1.9.3
+
+From version 1.9.3 on, the groupinfo file is sorted in a
+case-insensitive manner. To update correctly, do a "make update" as root
+after you have successfully completed "make install". This will re-sort
+the groupinfo file. The old groupinfo file will be stored as
+groupinfo.old just in case something goes wrong. You also have to change
+your main config file manually as described in the previous section.
+
+3.4 Update from versions < 1.6
+
+Between leafnode-1.6alpha and leafnode-1.6, the format of the groupinfo
+file changed and some files moved to other places. To update correctly,
+do a "make update" as root after you have successfully completed "make
+install". This will reformat the groupinfo file and move the other files
+into the correct places. The old groupinfo file will be stored as
+groupinfo.old just in case something goes wrong. You also have to change
+your main config file manually as described in the section "Update from
+versions < 2.0".
+
+------------------------------------------------------------------------
+
+4. FILES AND DIRECTORIES
+
+Leafnode puts its files in three separate directories: The spool
+directory, the library directory, and the binaries directory. All
+directories can be changed at compile time.
+
+In the spool directory you find the stored news, the active file and
+some other short-lived configuration file. It defaults to
+/var/spool/news and can be changed at compilation time. There are some
+special directories here; see the leafnode(8) man page.
+
+The library directory contains long-lived configuration files. It
+defaults to /etc/leafnode.
+
+The binaries directory, /usr/local/sbin by default, contains the
+executable programs applyfilter, texpire, fetchnews and leafnode.
+
+The user directory, /usr/local/bin by default, contains the newsq
+program.
+
+4.1. The main configuration file
+
+The main configuration file contains settings important for all programs
+of the leafnode suite. It defaults to /etc/leafnode/config, but several
+configuration files can be used at once by employing the -F switch of
+the programs.
+
+The file contains two mandatory and a number of optional parameters.
+
+NOTE: Global options must come first, server-specific options below the
+server = lines.
+
+Mandatory parameters
+
+  server = news02.bigprovider.com
+
+You have to specify at least one server (except if you want leafnode to
+serve as a local server only). Usually, this will be the news server of
+your provider. You can specify more than one server, and fetchnews will
+retrieve news from all of them, taking care not to transfer articles
+multiple times to your machine. Servers will be queried in the order
+specified in the config file.
+
+  expire = 5
+
+This parameter determines how many days threads are kept on your hard
+disk. texpire will delete whole threads, not just single articles.
+
+Server-specific optional parameters
+
+To configure interaction with the server somewhat, you can change the
+behaviour of fetchnews by setting several server-specific optional
+parameters. They have to be specified directly after the corresponding
+"server" statement. A new server statement in the config file will also
+allow new optional parameters.
+
+  username = myname
+  password = mypasswd
+
+If your upstream server requires a form of authentication, you can set
+your username and password here.
+
+  timeout = 30
+
+It may happen that, due to a bad connection or other reasons, the server
+stops talking to you while you fetch news. The "timeout" parameter
+determines the number of seconds fetchnews is supposed to wait for a
+response from the server before giving up.
+
+  nodesc = 1
+
+Some servers are unable to deliver descriptions of new newsgroups
+correctly. When fetchnews encounters such a server, it will print the
+warning
+
+  server.name does not process LIST NEWSGROUPS news.group.name
+  correctly: use nodesc
+
+To allow for shorter download times, you should in this case set "nodesc
+= 1" for that particular server in the configuration file.
+
+  port = 8000
+
+Normally, fetchnews will try to retrieve news from port 119 (the
+standard nntp port) of your upstream server. If the upstream server runs
+on a different port, you can specify it with this option.
+
+General optional parameters
+
+  authenticate = METHOD
+
+Require that NNTP clients connecting to your leafnode authenticate
+themselves. The only method currently supported is internal. In this
+mode, leafnode expects a file users in its sysconfdir,
+/etc/leafnode/users by default, which has a simple format, one line per
+user, with the user name (which cannot contain spaces), then a colon,
+then the crypt(3) encrypted password. To generate these lines, you can
+use the Perl program tools/make_pass.pl, for example, if you want to add
+a user "enigma" with a password of "break!me", type:
+
+  perl -wT tools/make_pass.pl 'enigma' 'break!me'
+
+and copy the resulting line to the users file.
+htpasswd as shipped for Apache servers should also work if in crypt(3)
+mode.
+
+  hostname = host.domain.country
+
+If the postings that you write do not have message IDs (generated by the
+newsreader), leafnode will generate a message ID for you. (It will never
+overwrite an already existing message ID.) Message IDs generated by
+leafnode feature ".ln" before the @ sign. The message ID contains the
+fully qualified hostname of your machine which may not always be what
+you want. In that case, you can override the use of the hostname by
+using the "hostname" option.
+
+  create_all_links = 1
+
+Usually fetchnews will store articles only in the newsgroups which you
+consider interesting. Unfortunately, this makes it difficult to score
+for the number of newsgroups a message is posted to because the
+Newsgroups: header is not featured in the overview information;
+therefore you can determine the number of newsgroups an article is
+crossposted to only from the Xref: header. If "create_all_links" is set
+to 1, fetchnews will store articles in all newsgroups which they are
+posted to, making all these newsgroups turn up in the Xref: header.
+
+  groupexpire = a.news.group 7
+
+As outlined above, texpire will expire threads after "expire" days. If
+you want to adjust expiry times for certain groups, you may use the
+"groupexpire" parameter to do just that. You can specify groups or use
+wildcards; for example
+
+  groupexpire = *.announce 30
+
+will affect expiry times of all groups ending with ".announce".
+
+  filterfile = /etc/leafnode/filters
+
+If you want to employ filtering on incoming messages, you have to
+specify the path where the filterfile can be found. The format of the
+filterfile is described in the next chapter.
+
+  timeout_short = 2
+  timeout_long = 5
+
+These two parameters determine how quickly a group is unsubscribed by
+leafnode after you have stopped reading it. If you have looked into the
+group only once, subscription is stopped after "timeout_short" days; if
+you have read it more regularly, subscription is stopped after
+"timeout_long" days. (You can stop subscription immediately by removing
+the corresponding file in /var/spool/news/interesting.groups/).
+
+  timeout_active = 90
+
+By default, fetchnews will re-read active files from the upstream server
+every 90 days. This interval can be changed by setting "timeout_active"
+to a different value. Re-reading the active file frequently will keep it
+a little bit smaller but will increase the on-line time.
+
+  delaybody = 1
+
+This option switches fetchnews into a mode where only the headers of
+articles are fetched for visual inspection. Only the articles read in
+the newsreader will be retrieved the next time fetchnews is called. This
+can save a huge amount of disk space and download time but requires more
+manual intervention on the user side.
+
+  groupdelaybody = some.news.group
+
+If you want delaybody mode only for selected groups, you can enable this
+download mode for one specific group. The global delaybody switch above
+causes all groups to be treated that way. Use one line per group
+pattern.
+
+  debugmode = 260
+
+This option forces the leafnode programs into logging lots of
+information via the syslog daemon. It is only useful if you want to hunt
+down bugs. See config.example for an explanation of the number here.
+
+4.2. The filter file
+
+The filter file format is currently described in fetchnews(5). Type man
+5 filterfile or man -s 5 filterfile to see the description.
+
+------------------------------------------------------------------------
+
+5. LOCAL NEWSGROUPS
+
+From version 2.0 on, Leafnode is able to handle local newsgroups. Local
+newsgroups are groups that exist only on your local server but not on
+upstream servers.
+
+To create a local newsgroup, you have to think of a newsgroup name which
+should not exist on any of your upstream servers. It is therefore a good
+idea to start a new top-level hierarchy. You should also make up a
+description for your newsgroup.
+
+If you choose a newsgroup name which exists already on an upstream
+server, the newsgroup is not treated as a local one.
+
+Next, you write the name, status and description into the file
+/etc/leafnode/local.groups using your preferred text editor, which must
+not mangle TABs to SPACEs. The file should consist of lines in the
+format
+
+    # Comment lines are allowed, with a hash at the beginning of a line.
+    #
+    # However, no white space may precede the hash mark, and empty lines
+    # are not valid.
+    news.group.name<TAB>status<TAB>description
+
+(replace <TAB> with a TAB character!)
+
+The first column of each line is taken as the newsgroup name; the second
+as the status (y for "may be posted to", m for "moderated" -- see below
+for moderator configuration), the third column of the line is
+interpreted as description. For example, to set up a newsgroup
+"local.leafnode" which deals with Leafnode's internals, you would put a
+line
+
+  local.leafnode<TAB>y<TAB>Local leafnode user group
+
+into /etc/leafnode/local.groups. (If your configuration does not reside
+in /etc/leafnode, replace this part of the pathname with the appropriate
+directory.)
+
+5.1 MODERATED NEWSGROUPS
+
+From version 2.0 on, Leafnode also handles moderated newsgroups. These
+are newsgroups which only certain people may post into, and articles
+which a regular (non-moderator) user posts, are mailed to the moderator.
+
+External moderated newsgroups are handled by the upstream servers.
+
+To configure the moderators for local moderated groups, an
+INN-compatible "moderators" file is used. It is named
+/etc/leafnode/moderators and has the following format:
+
+    pattern:moderator
+
+Empty lines and lines that start with a hash character (#) are
+considered comment lines and are ignored.
+
+The pattern is a normal wildmat pattern, which means that it's a SHELL
+pattern, the most useful character is the asterisk (*) which matches any
+sequence of characters. The moderator given on that line applies to all
+groups that the pattern matches. Should multiple lines match a group,
+the first match in the file "wins", the second and subsequent patterns
+are not taken into account. So put the more specific patterns first.
+
+The moderator is a regular internet mail address, with the exception
+that the first occurrence of "%s" is replaced with the newsgroup name,
+with dots (.) converted to dashes (-) for INN compatibility.
+
+Example:
+
+    # This is a comment line
+    #
+    # special moderator, hans at example.com is mailed all articles for
+    # local.special
+    local.special:hans at example.com
+    # moderator for all other local groups:
+    local.*:egon+%s at example.net
+    # that means:
+    # mail postings for local.test to egon+local-test at example.net
+    # mail postings for local.video to egon+local-video at example.net
+    #
+    # Note: if you put local.special below local.*, local.special will be
+    # ignored.
+
+------------------------------------------------------------------------
+
+6. DEINSTALLATION
+
+If you want to uninstall leafnode (e.g. because you want to replace it
+with another newsserver) and have a Makefile available, you can achieve
+this by doing "make uninstall".
+
+Do not uninstall an old version of leafnode before updating.
+
+------------------------------------------------------------------------
+
+7. FREQUENTLY ASKED QUESTIONS
+
+See the file FAQ.
+
+------------------------------------------------------------------------
+
+8. COPYRIGHT
+
+Leafnode versions through 1.4 were written by Arnt Gulbrandsen
+<agulbra at troll.no> and are copyright 1995 Troll Tech AS, Postboks 6133
+Etterstad, 0602 Oslo, Norway, fax +47 22646949.
+
+Leafnode versions 1.5 up to 1.9.19 and 2.0b1 to 2.0b8 were written by
+Cornelius Krasel <krasel at wpxx02.toxi.uni-wuerzburg.de> and are copyright
+1997-2001.
+
+Leafnode versions 1.9.20 and up were written by Matthias Andree
+<matthias.andree at gmx.de> and Ralf Wildenhues <ralf.wildenhues at gmx.de>
+and are © copyright 2002 - 2003.
+
+Leafnode versions 2.0b8_ma and 2.0.0.* were written by Matthias Andree
+<matthias.andree at gmx.de>, Ralf Wildenhues <ralf.wildenhues at gmx.de> and
+Jörg Dietrich <joerg at dietrich.net> and are © copyright 2001 - 2003.
+
+Major modifications were made by
+Randolf Skerka <Randolf.Skerka at gmx.de>
+Kent Robotti <robotti at erols.com>
+Markus Enzenberger <enz at cip.physik.uni-muenchen.de>
+Matthias Andree <matthias.andree at gmx.de>
+Jörg Dietrich <joerg at dietrich.net>
+Stefan Wiens <s.wi at gmx.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The getaline() and getline() routines are Copyright (c) 2000-2002
+Matthias Andree <matthias.andree at gmx.de>. They are licensed under the
+GNU Lesser General Public License (GNU LGPL) 2.1. A copy of the LGPL is
+provided in the file COPYING.
+
+The wildmat() routine is Copyright (c) 1986-1991 Rich $alz
+<rsalz at osf.org>. The original copyright notice, taken from INN 2.2.2,
+follows:
+
+  Redistribution and use in any form are permitted provided that the
+  following restrictions are met:
+
+  1.  Source distributions must retain this entire copyright notice and
+      comment.
+  2.  Binary distributions must include the acknowledgement ``This
+      product includes software developed by Rich Salz'' in the
+      documentation or other materials provided with the distribution.
+      This must not be represented as an endorsement or promotion
+      without specific prior written permission.
+  3.  The origin of this software must not be misrepresented, either by
+      explicit claim or by omission. Credits must appear in the source
+      and documentation.
+  4.  Altered versions must be plainly marked as such in the source and
+      documentation and must not be misrepresented as being the original
+      software.
+
+  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The replacement vsnprintf() function was written by Theo de Raadt and is
+Copyright (c) 1997 under the following restrictions:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+
+  1.  Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+  2.  Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+  IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+  POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.html b/README.html
index 609672a..3e9155f 100644
--- a/README.html
+++ b/README.html
@@ -1,222 +1,318 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
-  <head>
-    <meta name="generator" content=
-    "HTML Tidy for Linux/x86 (vers 1st April 2002), see www.w3.org">
-    <meta http-equiv="Content-Type" content=
-    "text/html; charset=iso-8859-1">
-
-    <title>Leafnode manual</title>
-
-    <style type="text/css">
- h4.c5 {text-align: center}
- p.c4 {font-weight: bold}
- p.c3 {text-align: center}
- h3.c2 {text-align: center}
- h2.c1 {text-align: center}
-                </style>
-  </head>
-
-  <body>
-    <h2 class="c1">LEAFNODE</h2>
-
-    <p>Preface: This documentation is about to be migrated to a
-    different format. Do not file bug reports against section
-    numbering or references within this document.</p>
-
-    <h3 class="c2">Table of Contents</h3>
-
-    <ol>
-      <li>Overview</li>
-
-      <li>Installation</li>
-
-      <li>
-        Update from previous versions 
-
-        <ol>
-          <li>Update from versions < 2.0b8_ma8</li>
-
-          <li>Update from versions < 2.0</li>
-
-          <li>Update from versions < 1.9.3</li>
-
-          <li>Update from versions < 1.6</li>
-        </ol>
-      </li>
-
-      <li>
-        Files and directories 
-
-        <ol>
-          <li>The main configuration file</li>
-
-          <li>The filter file</li>
-        </ol>
-      </li>
-
-      <li>
-        Local newsgroups 
-
-        <ol>
-          <li>Moderated newsgroups</li>
-        </ol>
-      </li>
-
-      <li>Deinstallation</li>
-
-      <li>Frequently asked questions</li>
-
-      <li>Copyright</li>
-    </ol>
-    <hr>
-
-    <h3 class="c2">1. OVERVIEW</h3>
-
-    <p>Leafnode is a USENET software package designed for small
-    sites, with a few tens of readers and only a slow link to the
-    net. It is developed on Linux, but has been reported to compile
-    and run also under any BSD flavour, Solaris and Irix.</p>
-
-    <p>The Leafnode package consists of several programs, three
-    essential ones and several add-ons.</p>
-
-    <ul>
-      <li><u>Leafnode</u> is the NNTP server. It talks to the
-      normal news clients, and stores readership data.</li>
-
-      <li><u>Fetchnews</u> is the NNTP news-gatherer. It looks at
-      the readership data Leafnode stores, and selects what groups
-      to pull news from. It also transfers your contributions to
-      one or more upstream servers.</li>
-
-      <li><u>Texpire</u> is responsible for deleting old and
-      uninteresting news. It deletes all discussion threads that
-      are old and not recently read.</li>
-    </ul>
-
-    <p>These are the additional tools:</p>
-
-    <ul>
-      <li><u>Applyfilter</u> lets you delete articles from your
-      local news spool which fit a certain pattern.</li>
-
-      <li><u>Checkgroups</u> inserts the titles of newsgroups into
-      the newsgroup database.</li>
-
-      <li><u>Newsq</u> shows which news are waiting to be
-      transferred to your upstream server(s).</li>
-
-      <li><u>Rnews</u> sorts an UUCP batch or articles downloaded
-      by other means into the news spool.</li>
-    </ul>
-
-    <p>Only groups that someone has been reading in the past week
-    are fetched from the upstream NNTP server. When someone stops
-    reading a group, fetchnews will stop reading that group a week
-    later (this is the default which can be configured), and when
-    someone starts reading a group, fetchnews will grab all the
-    articles it can in that group the next time it runs.</p>
-
-    <p>Leafnode's distinguishing features are:</p>
-
-    <ul>
-      <li>Leafnode is written with the novice user in mind. It is
-      very easy to install and configure and requires no manual
-      intervention once installed. Leafnode tries very hard to
-      recover automatically from error situations.</li>
-
-      <li>Compared to other servers, leafnode uses very little disk
-      space and bandwidth. Of course this also depends on how many
-      users are accessing your server and is probably not true for
-      300-user sites.</li>
-
-      <li>The newsspool can be easily manipulated by small scripts
-      because it is maintained in plain file format. Some tiny
-      examples are in the subdirectory tools/ .</li>
-    </ul>
-
-    <p>The current version of leafnode is available from
-    <a
-	href="http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/">http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/</a></p>
-
-    <p>There is also a leafnode mailing list. Send mail to</p>
-
-    <p class="c3">leafnode-list-subscribe at dt.e-technik.tu-dortmund.de</p>
-
-    <p>to subscribe, or visit <a
-	href="http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/">http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/.</a></p>
-    <hr>
-
-    <h3 class="c2">2. INSTALLATION</h3>
-
-    <ol>
-      <li>Leafnode does not currently work on SunOS 4.</li>
-
-      <li>
-        Leafnode depends on the PCRE regular-expression matching
-        library. It ships as binary package with many current
-        Linux/BSD distributions, and is also available as port for
-        *BSD (Debian users: try "apt-get install libpcre3
-        libpcre3-dev"). Just install the binary package for your
-        operating system if it ships with one. If it comes without
-        PCRE, don't worry, the installation from source is simple.
-        To install PCRE, do (AS NORMAL USER, NOT AS root!) 
-
-        <ol>
-          <li>Download the current PCRE version from <a href=
-          "http://www.pcre.org/">http://www.pcre.org/</a>.</li>
-
-          <li>Unpack PCRE: gunzip -c | tar xvf -</li>
-
-          <li>cd pcre-3.9<br>
-           <i>(This is for PCRE-3.9, for other versions, replace
-          that by the path that tar wrote when unpacking.)</i></li>
-
-          <li>type <kbd>./configure && make</kbd><br>
-           <i>there should be no errors</i></li>
-
-          <li>become root</li>
-
-          <li>as root, do <kbd>make install</kbd></li>
-
-          <li>as root, do <kbd>ldconfig</kbd><br>
-           <i>this may not be needed on all systems, but better
-          safe than sorry</i></li>
-
-          <li>exit your root shell</li>
-
-          <li>DONE!</li>
-        </ol>
-      </li>
-
-      <li>
-        Leafnode uses GNU autoconf to determine the configuration
-        of the machine it will be compiled on. It also uses GNU
-        automake for all the standard features that GNU automake
-        offers. Type (AS NORMAL USER, NOT AS root!) 
-<pre>
-         /bin/sh ./configure
-</pre>
-        to create an appropriate Makefile and config.h. If leafnode
-        cannot find your PCRE, it is probably an old version
-        without pcre-config, or pcre-config is not in your path.
-        Either add the directory containing pcre-config to your
-        $PATH, or call configure like this (we assume PCRE is in
-        /opt/pcre-3.9): 
-<pre>
-         env CPPFLAGS="-I/opt/pcre-3.9" LDFLAGS="-L/opt/pcre-3.9" /bin/sh ./configure
-</pre>
-        NOTE: on some machines, when PCRE is linked against a
-        shared library, you will need to add /opt/pcre-3.9 to
-        LD_LIBRARY_PATH or to /etc/ld.so.conf. 
-
-        <p>The configure script can take some flags (replace DIR by
-        a directory name, FILE by a file name):</p>
-<pre>
---enable-spooldir=DIR  To override the default /var/spool/news,
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <meta name="author" content="Matthias Andree" />
+  <title>Leafnode manual</title>
+  <style>
+    html {
+      color: #1a1a1a;
+      background-color: #fdfdfd;
+    }
+    body {
+      margin: 0 auto;
+      max-width: 36em;
+      padding-left: 50px;
+      padding-right: 50px;
+      padding-top: 50px;
+      padding-bottom: 50px;
+      hyphens: auto;
+      overflow-wrap: break-word;
+      text-rendering: optimizeLegibility;
+      font-kerning: normal;
+    }
+    @media (max-width: 600px) {
+      body {
+        font-size: 0.9em;
+        padding: 12px;
+      }
+      h1 {
+        font-size: 1.8em;
+      }
+    }
+    @media print {
+      html {
+        background-color: white;
+      }
+      body {
+        background-color: transparent;
+        color: black;
+        font-size: 12pt;
+      }
+      p, h2, h3 {
+        orphans: 3;
+        widows: 3;
+      }
+      h2, h3, h4 {
+        page-break-after: avoid;
+      }
+    }
+    p {
+      margin: 1em 0;
+    }
+    a {
+      color: #1a1a1a;
+    }
+    a:visited {
+      color: #1a1a1a;
+    }
+    img {
+      max-width: 100%;
+    }
+    svg {
+      height: auto;
+      max-width: 100%;
+    }
+    h1, h2, h3, h4, h5, h6 {
+      margin-top: 1.4em;
+    }
+    h5, h6 {
+      font-size: 1em;
+      font-style: italic;
+    }
+    h6 {
+      font-weight: normal;
+    }
+    ol, ul {
+      padding-left: 1.7em;
+      margin-top: 1em;
+    }
+    li > ol, li > ul {
+      margin-top: 0;
+    }
+    blockquote {
+      margin: 1em 0 1em 1.7em;
+      padding-left: 1em;
+      border-left: 2px solid #e6e6e6;
+      color: #606060;
+    }
+    code {
+      font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
+      font-size: 85%;
+      margin: 0;
+      hyphens: manual;
+    }
+    pre {
+      margin: 1em 0;
+      overflow: auto;
+    }
+    pre code {
+      padding: 0;
+      overflow: visible;
+      overflow-wrap: normal;
+    }
+    .sourceCode {
+     background-color: transparent;
+     overflow: visible;
+    }
+    hr {
+      border: none;
+      border-top: 1px solid #1a1a1a;
+      height: 1px;
+      margin: 1em 0;
+    }
+    table {
+      margin: 1em 0;
+      border-collapse: collapse;
+      width: 100%;
+      overflow-x: auto;
+      display: block;
+      font-variant-numeric: lining-nums tabular-nums;
+    }
+    table caption {
+      margin-bottom: 0.75em;
+    }
+    tbody {
+      margin-top: 0.5em;
+      border-top: 1px solid #1a1a1a;
+      border-bottom: 1px solid #1a1a1a;
+    }
+    th {
+      border-top: 1px solid #1a1a1a;
+      padding: 0.25em 0.5em 0.25em 0.5em;
+    }
+    td {
+      padding: 0.125em 0.5em 0.25em 0.5em;
+    }
+    header {
+      margin-bottom: 4em;
+      text-align: center;
+    }
+    #TOC li {
+      list-style: none;
+    }
+    #TOC ul {
+      padding-left: 1.3em;
+    }
+    #TOC > ul {
+      padding-left: 0;
+    }
+    #TOC a:not(:hover) {
+      text-decoration: none;
+    }
+    code{white-space: pre-wrap;}
+    span.smallcaps{font-variant: small-caps;}
+    div.columns{display: flex; gap: min(4vw, 1.5em);}
+    div.column{flex: auto; overflow-x: auto;}
+    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
+    /* The extra [class] is a hack that increases specificity enough to
+       override a similar rule in reveal.js */
+    ul.task-list[class]{list-style: none;}
+    ul.task-list li input[type="checkbox"] {
+      font-size: inherit;
+      width: 0.8em;
+      margin: 0 0.8em 0.2em -1.6em;
+      vertical-align: middle;
+    }
+    .display.math{display: block; text-align: center; margin: 0.5rem auto;}
+  </style>
+</head>
+<body>
+<header id="title-block-header">
+<h1 class="title">Leafnode manual</h1>
+<p class="author">Matthias Andree</p>
+<p class="date">2021-07-09T17:28:07</p>
+</header>
+<nav id="TOC" role="doc-toc">
+<ul>
+<li><a href="#overview" id="toc-overview">1. OVERVIEW</a></li>
+<li><a href="#installation" id="toc-installation">2.
+INSTALLATION</a></li>
+<li><a href="#update-from-previous-versions"
+id="toc-update-from-previous-versions">3. UPDATE FROM PREVIOUS
+VERSIONS</a></li>
+<li><a href="#update-from-versions-2.0b8_ma8"
+id="toc-update-from-versions-2.0b8_ma8">3.1 Update from versions <
+2.0b8_ma8</a></li>
+<li><a href="#update-from-versions-2.0"
+id="toc-update-from-versions-2.0">3.2 Update from versions <
+2.0</a></li>
+<li><a href="#update-from-versions-1.9.3"
+id="toc-update-from-versions-1.9.3">3.3 Update from versions <
+1.9.3</a></li>
+<li><a href="#update-from-versions-1.6"
+id="toc-update-from-versions-1.6">3.4 Update from versions <
+1.6</a></li>
+<li><a href="#files-and-directories" id="toc-files-and-directories">4.
+FILES AND DIRECTORIES</a></li>
+<li><a href="#the-main-configuration-file"
+id="toc-the-main-configuration-file">4.1. The main configuration
+file</a></li>
+<li><a href="#the-filter-file" id="toc-the-filter-file">4.2. The filter
+file</a></li>
+<li><a href="#local-newsgroups" id="toc-local-newsgroups">5. LOCAL
+NEWSGROUPS</a></li>
+<li><a href="#deinstallation" id="toc-deinstallation">6.
+DEINSTALLATION</a></li>
+<li><a href="#frequently-asked-questions"
+id="toc-frequently-asked-questions">7. FREQUENTLY ASKED
+QUESTIONS</a></li>
+<li><a href="#copyright" id="toc-copyright">8. COPYRIGHT</a></li>
+</ul>
+</nav>
+<hr />
+<h3 id="overview">1. OVERVIEW</h3>
+<p>Leafnode is a USENET software package designed for small sites, with
+a few tens of readers and only a slow link to the net. It is developed
+on Linux, but has been reported to compile and run also under any BSD
+flavour, Solaris and Irix.</p>
+<p>The Leafnode package consists of several programs, three essential
+ones and several add-ons.</p>
+<ul>
+<li><strong>Leafnode</strong> is the NNTP server. It talks to the normal
+news clients, and stores readership data.</li>
+<li><strong>Fetchnews</strong> is the NNTP news-gatherer. It looks at
+the readership data Leafnode stores, and selects what groups to pull
+news from. It also transfers your contributions to one or more upstream
+servers.</li>
+<li><strong>Texpire</strong> is responsible for deleting old and
+uninteresting news. It deletes all discussion threads that are old and
+not recently read.</li>
+</ul>
+<p>These are the additional tools:</p>
+<ul>
+<li><strong>Applyfilter</strong> lets you delete articles from your
+local news spool which fit a certain pattern.</li>
+<li><strong>Checkgroups</strong> inserts the titles of newsgroups into
+the newsgroup database.</li>
+<li><strong>Newsq</strong> shows which news are waiting to be
+transferred to your upstream server(s).</li>
+<li><strong>Rnews</strong> sorts an UUCP batch or articles downloaded by
+other means into the news spool.</li>
+</ul>
+<p>Only groups that someone has been reading in the past week are
+fetched from the upstream NNTP server. When someone stops reading a
+group, fetchnews will stop reading that group a week later (this is the
+default which can be configured), and when someone starts reading a
+group, fetchnews will grab all the articles it can in that group the
+next time it runs.</p>
+<p>Leafnode's distinguishing features are:</p>
+<ul>
+<li>Leafnode is written with the novice user in mind. It is very easy to
+install and configure and requires no manual intervention once
+installed. Leafnode tries very hard to recover automatically from error
+situations.</li>
+<li>Compared to other servers, leafnode uses very little disk space and
+bandwidth. Of course this also depends on how many users are accessing
+your server and is probably not true for 300-user sites.</li>
+<li>The newsspool can be easily manipulated by small scripts because it
+is maintained in plain file format. Some tiny examples are in the
+subdirectory tools/ .</li>
+</ul>
+<p>The current version of leafnode is available from <a
+href="http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/"
+class="uri">http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/</a></p>
+<p>There is also a leafnode mailing list. Send mail to</p>
+<p>leafnode-list-subscribe at dt.e-technik.tu-dortmund.de</p>
+<p>to subscribe, or visit <a
+href="http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/">http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/.</a></p>
+<hr />
+<h3 id="installation">2. INSTALLATION</h3>
+<ol type="1">
+<li><p>Leafnode does not currently work on SunOS 4.</p></li>
+<li><p>Leafnode depends on the PCRE regular-expression matching library.
+It ships as binary package with many current Linux/BSD distributions,
+and is also available as port for *BSD (Debian users: try "apt-get
+install libpcre3 libpcre3-dev"). Just install the binary package for
+your operating system if it ships with one. If it comes without PCRE,
+don't worry, the installation from source is simple. To install PCRE, do
+(AS NORMAL USER, NOT AS root!)</p>
+<ol type="1">
+<li>Download the current PCRE version from <a
+href="http://www.pcre.org/" class="uri">http://www.pcre.org/</a>.</li>
+<li>Unpack PCRE: gunzip -c | tar xvf -</li>
+<li>cd pcre-3.9<br />
+<em>(This is for PCRE-3.9, for other versions, replace that by the path
+that tar wrote when unpacking.)</em></li>
+<li>type <code>./configure && make</code><br />
+<em>there should be no errors</em></li>
+<li>become root</li>
+<li>as root, do <code>make install</code></li>
+<li>as root, do <code>ldconfig</code><br />
+<em>this may not be needed on all systems, but better safe than
+sorry</em></li>
+<li>exit your root shell</li>
+<li>DONE!</li>
+</ol></li>
+<li><p>Leafnode uses GNU autoconf to determine the configuration of the
+machine it will be compiled on. It also uses GNU automake for all the
+standard features that GNU automake offers. Type (AS NORMAL USER, NOT AS
+root!)</p>
+<pre><code>         /bin/sh ./configure</code></pre>
+<p>to create an appropriate Makefile and config.h. If leafnode cannot
+find your PCRE, it is probably an old version without pcre-config, or
+pcre-config is not in your path. Either add the directory containing
+pcre-config to your $PATH, or call configure like this (we assume PCRE
+is in /opt/pcre-3.9):</p>
+<pre><code>         env CPPFLAGS="-I/opt/pcre-3.9" LDFLAGS="-L/opt/pcre-3.9" /bin/sh ./configure</code></pre>
+<p>NOTE: on some machines, when PCRE is linked against a shared library,
+you will need to add /opt/pcre-3.9 to LD_LIBRARY_PATH or to
+/etc/ld.so.conf.</p>
+<p>The configure script can take some flags (replace DIR by a directory
+name, FILE by a file name):</p>
+<pre><code>--enable-spooldir=DIR  To override the default /var/spool/news,
                        where leafnode puts its news spool unless
                        --localstatedir is given or --prefix is given and
                        different from /usr, in the latter case, the
@@ -237,173 +333,103 @@
                        needed for normal operation. This option requires
                        dmalloc, available from http://dmalloc.com/.
 
---with-runas-user=USER Lets leafnode run as user USER, defaults to "news".
+--with-runas-user=USER Lets leafnode run as user USER, defaults to "news".
 
 --with-pam             Enable PAM (pluggable authentication modules)
-                       support.
-</pre>
-        <strong>BEWARE:</strong> Former versions always defaulted
-        their sysconfdir to /etc/leafnode. Current versions only
-        override sysconfdir to /etc/leafnode if configured without
-        --prefix or with --prefix=/usr. That way, if
-        --prefix=/opt/leafnode, the sysconfdir goes to
-        /opt/leafnode/etc, which is more appropriate.
-      </li>
-
-      <li>
-        Type 
-<pre>
-          make
-</pre>
-        There should be no errors.
-      </li>
-
-      <li>Become root.</li>
-
-      <li>As root, create user and group "news" (or the configured
-      user and group) if you don't have those already.</li>
-
-      <li>
-        Type 
-<pre>
-          make install
-</pre>
-        If you prefer an installation with the binaries stripped
-        free of symbols, use 
-<pre>
-          make install-strip
-</pre>
-        instead.<br>
-         <i>For packagers: if you want to prefix all installation
-        paths with a common prefix, e. g. to support RPM's
-        BuildRoot feature: You can use <kbd>make install-strip
-        DESTDIR=/var/tmp/leafnode-root</kbd>.</i>
-      </li>
-
-      <li>
-        Configure syslog so it captures news logging, most systems
-        do NOT log news stuff by default. 
-
-        <ol>
-          <li>
-            Edit /etc/syslog.conf. Unless you already have
-            news.info logging, add a line like this: 
-<pre>
-news.info               /var/log/news
-</pre>
-
-            <p>Note that if you want to send in a bug report and
-            need debug logging, you'll have to replace news.info by
-            news.debug (and send a SIGHUP, as shown below).</p>
-
-            <p>Your syslog.conf may already suggest a different
-            file. If your syslog.conf suggests news.info logging,
-            use that, but be sure to activate it in case it's
-            commented out: remove leading hash marks and white
-            space.</p>
-
-            <p>Also make sure you use TABs between news.info and
-            the path.</p>
-          </li>
-
-          <li>Create the /var/log/news file, type: <kbd>touch
-          /var/log/news</kbd>.</li>
-
-          <li>Send syslogd a HUP signal. <kbd>kill -1 `cat
-          /var/run/syslogd.pid`</kbd> usually does the job, if it
-          doesn't, retry with "syslogd" replaced by "syslog".</li>
-        </ol>
-      </li>
-
-      <li>If you are updating leafnode from a previous version, see
-      the section "Updating" below.</li>
-
-      <li>
-        Edit $(LIBDIR)/config. $(LIBDIR) defaults to /etc/leafnode,
-        but can be adjusted at build time. For documentation, see
-        below or config.example and leafnode(8). <strong>Mandatory
-        edits to the config file are:</strong> 
-
-        <ul>
-          <li>server -- this must point to your upstream news
-          server.</li>
-
-          <li>expire -- how many days will downloaded articles
-          remain in the spool.</li>
-        </ul>
-        Make sure the environment variable $NNTPSERVER or
-        /etc/nntpserver points to your own host so clients will
-        talk to leafnode rather than try to go to the upstream
-        server. 
-
-        <p>If you want to use filtering of the incoming spool, see
-        the section on the filter file below.</p>
-      </li>
-
-      <li>
-	the systemd/ directory of the tarball contains example service and 
-	timer files that can be used on systemd-based systems <strong>instead of</strong> the
-	inetd/xinetd and cron[tab] settings shown below.</li>
-
-      <li>
-        Set up a cron job (as user "root" or "news") to run texpire
-        every night or maybe every week. Here is my crontab line,
-        which runs nightly: 
-<pre>
-0 4 * * * /usr/local/sbin/texpire
-</pre>
-        I did "crontab -u news -e" as root to edit the crontab
-        file, and added this line. Substituting "1" for the third
-        "*", thus: 
-<pre>
-0 4 * * 1 /usr/local/sbin/texpire
-</pre>
-        tells cron to run texpire at 4am every Monday morning.
-      </li>
-
-      <li>Make sure fetchnews is run at the appropriate time. If
-      you have a full-time link, run it out of cron (as "news"
-      again); if not, run it when your connection to the net is
-      established. If it is run as root it will change to user
-      "news". If you use PPP, you can run fetchnews from
-      /etc/ppp/ip-up (or /etc/ppp/ip-up.local, depending on your
-      OS).</li>
-
-      <li>We assume that you have tcpd installed, it ships with
-      most distributions. If you don't have it, fetch it from
-      ftp://ftp.porcupine.org/pub/security/, it's in tcp_wrappers,
-      and install it. It's preferable if you compile it with
-      -DHOSTS_OPTIONS, and the examples below assume you did.</li>
-
-      <li>
-        Choose either of these alternatives: 
-
-        <ul>
-          <li>
-            Alternative #1: If your system uses inetd (most
-            commercial unices, *BSD). Edit /etc/inetd.conf so that
-            $(BINDIR)/leafnode is executed for incoming NNTP
-            connections. Here is my inetd.conf line: 
-<pre>
-nntp    stream  tcp     nowait  news    /usr/sbin/tcpd /usr/local/sbin/leafnode
-</pre>
-            <i>Note: some systems install tcpd to a different path,
-            but it's uncommon. Change the first path accordingly if
-            your tcpd resides in /usr/etc or /usr/lbin.</i> After
-            these changes, force inetd to read the changed
-            configuration file by sending it the HANGUP signal. To
-            achieve this, issue the following command (as root): 
-<pre>
-kill -HUP `cat /var/run/inetd.pid`
-</pre>
-          </li>
-
-          <li>
-            Alternative #2: If your system has xinetd instead. Add
-            this to your xinetd.conf (this example assumes xinetd
-            2.3.3 or newer): 
-<pre>
-service nntp
+                       support.</code></pre>
+<p><strong>BEWARE:</strong> Former versions always defaulted their
+sysconfdir to /etc/leafnode. Current versions only override sysconfdir
+to /etc/leafnode if configured without --prefix or with --prefix=/usr.
+That way, if --prefix=/opt/leafnode, the sysconfdir goes to
+/opt/leafnode/etc, which is more appropriate.</p></li>
+<li><p>Type</p>
+<pre><code>          make</code></pre>
+<p>There should be no errors.</p></li>
+<li><p>Become root.</p></li>
+<li><p>As root, create user and group "news" (or the configured user and
+group) if you don't have those already.</p></li>
+<li><p>Type</p>
+<pre><code>          make install</code></pre>
+<p>If you prefer an installation with the binaries stripped free of
+symbols, use</p>
+<pre><code>          make install-strip</code></pre>
+<p>instead.<br />
+<em>For packagers: if you want to prefix all installation paths with a
+common prefix, e. g. to support RPM's BuildRoot feature: You can use
+<code>make install-strip DESTDIR=/var/tmp/leafnode-root</code>.</em></p></li>
+<li><p>Configure syslog so it captures news logging, most systems do NOT
+log news stuff by default.</p>
+<ol type="1">
+<li><p>Edit /etc/syslog.conf. Unless you already have news.info logging,
+add a line like this:</p>
+<pre><code>news.info               /var/log/news</code></pre>
+<p>Note that if you want to send in a bug report and need debug logging,
+you'll have to replace news.info by news.debug (and send a SIGHUP, as
+shown below).</p>
+<p>Your syslog.conf may already suggest a different file. If your
+syslog.conf suggests news.info logging, use that, but be sure to
+activate it in case it's commented out: remove leading hash marks and
+white space.</p>
+<p>Also make sure you use TABs between news.info and the path.</p></li>
+<li><p>Create the /var/log/news file, type:
+<code>touch /var/log/news</code>.</p></li>
+<li><p>Send syslogd a HUP signal. <code>kill -1 \</code>cat
+/var/run/syslogd.pid`` usually does the job, if it doesn't, retry with
+"syslogd" replaced by "syslog".</p></li>
+</ol></li>
+<li><p>If you are updating leafnode from a previous version, see the
+section "Updating" below.</p></li>
+<li><p>Edit $(LIBDIR)/config. $(LIBDIR) defaults to /etc/leafnode, but
+can be adjusted at build time. For documentation, see below or
+config.example and leafnode(8). <strong>Mandatory edits to the config
+file are:</strong></p>
+<ul>
+<li>server -- this must point to your upstream news server.</li>
+<li>expire -- how many days will downloaded articles remain in the
+spool.</li>
+</ul>
+<p>Make sure the environment variable $NNTPSERVER or /etc/nntpserver
+points to your own host so clients will talk to leafnode rather than try
+to go to the upstream server.</p>
+<p>If you want to use filtering of the incoming spool, see the section
+on the filter file below.</p></li>
+<li><p>the systemd/ directory of the tarball contains example service
+and timer files that can be used on systemd-based systems
+<strong>instead of</strong> the inetd/xinetd and cron[tab] settings
+shown below.</p></li>
+<li><p>Set up a cron job (as user "root" or "news") to run texpire every
+night or maybe every week. Here is my crontab line, which runs
+nightly:</p>
+<pre><code>0 4 * * * /usr/local/sbin/texpire</code></pre>
+<p>I did "crontab -u news -e" as root to edit the crontab file, and
+added this line. Substituting "1" for the third "*", thus:</p>
+<pre><code>0 4 * * 1 /usr/local/sbin/texpire</code></pre>
+<p>tells cron to run texpire at 4am every Monday morning.</p></li>
+<li><p>Make sure fetchnews is run at the appropriate time. If you have a
+full-time link, run it out of cron (as "news" again); if not, run it
+when your connection to the net is established. If it is run as root it
+will change to user "news". If you use PPP, you can run fetchnews from
+/etc/ppp/ip-up (or /etc/ppp/ip-up.local, depending on your OS).</p></li>
+<li><p>We assume that you have tcpd installed, it ships with most
+distributions. If you don't have it, fetch it from
+ftp://ftp.porcupine.org/pub/security/, it's in tcp_wrappers, and install
+it. It's preferable if you compile it with -DHOSTS_OPTIONS, and the
+examples below assume you did.</p></li>
+<li><p>Choose either of these alternatives:</p>
+<ul>
+<li><p>Alternative #1: If your system uses inetd (most commercial
+unices, *BSD). Edit /etc/inetd.conf so that $(BINDIR)/leafnode is
+executed for incoming NNTP connections. Here is my inetd.conf line:</p>
+<pre><code>nntp    stream  tcp     nowait  news    /usr/sbin/tcpd /usr/local/sbin/leafnode</code></pre>
+<p><em>Note: some systems install tcpd to a different path, but it's
+uncommon. Change the first path accordingly if your tcpd resides in
+/usr/etc or /usr/lbin.</em> After these changes, force inetd to read the
+changed configuration file by sending it the HANGUP signal. To achieve
+this, issue the following command (as root):</p>
+<pre><code>kill -HUP `cat /var/run/inetd.pid`</code></pre></li>
+<li><p>Alternative #2: If your system has xinetd instead. Add this to
+your xinetd.conf (this example assumes xinetd 2.3.3 or newer):</p>
+<pre><code>service nntp
 {
         flags           = NAMEINARGS NOLIBWRAP
         socket_type     = stream
@@ -414,484 +440,353 @@ service nntp
         server_args     = /usr/local/sbin/leafnode
         instances       = 7
         per_source      = 3
-}
-</pre>
-            Then send xinetd an USR2 signal to make it reread its
-            configuration. See the <b>xinetd.conf</b>(5) manual
-            page for details. <i>Note: some systems install tcpd to
-            a different path, but it's uncommon. Change the first
-            path accordingly if your tcpd resides in /usr/etc or
-            /usr/lbin.</i>
-          </li>
-        </ul>
-      </li>
-
-      <li>
-        Write the following into /etc/hosts.deny: 
-<pre>
-leafnode: ALL
-</pre>
-        and into /etc/hosts.allow: 
-<pre>
-leafnode: 127.0.0.1
-</pre>
-        to protect your news server from abuse. If you want to make
-        leafnode accessible to additional IP numbers/domains, add
-        them in /etc/hosts.allow in the format described above. See
-        hosts_access(5) and hosts_options(5) (if applicable) for
-        more information about tcp wrappers.
-      </li>
-
-      <li>
-        <i>(optional)</i> If you want to allow read-only access,
-        you can set the NOPOSTING environment variable, for
-        example, put this into /etc/hosts.allow: 
-<pre>
-leafnode: 192.168.0.4: setenv NOPOSTING "You may only read."
-</pre>
-        The contents of this variable are printed at the end of the
-        banner, with control characters (as per iscntrl(3))
-        replaced by an underscore.
-      </li>
-
-      <li>
-        <i>(optional)</i> If you want to allow clients read access
-        to local or global subscribed groups, but do not want to
-        allow them to subscribe to new groups, you can set the
-        NOSUBSCRIBE environment variable. When this variable is
-        set, a client will never see a pseudo article. For example,
-        if clients from 127.0.0.1 and 192.168.0.42 may subscribe
-        new groups, and all other 192.168.0.* hosts may read the
-        existing groups but not subscribe to new groups, put this
-        into /etc/hosts.allow (this assumes libwrap/tcpd have been
-        compiled with -DPROCESS_OPTIONS): 
-<pre>
-leafnode: 127.0.0.1 192.168.0.42: ALLOW
+}</code></pre>
+<p>Then send xinetd an USR2 signal to make it reread its configuration.
+See the <strong>xinetd.conf</strong>(5) manual page for details.
+<em>Note: some systems install tcpd to a different path, but it's
+uncommon. Change the first path accordingly if your tcpd resides in
+/usr/etc or /usr/lbin.</em></p></li>
+</ul></li>
+<li><p>Write the following into /etc/hosts.deny:</p>
+<pre><code>leafnode: ALL</code></pre>
+<p>and into /etc/hosts.allow:</p>
+<pre><code>leafnode: 127.0.0.1</code></pre>
+<p>to protect your news server from abuse. If you want to make leafnode
+accessible to additional IP numbers/domains, add them in
+/etc/hosts.allow in the format described above. See hosts_access(5) and
+hosts_options(5) (if applicable) for more information about tcp
+wrappers.</p></li>
+<li><p><em>(optional)</em> If you want to allow read-only access, you
+can set the NOPOSTING environment variable, for example, put this into
+/etc/hosts.allow:</p>
+<pre><code>leafnode: 192.168.0.4: setenv NOPOSTING "You may only read."</code></pre>
+<p>The contents of this variable are printed at the end of the banner,
+with control characters (as per iscntrl(3)) replaced by an
+underscore.</p></li>
+<li><p><em>(optional)</em> If you want to allow clients read access to
+local or global subscribed groups, but do not want to allow them to
+subscribe to new groups, you can set the NOSUBSCRIBE environment
+variable. When this variable is set, a client will never see a pseudo
+article. For example, if clients from 127.0.0.1 and 192.168.0.42 may
+subscribe new groups, and all other 192.168.0.* hosts may read the
+existing groups but not subscribe to new groups, put this into
+/etc/hosts.allow (this assumes libwrap/tcpd have been compiled with
+-DPROCESS_OPTIONS):</p>
+<pre><code>leafnode: 127.0.0.1 192.168.0.42: ALLOW
 leafnode: 192.168.0.0/255.255.255.0: setenv NOSUBSCRIBE 1
-leafnode: ALL: DENY
-</pre>
-      </li>
-
-      <li>Run fetchnews. The first run will take some time since
-      fetchnews reads a list of all newsgroups from your upstream
-      server. In the worst case, this can take up to 60 minutes,
-      depending on how many newsgroups your provider offers and how
-      reliable your modem connection is. To see fetchnews working,
-      run it with -vvv.</li>
-
-      <li>Run texpire. It will create directories missing after the
-      first install.</li>
-
-      <li>Exit your root shell.</li>
-
-      <li>
-        Read news using an NNTP client (with $NNTPSERVER or
-        /etc/nntpserver pointing to your own host). Select the
-        groups you want to read in the future. You will find them
-        empty except a default article. Reading this article is
-        necessary with some newsreaders to select the groups for
-        further fetching. 
-
-        <p>After this, you should have empty files in
-        /var/spool/news/interesting.groups/ for every group you
-        want to read.</p>
-      </li>
-
-      <li>Become root and run fetchnews again, then exit your root
-      shell. This run should pick up all the groups you want to
-      read.</li>
-    </ol>
-    <hr>
-
-    <h3 class="c2">3. UPDATE FROM PREVIOUS VERSIONS</h3>
-
-    <h3 class="c2">3.1 Update from versions < 2.0b8_ma8</h3>
-
-    <p>The local.groups and groupinfo files and the hash function
-    for message.id have changed from any former version to
-    2.0b8_ma8.</p>
-
-    <p><strong>IMPORTANT:</strong> To fix the "remote" groups, run
-    <kbd>fetchnews -f</kbd> -- it will take some time, because it
-    refetches the whole active file, but that's needed anyhow to
-    figure the group status (posting allowed/not allowed/moderated
-    group).</p>
-
-    <p>To fix <strong>local.groups</strong>, if you have perl
-    installed:</p>
-<pre>
-  perl -ple 's /\s+/\ty\t/' -i.bak /etc/leafnode/local.groups
-</pre>
-    This will make a backup of your original
-    /etc/leafnode/local.groups in /etc/leafnode/local.groups.bak. 
-
-    <p>If you don't have Perl, use a text editor that preserves
-    HTAB characters, change all while space to TAB and insert an
-    additional field reading just y:</p>
-
-    <blockquote>
-      Before: local.test some test group<br>
-       After: local.testTAByTABsome test group
-    </blockquote>
-    <br>
-     Use the real TAB character rather than TAB. <br>
-     To fix the spool for message.ids, run <kbd>texpire -r</kbd>
-    <br>
-     The changes written in section 3.2 below also apply. 
-
-    <h3 class="c2">3.2 Update from versions < 2.0</h3>
-
-    <p>From 1.9.x to 2.0 there were some changes to options in the
-    main configuration file. The options "maxage", "maxlines",
-    "minlines", "maxbytes" and "maxcrosspost" have become obsolete
-    in the main configuration file and have to be specified in the
-    filter file instead. The advantage of this is that you can do
-    much finer selection on these criteria now.</p>
-
-    <p>To replace, for example, a "maxage = 5" specification in the
-    main configuration file, you should add the following to your
-    filter file:</p>
-<pre>
-newsgroups = .*
+leafnode: ALL: DENY</code></pre></li>
+<li><p>Run fetchnews. The first run will take some time since fetchnews
+reads a list of all newsgroups from your upstream server. In the worst
+case, this can take up to 60 minutes, depending on how many newsgroups
+your provider offers and how reliable your modem connection is. To see
+fetchnews working, run it with -vvv.</p></li>
+<li><p>Run texpire. It will create directories missing after the first
+install.</p></li>
+<li><p>Exit your root shell.</p></li>
+<li><p>Read news using an NNTP client (with $NNTPSERVER or
+/etc/nntpserver pointing to your own host). Select the groups you want
+to read in the future. You will find them empty except a default
+article. Reading this article is necessary with some newsreaders to
+select the groups for further fetching.</p>
+<p>After this, you should have empty files in
+/var/spool/news/interesting.groups/ for every group you want to
+read.</p></li>
+<li><p>Become root and run fetchnews again, then exit your root shell.
+This run should pick up all the groups you want to read.</p></li>
+</ol>
+<hr />
+<h3 id="update-from-previous-versions">3. UPDATE FROM PREVIOUS
+VERSIONS</h3>
+<h3 id="update-from-versions-2.0b8_ma8">3.1 Update from versions <
+2.0b8_ma8</h3>
+<p>The local.groups and groupinfo files and the hash function for
+message.id have changed from any former version to 2.0b8_ma8.</p>
+<p><strong>IMPORTANT:</strong> To fix the "remote" groups, run
+<code>fetchnews -f</code> -- it will take some time, because it
+refetches the whole active file, but that's needed anyhow to figure the
+group status (posting allowed/not allowed/moderated group).</p>
+<p>To fix <strong>local.groups</strong>, if you have perl installed:</p>
+<pre><code>  perl -ple 's /\s+/\ty\t/' -i.bak /etc/leafnode/local.groups</code></pre>
+<p>This will make a backup of your original /etc/leafnode/local.groups
+in /etc/leafnode/local.groups.bak.</p>
+<p>If you don't have Perl, use a text editor that preserves HTAB
+characters, change all while space to TAB and insert an additional field
+reading just y:</p>
+<blockquote>
+<p>Before: local.test some test group<br />
+After: local.testTAByTABsome test group</p>
+</blockquote>
+<p><br />
+Use the real TAB character rather than TAB.<br />
+To fix the spool for message.ids, run <code>texpire -r</code><br />
+The changes written in section 3.2 below also apply.</p>
+<h3 id="update-from-versions-2.0">3.2 Update from versions < 2.0</h3>
+<p>From 1.9.x to 2.0 there were some changes to options in the main
+configuration file. The options "maxage", "maxlines", "minlines",
+"maxbytes" and "maxcrosspost" have become obsolete in the main
+configuration file and have to be specified in the filter file instead.
+The advantage of this is that you can do much finer selection on these
+criteria now.</p>
+<p>To replace, for example, a "maxage = 5" specification in the main
+configuration file, you should add the following to your filter
+file:</p>
+<pre><code>newsgroups = .*
 maxage = 5
-action = kill
-</pre>
-
-    <p>The leafnode programs will issue warnings if they encounter
-    obsolete specifications in the main config file.</p>
-
-    <h3 class="c2">3.3 Update from versions < 1.9.3</h3>
-
-    <p>From version 1.9.3 on, the groupinfo file is sorted in a
-    case-insensitive manner. To update correctly, do a "make
-    update" as root after you have successfully completed "make
-    install". This will re-sort the groupinfo file. The old
-    groupinfo file will be stored as groupinfo.old just in case
-    something goes wrong. You also have to change your main config
-    file manually as described in the previous section.</p>
-
-    <h3 class="c2">3.4 Update from versions < 1.6</h3>
-
-    <p>Between leafnode-1.6alpha and leafnode-1.6, the format of
-    the groupinfo file changed and some files moved to other
-    places. To update correctly, do a "make update" as root after
-    you have successfully completed "make install". This will
-    reformat the groupinfo file and move the other files into the
-    correct places. The old groupinfo file will be stored as
-    groupinfo.old just in case something goes wrong. You also have
-    to change your main config file manually as described in the
-    section "Update from versions < 2.0".</p>
-    <hr>
-
-    <h3 class="c2">4. FILES AND DIRECTORIES</h3>
-
-    <p>Leafnode puts its files in three separate directories: The
-    spool directory, the library directory, and the binaries
-    directory. All directories can be changed at compile time.</p>
-
-    <p>In the spool directory you find the stored news, the active
-    file and some other short-lived configuration file. It defaults
-    to /var/spool/news and can be changed at compilation time.
-    There are some special directories here; see the leafnode(8)
-    man page.</p>
-
-    <p>The library directory contains long-lived configuration
-    files. It defaults to /etc/leafnode.</p>
-
-    <p>The binaries directory, /usr/local/sbin by default, contains
-    the executable programs applyfilter, texpire, fetchnews and
-    leafnode.</p>
-
-    <p>The user directory, /usr/local/bin by default, contains the
-    newsq program.</p>
-
-    <h3 class="c2">4.1. The main configuration file</h3>
-
-    <p>The main configuration file contains settings important for
-    all programs of the leafnode suite. It defaults to
-    /etc/leafnode/config, but several configuration files can be
-    used at once by employing the -F switch of the programs.</p>
-
-    <p>The file contains two mandatory and a number of optional
-    parameters.</p>
-
-    <p>NOTE: Global options must come first, server-specific
-    options below the server = lines.</p>
-
-    <p class="c4">Mandatory parameters</p>
-
-    <blockquote>
-      server = news02.bigprovider.com
-    </blockquote>
-    You have to specify at least one server (except if you want
-    leafnode to serve as a local server only). Usually, this will
-    be the news server of your provider. You can specify more than
-    one server, and fetchnews will retrieve news from all of them,
-    taking care not to transfer articles multiple times to your
-    machine. Servers will be queried in the order specified in the
-    config file. 
-
-    <blockquote>
-      expire = 5
-    </blockquote>
-    This parameter determines how many days threads are kept on
-    your hard disk. texpire will delete whole threads, not just
-    single articles. 
-
-    <p class="c4">Server-specific optional parameters</p>
-
-    <p>To configure interaction with the server somewhat, you can
-    change the behaviour of fetchnews by setting several
-    server-specific optional parameters. They have to be specified
-    directly after the corresponding "server" statement. A new
-    server statement in the config file will also allow new
-    optional parameters.</p>
-
-    <blockquote>
-      username = myname<br>
-       password = mypasswd
-    </blockquote>
-    If your upstream server requires a form of authentication, you
-    can set your username and password here. 
-
-    <blockquote>
-      timeout = 30
-    </blockquote>
-    It may happen that, due to a bad connection or other reasons,
-    the server stops talking to you while you fetch news. The
-    "timeout" parameter determines the number of seconds fetchnews
-    is supposed to wait for a response from the server before
-    giving up. 
-
-    <blockquote>
-      nodesc = 1
-    </blockquote>
-    Some servers are unable to deliver descriptions of new
-    newsgroups correctly. When fetchnews encounters such a server,
-    it will print the warning 
-
-    <blockquote>
-      server.name does not process LIST NEWSGROUPS news.group.name
-      correctly: use nodesc
-    </blockquote>
-    To allow for shorter download times, you should in this case
-    set "nodesc = 1" for that particular server in the
-    configuration file. 
-
-    <blockquote>
-      port = 8000
-    </blockquote>
-    Normally, fetchnews will try to retrieve news from port 119
-    (the standard nntp port) of your upstream server. If the
-    upstream server runs on a different port, you can specify it
-    with this option. 
-
-    <p class="c4">General optional parameters</p>
-
-    <blockquote>
-      authenticate = <i>METHOD</i>
-    </blockquote>
-    Require that NNTP clients connecting to your leafnode
-    authenticate themselves. The only method currently supported is
-    <tt>internal</tt>. In this mode, leafnode expects a file
-    <i>users</i> in its sysconfdir, /etc/leafnode/users by default,
-    which has a simple format, one line per user, with the user
-    name (which cannot contain spaces), then a colon, then the
-    crypt(3) encrypted password. To generate these lines, you can
-    use the Perl program <i>tools/make_pass.pl</i>, for example, if
-    you want to add a user "enigma" with a password of "break!me",
-    type: 
-
-    <blockquote>
-      perl -wT tools/make_pass.pl 'enigma' 'break!me'
-    </blockquote>
-    and copy the resulting line to the <i>users</i> file.<br>
-     htpasswd as shipped for Apache servers should also work if in
-    crypt(3) mode. 
-
-    <blockquote>
-      hostname = host.domain.country
-    </blockquote>
-    If the postings that you write do not have message IDs
-    (generated by the newsreader), leafnode will generate a message
-    ID for you. (It will never overwrite an already existing
-    message ID.) Message IDs generated by leafnode feature ".ln"
-    before the @ sign. The message ID contains the fully qualified
-    hostname of your machine which may not always be what you want.
-    In that case, you can override the use of the hostname by using
-    the "hostname" option. 
-
-    <blockquote>
-      create_all_links = 1
-    </blockquote>
-    Usually fetchnews will store articles only in the newsgroups
-    which you consider interesting. Unfortunately, this makes it
-    difficult to score for the number of newsgroups a message is
-    posted to because the Newsgroups: header is not featured in the
-    overview information; therefore you can determine the number of
-    newsgroups an article is crossposted to only from the Xref:
-    header. If "create_all_links" is set to 1, fetchnews will store
-    articles in all newsgroups which they are posted to, making all
-    these newsgroups turn up in the Xref: header. 
-
-    <blockquote>
-      groupexpire = a.news.group 7
-    </blockquote>
-    As outlined above, texpire will expire threads after "expire"
-    days. If you want to adjust expiry times for certain groups,
-    you may use the "groupexpire" parameter to do just that. You
-    can specify groups or use wildcards; for example 
-
-    <blockquote>
-      groupexpire = *.announce 30
-    </blockquote>
-    will affect expiry times of all groups ending with ".announce".
-    
-
-    <blockquote>
-      filterfile = /etc/leafnode/filters
-    </blockquote>
-    If you want to employ filtering on incoming messages, you have
-    to specify the path where the filterfile can be found. The
-    format of the filterfile is described in the next chapter. 
-
-    <blockquote>
-      timeout_short = 2<br>
-       timeout_long = 5
-    </blockquote>
-    These two parameters determine how quickly a group is
-    unsubscribed by leafnode after you have stopped reading it. If
-    you have looked into the group only once, subscription is
-    stopped after "timeout_short" days; if you have read it more
-    regularly, subscription is stopped after "timeout_long" days.
-    (You can stop subscription immediately by removing the
-    corresponding file in /var/spool/news/interesting.groups/). 
-
-    <blockquote>
-      timeout_active = 90
-    </blockquote>
-    By default, fetchnews will re-read active files from the
-    upstream server every 90 days. This interval can be changed by
-    setting "timeout_active" to a different value. Re-reading the
-    active file frequently will keep it a little bit smaller but
-    will increase the on-line time. 
-
-    <blockquote>
-      delaybody = 1
-    </blockquote>
-    This option switches fetchnews into a mode where only the
-    headers of articles are fetched for visual inspection. Only the
-    articles read in the newsreader will be retrieved the next time
-    fetchnews is called. This can save a huge amount of disk space
-    and download time but requires more manual intervention on the
-    user side. 
-
-    <blockquote>
-      groupdelaybody = some.news.group
-    </blockquote>
-    If you want delaybody mode only for selected groups, you can
-    enable this download mode for one specific group. The global
-    delaybody switch above causes all groups to be treated that
-    way. Use one line per group pattern. 
-
-    <blockquote>
-      debugmode = 260
-    </blockquote>
-    This option forces the leafnode programs into logging lots of
-    information via the syslog daemon. It is only useful if you
-    want to hunt down bugs. See config.example for an explanation
-    of the number here. 
-
-    <h3 class="c2">4.2. The filter file</h3>
-
-    <p>The filter file format is currently described in
-    fetchnews(5). Type man 5 filterfile or man -s 5 filterfile to
-    see the description.</p>
-    <hr>
-
-    <h3 class="c2">5. LOCAL NEWSGROUPS</h3>
-
-    <p>From version 2.0 on, Leafnode is able to handle local
-    newsgroups. Local newsgroups are groups that exist only on your
-    local server but not on upstream servers.</p>
-
-    <p>To create a local newsgroup, you have to think of a
-    newsgroup name which should not exist on any of your upstream
-    servers. It is therefore a good idea to start a new top-level
-    hierarchy. You should also make up a description for your
-    newsgroup.</p>
-
-    <p>If you choose a newsgroup name which exists already on an
-    upstream server, the newsgroup is not treated as a local
-    one.</p>
-
-    <p>Next, you write the name, status and description into the
-    file /etc/leafnode/local.groups using your preferred text
-    editor, which must not mangle TABs to SPACEs. The file should
-    consist of lines in the format</p>
-<pre>
-# Comment lines are allowed, with a hash at the beginning of a line.
+action = kill</code></pre>
+<p>The leafnode programs will issue warnings if they encounter obsolete
+specifications in the main config file.</p>
+<h3 id="update-from-versions-1.9.3">3.3 Update from versions <
+1.9.3</h3>
+<p>From version 1.9.3 on, the groupinfo file is sorted in a
+case-insensitive manner. To update correctly, do a "make update" as root
+after you have successfully completed "make install". This will re-sort
+the groupinfo file. The old groupinfo file will be stored as
+groupinfo.old just in case something goes wrong. You also have to change
+your main config file manually as described in the previous section.</p>
+<h3 id="update-from-versions-1.6">3.4 Update from versions < 1.6</h3>
+<p>Between leafnode-1.6alpha and leafnode-1.6, the format of the
+groupinfo file changed and some files moved to other places. To update
+correctly, do a "make update" as root after you have successfully
+completed "make install". This will reformat the groupinfo file and move
+the other files into the correct places. The old groupinfo file will be
+stored as groupinfo.old just in case something goes wrong. You also have
+to change your main config file manually as described in the section
+"Update from versions < 2.0".</p>
+<hr />
+<h3 id="files-and-directories">4. FILES AND DIRECTORIES</h3>
+<p>Leafnode puts its files in three separate directories: The spool
+directory, the library directory, and the binaries directory. All
+directories can be changed at compile time.</p>
+<p>In the spool directory you find the stored news, the active file and
+some other short-lived configuration file. It defaults to
+/var/spool/news and can be changed at compilation time. There are some
+special directories here; see the leafnode(8) man page.</p>
+<p>The library directory contains long-lived configuration files. It
+defaults to /etc/leafnode.</p>
+<p>The binaries directory, /usr/local/sbin by default, contains the
+executable programs applyfilter, texpire, fetchnews and leafnode.</p>
+<p>The user directory, /usr/local/bin by default, contains the newsq
+program.</p>
+<h3 id="the-main-configuration-file">4.1. The main configuration
+file</h3>
+<p>The main configuration file contains settings important for all
+programs of the leafnode suite. It defaults to /etc/leafnode/config, but
+several configuration files can be used at once by employing the -F
+switch of the programs.</p>
+<p>The file contains two mandatory and a number of optional
+parameters.</p>
+<p>NOTE: Global options must come first, server-specific options below
+the server = lines.</p>
+<p>Mandatory parameters</p>
+<blockquote>
+<p>server = news02.bigprovider.com</p>
+</blockquote>
+<p>You have to specify at least one server (except if you want leafnode
+to serve as a local server only). Usually, this will be the news server
+of your provider. You can specify more than one server, and fetchnews
+will retrieve news from all of them, taking care not to transfer
+articles multiple times to your machine. Servers will be queried in the
+order specified in the config file.</p>
+<blockquote>
+<p>expire = 5</p>
+</blockquote>
+<p>This parameter determines how many days threads are kept on your hard
+disk. texpire will delete whole threads, not just single articles.</p>
+<p>Server-specific optional parameters</p>
+<p>To configure interaction with the server somewhat, you can change the
+behaviour of fetchnews by setting several server-specific optional
+parameters. They have to be specified directly after the corresponding
+"server" statement. A new server statement in the config file will also
+allow new optional parameters.</p>
+<blockquote>
+<p>username = myname<br />
+password = mypasswd</p>
+</blockquote>
+<p>If your upstream server requires a form of authentication, you can
+set your username and password here.</p>
+<blockquote>
+<p>timeout = 30</p>
+</blockquote>
+<p>It may happen that, due to a bad connection or other reasons, the
+server stops talking to you while you fetch news. The "timeout"
+parameter determines the number of seconds fetchnews is supposed to wait
+for a response from the server before giving up.</p>
+<blockquote>
+<p>nodesc = 1</p>
+</blockquote>
+<p>Some servers are unable to deliver descriptions of new newsgroups
+correctly. When fetchnews encounters such a server, it will print the
+warning</p>
+<blockquote>
+<p>server.name does not process LIST NEWSGROUPS news.group.name
+correctly: use nodesc</p>
+</blockquote>
+<p>To allow for shorter download times, you should in this case set
+"nodesc = 1" for that particular server in the configuration file.</p>
+<blockquote>
+<p>port = 8000</p>
+</blockquote>
+<p>Normally, fetchnews will try to retrieve news from port 119 (the
+standard nntp port) of your upstream server. If the upstream server runs
+on a different port, you can specify it with this option.</p>
+<p>General optional parameters</p>
+<blockquote>
+<p>authenticate = <em>METHOD</em></p>
+</blockquote>
+<p>Require that NNTP clients connecting to your leafnode authenticate
+themselves. The only method currently supported is
+<code>internal</code>. In this mode, leafnode expects a file
+<em>users</em> in its sysconfdir, /etc/leafnode/users by default, which
+has a simple format, one line per user, with the user name (which cannot
+contain spaces), then a colon, then the crypt(3) encrypted password. To
+generate these lines, you can use the Perl program
+<em>tools/make_pass.pl</em>, for example, if you want to add a user
+"enigma" with a password of "break!me", type:</p>
+<blockquote>
+<p>perl -wT tools/make_pass.pl 'enigma' 'break!me'</p>
+</blockquote>
+<p>and copy the resulting line to the <em>users</em> file.<br />
+htpasswd as shipped for Apache servers should also work if in crypt(3)
+mode.</p>
+<blockquote>
+<p>hostname = host.domain.country</p>
+</blockquote>
+<p>If the postings that you write do not have message IDs (generated by
+the newsreader), leafnode will generate a message ID for you. (It will
+never overwrite an already existing message ID.) Message IDs generated
+by leafnode feature ".ln" before the @ sign. The message ID contains the
+fully qualified hostname of your machine which may not always be what
+you want. In that case, you can override the use of the hostname by
+using the "hostname" option.</p>
+<blockquote>
+<p>create_all_links = 1</p>
+</blockquote>
+<p>Usually fetchnews will store articles only in the newsgroups which
+you consider interesting. Unfortunately, this makes it difficult to
+score for the number of newsgroups a message is posted to because the
+Newsgroups: header is not featured in the overview information;
+therefore you can determine the number of newsgroups an article is
+crossposted to only from the Xref: header. If "create_all_links" is set
+to 1, fetchnews will store articles in all newsgroups which they are
+posted to, making all these newsgroups turn up in the Xref: header.</p>
+<blockquote>
+<p>groupexpire = a.news.group 7</p>
+</blockquote>
+<p>As outlined above, texpire will expire threads after "expire" days.
+If you want to adjust expiry times for certain groups, you may use the
+"groupexpire" parameter to do just that. You can specify groups or use
+wildcards; for example</p>
+<blockquote>
+<p>groupexpire = *.announce 30</p>
+</blockquote>
+<p>will affect expiry times of all groups ending with ".announce".</p>
+<blockquote>
+<p>filterfile = /etc/leafnode/filters</p>
+</blockquote>
+<p>If you want to employ filtering on incoming messages, you have to
+specify the path where the filterfile can be found. The format of the
+filterfile is described in the next chapter.</p>
+<blockquote>
+<p>timeout_short = 2<br />
+timeout_long = 5</p>
+</blockquote>
+<p>These two parameters determine how quickly a group is unsubscribed by
+leafnode after you have stopped reading it. If you have looked into the
+group only once, subscription is stopped after "timeout_short" days; if
+you have read it more regularly, subscription is stopped after
+"timeout_long" days. (You can stop subscription immediately by removing
+the corresponding file in /var/spool/news/interesting.groups/).</p>
+<blockquote>
+<p>timeout_active = 90</p>
+</blockquote>
+<p>By default, fetchnews will re-read active files from the upstream
+server every 90 days. This interval can be changed by setting
+"timeout_active" to a different value. Re-reading the active file
+frequently will keep it a little bit smaller but will increase the
+on-line time.</p>
+<blockquote>
+<p>delaybody = 1</p>
+</blockquote>
+<p>This option switches fetchnews into a mode where only the headers of
+articles are fetched for visual inspection. Only the articles read in
+the newsreader will be retrieved the next time fetchnews is called. This
+can save a huge amount of disk space and download time but requires more
+manual intervention on the user side.</p>
+<blockquote>
+<p>groupdelaybody = some.news.group</p>
+</blockquote>
+<p>If you want delaybody mode only for selected groups, you can enable
+this download mode for one specific group. The global delaybody switch
+above causes all groups to be treated that way. Use one line per group
+pattern.</p>
+<blockquote>
+<p>debugmode = 260</p>
+</blockquote>
+<p>This option forces the leafnode programs into logging lots of
+information via the syslog daemon. It is only useful if you want to hunt
+down bugs. See config.example for an explanation of the number here.</p>
+<h3 id="the-filter-file">4.2. The filter file</h3>
+<p>The filter file format is currently described in fetchnews(5). Type
+man 5 filterfile or man -s 5 filterfile to see the description.</p>
+<hr />
+<h3 id="local-newsgroups">5. LOCAL NEWSGROUPS</h3>
+<p>From version 2.0 on, Leafnode is able to handle local newsgroups.
+Local newsgroups are groups that exist only on your local server but not
+on upstream servers.</p>
+<p>To create a local newsgroup, you have to think of a newsgroup name
+which should not exist on any of your upstream servers. It is therefore
+a good idea to start a new top-level hierarchy. You should also make up
+a description for your newsgroup.</p>
+<p>If you choose a newsgroup name which exists already on an upstream
+server, the newsgroup is not treated as a local one.</p>
+<p>Next, you write the name, status and description into the file
+/etc/leafnode/local.groups using your preferred text editor, which must
+not mangle TABs to SPACEs. The file should consist of lines in the
+format</p>
+<pre><code># Comment lines are allowed, with a hash at the beginning of a line.
 #
 # However, no white space may precede the hash mark, and empty lines
 # are not valid.
-news.group.name<TAB>status<TAB>description
-</pre>
-    (replace <TAB> with a TAB character!) 
-
-    <p>The first column of each line is taken as the newsgroup
-    name; the second as the status (y for "may be posted to", m for
-    "moderated" -- see below for moderator configuration), the
-    third column of the line is interpreted as description. For
-    example, to set up a newsgroup "local.leafnode" which deals
-    with Leafnode's internals, you would put a line</p>
-
-    <blockquote>
-      local.leafnode<TAB>y<TAB>Local leafnode user
-      group
-    </blockquote>
-    into /etc/leafnode/local.groups. (If your configuration does
-    not reside in /etc/leafnode, replace this part of the pathname
-    with the appropriate directory.) 
-
-    <h4 class="c5">5.1 MODERATED NEWSGROUPS</h4>
-
-    <p>From version 2.0 on, Leafnode also handles
-    <strong>moderated</strong> newsgroups. These are newsgroups
-    which only certain people may post into, and articles which a
-    regular (non-moderator) user posts, are mailed to the
-    moderator.</p>
-
-    <p>External moderated newsgroups are handled by the upstream
-    servers.</p>
-
-    <p>To configure the moderators for <strong>local</strong>
-    moderated groups, an INN-compatible "moderators" file is used.
-    It is named /etc/leafnode/moderators and has the following
-    format:</p>
-<pre>
-pattern:moderator
-</pre>
-
-    <p>Empty lines and lines that start with a hash character (#)
-    are considered comment lines and are ignored.</p>
-
-    <p>The <strong>pattern</strong> is a normal wildmat pattern,
-    which means that it's a SHELL pattern, the most useful
-    character is the asterisk (*) which matches any sequence of
-    characters. The moderator given on that line applies to all
-    groups that the pattern matches. Should multiple lines match a
-    group, the first match in the file "wins", the second and
-    subsequent patterns are not taken into account. So put the more
-    specific patterns first.</p>
-
-    <p>The <strong>moderator</strong> is a regular internet mail
-    address, with the exception that the first occurrence of "%s"
-    is replaced with the newsgroup name, with dots (.) converted to
-    dashes (-) for INN compatibility.</p>
-
-    <p>Example:</p>
-<pre>
-# This is a comment line
+news.group.name<TAB>status<TAB>description</code></pre>
+<p>(replace <TAB> with a TAB character!)</p>
+<p>The first column of each line is taken as the newsgroup name; the
+second as the status (y for "may be posted to", m for "moderated" -- see
+below for moderator configuration), the third column of the line is
+interpreted as description. For example, to set up a newsgroup
+"local.leafnode" which deals with Leafnode's internals, you would put a
+line</p>
+<blockquote>
+<p>local.leafnode<TAB>y<TAB>Local leafnode user group</p>
+</blockquote>
+<p>into /etc/leafnode/local.groups. (If your configuration does not
+reside in /etc/leafnode, replace this part of the pathname with the
+appropriate directory.)</p>
+<h4 id="moderated-newsgroups">5.1 MODERATED NEWSGROUPS</h4>
+<p>From version 2.0 on, Leafnode also handles <strong>moderated</strong>
+newsgroups. These are newsgroups which only certain people may post
+into, and articles which a regular (non-moderator) user posts, are
+mailed to the moderator.</p>
+<p>External moderated newsgroups are handled by the upstream
+servers.</p>
+<p>To configure the moderators for <strong>local</strong> moderated
+groups, an INN-compatible "moderators" file is used. It is named
+/etc/leafnode/moderators and has the following format:</p>
+<pre><code>pattern:moderator</code></pre>
+<p>Empty lines and lines that start with a hash character (#) are
+considered comment lines and are ignored.</p>
+<p>The <strong>pattern</strong> is a normal wildmat pattern, which means
+that it's a SHELL pattern, the most useful character is the asterisk (*)
+which matches any sequence of characters. The moderator given on that
+line applies to all groups that the pattern matches. Should multiple
+lines match a group, the first match in the file "wins", the second and
+subsequent patterns are not taken into account. So put the more specific
+patterns first.</p>
+<p>The <strong>moderator</strong> is a regular internet mail address,
+with the exception that the first occurrence of "%s" is replaced with
+the newsgroup name, with dots (.) converted to dashes (-) for INN
+compatibility.</p>
+<p>Example:</p>
+<pre><code># This is a comment line
 #
 # special moderator, hans at example.com is mailed all articles for
 # local.special
@@ -903,149 +798,110 @@ local.*:egon+%s at example.net
 # mail postings for local.video to egon+local-video at example.net
 #
 # Note: if you put local.special below local.*, local.special will be
-# ignored.
-</pre>
-    <hr>
-
-    <h3 class="c2">6. DEINSTALLATION</h3>
-
-    <p>If you want to uninstall leafnode (e.g. because you want to
-    replace it with another newsserver) and have a Makefile
-    available, you can achieve this by doing "make uninstall".</p>
-
-    <p>Do <b>not</b> uninstall an old version of leafnode before
-    updating.</p>
-    <hr>
-
-    <h3 class="c2">7. FREQUENTLY ASKED QUESTIONS</h3>
-
-    <p>See the file FAQ.</p>
-    <hr>
-
-    <h3 class="c2">8. COPYRIGHT</h3>
-
-    <p>Leafnode versions through 1.4 were written by Arnt
-    Gulbrandsen <agulbra at troll.no> and are copyright 1995
-    Troll Tech AS, Postboks 6133 Etterstad, 0602 Oslo, Norway, fax
-    +47 22646949.</p>
-
-    <p>Leafnode versions 1.5 up to 1.9.19 and 2.0b1 to 2.0b8 were
-    written by Cornelius Krasel
-    <krasel at wpxx02.toxi.uni-wuerzburg.de> and are copyright
-    1997-2001.</p>
-
-    <p>Leafnode versions 1.9.20 and up were written by Matthias
-    Andree <matthias.andree at gmx.de> and Ralf Wildenhues
-    <ralf.wildenhues at gmx.de> and are © copyright 2002 -
-    2003.</p>
-
-    <p>Leafnode versions 2.0b8_ma and 2.0.0.* were written by
-    Matthias Andree <matthias.andree at gmx.de>, Ralf Wildenhues
-    <ralf.wildenhues at gmx.de> and Jörg Dietrich
-    <joerg at dietrich.net> and are © copyright 2001 -
-    2003.</p>
-
-    <p>Major modifications were made by<br>
-     Randolf Skerka <Randolf.Skerka at gmx.de><br>
-     Kent Robotti <robotti at erols.com><br>
-     Markus Enzenberger <enz at cip.physik.uni-muenchen.de><br>
-     Matthias Andree <matthias.andree at gmx.de><br>
-     Jörg Dietrich <joerg at dietrich.net><br>
-     Stefan Wiens <s.wi at gmx.net><br>
-    </p>
-
-    <p>Permission is hereby granted, free of charge, to any person
-    obtaining a copy of this software and associated documentation
-    files (the "Software"), to deal in the Software without
-    restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or
-    sell copies of the Software, and to permit persons to whom the
-    Software is furnished to do so, subject to the following
-    conditions:</p>
-
-    <p>The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the
-    Software.</p>
-
-    <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-    KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-    WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-    OTHER DEALINGS IN THE SOFTWARE.</p>
-
-    <p>The getaline() and getline() routines are Copyright (c)
-    2000-2002 Matthias Andree <matthias.andree at gmx.de>. They
-    are licensed under the GNU Lesser General Public License (GNU
-    LGPL) 2.1. A copy of the LGPL is provided in the file
-    COPYING.</p>
-
-    <p>The wildmat() routine is Copyright (c) 1986-1991 Rich $alz
-    <rsalz at osf.org>. The original copyright notice, taken
-    from INN 2.2.2, follows:</p>
-
-    <blockquote>
-      Redistribution and use in any form are permitted provided
-      that the following restrictions are met: 
-
-      <ol>
-        <li>Source distributions must retain this entire copyright
-        notice and comment.</li>
-
-        <li>Binary distributions must include the acknowledgement
-        ``This product includes software developed by Rich Salz''
-        in the documentation or other materials provided with the
-        distribution. This must not be represented as an
-        endorsement or promotion without specific prior written
-        permission.</li>
-
-        <li>The origin of this software must not be misrepresented,
-        either by explicit claim or by omission. Credits must
-        appear in the source and documentation.</li>
-
-        <li>Altered versions must be plainly marked as such in the
-        source and documentation and must not be misrepresented as
-        being the original software.</li>
-      </ol>
-      THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS
-      OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
-      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-      PARTICULAR PURPOSE.
-    </blockquote>
-
-    <p>The replacement vsnprintf() function was written by Theo de
-    Raadt and is Copyright (c) 1997 under the following
-    restrictions:</p>
-
-    <blockquote>
-      Redistribution and use in source and binary forms, with or
-      without modification, are permitted provided that the
-      following conditions are met: 
-
-      <ol>
-        <li>Redistributions of source code must retain the above
-        copyright notice, this list of conditions and the following
-        disclaimer.</li>
-
-        <li>Redistributions in binary form must reproduce the above
-        copyright notice, this list of conditions and the following
-        disclaimer in the documentation and/or other materials
-        provided with the distribution.</li>
-      </ol>
-      THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
-      EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-      THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-      PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-      AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-      SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-      HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-      OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-      SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-    </blockquote>
-  </body>
+# ignored.</code></pre>
+<hr />
+<h3 id="deinstallation">6. DEINSTALLATION</h3>
+<p>If you want to uninstall leafnode (e.g. because you want to replace
+it with another newsserver) and have a Makefile available, you can
+achieve this by doing "make uninstall".</p>
+<p>Do <strong>not</strong> uninstall an old version of leafnode before
+updating.</p>
+<hr />
+<h3 id="frequently-asked-questions">7. FREQUENTLY ASKED QUESTIONS</h3>
+<p>See the file FAQ.</p>
+<hr />
+<h3 id="copyright">8. COPYRIGHT</h3>
+<p>Leafnode versions through 1.4 were written by Arnt Gulbrandsen
+<agulbra at troll.no> and are copyright 1995 Troll Tech AS, Postboks
+6133 Etterstad, 0602 Oslo, Norway, fax +47 22646949.</p>
+<p>Leafnode versions 1.5 up to 1.9.19 and 2.0b1 to 2.0b8 were written by
+Cornelius Krasel <krasel at wpxx02.toxi.uni-wuerzburg.de> and are
+copyright 1997-2001.</p>
+<p>Leafnode versions 1.9.20 and up were written by Matthias Andree
+<matthias.andree at gmx.de> and Ralf Wildenhues
+<ralf.wildenhues at gmx.de> and are © copyright 2002 - 2003.</p>
+<p>Leafnode versions 2.0b8_ma and 2.0.0.* were written by Matthias
+Andree <matthias.andree at gmx.de>, Ralf Wildenhues
+<ralf.wildenhues at gmx.de> and Jörg Dietrich
+<joerg at dietrich.net> and are © copyright 2001 - 2003.</p>
+<p>Major modifications were made by<br />
+Randolf Skerka <Randolf.Skerka at gmx.de><br />
+Kent Robotti <robotti at erols.com><br />
+Markus Enzenberger <enz at cip.physik.uni-muenchen.de><br />
+Matthias Andree <matthias.andree at gmx.de><br />
+Jörg Dietrich <joerg at dietrich.net><br />
+Stefan Wiens <s.wi at gmx.net><br />
+</p>
+<p>Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:</p>
+<p>The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.</p>
+<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
+<p>The getaline() and getline() routines are Copyright (c) 2000-2002
+Matthias Andree <matthias.andree at gmx.de>. They are licensed under
+the GNU Lesser General Public License (GNU LGPL) 2.1. A copy of the LGPL
+is provided in the file COPYING.</p>
+<p>The wildmat() routine is Copyright (c) 1986-1991 Rich $alz
+<rsalz at osf.org>. The original copyright notice, taken from INN
+2.2.2, follows:</p>
+<blockquote>
+<p>Redistribution and use in any form are permitted provided that the
+following restrictions are met:</p>
+<ol type="1">
+<li>Source distributions must retain this entire copyright notice and
+comment.</li>
+<li>Binary distributions must include the acknowledgement ``This product
+includes software developed by Rich Salz'' in the documentation or other
+materials provided with the distribution. This must not be represented
+as an endorsement or promotion without specific prior written
+permission.</li>
+<li>The origin of this software must not be misrepresented, either by
+explicit claim or by omission. Credits must appear in the source and
+documentation.</li>
+<li>Altered versions must be plainly marked as such in the source and
+documentation and must not be misrepresented as being the original
+software.</li>
+</ol>
+<p>THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+</blockquote>
+<p>The replacement vsnprintf() function was written by Theo de Raadt and
+is Copyright (c) 1997 under the following restrictions:</p>
+<blockquote>
+<p>Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:</p>
+<ol type="1">
+<li>Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the
+distribution.</li>
+</ol>
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.</p>
+</blockquote>
+</body>
 </html>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9d17a83
--- /dev/null
+++ b/README.md
@@ -0,0 +1,816 @@
+% Leafnode manual
+% Matthias Andree
+% 2021-07-09T17:28:07
+
+------------------------------------------------------------------------
+
+### 1. OVERVIEW
+
+Leafnode is a USENET software package designed for small sites, with a
+few tens of readers and only a slow link to the net. It is developed on
+Linux, but has been reported to compile and run also under any BSD
+flavour, Solaris and Irix.
+
+The Leafnode package consists of several programs, three essential ones
+and several add-ons.
+
+-   **Leafnode** is the NNTP server. It talks to the normal
+    news clients, and stores readership data.
+-   **Fetchnews** is the NNTP news-gatherer. It looks at the
+    readership data Leafnode stores, and selects what groups to pull
+    news from. It also transfers your contributions to one or more
+    upstream servers.
+-   **Texpire** is responsible for deleting old and
+    uninteresting news. It deletes all discussion threads that are old
+    and not recently read.
+
+These are the additional tools:
+
+-   **Applyfilter** lets you delete articles from your local
+    news spool which fit a certain pattern.
+-   **Checkgroups** inserts the titles of newsgroups into the
+    newsgroup database.
+-   **Newsq** shows which news are waiting to be transferred
+    to your upstream server(s).
+-   **Rnews** sorts an UUCP batch or articles downloaded by
+    other means into the news spool.
+
+Only groups that someone has been reading in the past week are fetched
+from the upstream NNTP server. When someone stops reading a group,
+fetchnews will stop reading that group a week later (this is the default
+which can be configured), and when someone starts reading a group,
+fetchnews will grab all the articles it can in that group the next time
+it runs.
+
+Leafnode\'s distinguishing features are:
+
+-   Leafnode is written with the novice user in mind. It is very easy to
+    install and configure and requires no manual intervention once
+    installed. Leafnode tries very hard to recover automatically from
+    error situations.
+-   Compared to other servers, leafnode uses very little disk space and
+    bandwidth. Of course this also depends on how many users are
+    accessing your server and is probably not true for 300-user sites.
+-   The newsspool can be easily manipulated by small scripts because it
+    is maintained in plain file format. Some tiny examples are in the
+    subdirectory tools/ .
+
+The current version of leafnode is available from
+<http://www.dt.e-technik.tu-dortmund.de/~ma/leafnode/beta/>
+
+There is also a leafnode mailing list. Send mail to
+
+leafnode-list-subscribe at dt.e-technik.tu-dortmund.de
+
+to subscribe, or visit
+[http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/.](http://www.dt.e-technik.tu-dortmund.de/mailman/listinfo/leafnode-list/)
+
+------------------------------------------------------------------------
+
+### 2. INSTALLATION
+
+1.  Leafnode does not currently work on SunOS 4.
+
+2.  Leafnode depends on the PCRE regular-expression matching library. It
+    ships as binary package with many current Linux/BSD distributions,
+    and is also available as port for \*BSD (Debian users: try \"apt-get
+    install libpcre3 libpcre3-dev\"). Just install the binary package
+    for your operating system if it ships with one. If it comes without
+    PCRE, don\'t worry, the installation from source is simple. To
+    install PCRE, do (AS NORMAL USER, NOT AS root!)
+    1.  Download the current PCRE version from <http://www.pcre.org/>.
+    2.  Unpack PCRE: gunzip -c \| tar xvf -
+    3.  cd pcre-3.9\
+        *(This is for PCRE-3.9, for other versions, replace that by the
+        path that tar wrote when unpacking.)*
+    4.  type `./configure && make`\
+        *there should be no errors*
+    5.  become root
+    6.  as root, do `make install`
+    7.  as root, do `ldconfig`\
+        *this may not be needed on all systems, but better safe than
+        sorry*
+    8.  exit your root shell
+    9.  DONE!
+
+3.  Leafnode uses GNU autoconf to determine the configuration of the
+    machine it will be compiled on. It also uses GNU automake for all
+    the standard features that GNU automake offers. Type (AS NORMAL
+    USER, NOT AS root!)
+
+                 /bin/sh ./configure
+
+    to create an appropriate Makefile and config.h. If leafnode cannot
+    find your PCRE, it is probably an old version without pcre-config,
+    or pcre-config is not in your path. Either add the directory
+    containing pcre-config to your \$PATH, or call configure like this
+    (we assume PCRE is in /opt/pcre-3.9):
+
+                 env CPPFLAGS="-I/opt/pcre-3.9" LDFLAGS="-L/opt/pcre-3.9" /bin/sh ./configure
+
+    NOTE: on some machines, when PCRE is linked against a shared
+    library, you will need to add /opt/pcre-3.9 to LD_LIBRARY_PATH or to
+    /etc/ld.so.conf.
+
+    The configure script can take some flags (replace DIR by a directory
+    name, FILE by a file name):
+
+        --enable-spooldir=DIR  To override the default /var/spool/news,
+                               where leafnode puts its news spool unless
+                               --localstatedir is given or --prefix is given and
+                               different from /usr, in the latter case, the
+                               default is $localstatedir/spool/news
+
+        --prefix=DIR           Leafnode installs itself normally in the /usr/local/sbin
+                               directory. If you want to use another directory, use this
+                               flag. For example, if you want to install leafnode in
+                               /usr/sbin, use --prefix=/usr
+
+        --sysconfdir=DIR       Default path for configuration is /etc/leafnode when
+                               --prefix is not used or set to /usr, and PREFIX/etc
+                               otherwise.  You can use this to change the config file
+                               location from its default.
+
+        --with-dmalloc         Lets leafnode include dmalloc header files and link
+                               against libdmalloc. Only useful for debugging, not
+                               needed for normal operation. This option requires
+                               dmalloc, available from http://dmalloc.com/.
+
+        --with-runas-user=USER Lets leafnode run as user USER, defaults to "news".
+
+        --with-pam             Enable PAM (pluggable authentication modules)
+                               support.
+
+    **BEWARE:** Former versions always defaulted their sysconfdir to
+    /etc/leafnode. Current versions only override sysconfdir to
+    /etc/leafnode if configured without \--prefix or with
+    \--prefix=/usr. That way, if \--prefix=/opt/leafnode, the sysconfdir
+    goes to /opt/leafnode/etc, which is more appropriate.
+
+4.  Type
+
+                  make
+
+    There should be no errors.
+
+5.  Become root.
+
+6.  As root, create user and group \"news\" (or the configured user and
+    group) if you don\'t have those already.
+
+7.  Type
+
+                  make install
+
+    If you prefer an installation with the binaries stripped free of
+    symbols, use
+
+                  make install-strip
+
+    instead.\
+    *For packagers: if you want to prefix all installation paths with a
+    common prefix, e. g. to support RPM\'s BuildRoot feature: You can
+    use `make install-strip DESTDIR=/var/tmp/leafnode-root`.*
+
+8.  Configure syslog so it captures news logging, most systems do NOT
+    log news stuff by default.
+    1.  Edit /etc/syslog.conf. Unless you already have news.info
+        logging, add a line like this:
+
+            news.info               /var/log/news
+
+        Note that if you want to send in a bug report and need debug
+        logging, you\'ll have to replace news.info by news.debug (and
+        send a SIGHUP, as shown below).
+
+        Your syslog.conf may already suggest a different file. If your
+        syslog.conf suggests news.info logging, use that, but be sure to
+        activate it in case it\'s commented out: remove leading hash
+        marks and white space.
+
+        Also make sure you use TABs between news.info and the path.
+
+    2.  Create the /var/log/news file, type: `touch /var/log/news`.
+
+    3.  Send syslogd a HUP signal. `kill -1 \`cat
+        /var/run/syslogd.pid\`` usually does the job, if it doesn\'t,
+    retry with \"syslogd\" replaced by \"syslog\".
+
+9.  If you are updating leafnode from a previous version, see the
+    section \"Updating\" below.
+
+10. Edit \$(LIBDIR)/config. \$(LIBDIR) defaults to /etc/leafnode, but
+    can be adjusted at build time. For documentation, see below or
+    config.example and leafnode(8). **Mandatory edits to the config file
+    are:**
+
+    -   server \-- this must point to your upstream news server.
+    -   expire \-- how many days will downloaded articles remain in the
+        spool.
+
+    Make sure the environment variable \$NNTPSERVER or /etc/nntpserver
+    points to your own host so clients will talk to leafnode rather than
+    try to go to the upstream server.
+
+    If you want to use filtering of the incoming spool, see the section
+    on the filter file below.
+
+11. the systemd/ directory of the tarball contains example service and
+    timer files that can be used on systemd-based systems **instead of**
+    the inetd/xinetd and cron\[tab\] settings shown below.
+
+12. Set up a cron job (as user \"root\" or \"news\") to run texpire
+    every night or maybe every week. Here is my crontab line, which runs
+    nightly:
+
+        0 4 * * * /usr/local/sbin/texpire
+
+    I did \"crontab -u news -e\" as root to edit the crontab file, and
+    added this line. Substituting \"1\" for the third \"\*\", thus:
+
+        0 4 * * 1 /usr/local/sbin/texpire
+
+    tells cron to run texpire at 4am every Monday morning.
+
+13. Make sure fetchnews is run at the appropriate time. If you have a
+    full-time link, run it out of cron (as \"news\" again); if not, run
+    it when your connection to the net is established. If it is run as
+    root it will change to user \"news\". If you use PPP, you can run
+    fetchnews from /etc/ppp/ip-up (or /etc/ppp/ip-up.local, depending on
+    your OS).
+
+14. We assume that you have tcpd installed, it ships with most
+    distributions. If you don\'t have it, fetch it from
+    ftp://ftp.porcupine.org/pub/security/, it\'s in tcp_wrappers, and
+    install it. It\'s preferable if you compile it with -DHOSTS_OPTIONS,
+    and the examples below assume you did.
+
+15. Choose either of these alternatives:
+    -   Alternative #1: If your system uses inetd (most commercial
+        unices, \*BSD). Edit /etc/inetd.conf so that \$(BINDIR)/leafnode
+        is executed for incoming NNTP connections. Here is my inetd.conf
+        line:
+
+            nntp    stream  tcp     nowait  news    /usr/sbin/tcpd /usr/local/sbin/leafnode
+
+        *Note: some systems install tcpd to a different path, but it\'s
+        uncommon. Change the first path accordingly if your tcpd resides
+        in /usr/etc or /usr/lbin.* After these changes, force inetd to
+        read the changed configuration file by sending it the HANGUP
+        signal. To achieve this, issue the following command (as root):
+
+            kill -HUP `cat /var/run/inetd.pid`
+
+    -   Alternative #2: If your system has xinetd instead. Add this to
+        your xinetd.conf (this example assumes xinetd 2.3.3 or newer):
+
+            service nntp
+            {
+                    flags           = NAMEINARGS NOLIBWRAP
+                    socket_type     = stream
+                    protocol        = tcp
+                    wait            = no
+                    user            = news
+                    server          = /usr/sbin/tcpd
+                    server_args     = /usr/local/sbin/leafnode
+                    instances       = 7
+                    per_source      = 3
+            }
+
+        Then send xinetd an USR2 signal to make it reread its
+        configuration. See the **xinetd.conf**(5) manual page for
+        details. *Note: some systems install tcpd to a different path,
+        but it\'s uncommon. Change the first path accordingly if your
+        tcpd resides in /usr/etc or /usr/lbin.*
+
+16. Write the following into /etc/hosts.deny:
+
+        leafnode: ALL
+
+    and into /etc/hosts.allow:
+
+        leafnode: 127.0.0.1
+
+    to protect your news server from abuse. If you want to make leafnode
+    accessible to additional IP numbers/domains, add them in
+    /etc/hosts.allow in the format described above. See hosts_access(5)
+    and hosts_options(5) (if applicable) for more information about tcp
+    wrappers.
+
+17. *(optional)* If you want to allow read-only access, you can set the
+    NOPOSTING environment variable, for example, put this into
+    /etc/hosts.allow:
+
+        leafnode: 192.168.0.4: setenv NOPOSTING "You may only read."
+
+    The contents of this variable are printed at the end of the banner,
+    with control characters (as per iscntrl(3)) replaced by an
+    underscore.
+
+18. *(optional)* If you want to allow clients read access to local or
+    global subscribed groups, but do not want to allow them to subscribe
+    to new groups, you can set the NOSUBSCRIBE environment variable.
+    When this variable is set, a client will never see a pseudo article.
+    For example, if clients from 127.0.0.1 and 192.168.0.42 may
+    subscribe new groups, and all other 192.168.0.\* hosts may read the
+    existing groups but not subscribe to new groups, put this into
+    /etc/hosts.allow (this assumes libwrap/tcpd have been compiled with
+    -DPROCESS_OPTIONS):
+
+        leafnode: 127.0.0.1 192.168.0.42: ALLOW
+        leafnode: 192.168.0.0/255.255.255.0: setenv NOSUBSCRIBE 1
+        leafnode: ALL: DENY
+
+19. Run fetchnews. The first run will take some time since fetchnews
+    reads a list of all newsgroups from your upstream server. In the
+    worst case, this can take up to 60 minutes, depending on how many
+    newsgroups your provider offers and how reliable your modem
+    connection is. To see fetchnews working, run it with -vvv.
+
+20. Run texpire. It will create directories missing after the first
+    install.
+
+21. Exit your root shell.
+
+22. Read news using an NNTP client (with \$NNTPSERVER or /etc/nntpserver
+    pointing to your own host). Select the groups you want to read in
+    the future. You will find them empty except a default article.
+    Reading this article is necessary with some newsreaders to select
+    the groups for further fetching.
+
+    After this, you should have empty files in
+    /var/spool/news/interesting.groups/ for every group you want to
+    read.
+
+23. Become root and run fetchnews again, then exit your root shell. This
+    run should pick up all the groups you want to read.
+
+------------------------------------------------------------------------
+
+### 3. UPDATE FROM PREVIOUS VERSIONS
+
+### 3.1 Update from versions \< 2.0b8_ma8
+
+The local.groups and groupinfo files and the hash function for
+message.id have changed from any former version to 2.0b8_ma8.
+
+**IMPORTANT:** To fix the \"remote\" groups, run `fetchnews -f`
+\-- it will take some time, because it refetches the whole active file,
+but that\'s needed anyhow to figure the group status (posting
+allowed/not allowed/moderated group).
+
+To fix **local.groups**, if you have perl installed:
+
+      perl -ple 's /\s+/\ty\t/' -i.bak /etc/leafnode/local.groups
+
+This will make a backup of your original /etc/leafnode/local.groups in
+/etc/leafnode/local.groups.bak.
+
+If you don\'t have Perl, use a text editor that preserves HTAB
+characters, change all while space to TAB and insert an additional field
+reading just y:
+
+> Before: local.test some test group\
+> After: local.testTAByTABsome test group
+
+\
+Use the real TAB character rather than TAB.\
+To fix the spool for message.ids, run `texpire -r`\
+The changes written in section 3.2 below also apply.
+
+### 3.2 Update from versions \< 2.0
+
+From 1.9.x to 2.0 there were some changes to options in the main
+configuration file. The options \"maxage\", \"maxlines\", \"minlines\",
+\"maxbytes\" and \"maxcrosspost\" have become obsolete in the main
+configuration file and have to be specified in the filter file instead.
+The advantage of this is that you can do much finer selection on these
+criteria now.
+
+To replace, for example, a \"maxage = 5\" specification in the main
+configuration file, you should add the following to your filter file:
+
+    newsgroups = .*
+    maxage = 5
+    action = kill
+
+The leafnode programs will issue warnings if they encounter obsolete
+specifications in the main config file.
+
+### 3.3 Update from versions \< 1.9.3
+
+From version 1.9.3 on, the groupinfo file is sorted in a
+case-insensitive manner. To update correctly, do a \"make update\" as
+root after you have successfully completed \"make install\". This will
+re-sort the groupinfo file. The old groupinfo file will be stored as
+groupinfo.old just in case something goes wrong. You also have to change
+your main config file manually as described in the previous section.
+
+### 3.4 Update from versions \< 1.6
+
+Between leafnode-1.6alpha and leafnode-1.6, the format of the groupinfo
+file changed and some files moved to other places. To update correctly,
+do a \"make update\" as root after you have successfully completed
+\"make install\". This will reformat the groupinfo file and move the
+other files into the correct places. The old groupinfo file will be
+stored as groupinfo.old just in case something goes wrong. You also have
+to change your main config file manually as described in the section
+\"Update from versions \< 2.0\".
+
+------------------------------------------------------------------------
+
+### 4. FILES AND DIRECTORIES
+
+Leafnode puts its files in three separate directories: The spool
+directory, the library directory, and the binaries directory. All
+directories can be changed at compile time.
+
+In the spool directory you find the stored news, the active file and
+some other short-lived configuration file. It defaults to
+/var/spool/news and can be changed at compilation time. There are some
+special directories here; see the leafnode(8) man page.
+
+The library directory contains long-lived configuration files. It
+defaults to /etc/leafnode.
+
+The binaries directory, /usr/local/sbin by default, contains the
+executable programs applyfilter, texpire, fetchnews and leafnode.
+
+The user directory, /usr/local/bin by default, contains the newsq
+program.
+
+### 4.1. The main configuration file
+
+The main configuration file contains settings important for all programs
+of the leafnode suite. It defaults to /etc/leafnode/config, but several
+configuration files can be used at once by employing the -F switch of
+the programs.
+
+The file contains two mandatory and a number of optional parameters.
+
+NOTE: Global options must come first, server-specific options below the
+server = lines.
+
+Mandatory parameters
+
+> server = news02.bigprovider.com
+
+You have to specify at least one server (except if you want leafnode to
+serve as a local server only). Usually, this will be the news server of
+your provider. You can specify more than one server, and fetchnews will
+retrieve news from all of them, taking care not to transfer articles
+multiple times to your machine. Servers will be queried in the order
+specified in the config file.
+
+> expire = 5
+
+This parameter determines how many days threads are kept on your hard
+disk. texpire will delete whole threads, not just single articles.
+
+Server-specific optional parameters
+
+To configure interaction with the server somewhat, you can change the
+behaviour of fetchnews by setting several server-specific optional
+parameters. They have to be specified directly after the corresponding
+\"server\" statement. A new server statement in the config file will
+also allow new optional parameters.
+
+> username = myname\
+> password = mypasswd
+
+If your upstream server requires a form of authentication, you can set
+your username and password here.
+
+> timeout = 30
+
+It may happen that, due to a bad connection or other reasons, the server
+stops talking to you while you fetch news. The \"timeout\" parameter
+determines the number of seconds fetchnews is supposed to wait for a
+response from the server before giving up.
+
+> nodesc = 1
+
+Some servers are unable to deliver descriptions of new newsgroups
+correctly. When fetchnews encounters such a server, it will print the
+warning
+
+> server.name does not process LIST NEWSGROUPS news.group.name
+> correctly: use nodesc
+
+To allow for shorter download times, you should in this case set
+\"nodesc = 1\" for that particular server in the configuration file.
+
+> port = 8000
+
+Normally, fetchnews will try to retrieve news from port 119 (the
+standard nntp port) of your upstream server. If the upstream server runs
+on a different port, you can specify it with this option.
+
+General optional parameters
+
+> authenticate = *METHOD*
+
+Require that NNTP clients connecting to your leafnode authenticate
+themselves. The only method currently supported is `internal`. In this
+mode, leafnode expects a file *users* in its sysconfdir,
+/etc/leafnode/users by default, which has a simple format, one line per
+user, with the user name (which cannot contain spaces), then a colon,
+then the crypt(3) encrypted password. To generate these lines, you can
+use the Perl program *tools/make_pass.pl*, for example, if you want to
+add a user \"enigma\" with a password of \"break!me\", type:
+
+> perl -wT tools/make_pass.pl \'enigma\' \'break!me\'
+
+and copy the resulting line to the *users* file.\
+htpasswd as shipped for Apache servers should also work if in crypt(3)
+mode.
+
+> hostname = host.domain.country
+
+If the postings that you write do not have message IDs (generated by the
+newsreader), leafnode will generate a message ID for you. (It will never
+overwrite an already existing message ID.) Message IDs generated by
+leafnode feature \".ln\" before the @ sign. The message ID contains the
+fully qualified hostname of your machine which may not always be what
+you want. In that case, you can override the use of the hostname by
+using the \"hostname\" option.
+
+> create_all_links = 1
+
+Usually fetchnews will store articles only in the newsgroups which you
+consider interesting. Unfortunately, this makes it difficult to score
+for the number of newsgroups a message is posted to because the
+Newsgroups: header is not featured in the overview information;
+therefore you can determine the number of newsgroups an article is
+crossposted to only from the Xref: header. If \"create_all_links\" is
+set to 1, fetchnews will store articles in all newsgroups which they are
+posted to, making all these newsgroups turn up in the Xref: header.
+
+> groupexpire = a.news.group 7
+
+As outlined above, texpire will expire threads after \"expire\" days. If
+you want to adjust expiry times for certain groups, you may use the
+\"groupexpire\" parameter to do just that. You can specify groups or use
+wildcards; for example
+
+> groupexpire = \*.announce 30
+
+will affect expiry times of all groups ending with \".announce\".
+
+> filterfile = /etc/leafnode/filters
+
+If you want to employ filtering on incoming messages, you have to
+specify the path where the filterfile can be found. The format of the
+filterfile is described in the next chapter.
+
+> timeout_short = 2\
+> timeout_long = 5
+
+These two parameters determine how quickly a group is unsubscribed by
+leafnode after you have stopped reading it. If you have looked into the
+group only once, subscription is stopped after \"timeout_short\" days;
+if you have read it more regularly, subscription is stopped after
+\"timeout_long\" days. (You can stop subscription immediately by
+removing the corresponding file in /var/spool/news/interesting.groups/).
+
+> timeout_active = 90
+
+By default, fetchnews will re-read active files from the upstream server
+every 90 days. This interval can be changed by setting
+\"timeout_active\" to a different value. Re-reading the active file
+frequently will keep it a little bit smaller but will increase the
+on-line time.
+
+> delaybody = 1
+
+This option switches fetchnews into a mode where only the headers of
+articles are fetched for visual inspection. Only the articles read in
+the newsreader will be retrieved the next time fetchnews is called. This
+can save a huge amount of disk space and download time but requires more
+manual intervention on the user side.
+
+> groupdelaybody = some.news.group
+
+If you want delaybody mode only for selected groups, you can enable this
+download mode for one specific group. The global delaybody switch above
+causes all groups to be treated that way. Use one line per group
+pattern.
+
+> debugmode = 260
+
+This option forces the leafnode programs into logging lots of
+information via the syslog daemon. It is only useful if you want to hunt
+down bugs. See config.example for an explanation of the number here.
+
+### 4.2. The filter file
+
+The filter file format is currently described in fetchnews(5). Type man
+5 filterfile or man -s 5 filterfile to see the description.
+
+------------------------------------------------------------------------
+
+### 5. LOCAL NEWSGROUPS
+
+From version 2.0 on, Leafnode is able to handle local newsgroups. Local
+newsgroups are groups that exist only on your local server but not on
+upstream servers.
+
+To create a local newsgroup, you have to think of a newsgroup name which
+should not exist on any of your upstream servers. It is therefore a good
+idea to start a new top-level hierarchy. You should also make up a
+description for your newsgroup.
+
+If you choose a newsgroup name which exists already on an upstream
+server, the newsgroup is not treated as a local one.
+
+Next, you write the name, status and description into the file
+/etc/leafnode/local.groups using your preferred text editor, which must
+not mangle TABs to SPACEs. The file should consist of lines in the
+format
+
+    # Comment lines are allowed, with a hash at the beginning of a line.
+    #
+    # However, no white space may precede the hash mark, and empty lines
+    # are not valid.
+    news.group.name<TAB>status<TAB>description
+
+(replace \<TAB\> with a TAB character!)
+
+The first column of each line is taken as the newsgroup name; the second
+as the status (y for \"may be posted to\", m for \"moderated\" \-- see
+below for moderator configuration), the third column of the line is
+interpreted as description. For example, to set up a newsgroup
+\"local.leafnode\" which deals with Leafnode\'s internals, you would put
+a line
+
+> local.leafnode\<TAB\>y\<TAB\>Local leafnode user group
+
+into /etc/leafnode/local.groups. (If your configuration does not reside
+in /etc/leafnode, replace this part of the pathname with the appropriate
+directory.)
+
+#### 5.1 MODERATED NEWSGROUPS
+
+From version 2.0 on, Leafnode also handles **moderated** newsgroups.
+These are newsgroups which only certain people may post into, and
+articles which a regular (non-moderator) user posts, are mailed to the
+moderator.
+
+External moderated newsgroups are handled by the upstream servers.
+
+To configure the moderators for **local** moderated groups, an
+INN-compatible \"moderators\" file is used. It is named
+/etc/leafnode/moderators and has the following format:
+
+    pattern:moderator
+
+Empty lines and lines that start with a hash character (#) are
+considered comment lines and are ignored.
+
+The **pattern** is a normal wildmat pattern, which means that it\'s a
+SHELL pattern, the most useful character is the asterisk (\*) which
+matches any sequence of characters. The moderator given on that line
+applies to all groups that the pattern matches. Should multiple lines
+match a group, the first match in the file \"wins\", the second and
+subsequent patterns are not taken into account. So put the more specific
+patterns first.
+
+The **moderator** is a regular internet mail address, with the exception
+that the first occurrence of \"%s\" is replaced with the newsgroup name,
+with dots (.) converted to dashes (-) for INN compatibility.
+
+Example:
+
+    # This is a comment line
+    #
+    # special moderator, hans at example.com is mailed all articles for
+    # local.special
+    local.special:hans at example.com
+    # moderator for all other local groups:
+    local.*:egon+%s at example.net
+    # that means:
+    # mail postings for local.test to egon+local-test at example.net
+    # mail postings for local.video to egon+local-video at example.net
+    #
+    # Note: if you put local.special below local.*, local.special will be
+    # ignored.
+
+------------------------------------------------------------------------
+
+### 6. DEINSTALLATION
+
+If you want to uninstall leafnode (e.g. because you want to replace it
+with another newsserver) and have a Makefile available, you can achieve
+this by doing \"make uninstall\".
+
+Do **not** uninstall an old version of leafnode before updating.
+
+------------------------------------------------------------------------
+
+### 7. FREQUENTLY ASKED QUESTIONS
+
+See the file FAQ.
+
+------------------------------------------------------------------------
+
+### 8. COPYRIGHT
+
+Leafnode versions through 1.4 were written by Arnt Gulbrandsen
+\<agulbra at troll.no\> and are copyright 1995 Troll Tech AS, Postboks 6133
+Etterstad, 0602 Oslo, Norway, fax +47 22646949.
+
+Leafnode versions 1.5 up to 1.9.19 and 2.0b1 to 2.0b8 were written by
+Cornelius Krasel \<krasel at wpxx02.toxi.uni-wuerzburg.de\> and are
+copyright 1997-2001.
+
+Leafnode versions 1.9.20 and up were written by Matthias Andree
+\<matthias.andree at gmx.de\> and Ralf Wildenhues
+\<ralf.wildenhues at gmx.de\> and are © copyright 2002 - 2003.
+
+Leafnode versions 2.0b8_ma and 2.0.0.\* were written by Matthias Andree
+\<matthias.andree at gmx.de\>, Ralf Wildenhues \<ralf.wildenhues at gmx.de\>
+and Jörg Dietrich \<joerg at dietrich.net\> and are © copyright 2001 -
+2003.
+
+Major modifications were made by\
+Randolf Skerka \<Randolf.Skerka at gmx.de\>\
+Kent Robotti \<robotti at erols.com\>\
+Markus Enzenberger \<enz at cip.physik.uni-muenchen.de\>\
+Matthias Andree \<matthias.andree at gmx.de\>\
+Jörg Dietrich \<joerg at dietrich.net\>\
+Stefan Wiens \<s.wi at gmx.net\>\
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+\"Software\"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The getaline() and getline() routines are Copyright (c) 2000-2002
+Matthias Andree \<matthias.andree at gmx.de\>. They are licensed under the
+GNU Lesser General Public License (GNU LGPL) 2.1. A copy of the LGPL is
+provided in the file COPYING.
+
+The wildmat() routine is Copyright (c) 1986-1991 Rich \$alz
+\<rsalz at osf.org\>. The original copyright notice, taken from INN 2.2.2,
+follows:
+
+> Redistribution and use in any form are permitted provided that the
+> following restrictions are met:
+>
+> 1.  Source distributions must retain this entire copyright notice and
+>     comment.
+> 2.  Binary distributions must include the acknowledgement \`\`This
+>     product includes software developed by Rich Salz\'\' in the
+>     documentation or other materials provided with the distribution.
+>     This must not be represented as an endorsement or promotion
+>     without specific prior written permission.
+> 3.  The origin of this software must not be misrepresented, either by
+>     explicit claim or by omission. Credits must appear in the source
+>     and documentation.
+> 4.  Altered versions must be plainly marked as such in the source and
+>     documentation and must not be misrepresented as being the original
+>     software.
+>
+> THIS SOFTWARE IS PROVIDED \`\`AS IS\'\' AND WITHOUT ANY EXPRESS OR
+> IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The replacement vsnprintf() function was written by Theo de Raadt and is
+Copyright (c) 1997 under the following restrictions:
+
+> Redistribution and use in source and binary forms, with or without
+> modification, are permitted provided that the following conditions are
+> met:
+>
+> 1.  Redistributions of source code must retain the above copyright
+>     notice, this list of conditions and the following disclaimer.
+> 2.  Redistributions in binary form must reproduce the above copyright
+>     notice, this list of conditions and the following disclaimer in
+>     the documentation and/or other materials provided with the
+>     distribution.
+>
+> THIS SOFTWARE IS PROVIDED BY THE AUTHOR \`\`AS IS\'\' AND ANY EXPRESS
+> OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+> INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+> STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+> IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+> POSSIBILITY OF SUCH DAMAGE.
diff --git a/configure.ac b/configure.ac
index c999e49..15cf70b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,7 +25,7 @@ AC_PROG_MAKE_SET
 AC_PROG_RANLIB
 
 AC_CHECK_TOOL(AR,ar,ar)
-AC_PATH_PROG(LYNX,lynx,no)
+AC_PATH_PROG(PANDOC,pandoc,no)
 AC_PATH_PROG(RPM,rpm)
 AC_PATH_PROG(GZIP,gzip,false)
 AC_PATH_PROG(BZIP2,bzip2,false)
-- 
2.49.0



More information about the leafnode-list mailing list