\chapter{Configuración de Leafnode/INN.}


%***********************************************
%                   Leafnode                   *
%   Carlos Pérez Pérez   carlos@abierta.org    *
%***********************************************

\section{Leafnode.}

%***********************************************
%           Leafnode: Introducción             *
%***********************************************

\subsection{Introducción.}
El servidor Leafnode se utiliza para redes pequeñas
que necesiten un servidor de noticias offline, esto
es, leer las noticias desconectados de la red, o cuando
se tiene una conexión lenta.

Leafnode se utiliza para replicar
grupos de noticias que obtiene desde otro servidor
ya que, por el momento, no es capaz de generar grupos
locales, aunque parace que la próxima versión soportará
esta eventualidad.\\
Su mayor ventaja está en su pequeño tamaño y su fácil
instalación. Por contra, sólo se puede utilizar para
pocos usuarios puesto que no es escalable. Si se
necesita dar servicio de noticias a una gran cantidad
de usuarios hay mejores alternativas, como INN.

%*************************************************
%        Leafnode: Obtención e instalación       *
%*************************************************

\subsection{Obtención e Instalación.}
Se puede obtener Leafnode desde la página
oficial del programa \sitio{http://www.leafnode.org}.
Si se quieren bajar paquetes en formato rpm se
puede acudir a \sitio{http://rpmfind.net} para el
formato Debian se deberá acudir a \sitio{http://www.debian.org}.
Aunque normalmente el paquete de Leafnode viene con
la mayoría de las distribuciones.\\

\figura{Página de Leafnode}{leafnode.org}

Su instalación es sencilla:\\
\begin{itemize}
\item Paquetes RPM: desde la línea de comandos ejecutaremos
la orden \comando{rpm -i leafnode-1.9.17-1.rpm}, teniendo
en cuenta que la versión puede ser distinta, en este caso, 1.9.17-1.
\item Paquetes Deb: desde la línea de comandos ejecutamos
\comando{apt-get install leafnode} y con esto nos aseguramos
que se instalan todas las dependencias necesarias.
\item Código fuente: procederemos a desempaquetar el archivo
con las fuentes con la orden \comando{tar xvzf archivo} y
buscaremos el fichero README para ver la información de
compilación.
\end{itemize}
Una vez realizada la instalación, habrá que verificar la existencia del usuario news.
Dentro del fichero /etc/inetd.conf debe existir:\\
\comando{nntp stream tcp nowait news /usr/sbin/tcpd /usr/local/sbin/leafnode}

Estas comprobaciones no son necesarias porque el sistema de instalación las
trae automatizadas, pero servirán para descartar problemas si el servicio
no funciona correctamente.


Si estamos utilizando xinet en lugar de inet, deberemos crear un fichero llamado
\comando{leafnode} dentreo del directorio \comando{/etc/xinetd.d}, con el siguiente
contenido:

\begin{verbatim}
service nntp
{
	disable	= no
	socket_type		= stream
	wait			= no
	user			= root
	server			= /usr/sbin/leafnode
	log_on_success		+= USERID
	log_on_failure		+= USERID
}
\end{verbatim}


El siguiente paso lógico es editar el fichero de configuración con el
objeto de adpatar el servicio a nustras necesidades e indicarle a
Leafnode una información vital para su correcto funcionamiento.

El último paso sería automatizar los comandos para bajar los grupos
y las noticias. Para esto se puede poner el \comando{fetchnews} dentro
del script ip-up para bajarlos cuando hagamos la conexión a Internet
o bien añadiendo una línea dentro del cron. Aunque siempre nos queda
el método manual, esto es, ejecutarlo desde la línea de comandos.

Reiniciamos el demonio inetd o xinetd:\\
\comando{kill -HUP `cat /var/run/inetd.pid`} \\
\comando{kill -HUP `cat /var/run/xinetd.pid`} \\
o bien:\\
\comando{/etc/init.d/xinetd reload}

En el fichero /etc/hosts.deny pondremos:\\
\comando{leafnode: ALL EXCEPT LOCAL}\\
Ejecutamos \comando{fetchnews} después de haber hecho los
cambios en el fichero de configuración, con lo que se
bajarán la lista de grupos disponibles. Luego nos conectaremos
desde nuestro cliente favorito, teniendo en cuenta que el
servidor será local y no se necesitará usuario ni contraseña.
Ejecutamos \comando{fetchnews} por segunda vez y comenzarán
a bajar las noticias de los grupos suscritos hasta un máximo
que ha sido definido en el ficher de configuración.

%*************************************************
%     Leafnode: Configuración y utilización      *
%*************************************************

\subsection{Configuración.}
La configuración de Leafnode es relativamente sencilla,
se concentra en un sólo archivo.
Para RedHat lo encontraremos en \comando{/etc/leafnode/config},
que es donde se instala por defecto. Para Debian en
\comando{/etc/news/leafnode/config}.\\
Este archivo tiene varias opciones que vamos a explicar
a continuación:

\begin{itemize}
\item server: el servidor al que se conectará Leafnode.
\item supplement: un servidor de apoyo para bajar aquellas
noticias que no encontremos en el principal o cuando este
no esté disponible.
\item expire: el tiempo máximo que permanecerán las noticias
en el servidor Leafnode.
\item username: nombre de usuario para acceder al servidor.
\item password: la clave para permitir el acceso.
\item port: puerto al que se conectará Leafnode para bajar
las noticias si es diferente del 119.
\item timeout: máximo tiempo de espera si no se conecta.
\item nodesc: aquí decidimos si queremos bajar los grupos con
descripciones, valor 1, o sin descripciones, por defecto, valor
0.
\item filterfile: fichero en el que se encuentran los filtros.
\item groupexpire: tiempo de caducidad de las noticias dentro de
un grupo determinado.
\item maxfetch: número máximo de noticias que se bajarán desde el
servidor en una sesión.
\item initialfetch: el número de noticias que se obtienen la primera vez
que Leafnode baja un grupo de noticias. Útil cuando se trata de grupos
que tengan mucho tráfico, de esta manera se bajarán los más actuales.
\item delayboy: para bajar sólo los encabezados en un primer momento y,
posteriormente, los cuerpos de aquellas noticias que hayamos seleccionado con el
lector de noticias. Hay que tener cuidado porque da problemas con
el lector de noticias del Netscape.
\item maxcrosspost: número máximo al que se ha enviado una noticia, si
excede el número, la noticia no será almacenada.
\item maxage: con esta opción indicamos la antigüedad máxima de las noticias
a bajar.
\item maxlines: número máximo de líneas que puede contener la noticia.
\item maxbytes: tamaño máximo de las noticias, para evitar la descarga de
binarios.
\item timeout\_short: indica el número de días que Leafnode mantendrá
un grupo de noticias antes de darlo de baja cuando no tiene a nadie
suscrito al mismo.
\item timeout\_long: es el número de días que Leafnode seguirá bajando
noticias a un grupo que nadie está leyendo, luego lo dará de baja.
\item timeout\_active: con esta opción indicamos a Leafnode un intervalo en
días para que actualize la lista de grupos desde los servidores.
\item create\_all\_links: para aquellos que usen lectores de noticias que
permitan puntuar/matar, valor 1 para activar, 0 para desactivar.
\item hostname: nombre del servidor de noticias que saldrá en la noticia
en el caso de que Leafnode no lo resuelva de forma satisfactoria.
\end{itemize}

% Introduccir ejemplo de configuración. A ser posible con los comentarios
% pasados al español.

Este es el fichero de configuración que viene con leafnode, he optado por
dejar los comentarios en inglés y poner, opcionalmente, algunos comentarios
en español al final de cada sección.

\begin{verbatim}
## This is the NNTP server leafnode fetches its news from.
## You need read and post access to it. Mandatory.

server = news.servidor_principal.com

#Puede que necesite poner usuario y clave para lo que usaremos:
#username = usuario
#password = clave
#******************************************************************

## Unread discussion threads will be deleted after this many days if
## you don't define special expire times. Mandatory.

expire = 5

#Este es el tiempo de caducidad por defecto de todos los grupos.
#******************************************************************

# Todo lo que viene después son parámetros opcionales.
##
## All the following parameters are optional
##

## I have free access to my news server. If you don't have, comment out
## the following two lines and change them accordingly.
## username = name
## password = pass

## Standard news servers run on port 119. If your newsserver doesn't, comment
## out the following line and change it accordingly.
# port = 8000
#El puerto en el que escucha leafnode es el 119, con port se puede cambiar.
#***************************************************************************

## This is another news server which stores some groups that are not
## available on the first one. You can define username, password and port
## for each server separately.

server = news.un_servidor.com
username = usuario
password = clave
server = news.otro_servidor.com.es
username = usuario
password = clave

#Esta parte es si se necesita tener servidores adicionales por si el principal
#falla o para complementar las noticias.
#*****************************************************************************

## This is a news server which does not understand the 
## "LIST NEWSGROUP news.group" command. For this reason, we don't try to
## download newsgroups descriptions when getting new newsgroups. This is
## achieved by putting "nodesc = 1" somewhere behind the server
## line.
# server = broken.upstream.server
# nodesc = 1

## Here we have another news server which has a very slow connection. For
## that reason, we wait a full minute before we give up trying to connect.
## The default is 10 seconds.
# server = really.slow.snail
# timeout = 60

## Non-standard expire times (glob(7) wildcard constructs possible)
# groupexpire comp.os.linux.* = 5 # groups too big to hold articles 20 days
# groupexpire any.local.newsgroup = 100 # very interesting, hold articles longer
#groupexpire es.comp.os.linux.* = 20

## Never fetch more than this many articles from one group in one run.
## Be careful with this; setting it much below 1000 is probably a bad
## idea.
maxfetch = 100

## Fetch only a few articles when we subscribe a new newsgroup. The
## default is to fetch all articles.
initialfetch = 30

## If you want to use leafnode like an offline newsreader (e.g. Forte
## Agent) you can download headers and bodies separately if you set
## delaybody to 1. In this case, fetch will only download the headers
## and only when you select an article, it will download the body.
## This can save a huge amount of bandwith if only few articles are really
## read from groups with lots of postings.
## This feature works not very well with Netscape, though (which is not
## a fault of Leafnode).
delaybody = 0

## To avoid spam, you can select the maximum number of crosspostings
## that are allowed in incoming postings. Setting this below 5 is
## probably a bad idea. The default is unlimited crossposting.
maxcrosspost = 2

## If you suffer from repeatedly receiving old postings (this happens
## sometimes when an upstream server goes into hiccup mode) you can
## refuse to receive them with the parameter "maxage" which tells the
## maximum allowed age of an article in days. The default maxage is 10
## days.
maxage = 10

## maxlines will make fetch reject postings that are longer than a certain
## amount of lines.
# maxlines = 100

## minlines will make fetch reject postings that are shorter than a certain
## amount of lines.
# minlines = 2

## maxbytes will make fetch reject postings that are larger
maxbytes = 1048576
#maxbytes = 5120

## timeout_short determines how many days fetch gets a newsgroup which
## has been accidentally opened. The default is two days.
# timeout_short = 1

## timeout_long determines how many days fetch will wait before not getting
## an unread newsgroup any more. The default is seven days.
# timeout_long = 6

## timeout_active determines how many days fetch will wait before re-reading
## the whole active file. The default is 90 days.
# timeout_active = 365

## If you want to have your newsreader score/kill on Xref: lines, you might
## want to uncomment this.
# create_all_links = 1

## If you want to filter out certain regular expressions in the header,
## create a "filterfile" (how this is done is explained in the README)
## and set
filterfile = /etc/leafnode/filters

## If your newsreader does not supply a Message-ID for your postings
## Leafnode will supply one, using the hostname of the machine it is
## running on.  If this hostname is not suitable, this parameter can be 
## used to override it.  Do not use a fantasy name, it may interfere with
## the propagation of your messages.  Most modern newsreaders do provide
## a Message-ID.
# hostname = host.domain.country
\end{verbatim}


Leafnode consta de una serie de programas que
tienen como objetivo el control del servidor:

\begin{itemize}
\item fetchnews: con este comando se prepara a Leafnode
para albergar los grupos de noticias y para bajar las noticias
cada vez que queramos. Presenta una serie de modificadores que
nos ayudan a controlar su funcionamiento. Los modificadores más destacados
son v, f, x, l, n y P. Con el modificador \comando{v} hacemos que pase
a modo de depuración, de esta manera irá mostrando en pantalla los
mensajes que va generando, con lo que podemos ver el estado actual
o los mensajes de error si los hubiera. La profundidad de depuración
viene marcada por la cantidad de \comando{v} que se pongan. El modificador
\comando{f} se utiliza para volver a leer las listas de grupos desde
los servidores, puede tardar tiempo y se utiliza cuando Leanode
comienza a dar problemas al servir las noticias. El modificador
\comando{x \#} nos permite bajar \comando{\#} noticias extras desde
el exterior. El modificador \comando{l} se usa para que Leafnode
no utilice los servidores suplementarios. Con el modificador
\comando{n} se puede comunicar a Leafnode que no elimine los
grupos que no se leen, esto es, cuando nos inscribimos en un
grupo que nos interesa pero que no leemos desde hace tiempo. El
modificador \comando{P} se utiliza para mandar las noticias que
hayamos recibido localmente a los servidores externos pero no
bajar ninguna noticia nueva.

\item texpire: este es el programa que retira del servidor todas
aquellas noticias que superen el tiempo dado en la directiva expire o
groupexpire. Sus modificadores son dos, v y f. El modificador
\comando{v} es el mismo que en el comando anterior. El modificador
\comando{f} se utiliza para forzar la caducidad de las noticias
independientemente del tiempo de acceso.

\item applyfilter: con este programa se busca dentro de las noticias
almacenadas en el directorio \comando{news} todas aquellas que coincidan
con los patrones dados dentro del fichero filters para ser retiradas.
Su sintaxis es \comando{applyfilter grupo de noticias}, ha de notarse
que se debe dar el nombre completo del grupo, por ejemplo, para el grupo
misc de la jerarquía ecol ha de ponerse \comando{applyfilter es.comp.os.linux.misc}.

\item checkgroups: se utiliza para actualizar las descripciones de los
grupos.
\item newsq: con este vemos las noticias que hay en la cola listas para
ser enviadas al servidor en la próxima conexión.
\end{itemize}



\figura{Viendo las noticias en knode}{knode}

%*************************************************
%        Leafnode: Los filtros                   *
%*************************************************

\subsection{Los filtros.}
Aquí es dónde apunta la directiva \comando{filterfile} del archivo
de configuración. En este archivo se colocan todas aquellas
reglas destinadas al filtrado de mensajes que no queramos
recibir. Dentro de Usenet hay una práctica que se va
extendiendo y que es perjudicial, el denominado Spam,
con el filtrado de las direcciones desde las que se
remiten los mensajes no solicitados se consigue que los
mensajes que leamos se ajusten a la materia del grupo
de noticias al que estemos apuntados. Otra manera de
controlar estos mensajes es con la directiva \comando{maxcrosspost}
del archivo de configuración que evita leer mensajes que vayan a
más de una determinada cantidad de grupos a la vez, el denominado
crosspoting, y que es muy utilizado por los spammers.\\

Las expresiones para el fichero de filtros siguen la misma estructura
que las expresiones regulares de Perl.\\
Con la siguiente línea filtramos cualquier noticia que tenga como
remitente de correo \comando{todosexo@sex.com}:

\begin{verbatim}
^(i?:from):.*[< ]todosexo@sexo.com(>|$| )
\end{verbatim}

Ejemplo de filtro para el apartado Asunto (Subject en inglés):
\begin{verbatim}
^Subject.*\[Cursos-linux\]*.
\end{verbatim}
Con esta regla filtramos todas las noticias que tengan en
el asunto [Cursos-linux].

De esta forma podremos evitar bajar noticias que contengan unas
determinadas palabras o unos remitentes molestos.
En \sitio{http://www.escomposlinux.org/spam/} se pueden encontrar
consejos para filtrar el spam y filtros constantemente actualizados
que filtran los spammers dentro de la jerarquía es.comp.os.linux.*.


%*************************************************
%        Leafnode: Documentación                 *
%*************************************************

%\subsection{Documentación.}

%*************************************************
%              Leafnode: FIN                     *
%*************************************************

%*************************************************
%                   INN                          *
%*************************************************
\section{INN}

%*************************************************
%        Inn+Suck: Obtención e instalación       *
%*************************************************
%\subsection{Obtención e instalación}

