使用Bugzilla的Whining功能

改了多少bug了,还有多少木有改,某类型的bug还有多少?

如果想周期性的知道这类问题,那么使用Whining功能吧

简单的说就是执行一个查询,然后把结果邮件通知给用户或组,这些被通知的用户可以是谁取决于设定该功能的用户的权限大小

但是目前在使用的时候遇到这么个问题,Apache日志记录如下:
editwhines.cgi: Use of uninitialized value in numeric eq (==) at $APACHE_HOME/htdocs/bugzilla/editwhines.cgi line 188
看了下代码,line 188写着“if ($cgi->param(“mailto_type_$sid”) == MAILTO_USER)”,估计是统计邮件发送的地址为空了,不大清楚mailto_type_的意思和perl的写法

以我的理解,普通用户Whining的对象就是自己,所以没有输入邮件发送对象(User或Group)的地方;超级用户可以将该邮件发送给系统的指定User或Group,所以Mail to是可以编辑的
bugzilla-whining

如果发送的统计邮件有乱码,可以试着修改邮件模板,位置$BUGZILLA_HOME/template/en/default/whine/mail.html.tmpl
在html的head之间加上

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

来指定其编码,这样一般就不会乱了。

目前只成功发送过一次邮件,后台没有发现错误,求解中ING

UPDATE 2011-04-08
那次偶然的成功发送是因为我单独执行了./whine.pl的结果,也就是说在我不人为执行的情况下系统并没有自动执行

因为Bugzilla的Whine是利用crontab程序来完成定时执行任务的,于是用crontab -l查询发现没有正在执行的任务

原来我这台机器上面crond服务根本没有,所以无法执行调度

另外附上Bugzilla比较有用的可调参数
allow_attachment_display

usemenuforusers

P.S. 关于crontab,点击我还有我

在Bugzilla中通过SMTP发通知邮件

Bugzilla 4.0注册验证通知等邮件可以通过SendMail之类的来发送,配置也很简单,但是它发出去的邮件后缀地址是localhost.localdomain之类的地址,会被一些邮箱拦截,从而收不到邮件。所以通过SMTP来发邮件还是很必要的。
文档上说的配置SMTP也很简单,但是我在配置的时候遇到几个问题,在此记录下来
1、The new value for smtp_username is invalid: SMTP Authentication is not available. Run checksetup.pl for more details.
这是我在Bugzilla中Create New Account的时候发验证邮件时产生的,这个的原因是Perl有个模块没有安装,安装下就可以了
sudo perl install-module.pl Authen::SASL
自己先可以通过$ ./checksetup.pl –check-modules查看下已经安装了哪些模块
只要安装好,上述的这个问题就解决了

所以再次试着注册一个用户,提示邮件发送成功了,于是下面的问题产生了

2、提示邮件成功发送,但是实际邮件没有发送出去,因为我填的邮箱没有收到邮件
在这里我原先是开启了use_mailer_queue这个功能
于是我选择使用Test模式(Parameters -> Email -> mail_delivery_method -> SMTP)再发了一次,mailer.testfile木有邮件

网络上有人和我是一样的问题,发不出去邮件,我参看这里http://hi.baidu.com/ever__love/blog/item/62473a9772800846d0135e2c.html的方法,把use_mailer_queue关闭(Parameters -> Email -> use_mailer_queue -> Off),再试着发送一次,果真mailer.testfile当中有邮件了

这样就基本定位到问题use_mailer_queue没有正常工作

于是又把use_mailer_queue开启
执行下面的命令
$ $BUGZILLA_HOME/jobqueue.pl check
Configuration looks okay
jobqueue.pl running – pid 5317
9 jobs in the queue.

看起来似乎正常,但是提示9 jobs in the queue,并且这个数目一直没有减少,这说明邮件几乎都被堵塞在这里了,而并没有发出去

于是又Debug发现
$ $BUGZILLA_HOME/jobqueue.pl -f -d restart
Killing 9657
Starting up…
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs

几乎神了,这里又说没有错误,那到底是哪里出问题了呢?
目前无解,求解ING。。。

UPDATE 后来经过分析解决了此问题
虽然debug jobqueue出来的信息开头几个没有发现什么异常,但是经过很多个“TheSchwartz::work_once found no jobs”之后出来一些错误信息,如下:
……
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
…….
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Use of uninitialized value $hostname in concatenation (.) or string at Bugzilla/Mailer.pm line 153.
job failed. considering retry. is max_retries of 725 >= failures of 5?
job failed: There was an error sending mail from ‘bugzilla_admin@’ to
‘xxxxx@aol.com’:Can’t call method “address” on an undefined value at
lib/Email/Send/SMTP.pm line 25.
TheSchwartz::work_once found no jobs
……
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Use of uninitialized value $hostname in concatenation (.) or string at Bugzilla/Mailer.pm line 153.
job failed. considering retry. is max_retries of 725 >= failures of 5?
job failed: There was an error sending mail from ‘bugzilla_admin@’ to
‘xxxxxx@gmail.com’:Can’t call method “address” on an undefined value
at lib/Email/Send/SMTP.pm line 25.
TheSchwartz::work_once found no jobs
……
TheSchwartz::work_once found no jobs

……是我省略掉了很多这样相同的状态

看起来这个jobqueue当中的任务不是立即就执行了的,它可能是经过某种算法才执行的
否则不应该出现第一个就是“TheSchwartz::work_once found no jobs”,到后面才有任务执行的

并且进一步发现这些任务队列都是放在数据库当中的一张表(ts_job)中的,任务成功一个就把它从这张表中删除

不过此时问题还没有解决,认真看下错误,并且看了指出的错误地方的源代码,觉得应该是mailfrom填错了,可能我这里填的不完整

又打开SMTP的调试开关(Parameters -> Email -> smtp_debug -> On),这样能看到更多的详细信息,基本觉得问题就在这了

于是我填写了标准的邮件格式“username@example.com”之后再试,邮件还不没有发出去,jobqueue的的数量又增加了一个,
看来可能前面的这些包含错误信息的队列已经将后面的阻塞了,于是我试着将ts_job表当中的数据删除
truncate table ts_job; // 反正我这里是直接truncate掉了的,我不知道这里delete和truncate有没有区别

再次注册了一遍,看到后台输出通知邮件发送成功的信息,如下:
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Net::SMTP>>> Net::SMTP(2.31)
Net::SMTP>>> Net::Cmd(2.29)
Net::SMTP>>> Exporter(5.63)
Net::SMTP>>> IO::Socket::INET(1.31)
Net::SMTP>>> IO::Socket(1.31)
Net::SMTP>>> IO::Handle(1.28)
Net::SMTP=GLOB(0xb79ce68)<<< 220 esmtp4.qq.com Esmtp QQ Mail Server Net::SMTP=GLOB(0xb79ce68)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0xb79ce68)<<< 250-esmtp4.qq.com Net::SMTP=GLOB(0xb79ce68)<<< 250-PIPELINING Net::SMTP=GLOB(0xb79ce68)<<< 250-SIZE 52428800 Net::SMTP=GLOB(0xb79ce68)<<< 250-AUTH LOGIN PLAIN Net::SMTP=GLOB(0xb79ce68)<<< 250-AUTH=LOGIN Net::SMTP=GLOB(0xb79ce68)<<< 250 8BITMIME Net::SMTP=GLOB(0xb79ce68)>>> AUTH LOGIN
……
Net::SMTP=GLOB(0xb79ce68)<<< 235 Authentication successful Net::SMTP=GLOB(0xb79ce68)>>> MAIL FROM:
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok Net::SMTP=GLOB(0xb79ce68)>>> RCPT TO:
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok Net::SMTP=GLOB(0xb79ce68)>>> DATA
Net::SMTP=GLOB(0xb79ce68)<<< 354 End data with .
Net::SMTP=GLOB(0xb79ce68)>>> From: xxxxxx@qq.com
Net::SMTP=GLOB(0xb79ce68)>>> To: xxxxxx@gmail.com
Net::SMTP=GLOB(0xb79ce68)>>> Subject: Bugzilla: confirm account creation
Net::SMTP=GLOB(0xb79ce68)>>> X-Bugzilla-Type: admin
Net::SMTP=GLOB(0xb79ce68)>>> X-Bugzilla-URL:
Net::SMTP=GLOB(0xb79ce68)>>> Auto-Submitted: auto-generated
Net::SMTP=GLOB(0xb79ce68)>>> Content-Type: text/plain; charset=”UTF-8″
Net::SMTP=GLOB(0xb79ce68)>>> MIME-Version: 1.0
Net::SMTP=GLOB(0xb79ce68)>>> Date: Tue, 05 Apr 2011 16:05:23 +0800
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> Bugzilla has received a request to create a user account
Net::SMTP=GLOB(0xb79ce68)>>> using your email address (xxxxxx@gmail.com).
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> To continue creating an account using this email address, visit the
Net::SMTP=GLOB(0xb79ce68)>>> following link by April 8, 2011 at 16:05 CST:
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> token.cgi?t=FegLL6OpYM&a=request_new_account
Net::SMTP=GLOB(0xb79ce68)>>> PRIVACY NOTICE: Bugzilla is an open bug tracking system. Activity on most
Net::SMTP=GLOB(0xb79ce68)>>> bugs, including email addresses, will be visible to the public. We recommend
……
Net::SMTP=GLOB(0xb79ce68)>>> .
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok: queued as Net::SMTP=GLOB(0xb79ce68)>>> QUIT
Net::SMTP=GLOB(0xb79ce68)<<< 221 Bye job completed TheSchwartz::work_once found no jobs 到QQ Mail也看到发送成功的邮件,在Gmail也收到了邮件,到此才算基本成功。 Parameters -> Email里面我的基本几项数据如下
mailfrom : xxxxxx@qq.com // 出现问题就是这里填的不标准
use_mailer_queue : on
smtpserver : smtp.qq.com
smtp_username : xxxxxx@qq.com
smtp_password : ******

如果mail_delivery_method你选择SendMail或者Test,那么SMTP相关的参数就可以不用填了,如果你是通过SSL加密的SMTP链接,应该是要新装插件了

P.S. 关于use_mailer_queue的信息请挪步http://www.bugzilla.org/releases/4.0/release-notes.html#v34_feat_async

在Linux上安装Bugzilla v4

首先去官网http://www.bugzilla.org/下载Stable Release (4.0)
然后可以浏览下手册http://www.bugzilla.org/docs/4.0/en/html/

现在重点关注http://www.bugzilla.org/docs/4.0/en/html/installation.html
发现依赖于Perl,Database Engine,Web Server,mod_perl,Perl Modules,Mail Transfer Agent (MTA)

1、Perl在一般的Linux发行版上都有,只需要按照安装手册检测下版本是不是支持Bugzilla

2、数据库比较独立,Bugzilla支持的任意一种数据库都可以正常工作,这里我采用的是MySQL v5.5,以前有安装过。安装方法可以参考下http://lucane.iteye.com/blog/866355
安装好之后能正常登录就可以,等会来创建数据库实例和用户,因为bugzilla需要

3、Web Server目前只有Apache是官网推荐的,但你可以用其他的Server,如果用其他的Server安装Bugzilla成功,请别忘了写封邮件告诉Bugzilla团队和我。
这里我用的Apache 2.2.17源码编译安装,还算顺利,就是启动的时候遇到点问题,后来解决了
安装成功并启动成功的情况下,在浏览器下输入http://localhost/,会出现It works!的提示,说明Apache安装完成

4、mod_perl是Apache处理Perl的模块,我这里是采用动态插件的方式集成到Apache的,即Dynamic Shared Object方式,有人推荐静态编译的方式编译到Apache源码中,那样效率高。我这里就不需要了,如果要采取静态编译方式请参考官方文档,总之我们的目的是要使我们的Web Server具有处理Perl的能力。
去http://perl.apache.org/download/index.html下载mod_perl-2.0.5,然后编译安装
sudo perl Makefile.PL MP_APXS=$APACHE_HOME/bin/apxs
MP_APXS后面的这些参数会把已经安装好的Apache信息传递给编译程序,这样它就知道Apache在哪,
编译出来的mod_perl.so它就会默认放到$APACHE_HOME/modules文件夹下,不会随意给你放个地方

我在编译的时候出现了一个错误,就是提示系统缺少libperl.so文件
我到/usr/lib下查看,发现真没有这个文件,但是有个libperl.so.5.10.1文件,
于是我做了个软链接,如下
/usr/lib$ sudo ln -sv libperl.so.5.10.1 libperl.so
再次编译,成功

编译好之后就是配置Apache了,需要把mod_perl集成到Apache当中,在$APACHE_HOME/conf/httpd.conf
搜索Dynamic Shared Object (DSO) Support,会看到下方不远处有个例子
(在httpd.conf这个配置文件中#符号表示注释掉的内容,这里是给我们参考的)
# Example:
# LoadModule foo_module modules/mod_foo.so

我们只需要增加一行就行,
LoadModule perl_module modules/mod_perl.so
这样就把perl_module集成进来了,后面modules/mod_perl.so是物理位置,
也就是你应该在$APACHE_HOME/modules下看到有个mod_perl.so文件

保存修改好的配置文件,重启Apache(./apachectl -k stop,sudo ./apachectl -k start),
如果Apache还能正常启动就说明刚刚修改的配置文件的语法是正确的,我们就可以进行下一步的工作了

————————-
另外插个小问题,我在用./apachectl -k stop关闭Apache的时候,Apache并没有真正关闭,后来我直接kill进程了
貌似网络上也有人遇到我这个问题,谁知道原因烦请告知我一声
————————-

5、开始安装Bugzilla,Bugzilla是用Perl写的,我们机器上的Perl可能不是最完整的,我们安装时缺少什么模块都可以现装上去
把下载的bugzilla解压到硬盘某处,比如/var/www/或者/home/下的文件夹,不要放到系统或者临时文件夹下,这样都不好
为了安全考虑的话一般部署都会给Web Server单独的用户,单独的权限,单独存储空间

我这里是把bugzilla放在我用户下的一个文件夹下的(~/dev/a/bugzilla-4.0),然后做了个软链接到Apache的内容文件夹($APACHE_HOME/htdocs)下
$ ls -lh
总计 8.0K
lrwxrwxrwx 1 guohai guohai 31 2011-03-31 21:58 bugzilla -> ~/dev/a/bugzilla-4.0

我给~/dev/a/bugzilla-4.0文件夹的权限是我当前用户的权限,这个实际上很重要,后面遇到问题就跟权限有关

还要在Apache httpd.conf中发布bugzilla,增加段配置,看看已有的配置文件就知道该加哪了,$APACHE_HOME这个请替换成自己相应的路径


Options ExecCGI FollowSymLinks
AllowOverride Limit
DirectoryIndex index.cgi
Order allow,deny
Allow from all

懂的人就知道这段配置的意思,不懂的人就先这样加在里面,只要是相同版本的Apache应该是不会出错的

还要增加AddHandler cgi-script .cgi这个,一般默认都是开启了的,在httpd.conf下搜索下,如果没有开启就把前面的#符号去掉开启该功能就行

这样的话,我们期望访问bugzilla的地址就变成了http://localhost/bugzilla/

现在来正式开始安装Bugzilla程序
先运行~/dev/a/bugzilla-4.0$ ./checksetup.pl –check-modules
它会提示缺少哪些模块,比如Checking for DBD-Pg (v1.45) not found
凡是not found都是目前系统上不具有的模块,但是我们只需要先安装必须的模块,缺少的模块和安装方式上面都有写出来
一般我们只需要执行类似的命令sudo perl install-module.pl TheSchwartz就可以安装完成,很好理解
我在安装的时候最开始安装MySQL数据的模块,结果提示错误,可能是依赖于其他的模块,所以我先把其他模块安装完了再去安装MySQL的就可以了
如果出现安装错误之类的问题,只需要认真看看提示,一般都可以解决

必须的模块都安装完成之后就可以配置了,简单的来说就是些数据库链接的配置
参考http://www.bugzilla.org/docs/4.0/en/html/configuration.html
执行下./checksetup.pl,现在不带后面的check-modules参数
它会帮我们生成$BUGZILLA_HOME/localconfig这个文件,打开看看就知道是些比如数据库机器地址,数据库名字,密码等等

重点有两个参数需要注意
$webservergroup = ‘yourgroupname’;
$db_sock = ‘/etc/mysql/mysql.sock’;
上面一个就是说Web Server是以什么组的权限运行的,你这里就以这个组,尽量不要留空,留空很危险
下面的一个就是Mysql数据库本地连接相关的,可以加速本地连接性能,可以参考MySQL的安装,如果留空的话,Bugzilla就以默认的路径去查找,
如果找不到就可能会报数据库连接错误,所以查查MySQL的安装配置就明白了

这些都配置好了我们是不是可以重启Apache开始使用Bugzilla了,还不可以,因为刚刚只说了下数据库的连接,我们还并没有实际的创建数据库。
很简单,创建个用户(bugzilla),当然还有密码,创建个数据库(bugbase),然后把相应的权限授予创建的这个用户

这些都有了之后我们才能填写localconfig文件相应的内容,重启Apache,再执行遍~/dev/a/bugzilla-4.0$ ./checksetup.pl
这才是真正的安装,它会连接数据库创建表等等操作,如果没有错误的话会提示你创建管理员账户,一般输入电子邮件,名字,密码之类的就可以

然后我们高高兴兴的去打开浏览器去看看Bugzilla

这个时候运气好的人可能会发现真能够访问了,但是运气不好的人一般都会给出403错误,木有权限,Forbidden几个大字搞的你没有脾气
我是参考了下面的才解决的
http://support.modwest.com/content/2/181/en/after-i-install-bugzilla-i-get-error-403-forbidden.html

去Bugzilla目录下执行
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
find . -name \*.cgi -exec chmod 755 {} \;
find . -name \*.pl -exec chmod 755 {} \;
find . -name \*.sh -exec chmod 755 {} \;

但是在这之前需要说明点东西,可能会对理解这个权限有点帮助

首先,Apache本身是有运行权限的,搜索下httpd.conf,你会找到如下这段
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User guohai
Group guohai

它建议你单独创建用户和组,并在这里指定,然后以root权限运行Apache,它会自动帮助你切换过来

也就是我这里运行Apache的用户和组都是guohai,并且Bugzilla的localconfig中的$webservergroup也是guohai
并且Bugzilla目录下文件的用户和组都是guohai

这些都正确了之后现在应该是可以访问的了,能看到Bugzilla的页面就算告一段落了,但是还没有完。

因为Bugzilla当中有很多邮件通知,所以还需要配置MTA之类的东西,
最简单的方法检测目前操作系统环境是否已经满足该条件的就是在Bugzilla上注册一个新用户,
如果不出现错误就表示目前满足条件

我的机器上面出现错误,是因为没有装MTA的原因,我就装了个SendMail,大家可以参考其他相关文档。
官方有个简短有效的说法,就说你如果能用mail命令成功发邮件的话,那么Bugzilla也就是可以用的
错误如下:
There was an error sending mail from ‘bugzilla-daemon’ to ‘guohai@mailwalk.com’:error when closing pipe to /usr/sbin/sendmail: Broken pipe
Traceback:
at Bugzilla/Mailer.pm line 186
Bugzilla::Mailer::MessageToMTA(…) called at Bugzilla/Token.pm line 90
Bugzilla::Token::issue_new_user_account_token(…) called at /home/guohai/apps/volcano/apache/htdocs/bugzilla/createaccount.cgi line 73

单独运行下/usr/sbin/sendmail,提示:
Please install an MTA on this system if you want to use sendmail!

在修改配置的时候也出现了错误,因为修改配置信息,要往一个文件($BUGZILLA_HOME/data/params)里面写东西,文件需要有可写权限
~/dev/a/bugzilla-4.0/data$
-rw-rw-r– 1 guohai guohai 4.0K 2011-04-01 00:36 params
类似这些错误只需要根据错误提示给权限就可以了

还有个功能如果需要开启的话就还要改配置,那就是use_mailer_queue,也就是让通知邮件在后台以异步方式发送,一般用户多的系统都要开启该功能
但是该功能依赖于一个模块,否则就会如下出错
The new value for use_mailer_queue is invalid: Using the job queue requires that you have certain Perl modules installed. See the output of checksetup.pl for more information.

详情也可一参考http://www.bugzilla.org/docs/tip/en/html/api/jobqueue.html

编译jobqueue.pl
~/dev/a/bugzilla-4.0$ ./jobqueue.pl
Base class package “TheSchwartz” is empty.
(Perhaps you need to ‘use’ the module which defines that package first,
or make that module available in @INC (@INC contains: . lib/i686-linux-gnu-thread-multi lib /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl).
at Bugzilla/JobQueue.pm line 30
BEGIN failed–compilation aborted at Bugzilla/JobQueue.pm line 30.
Compilation failed in require at Bugzilla/JobQueue/Runner.pm line 36.
BEGIN failed–compilation aborted at Bugzilla/JobQueue/Runner.pm line 36.
Compilation failed in require at ./jobqueue.pl line 30.
BEGIN failed–compilation aborted at ./jobqueue.pl line 30.

发现缺少TheSchwartz模块
这个时候最简单的就是检测下哪些模块没有,之前我们已经执行过这个操作./checksetup.pl –check-modules

那就按照提示安装TheSchwartz模块
sudo perl install-module.pl TheSchwartz
发现还是报错,因为它还依赖于另一个模块
Can’t locate object method “new” via package “Bugzilla::JobQueue::Runner” at ./jobqueue.pl line 32.
果断看出是Bugzilla::JobQueue::Runner这个类不正确,或没有,犯下API发现
Bugzilla::JobQueue::Runner – A class representing the daemon that runs the job queue.
就说明还依赖另外一个模块,定位到Daemon::Generic
那就再安装Daemon模块sudo perl install-module.pl Daemon::Generic

编译 ./jobqueue.pl通过
启动 ./jobqueue.pl start
当然你也可以让jobqueue随操作系统开机启动,可以参照文档做些设置

这样就可以开启Bugzilla的use_mailer_queue功能了

这样才算基本完成了
不过还有一些功能需要,比如设置通知邮件的地址,就是说这些通知邮件是由哪个邮箱发出的,
有人可以把他定位到Gmail等第三方邮箱上,我目前还是个无效的邮件地址发出去的邮件,bugzilla-daemon@localhost6.localdomain6
这种邮件可能会被些其它邮箱拒绝

建议大家安装的时候还是先读读官方指南,我这里只是把出现的问题及解决办法记录下了,看起来不是那么顺畅。