配置文件 incoming.conf
,用来控制来自外部的喂信(incoming feed);配置文件 newsfeeds
,用来控制本服务器向外部的喂信(outgoing feed)。
配置接收外部新闻服务器喂信非常简单,只需要修改配置文件incoming.conf
即可。注意其中的 peer ME 的设置,不正确的设置,导致不能收到文章。
streaming: true # streaming allowed by default max-connections: 8 # per feed peer ME { hostname: "localhost, 127.0.0.1" }
另外一个要注意的是,配置文件 newsfeeds
中的 ME 项。其中的 distributions 域用于判断允许接收哪些文章,错误设置也可导致无法收到文章。
ME:!*/!local,!collabra-internal::
下面的配置,将限制主机 example.com,不能向本地主机发送 local.* 的文章。
peer remote.example.com { patterns: "*, @local.*" hostname: "remote.example.com, news.example.com" }
只设置了本地服务器的 incoming.conf,还不行,还需要通知上游站点,主动向本服务器喂信。
如果无法通知上游向本地喂信,想要从其它服务器获取新闻消息,可以使用 suck 从上游取信。suck 可以认为是一个 news 客户端,负责从新闻组服务器获取新闻,并可以以各种格式存储,交给 innfeed,innxmit 等inn软件包的程序进一步处理(如投递到本地)。
suck 的下载网址:http://www.sucknews.org/。
中国的网络新闻组发展相对落后,不但和美国没法比,就是和台湾也比不了,比较一下 cn.comp.* 上的新闻数量和 comp.*, tw.* 的发贴数量就看出来了。还有一个问题是,国内的用户量比较大的新闻组,如:新帆、万千等都维护自己独立的新闻组,新闻组名称互不相同,而且不同的服务器之间更没有新闻互转。
我用 suck 实现了将互不相通的新闻组的服务器的新闻收集,归类在本地统一配置的新闻组服务器中,但是没有实现将新闻向外同步,因为本地的一个组可能是外部好多的新闻组汇集而来。
配置步骤
安装 suck
创建 suck 工作目录
因为 suck 要到不同的新闻服务器取信(新闻服务器互不相通),要为每个服务器建立不同的目录。
suck 工作根目录: /usr/local/news/suck,新帆新闻组的工作目录 /usr/local/news/suck/news.newsfan.net,希网网络新闻组的工作目录 /usr/local/news/suck/news.yaako.com,万千新闻组的工作目录 /usr/local/news/suck/news.webking.com.cn,...
$ mkdir -p /usr/local/news/suck/news.newsfan.net/Msgs $ mkdir -p /usr/local/news/suck/news.yaako.com/Msgs $ mkdir -p /usr/local/news/suck/news.webking.com.cn/Msgs
创建运行脚本
/usr/local/news/suck/suck.sh
#!/bin/sh basedir=/usr/local/news/suck/ run=$basedir/get.news.inn for i in `ls $basedir`; do if [ -d $basedir/$i ]; then sh $run $i fi done
脚本:/usr/local/news/suck/get.news.inn
#!/bin/sh #BEFORE USING - check to ensure all the paths defined below are correct!! #NOTE: this script probably needs to be run by root. Most systems will # not let a normal user run ctlinnd REMOTE_HOST=$1 LOCAL_HOST=localhost SPOOLDIR=/usr/local/news/spool # base directory for articles to be rposted NEWSDIR=/usr/local/news # base directory for news binaries BASEDIR=/usr/local/news/suck/$1/ # base directory for scripts and data files CTLINND=${NEWSDIR}/bin/ctlinnd # location of binary SHLOCK=${NEWSDIR}/bin/shlock # location of binary TMPDIR=${BASEDIR} # location for suck.* files MSGDIR=${BASEDIR}/Msgs # where to put MultiFile messages when getting them SITE=$1 # name of site from newsfeeds file OUTGOING=${SPOOLDIR}/outgoing/${SITE} # location of the list of articles to upload OUTGOINGNEW=${OUTGOING}.new # file to contain the list temporarily OUTGOINGFAIL=${OUTGOINGNEW}.fail # file with failed xfers SCRIPT=${BASEDIR}/news.filter # my filter for rpost OUTFILE=/tmp/tmp$$ # used by rpost as article after it is filtered LOCKFILE=${BASEDIR}/getnews.lock # lock file to prevent multiple instances of script NEWSGROUP=news # which group owns the file in out.going, typically either news or uucp. BATCHFILE=${BASEDIR}/suckbatch.xmit TRANSTAB=${BASEDIR}/transtab TESTHOST=/usr/local/bin/testhost RPOST=/usr/local/bin/rpost SUCK=/usr/local/bin/suck INNXMIT=/usr/local/bin/innxmit # if we are already running, abort trap 'rm -f ${LOCKFILE} ; echo "Aborting" ; exit 1' EXIT 1 2 3 15 ${SHLOCK} -p $$ -f ${LOCKFILE} if [ $? -ne 0 ]; then echo "Already running, can't run two at one time" exit fi # is the local host up and running so we can post messages we download? ${TESTHOST} ${LOCAL_HOST} -s LOCAL_RESULT=$? # is the remote host up and running so we can download messages? ${TESTHOST} ${REMOTE_HOST} -s REMOTE_RESULT=$? if [ ${REMOTE_RESULT} -ne 0 ]; then echo "remote server cannot be connected!" exit 1 fi if [ ${LOCAL_RESULT} -ne 0 ]; then echo "local server cannot be connected!" exit 1 fi if [ -f "${BASEDIR}/shutdown" ]; then echo "not update, due to shutdown file exist" exit 0 fi # now upload messages while [ -s $BATCHFILE ] ; do echo "warning: batchfile - $BATCHFILE already exist!" ${INNXMIT} ${LOCAL_HOST} ${BATCHFILE} sleep 10 done # download messages ${SUCK} ${REMOTE_HOST} -c -bi ${BATCHFILE} -dt ${TMPDIR} -dm ${MSGDIR} -dd ${BASEDIR} -HF /usr/local/news/db/history SUCK_STATUS=$? if [ ${SUCK_STATUS} -eq 0 ]; then echo "Downloaded Articles" elif [ ${SUCK_STATUS} -eq 1 ]; then echo "No articles to download" elif [ ${SUCK_STATUS} -eq 2 ]; then echo "Unexpected answer from remote server to an issued command" elif [ ${SUCK_STATUS} -eq 4 ]; then echo "Can't do NNTP authorization" elif [ ${SUCK_STATUS} -eq -1 ]; then echo "General failure" fi # filter messages if [ -f ${TRANSTAB} ]; then for x in `ls ${MSGDIR}`; do x="${MSGDIR}/${x}" header="`grep -m 1 "^Newsgroups:" $x | sed -e 's/^Newsgroups:[ ]*//' -e 's/,/ /g' `" newheader="" if [ -z "$header" ]; then rm -f $x continue fi for y in $header; do value=`grep -m 1 "$y:" $TRANSTAB | awk -F : '{ print $2; }'` if [ "x$value" != "x" ]; then newheader="${newheader},${value}" fi done newheader=${newheader#,} if [ "x$newheader" != "x" ]; then tmpfile=`mktemp /tmp/suck.XXXXXX` sed -e "s/^Newsgroups:.*$/Newsgroups: $newheader/" $x > $tmpfile mv -f $tmpfile $x else rm -f $x fi done fi # now upload messages ${INNXMIT} ${LOCAL_HOST} ${BATCHFILE} if [ ! -f $BATCHFILE ] ; then cd $MSGDIR echo "clear cache" rm -f * fi
在每个新闻组服务器的工作目录下,创建配置文件 sucknewsrc
sucknewsrc 示例: 示例:/usr/local/news/suck/news.newsfan.net/sucknewsrc
计算机.软件.编程 -100 计算机.软件.编程.API -50 计算机.软件.编程.C语言 1 计算机.软件.编程.C语言.BCB 2584 计算机.软件.编程.C语言.C++ 10494 计算机.软件.编程.Perl 1550 计算机.软件.编程.Vc 24864 计算机.软件.病毒 10292 计算机.软件.操作系统 5110 计算机.软件.操作系统.FreeBSD 709 计算机.软件.操作系统.Linux 25333 计算机.软件.操作系统.Linux.常见问题 554 计算机.软件.操作系统.MACOS 473 计算机.软件.操作系统.Unix 1790 计算机.软件.软件工程 1712 计算机.网络.网络安全 11222 计算机.网络.协议.TCPIP 3783 精华信区.计算机 61 精华信区.计算机.软件 43 精华信区.计算机.软件.办公软件 2 精华信区.计算机.软件.编程 27 精华信区.计算机.软件.编程.ASP 38 精华信区.计算机.软件.编程.C语言 14 精华信区.计算机.软件.操作系统 50 精华信区.计算机.软件.数据库 2 精华信区.计算机.软件.图形图像 3 精华信区.计算机.软件.主页制作 8 精华信区.计算机.网络 64 精华信区.计算机.网络.网络安全 61 精华信区.计算机.网络.硬件 8 精华信区.计算机.硬件 150 精华信区.计算机.硬件.故障维修 13 精华信区.精华推荐 292 精华信区.休闲娱乐.讽刺与幽默 116
该文件一次创建,以后 suck 自动维护该文件
在每个新闻组服务器的工作目录下,创建配置文件 transtab
transtab 示例:/usr/local/news/suck/news.newsfan.net/transtab
计算机.软件.编程:cn.comp.lang 计算机.软件.编程.API:cn.comp.lang 计算机.软件.编程.C语言:cn.comp.lang.c 计算机.软件.编程.C语言.BCB:cn.comp.lang.c 计算机.软件.编程.C语言.C++:cn.comp.lang.c 计算机.软件.编程.Perl:cn.comp.lang.perl 计算机.软件.编程.Vc:cn.comp.lang.vc 计算机.软件.病毒:cn.comp.security.virus 计算机.软件.操作系统:cn.comp.os 计算机.软件.操作系统.FreeBSD:cn.comp.os.freebsd 计算机.软件.操作系统.Linux:cn.comp.os.linux 计算机.软件.操作系统.Linux.常见问题:cn.comp.os.linux 计算机.软件.操作系统.MACOS:cn.comp.os.macos 计算机.软件.操作系统.Unix:cn.comp.os.unix 计算机.软件.软件工程:cn.comp.softeng 计算机.网络.网络安全:cn.comp.security 计算机.网络.协议.TCPIP:cn.comp.network 精华信区.休闲娱乐.讽刺与幽默:休闲娱乐.讽刺与幽默
用冒号分隔的新闻组名称对应表,前面是该新闻组实际名称,后面是欲替换的名称。
在 crontab 中加入如下内容,每小时自动同步一次:
40 * * * * /bin/sh /usr/local/news/suck/suck.sh
由配置文件newsfeeds
控制。newsfeeds档案的设定, 算是INN News Server最重要的工作, 也是困难度最高的部份。 innd 靠 newsfeeds 来决定要丢哪些 newsgroups 的 articles 给哪些 site 负责的程序 (nntplink) 或产生批处理, 让其它的程序来转送。
INN newsfeeds档案至少必须定义自己(ME)以及一个喂送下游 Server。
该文件由一系列 feed 项构成。每一个配置项由四个部分构成,用冒号分开。
sitename[/exclude,exclude,...]\ :pattern,pattern...[/distrib,distrib...]\ :flag,flag...\ :param
ME:!*/!local,!collabra-internal::
配置项 ME,是必不可少的一个配置项,有着特殊作用。其 newsgroup pattern 部分(本例为“!*”),将加到所有其它的配置项的 newsgroup pattern 的前面,定义了确省的向外喂信的新闻组列表。亦即定义所有 site, 共同的 pre-subscription list。
而其 distribution pattern 则通过匹配文章头部的 Distribution 域,确定允许接收哪些文章。不过distribution 作为一个限制流传的功能, 很少有人用,已几乎名存实亡。
remote.example.com/news.example.com\ :<newsgroups>\ :Tf,Wnm:
这条配置项,将对匹配的文章的 Message-ID, storage token 写入文件 ~news/spool/outgoing/remote.example.com。crontab 中的配置将会定期根据文件外发数据。
innfeed!\ :!*\ :Tc,Wnm*:/usr/local/news/bin/startinnfeed -y remote.example.com/news.example.com\ :<newsgroups>\ :Tm:innfeed!
funnel feed 示例,注意 innfeed 后面的感叹号。
上例采用 innfeed 向外部服务器 remote.example.com 喂信。正确运行 innfeed 还需要配置文件 innfeed.conf。
Copyright © 2006 WorldHello 开放文档之源 计划 |