Saturday, October 19, 2013

Step-by-Step Bugzilla Installation Guide for Linux

Bugzilla is the best open source bug tracking system. Very simple to use with lot of features. Bugzilla allows you to track the bugs and collaborate with developers and other teams in your organization effectively.
This is a detailed step-by-step bugzilla installation guide for Linux.

1. Verify Perl Version

Make sure your perl version is >= 5.8.1 as shown below.
# perl -v

This is perl, v5.8.8 built for i386-linux-thread-multi
Most Linux distributions comes with perl. If you don’t have it on yours, download and install it from corresponding distribution website.

2. Install MySQL Database

Make sure your MySQL version is >= 4.1.2 as shown below.
# mysql -V
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1
If you don’t have mysql, install it as using yum groupinstall, or based on LAMP install article, or based on mysql rpm article.

3. Install Apache

If you already have apache installed, make sure you are able to access it by using http://{your-ip-address}.
If you don’t have apache, install is using yum based on LAMP install article, or install apache from source.

4. Download latest Bugzilla tar ball

Download the latest stable release from bugzilla download page. Extract the bugzilla*.tar.gz file to the apache document root directory as shown below.
# cd ~

# wget

# cd /var/www/html

# tar xvfz /usr/save/bugzilla-3.4.6.tar.gz

5. Execute the bugzilla

Bugzilla program will verify whether all the required perl modules are installed. This will also display a list of all missing bugzilla modules that needs to be installed.
You can run the program as many times as you like until you’ve verified all the required perl modules are installed.
Following is the output of 1st run of, where is has listed all the missing optional and required modules.
# cd /var/www/html/bugzilla-3.4.6

# ./ --check-modules


             GD: /usr/bin/perl GD
          Chart: /usr/bin/perl Chart::Base
    Template-GD: /usr/bin/perl Template::Plugin::GD::Image
     GDTextUtil: /usr/bin/perl GD::Text
        GDGraph: /usr/bin/perl GD::Graph
       XML-Twig: /usr/bin/perl XML::Twig
     MIME-tools: /usr/bin/perl MIME::Parser
    libwww-perl: /usr/bin/perl LWP::UserAgent
    PatchReader: /usr/bin/perl PatchReader
     PerlMagick: /usr/bin/perl Image::Magick
      perl-ldap: /usr/bin/perl Net::LDAP
    Authen-SASL: /usr/bin/perl Authen::SASL
     RadiusPerl: /usr/bin/perl Authen::Radius
      SOAP-Lite: /usr/bin/perl SOAP::Lite
    HTML-Parser: /usr/bin/perl HTML::Parser
  HTML-Scrubber: /usr/bin/perl HTML::Scrubber
Email-MIME-Attachment-Stripper: /usr/bin/perl Email::MIME::Attachment::Stripper
    Email-Reply: /usr/bin/perl Email::Reply
    TheSchwartz: /usr/bin/perl TheSchwartz
 Daemon-Generic: /usr/bin/perl Daemon::Generic
       mod_perl: /usr/bin/perl mod_perl2

YOU MUST RUN ONE OF THE FOLLOWING COMMANDS (depending on which database you use):

PostgreSQL: /usr/bin/perl DBD::Pg
     MySQL: /usr/bin/perl DBD::mysql
    Oracle: /usr/bin/perl DBD::Oracle

COMMANDS TO INSTALL REQUIRED MODULES (You *must* run all these commands and then re-run

    /usr/bin/perl CGI
    /usr/bin/perl Digest::SHA
    /usr/bin/perl Date::Format
    /usr/bin/perl DateTime
    /usr/bin/perl DateTime::TimeZone
    /usr/bin/perl Template
    /usr/bin/perl Email::Send
    /usr/bin/perl Email::MIME
    /usr/bin/perl Email::MIME::Encodings
    /usr/bin/perl Email::MIME::Modifier
    /usr/bin/perl URI

To attempt an automatic install of every required and optional module with one command, do:

  /usr/bin/perl --all

6. Execute bugzilla

As suggested by the output of the, you can execute the to install all bugzilla required and optional perl modules.
# /usr/bin/perl --all
Please review the output of the above to make sure everything got install properly. There is a possibility that some of the modules failed to install (may be because some required OS packages were missing).
Execute the to verify whether all the modules got installed properly.
Following is the output of 2nd run of the
# ./ --check-modules

             GD: /usr/bin/perl GD
          Chart: /usr/bin/perl Chart::Base
    Template-GD: /usr/bin/perl Template::Plugin::GD::Image
     GDTextUtil: /usr/bin/perl GD::Text
        GDGraph: /usr/bin/perl GD::Graph
       XML-Twig: /usr/bin/perl XML::Twig
     PerlMagick: /usr/bin/perl Image::Magick
      SOAP-Lite: /usr/bin/perl SOAP::Lite
       mod_perl: /usr/bin/perl mod_perl2

YOU MUST RUN ONE OF THE FOLLOWING COMMANDS (depending on which database
you use):

PostgreSQL: /usr/bin/perl DBD::Pg
     MySQL: /usr/bin/perl DBD::mysql
    Oracle: /usr/bin/perl DBD::Oracle

7. Install missing Perl Modules

As we see from the above output, some of the optional modules and required module installed was not completed when we ran the
So, we have to install the missing modules manually one-by-one to figure out the issues and fix it one-by-one.
Refer to the “Troubleshooting Section” at the end for list of all the issues that I faced while installing the perl modules required for bugzilla (along with the solution on how to fix those issues).

8. Final –check-modules verification

Execute –check-modules again as shown below as final verification to make sure all the modules got installed successfully.
# ./ --check-modules
* This is Bugzilla 3.4.6 on perl 5.8.8
* Running on Linux 2.6.18-164.el5PAE #1 SMP Thu Sep 3 04:10:44 EDT 2009

Checking perl modules...
Checking for     (v3.21)   ok: found v3.49
Checking for          Digest-SHA (any)     ok: found v5.48
Checking for            TimeDate (v2.21)   ok: found v2.24
Checking for            DateTime (v0.28)   ok: found v0.55
Checking for   DateTime-TimeZone (v0.71)   ok: found v1.17
Checking for                 DBI (v1.41)   ok: found v1.52
Checking for    Template-Toolkit (v2.22)   ok: found v2.22
Checking for          Email-Send (v2.00)   ok: found v2.198
Checking for          Email-MIME (v1.861)  ok: found v1.903
Checking for Email-MIME-Encodings (v1.313)  ok: found v1.313
Checking for Email-MIME-Modifier (v1.442)  ok: found v1.903
Checking for                 URI (any)     ok: found v1.54 

Checking available perl DBD modules...
Checking for              DBD-Pg (v1.45)    not found
Checking for           DBD-mysql (v4.00)   ok: found v4.013
Checking for          DBD-Oracle (v1.19)    not found 

The following Perl modules are optional:
Checking for                  GD (v1.20)   ok: found v2.44
Checking for               Chart (v1.0)    ok: found v2.4.1
Checking for         Template-GD (any)     ok: found v1.56
Checking for          GDTextUtil (any)     ok: found v0.86
Checking for             GDGraph (any)     ok: found v1.44
Checking for            XML-Twig (any)     ok: found v3.34
Checking for          MIME-tools (v5.406)  ok: found v5.427
Checking for         libwww-perl (any)     ok: found v5.834
Checking for         PatchReader (v0.9.4)  ok: found v0.9.5
Checking for          PerlMagick (any)     ok: found v6.2.8
Checking for           perl-ldap (any)     ok: found v0.4001
Checking for         Authen-SASL (any)     ok: found v2.1401
Checking for          RadiusPerl (any)     ok: found v0.17
Checking for           SOAP-Lite (v0.710.06) ok: found v0.711
Checking for         HTML-Parser (v3.40)   ok: found v3.65
Checking for       HTML-Scrubber (any)     ok: found v0.08
Checking for Email-MIME-Attachment-Stripper (any)     ok: found v1.316
Checking for         Email-Reply (any)     ok: found v1.202
Checking for         TheSchwartz (any)     ok: found v1.10
Checking for      Daemon-Generic (any)     ok: found v0.61
Checking for            mod_perl (v1.999022) ok: found v2.000004

9. Create localconfig file using

Execute without any argument, which will create a localconfig file in the current directory. The localconfig file contains the key configuration parameters used by the bugzilla (for example, mysql db username and password).
# ./
Reading ./localconfig...

This version of Bugzilla contains some variables that you may want to
change and adapt to your local settings. Please edit the file
./localconfig and rerun

The following variables are new to ./localconfig since you last ran  create_htaccess, webservergroup, db_driver, db_host, db_name, db_user, db_pass, db_port, db_sock, db_check, index_html, cvsbin, interdiffbin, diffpath, site_wide_secret

10. Modify the localconfig file.

The only thing you need to modify the localconfig file is MySQL database db password by changing the $db_pass variable as shown below.
# vi ./localconfig
$db_pass = 'Bugs4All';

11. Modify /etc/my.cnf to increase bugzilla attachment size

Set the max_allowed_packet to 4M in the /etc/my.cnf to increase bugzilla attachment size.
# cat /etc/my.cnf
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

# Allow packets up to 4MB

Restart the mysqld after this change.
# service mysqld restart

12. Create bugs mysql user

Add bugzilla user (bugs) to the mysql database as shown below.
# mysql -u root -p

TO bugs@localhost IDENTIFIED BY 'Bugs4All';


13. Create the bugzilla database

Execute the (without any arguments) again to create the mysql bugzilla database. Since the localconfig file already exist, the second time when you execute the, it will create the mysql database based on the information from localconfig file.
# ./ 

Creating database bugs...

Building Schema object from database...
Adding new table bz_schema ...
Initializing the new Schema storage...
Adding new table attach_data ...
Adding new table attachments ...
Adding new table bug_group_map ...
Adding new table bug_see_also ...
Adding new table bug_severity ...
Adding new table bug_status ...

Inserting values into the 'priority' table:
Inserting values into the 'bug_status' table:
Inserting values into the 'rep_platform' table:

Creating ./data directory...
Creating ./data/attachments directory...
Creating ./data/duplicates directory...

Adding foreign key: attachments.bug_id -> bugs.bug_id...
Adding foreign key: attachments.submitter_id -> profiles.userid...
Adding foreign key: bug_group_map.bug_id -> bugs.bug_id...

14. Create bugzilla administrator account.

At the end of the ./ execution, it will detect that you don’t have an adminsitrator account and request you to enter administration login information as shown below.
Looks like we don't have an administrator set up yet. Either this is
your first time using Bugzilla, or your administrator's privileges
might have accidentally been deleted.

Enter the e-mail address of the administrator:
Enter the real name of the administrator: Ramesh Natarajan
Enter a password for the administrator account: NotRealPwd
Please retype the password to verify: welcome is now set up as an administrator.
Creating default classification 'Unclassified'...
Creating initial dummy product 'TestProduct'...

Now that you have installed Bugzilla, you should visit the 'Parameters'
page (linked in the footer of the Administrator account) to ensure it
is set up as you wish - this includes setting the 'urlbase' option to
the correct URL.

15. Configure apache for mod_perl

Rename the bugzilla directory. (i.e remove the version number in it)
# cd /var/www/html

# mv bugzilla-3.4.6/ bugzilla
Add the following two lines to httpd.conf
# tail -2 /etc/httpd/conf/httpd.conf
PerlSwitches -I/var/www/html/bugzilla -I/var/www/html/bugzilla/lib -w -T
PerlConfigRequire /var/www/html/bugzilla/
Verify the Group in httpd.conf matches the webservergroup in localconfig
# cd /var/www/html/bugzilla/

# grep webservergroup localconfig
$webservergroup = 'apache';

# grep Group /etc/httpd/conf/httpd.conf
Group apache

16. Final execution

Execute the again.
# ./
Reading ./localconfig...

Removing existing compiled templates...
Precompiling templates...done.
Fixing file permissions...

Now that you have installed Bugzilla, you should visit the 'Parameters'
page (linked in the footer of the Administrator account) to ensure it
is set up as you wish - this includes setting the 'urlbase' option to
the correct URL.

17. Login to bugzilla and complete one time setup.

Start the apache, go to http://{your-ip-address}/bugzilla and login using the administrator account you created above.
From the bugzilla UI, at the footer -> Administration -> Parameters -> ‘Required Settings’ section -> Fill-out following information:
urlbase: http://{your-ip-address}/
Note: Depending on your setup, go to -> User Authentication -> and you might want to change requiredlogin and emailregexp parameter.

Troubleshooting Bugzilla Install Issues

Issue1: DBD::mysql module failed

The DBD:mysql perl module failed with the “mysql.h: No such file or directory” error message as shown below.
# /usr/bin/perl DBD::mysql

dbdimp.h:22:49: error: mysql.h: No such file or directory
dbdimp.h:23:45: error: mysqld_error.h: No such file or directory
dbdimp.h:25:49: error: errmsg.h: No such file or directory
In file included from dbdimp.c:20:
dbdimp.h:144: error: expected specifier-qualifier-list before âMYSQLâ
dbdimp.h:236: error: expected specifier-qualifier-list before âMYSQL_RESâ

Solution1: install mysql-devel

Error message “mysql.h: No such file or directory” is because mysql-devel package was missing as shown below.
# rpm -qa | grep -i mysql
Install the mysql-devel package as shown below.
# yum install mysql-devel

# rpm -qa | grep -i "mysql-devel"
DBD::mysql installation will go through without any issues now.
# /usr/bin/perl DBD::mysql

Issue2: GD failed with missing gdlib-config / libgd

Installing GD module failed with the following error message.
# /usr/bin/perl GD

Could not find gdlib-config in the search path. Please install libgd 2.0.28 or higher.
If you want to try to compile anyway, please rerun this script with the option --ignore_missing_gd.
Running make test
  Make had some problems, maybe interrupted? Won't test
Running make install
  Make had some problems, maybe interrupted? Won't install

Solution2: Install gd-devel package

Install libgd (i.e gd-devel package) as shown below to fix the GD module issue.
# yum install gd-devel

# rpm -qa | grep gd
GD got installed without any issues after insingalling gd-devel package.
# /usr/bin/perl GD

Issue3: Twig Failed with expat.h error

Twig module failed to install with the error message “expat.h: No such file or directory” as shown below.
# /usr/bin/perl XML::Twig

Expat.xs:12:19: error: expat.h: No such file or directory
Expat.xs:60: error: expected specifier-qualifier-list before XML_Parser

Solution3: Install expat and expat-devel for Twig

Install expat and expat-devel package as shown below.
# yum install expat

# yum install expat-devel
Now install Twig without any issues.
# /usr/bin/perl XML::Twig

Issue4: Image::Magick failed to install

Image::Magick installation failed with “magick/MagickCore.h: No such file or directory” error message as shown below.
# /usr/bin/perl Image::Magick

Note (probably harmless): No library found for -lMagickCore
Magick.xs:64:31: error: magick/MagickCore.h: No such file or directory
Magick.xs:171: error: expected specifier-qualifier-list before ‘MagickRealType’
Magick.xs:192: error: expected specifier-qualifier-list before ‘ImageInfo’
Magick.xs:214: error: ‘MagickNoiseOptions’ undeclared here (not in a function)
Magick.xs:214: warning: missing initializer

Solution4: Image::Magick failed to install

Make sure following ImageMagic related packages are present.
# rpm -qa | grep -i Image
In my case, ImageMagic-devel was missing. So, installed it as shown below. After that, Image::Magick perl module got installed successfully.
# yum install ImageMagick-devel

# /usr/bin/perl Image::Magick

Issue5: SOAP::Lite failed to install

SOAP::Lite module failed to install with “Cannot locate in @INC” message as shown below.
#/usr/bin/perl SOAP::Lite

Failed test 'use SOAP::Lite;' at t/SOAP/Data.t line 5.
Tried to use 'SOAP::Lite'.
Error:  Can't locate in @INC

Solution5: Install required for SOAP::Lite

Installed as shown below. After this, SOAP::Lite got installed without any issue.
# perl -MCPAN -e 'install version' 

# /usr/bin/perl SOAP::Lite

Issue6 (and Solution6): mod_perl was missing

Don’t install mod_perl using /usr/bin/perl mod_perl2 . Insetad, use yum to install mod_perl as shown below.
# yum install mod_perl

Issue7: Apache start failed

Starting apache failed with “Cannot locate Template/ in @INC” error message.
# service httpd restart
Stopping httpd:                                            [  OK  ]

Starting httpd: Syntax error on line 994 of /etc/httpd/conf/httpd.conf:
Can't locate Template/ in @INC

Solution7: Install Template-Tool Kit as shown below

Install Template-Tool kit to fix the above apache error message
# cpan
cpan> i /Template-Toolkit/
Distribution    A/AB/ABEL/Eidolon-Driver-Template-Toolkit-0.01.tar.gz
Distribution    A/AB/ABW/Template-Toolkit-1.07.tar.gz
Distribution    A/AB/ABW/Template-Toolkit-2.22.tar.gz
Distribution    I/IN/INGY/Template-Toolkit-Simple-0.03.tar.gz
4 items found

cpan> install A/AB/ABW/Template-Toolkit-2.22.tar.gz

Issue8: Apache start failed again

Starting apache failed with “Cannot locate DateTime/ in @INC” error message.
# service httpd restart
Stopping httpd:                                            [  OK  ]

Starting httpd: Syntax error on line 994 of /etc/httpd/conf/httpd.conf:
Can't locate DateTime/ in @INC

Solution8: Install DateTime/ as shown below

Install DateTime/ to fix the above apache error message
# cpan

cpan> install DateTime:Locale
Also, in your apache error_log if you see Digest/ issue, you should install it as shown below.
# tail -f /etc/httpd/logs/error_log
Can't locate Digest/ in @INC (@INC contains: 

# cpan
cpan> install Digest::SHA

If you enjoyed this article, you might also like..

  1. 50 Linux Sysadmin Tutorials
  2. 50 Most Frequently Used Linux Commands (With Examples)
  3. Top 25 Best Linux Performance Monitoring and Debugging Tools
  4. Mommy, I found it! – 15 Practical Linux Find Command Examples
  5. Linux 101 Hacks 2nd Edition eBook Linux 101 Hacks Book

Thursday, October 17, 2013

Automating a JBoss Deployment with ANT

One area where virtually all organizations seem to differ is in change management–and specifically in the deployment strategy.  Recently, a client requested I put together deployment instructions, specifying a preference that I include a deployment script that could remotely deploy the application.  To meet this requirement, I decided to incorporate this new functionality into my existing ANT build script.
In my case, the application is a JBoss Web Service deployment.  The following steps are necessary to deploy the application:
  1. Stop the JBoss Server.
  2. Removed the previous EAR deployment.
  3. Copy the new EAR file up to the server.
  4. Restart the JBoss Server.
Note that restarting the JBoss server is not entirely necessary for many applications.  The JBoss hot deploy feature will gladly pick up the changes. However, we’ve had a few issues with hot deployments in other applications and over time have found it best to restart the application server for each deployment. Your mileage may vary.
Also, because we will eventually deploy to multiple environments, I want to be able to store configuration parameters for each target environment in its own .properties file.
The expected command line to run this deployment will be:
ant -Denv=targetEnvironment jboss-deploy
Where targetEnvironment specifies the target deployment environment.
To get started, I added an ANT target to verify two things:
  • That an environment has been specified
  • The corresponding file exists.
If these conditions are met, it reads in the target environment’s configution properties.  Here is the code:
<target name="-jboss-deploy-prep">
     message="Target environment must be specified in ant command line as -Denv=target"
     unless="env" />

  <fail message="conf/${env}.properties file does not exist">
        <available file="conf/${env}.properties" />

  <!-- Get properties for target environment -->
  <property file="conf/${env}.properties" />
The contents of the properties file goes something like this:
jboss.remote.stop=/home/jboss/jboss-5.1.0.GA/server/testapp/bin/testapp stop
jboss.remote.start=/home/jboss/jboss-5.1.0.GA/server/testapp/bin/testapp start
Note that the password is commented out. For security reasons, we may not want to keep the password in the properties file. If the password is not specified, we want to prompt for it. So I added this target:
<!-- get password if not specified -->
<target name="-jboss-prompt-password" unless="jboss.remote.password">
  <input message="Jboss Remote Password:" addproperty="jboss.remote.password">
    <handler classname="" />
Now that I have all the right pieces in place, time to add the jboss-deploy target:
   depends="clean, dist-app, -jboss-deploy-prep, -jboss-prompt-password" >

  <echo message="JBoss Deployment" />
  <echo message="--------------------------------------------------------" />

  <echo message="Stopping the JBoss server running in ${env}" />
     username="${jboss.remote.username}" password="${jboss.remote.password}"
     command="${jboss.remote.stop}" />

  <echo message="Removing existing deployment ..." />
     username="${jboss.remote.username}" password="${jboss.remote.password}"
     command="rm -f ${jboss.remote.instance.home}/deploy/rce-j2ee-*.ear" />

  <echo message="Transferring new deployment ..." />
    sftp="true" trust="true"
    password="${jboss.remote.password}" />

  <echo message="Starting JBoss server running in ${env}" />
    username="${jboss.remote.username}" password="${jboss.remote.password}"
    command="${jboss.remote.start}" />

That’s it. Now executing the jboss-deploy target does the following:
  • Compiles my application
  • Creates a versioned EAR file
  • Stops the JBoss Server
  • Removes the previous deployment
  • Securely copies the new EAR to the server
  • Starts the JBoss server
One other note: if your start/stop scripts make use of the sudo command (as mine does), you may need to modify your sudoers configuration to skipping checking for TTY. The sshexec task does not allocate a TTY terminal, so many Linux distros will not allow the sudo.

autostart JBOSS when power up

#chkconfig: 345 99 10
#description: JBoss auto start-stop script.
# Source function library.
. /etc/rc.d/init.d/functions
# Get config.
. /etc/sysconfig/network
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0
startup='/home/jboss/jboss-as-web-7.0.2.Final/bin/ > /dev/null 2> /dev/null &'
shutdown='killall java'
echo -n $"Starting JBoss service: "
action $"Stopping JBoss service: " $shutdown
sleep 10
# See how we were called.
case "$1" in
echo $"Usage: $0 {start|stop|restart}"
exit 1
1: Name and add it to /etc/init.d
2: chmod 755 jboss
3: chkconfig --add jboss && chkconfig jboss on

Command Usage
service jboss start
service jboss stop
servoce jboss restart