发信人: atppp (ATP (Big Mouse)), 信区: BBSSystem

标  题: smthbbs 代码系统技术方面的一些笔记

发信站: 牧场物语 (Sun Mar 14 19:59:33 2004), 转信

主要是一些常见问题的解答,我这东西最开始写给我一个朋友用于建BBS的,也不成

什么系统,而且我们已经解决了的常见问题我可能也没写进来。有问题大家多在smth的

BBSMan_Dev版或者cn.bbs.admin.installbbs新闻组上讨论。另外想知道这篇垃圾的

出处和更新,欢迎到bbs.stanford.edu BBSSystem版的文摘区。

1. WWW方面的一些问题

1.1 上传文件的配置

    默认的配置下,上传文件需要有~bbs/boards/_attach/目录。

    修改上传文件的大小限制:$WWWROOT$/site.php。还有apache/php的POST限制,

我默认安装的redhat9,相应的就需要修改/etc/php.ini(upload_max_filesize)和

/etc/httpd/conf.d/php.conf(LimitRequestBody)

1.2 救命啊,文件传上去以后和原文件不一样,文件大小也不对

    检查httpd.conf和php.conf里面是不是都设置了php过滤。加入PHP支持常用两种

方法,httpd.conf里面增加AddType application/x-httpd-php .php。还有就是

php.conf里面增加SetOutputFilter PHP和SetInputFilter PHP。特别要注意

这两种方法只能取其一,不能同时设置。redhat9默认设置好了php.conf,所以不要在

httpd.conf里面多此一举加上AddType。

1.3 WWW发出来的消息会在’和"前面多加一个\

    php.ini里面设置magic_quotes_gpc = Off。或者在相关php里面使用stripslashes

函数。另外也可以使用的方法是在.htaccess里面使用php_flag设置。参照php文档吧。

2. 修改分类讨论区

    站点,特别是小站,有的时候会希望更改分类讨论区的设置,比方关掉一个区。

要做这件事情,一般一开始要有一个计划,特别是修改分类之后各个讨论区都划归

什么新的分类。计划好了以后,一般有下面几件事情要做:

    1. 修改~bbs/etc/menu.ini,里面有个分类讨论区的东东。

    2. 相应的修改bbs2www里面的site.php

    3. 源代码里面,site.c要修改定制的seccode,groups,secname,explain,如果你修改

了分区数目,还需要在site.h里面修改定制的SECNUM。弄好了以后就重新make一下。

    4. 新的menu.ini生效以后,

    5. 如果版面的分类发生了变化,还需要修改讨论区设置,使用新的分区号。

3. email和BBS互通的问题

    BBS系统往外发邮件比较简单,似乎主要是配置~bbs/etc/sysconf.ini里面的

MAILSERVER。信件选单可以直接外发邮件,文章可以按F往外转发。

    配置BBS接受邮件包括接受用户信件,和将特定邮件直接转发到版面。这个功能

的程序都在mail2bbs目录下面。一般可以修改系统sendmail把发往特定地址的邮件交给

BBS系统去处理。目前我用的是mail2bbs.c,希望玩转qmail2bbs之后写个详细点的说明…

    BBS系统可以开POP3服务器供用户下载邮件。程序是daemon/newpop3.c。收件箱

的POP3用户名是id或者id.DIR,发件箱是id.SENT。

 

4. 转信

    下面说说BBS和新闻组转信要做的设置。cn.bbs.admin新闻组每个月1号自动张贴

cn.bbs.* HOWTO,有大量的指导。这里简要说一些要点。

4.1 代码

    转信的代码都在源代码的 innbbsd/ 目录。innbbsd/doc/tw/ 下面有一些比较好的

文档可以看看。程序基本功能介绍:

    innbbsd 这个程序是个基础,必须最先运行。程序默认监听 internet 7777端口接

            受被动转信,还监听一个unix-socket接受后面两个本地程序的请求。

    bbslink 这个是发送文章的程序,任何要转信出去的文章都要由它发送。一般在

            crontab 里面设置每 5 分钟执行一次。

    bbsnnrp 这个是主动转信程序。任何主动转入的文章都由它处理。

4.2 配置和初始测试

    转信的配置文件都在 ~bbs/innd/ 目录。如果已经是正式成员可以去cn-bbs.org

网页上看你应该做的设置。在初期测试阶段,配置和测试可以参考cn.bbs.admin组上面

每个月1号自动张贴的 cn.bbs.* HOWTO 里面的

    Q6:如何书写bbsname.bbs、newsfeeds.bbs、nodelist.bbs和active文件呢?

    Q7:如何执行innbbsd呢?

4.3 FAQ

4.3.1 bbslink 说 Segmentation fault(ft)

    这问题我碰到过两次,原因都是 bbsname.bbs 里面的那个名字在 nodelist.bbs

里面没有对应项。考虑要不要直接看看bbslink/innbbsd程序做个检查…

4.3.2 被动转信进不来

    可以tail一下~bbs/innd/bbslog会看到有用的信息。一般可能的原因是上游没有

喂信给你(联系你上游服务器的管理员);你禁止了上游给你喂信(检查你的

nodelist.bbs里面上游服务器的IP地址对不对;另外~bbs/innd/下面如果有个文件叫

ncmperm.bbs,把它删掉 - 除非你知道这文件是干嘛用的);你的转信对应版面不对

(检查newsfeeds.bbs,改了版名没改这个文件就会出这个问题);还有可能是你重新

配置了某些文件但是没有重新启动 innbbsd(执行 ctlinnbbsd reload 即可)。

4.3.3 最开始主动转信的时候,我不要新闻组上面以前的文章!

    执行 bbsnnrp -c news_server active_file(如果打bbsnnrp,帮助信息里面也

有 -c 这个参数的说明)。一般新闻组上面保留最近几个月的文章,如果一般方式执行

主动转信的bbsnnrp程序,就会每次收100篇以前的文章下来。

4.3.4 我怎么看得到cn.bbs.admin上面的文章啊!

    有几个办法。可以去新闻组网页版 http://webnews.cn-bbs.org/;或者你也可以

去各大加入转信的BBS站点找相关版面,一般叫做cnAdmin版。

4.3.5 phpbb论坛和新闻组/BBS可以互相转信吗?

    可以用NewsSync模块,但是只能做到主动转信。这方面我还在研究中…

5. 编译参数

    大多数编译参数应该在 site.h 里面定义。有的时候可以偷懒直接改 default.h。

    我只写一些我了解的参数吧。

5.1 程序功能的编译参数

    这些编译参数只是一些小系统功能的编译参数,新代码不影响系统的共享内存数据

和系统数据文件,如果你修改了这些编译参数,所需要做的就是:

    1. 在src根执行 make; make install;

    2. lsof -i :23 | grep LISTEN 看看是什么进程在listen那个端口

    3. kill 掉那个进程,然后 /home/bbs/bin/bbsd -p 23。这样做可以不影响当前

       登录的用户,但是新登录的用户就已经开始使用新代码了

    4. bbs2www/ 或者 libBBS/ 下面的程序如果也被修改了,需要重新启动 httpd。

    *) COLOR_ONLINE            文章列表用绿/蓝色显示在线/隐身作者

    *) COMMEND_ARTICLE         推荐文章被送往的版面名称

    *) HAVE_COLOR_DATE         贴子列表里面显示彩色日期

    *) HAVE_CUSTOM_USER_TITLE  呵呵,用户职务说明,参见doc/README.SYSOP

    *) IDLE_TIMEOUT            telnet方式idle自动断线的秒数

    *) MAX_WWW_GUEST_IDLE_TIME wwwguest idle自动断线秒数

    *) NEW_COMERS              注册后自动在newcomers版发文

    *) MAIL_BBSDOMAIN,NAME_BBS_ENGLISH,NAME_BBS_CHINESE,NAME_BBS_NICK,

       BBS_FULL_NAME           BBS的中英文名等

    *) SHOW_USERIP             参考smth.h/c定义站点自己的显用户IP的函数

    *) USE_DEFAULT_READ_PERM,USE_DEFAULT_SEE_PERM  是否使用默认的判断用户

            是否可读/可见某个版面的函数…参考default.c自定义。

5.2 涉及到共享内存数据结构的编译参数

    这些编译参数涉及到系统共享内存的数据结构,安全的升级办法是

    1. make; 解决所有的编译期错误

    2. 停掉所有的BBS服务(注意,包括cron里面的!),然后 make install;

    3. 清掉共享内存

    4. 启动所有的BBS服务。

    *) BBSUID, BBSGID          系统里面bbs用户的uid/gid,必须在site.h里面定义

                               linux下面用bbs身份执行id可以看到。

    *) DAY_DeleteD_CLEAN       被删除文章在这个天数之后自动被彻底删除(miscd)

    *) MAXACTIVE               最大在线用户数

    *) MAXBOARD                最大版面数

    *) MAXUSERS                最大注册用户数。这个好像系统会自动转换.PASSWD?

    *) MAX_GUEST_NUM,WWW_MAX_LOGIN,MAX_WWW_GUEST

5.3 涉及到系统数据文件结构的编译参数

    这个改动就大了,嘿嘿。升级方法类似于上面的4.2里面的的步骤,不过在启动所有

BBS服务之前,需要运行文件结构转换的程序。

    *) CONV_PASS                 如果从fb2k系统升级用户,定义为1。

    *) FLOWBANNER,MAXBANNER,BANNERSIZE   底部流动相关

    *) HAVE_BIRTHDAY             记录用户的生日/性别信息

    *) HAVE_FILEHEADER_DEFINE    不定义这个就应该在site.h里面定义fileheader

    *) HAVE_WFORUM               加入wForum支持

    *) NUMPERMS等          权限说明等。如果是小添加/修改等往往不需要转换文件

6 一些杂问题

6.0 问问题之前首先检查的一些东东

    目录权限:很多问题都出在这里,运行一下 chown -R bbs:bbs ~bbs。另外,推荐

大多数操作都使用bbs用户来执行,除非你非要用root权限。

    一些特别弱的问题:

    *) ~bbs是什么意思?简单的说就是BBS数据主目录,一般是/home/bbs。

    *) 十大统计怎么才能运行起来?参考源代码目录下的contrib/crontab.SMTH和

       doc/README.local_utl设置合适的crontab。

6.1 crontab出问题了。明明我直接运行可以,但是放到crontab里面运行不了。

    检查这个程序是否需要设置特殊的环境变量,还有是否需要在特定的目录下执行。

另外,还有些人在编辑crontab文件的时候使用了windows类型的编辑器,检查crontab

的行末是\n(linux换行符)还是\r\n(windows换行符)。crontab程序不认\r\n这种

换行符,而将\r作为命令行的最后一个字符。解决办法?…

6.2 crontab怎么设置才能不运行一次就给我发一封信啊

    默认的情况下,crond 运行程序发现控制台有输出就会将输出发送给 crontab 里

面 MAILTO 指定的那个用户。你可以在命令行末加上下面的东东

     > /dev/null 2>&1

这样,只有程序输出错误的时候才会发出信件。

6.3 到底有哪些文件记录了系统的错误

    bbs主目录下面的 usies, user.log, trace 可能都能提供有用的错误信息。

bbsinnd 的出错信息默认在 ~bbs/innd/bbslog,mail2bbs 的在 ~bbs/mail-log。

另外,crond 上的定时程序如果出现错误可能会给 crontab 里面 MAILTO 指定的用户

发信,用 mail 或者 pine 之类的收信看看。httpd 那边出错,一般可以检查 httpd

的 error log。我用的 redhat 9 系统默认的 httpd.conf 配置将 log 放在

/var/log/httpd/ 目录下面。

6.4 自动程序运行不起来,比方十大统计

    确认一下~bbs下面有以下几个目录:etc/posts/  bonlinelog/  xml/

6.5 留言版留不了言

    确认一下有 ~bbs/etc/notepad_tmp 目录

6.6 怎么合并两个版

    基本过程是合并两个版的M.*文件,合并两个版的.DIR文件,然后用gen_title程序

重新产生版面文章的回复结构。其中合并.DIR最简单办法就是cat .DIR1 >> .DIR2,

这样做的话原来版面1的文章就会全部放到最后。

    我参考了smth/BBSMan_Dev精华区里面一个程序来合并两个.DIR,合并后文章按照日

期排序。希望写个自动保留/同步reid字段的并版程序…

6.7 "进入所有讨论区"菜单的时候我不想看到二级版面

    这么做要出事的…你真要这么做就来问我吧。

※ 修改:·atppp 于 Mar 23 14:59:01 修改本文·[FROM: FARM]

※ 来源:·牧场物语 bbs.stanford.edu·[FROM: FARM]

看完了要说点啥么?

You must be logged in to post a comment.