Commit 6963781b authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 344855: Create a subroutine that does all of checksetup's requirements checking

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=myk
parent c98c1fce
......@@ -109,6 +109,7 @@ use File::Basename;
BUG_STATE_OPEN
DB_MODULE
ROOT_USER
);
@Bugzilla::Constants::EXPORT_OK = qw(contenttypes);
......@@ -298,6 +299,8 @@ use constant DB_MODULE => {
name => 'PostgreSQL'},
};
use constant ROOT_USER => $^O =~ /MSWin32/i ? 'Administrator' : 'root';
sub bz_locations {
# We know that Bugzilla/Constants.pm must be in %INC at this point.
# So the only question is, what's the name of the directory
......
......@@ -30,8 +30,12 @@ our @EXPORT = qw(
OPTIONAL_MODULES
MOD_PERL_MODULES
vers_cmp
check_requirements
have_vers
vers_cmp
);
our @EXPORT_OK = qw(
install_command
);
......@@ -173,14 +177,204 @@ use constant WIN32_MODULE_NAMES => {
'Template::Plugin::GD' => 'Template',
};
sub check_requirements {
my ($output) = @_;
print "\nChecking perl modules...\n" if $output;
my $modules = REQUIRED_MODULES;
my $root = ROOT_USER;
my %missing;
foreach my $module (@{$modules}) {
unless (have_vers($module->{name}, $module->{version}, $output)) {
$missing{$module->{name}} = $module->{version};
}
}
print "\nYou need one of the following DBD modules installed, depending",
" on\nwhich database you are using with Bugzilla:\n" if $output;
my $have_one_dbd = 0;
my $db_modules = DB_MODULE;
foreach my $db (keys %$db_modules) {
if (have_vers($db_modules->{$db}->{dbd},
$db_modules->{$db}->{dbd_version}, $output))
{
$have_one_dbd = 1;
}
}
print "\nThe following Perl modules are optional:\n" if $output;
my $opt_modules = OPTIONAL_MODULES;
my %have_mod;
foreach my $module (@$opt_modules) {
$have_mod{$module->{name}} =
have_vers($module->{name}, $module->{version}, $output);
}
print "\nThe following modules are required for mod_perl support:\n"
if $output;
my $mp_modules = MOD_PERL_MODULES;
foreach my $module (@$mp_modules) {
$have_mod{$module->{name}} =
have_vers($module->{name}, $module->{version}, $output);
}
if ($output) {
print "\n";
if ($^O =~ /MSWin32/i) {
print "All the required modules are available at:\n",
" http://landfill.bugzilla.org/ppm/\n",
"You can add the repository with the following command:\n",
" ppm rep add bugzilla http://landfill.bugzilla.org/ppm/",
"\n\n";
}
# New/Old Charts
if ((!$have_mod{'GD'} || !$have_mod{'Chart::Base'})) {
print "If you you want to see graphical bug charts (plotting",
" historical data over \ntime), you should install libgd",
" and the following Perl modules (as $root):\n\n";
print " GD: " . install_command("GD") ."\n"
if !$have_mod{'GD'};
print " Chart: " . install_command("Chart::Base") . "\n"
if !$have_mod{'Chart::Base'};
print "\n";
}
# Bug Import/Export
if (!$have_mod{'XML::Twig'}) {
print "If you want to use the bug import/export feature to move",
" bugs to or from\nother bugzilla installations, you will",
" need to install the XML::Twig\nmodule by running",
" (as $root):\n\n",
" " . install_command("XML::Twig") . "\n\n";
}
# Automatic Updates
if (!$have_mod{'LWP::UserAgent'}) {
print "If you want to use the automatic update notification",
" feature you will\nneed to install the LWP::UserAgent",
" module by running (as $root):\n\n",
" " . install_command("LWP::UserAgent") . "\n\n";
}
# BMP to PNG
if (!$have_mod{'Image::Magick'}) {
print "If you want to convert BMP image attachments to PNG to",
" conserve\ndisk space, you will need to install the",
" ImageMagick application\nAvailable from",
" http://www.imagemagick.org, and the Image::Magick\n",
"Perl module by running (as $root):\n\n",
" " . install_command("Image::Magick") . "\n\n";
}
# Graphical Reports
if (!$have_mod{'GD'} || !$have_mod{'GD::Graph'}
|| !$have_mod{'GD::Text::Align'}
|| !$have_mod{'Template::Plugin::GD::Image'})
{
print "If you want to see graphical bug reports (bar, pie and",
" line charts of \ncurrent data), you should install libgd",
" and the following Perl modules:\n\n";
print " GD: " . install_command("GD") . "\n"
if !$have_mod{'GD'};
print " GD::Graph: " . install_command("GD::Graph") . "\n"
if !$have_mod{'GD::Graph'};
print " GD::Text::Align: " . install_command("GD::Text::Align")
. "\n" if !$have_mod{'GD::Text::Align'};
print " Template::Plugin::GD: "
. install_command('Template::Plugin::GD') . "\n"
if !$have_mod{'Template::Plugin::GD::Image'};
print "\n";
}
# Diff View
if (!$have_mod{'PatchReader'}) {
print "If you want to see pretty HTML views of patches, you",
" should install the \nPatchReader module by running",
" (as $root):\n\n",
" " . install_command("PatchReader") . "\n\n";
}
# LDAP
if (!$have_mod{'Net::LDAP'}) {
print "If you wish to use LDAP authentication, then you must",
" install Net::LDAP\nby running (as $root):\n\n",
" " . install_command('Net::LDAP') . "\n\n";
}
# mod_perl
if (!$have_mod{'mod_perl2'}) {
print "If you would like mod_perl support, you must install at",
" least the minimum\nrequired version of mod_perl. You",
" can download mod_perl from:\n",
" http://perl.apache.org/download/binaries.html\n",
"Make sure that you get the 2.0 version, not the 1.0",
" version.\n\n";
}
if (!$have_mod{'Apache::DBI'} || !$have_mod{'CGI'}) {
print "For mod_perl support, you must install the following",
" perl module(s):\n\n";
print " Apache::DBI: " . install_command('Apache::DBI') . "\n"
if !$have_mod{'Apache::DBI'};
print " CGI: " . install_command('CGI') . "\n"
if !$have_mod{'CGI'};
print "\n";
}
}
if (!$have_one_dbd) {
print "\n";
print "Bugzilla requires that at least one DBD module be",
" installed in order to\naccess a database. You can install",
" the correct one by running (as $root) the\ncommand listed",
" below for your database:\n\n";
foreach my $db (keys %$db_modules) {
print $db_modules->{$db}->{name} . ": "
. install_command($db_modules->{$db}->{dbd}) . "\n";
print " Minimum version required: "
. $db_modules->{$db}->{dbd_version} . "\n";
}
print "\n";
}
if (%missing) {
print "\n";
print "Bugzilla requires some Perl modules which are either",
" missing from your\nsystem, or the version on your system",
" is too old. They can be installed\nby running (as $root)",
" the following:\n";
foreach my $module (keys %missing) {
print " " . install_command("$module") . "\n";
if ($missing{$module} > 0) {
print " Minimum version required: $missing{$module}\n";
}
}
print "\n";
}
return {
pass => !scalar(keys %missing) && $have_one_dbd,
missing => \%missing,
optional => \%have_mod,
}
}
# This was originally clipped from the libnet Makefile.PL, adapted here to
# use the below vers_cmp routine for accurate version checking.
sub have_vers {
my ($pkg, $wanted, $silent) = @_;
my ($pkg, $wanted, $output) = @_;
my ($msg, $vnum, $vstr);
no strict 'refs';
printf("Checking for %15s %-9s ", $pkg, !$wanted?'(any)':"(v$wanted)")
unless $silent;
if $output;
# Modules may change $SIG{__DIE__} and $SIG{__WARN__}, so localise them here
# so that later errors display 'normally'
......@@ -212,7 +406,7 @@ sub have_vers {
}
my $vok = (vers_cmp($vnum,$wanted) > -1);
print ((($vok) ? "ok: " : " "), "$vstr\n") unless $silent;
print ((($vok) ? "ok: " : " "), "$vstr\n") if $output;
return $vok ? 1 : 0;
}
......@@ -303,6 +497,27 @@ represent the name of the module and the version that we require.
=over 4
=item C<check_requirements($output)>
Description: This checks what optional or required perl modules
are installed, like C<checksetup.pl> does.
Params: C<$output> - C<true> if you want the function to print
out information about what it's doing,
and the versions of everything installed.
If you don't pass the minimum requirements,
the will always print out something,
regardless of this parameter.
Returns: A hashref containing three values:
C<pass> - Whether or not we have all the mandatory
requirements.
C<missing> - A hash showing which mandatory requirements
are missing. The key is the module name,
and the value is the version we require.
C<optional> - Which optional modules are installed and
up-to-date enough for Bugzilla.
=item C<vers_cmp($a, $b)>
Description: This is a comparison function, like you would use in
......@@ -315,7 +530,7 @@ represent the name of the module and the version that we require.
Returns: -1 if $a is less than $b, 0 if they are equal, and
1 if $a is greater than $b.
=item C<have_vers($pkg, $wanted, $silent)>
=item C<have_vers($pkg, $wanted, $output)>
Description: Tells you whether or not you have the appropriate
version of the module requested. It also prints
......@@ -326,8 +541,9 @@ represent the name of the module and the version that we require.
C<$wanted> - The version of the package you require.
Set this to 0 if you don't require any
particular version.
C<$silent> - Set to true if you don't want this function
to print out anything.
C<$output> - Set to true if you want this function to
print information to STDOUT about what it's
doing.
Returns: C<1> if you have the module installed and you have the
appropriate version. C<0> otherwise.
......
......@@ -214,163 +214,7 @@ use Bugzilla::Install::Requirements;
# Here we check for --MODULES--
#
print "\nChecking perl modules ...\n" unless $silent;
my $modules = REQUIRED_MODULES;
$::root = ($^O =~ /MSWin32/i ? 'Administrator' : 'root');
my %missing = ();
foreach my $module (@{$modules}) {
unless (have_vers($module->{name}, $module->{version}, $silent)) {
$missing{$module->{name}} = $module->{version};
}
}
print "\nYou need one of the following DBD modules installed, depending on\n"
. "which database you are using with Bugzilla:\n" unless $silent;
my $have_one_dbd = 0;
my $db_modules = DB_MODULE;
foreach my $db (keys %$db_modules) {
if (have_vers($db_modules->{$db}->{dbd},
$db_modules->{$db}->{dbd_version}, $silent))
{
$have_one_dbd = 1;
}
}
print "\nThe following Perl modules are optional:\n" unless $silent;
my $opt_modules = OPTIONAL_MODULES;
my %have_mod;
foreach my $module (@$opt_modules) {
$have_mod{$module->{name}} =
have_vers($module->{name}, $module->{version}, $silent);
}
print "\nThe following modules are required for mod_perl support:\n"
unless $silent;
my $mp_modules = MOD_PERL_MODULES;
foreach my $module (@$mp_modules) {
$have_mod{$module->{name}} =
have_vers($module->{name}, $module->{version}, $silent);
}
print "\n" unless $silent;
if ($^O =~ /MSWin32/i && !$silent) {
print "All the required modules are available at:\n";
print " http://landfill.bugzilla.org/ppm/\n";
print "You can add the repository with the following command:\n";
print " ppm rep add bugzilla http://landfill.bugzilla.org/ppm/\n\n";
}
if ((!$have_mod{'GD'} || !$have_mod{'Chart::Base'}) && !$silent) {
print "If you you want to see graphical bug charts (plotting historical ";
print "data over \ntime), you should install libgd and the following Perl ";
print "modules:\n\n";
print "GD: " . install_command("GD") ."\n" if !$have_mod{'GD'};
print "Chart: " . install_command("Chart::Base") . "\n"
if !$have_mod{'Chart::Base'};
print "\n";
}
if (!$have_mod{'XML::Twig'} && !$silent) {
print "If you want to use the bug import/export feature to move bugs to\n",
"or from other bugzilla installations, you will need to install\n",
"the XML::Twig module by running (as $::root):\n\n",
" " . install_command("XML::Twig") . "\n\n";
}
if (!$have_mod{'LWP::UserAgent'} && !$silent) {
print "If you want to use the automatic update notification feature\n",
"you will need to install the LWP::UserAgent module by running\n",
"(as $::root):\n\n",
" " . install_command("LWP::UserAgent") . "\n\n";
}
if (!$have_mod{'Image::Magick'} && !$silent) {
print "If you want to convert BMP image attachments to PNG to conserve\n",
"disk space, you will need to install the ImageMagick application\n",
"Available from http://www.imagemagick.org, and the Image::Magick\n",
"Perl module by running (as $::root):\n\n",
" " . install_command("Image::Magick") . "\n\n";
}
if ( (!$have_mod{'GD'} || !$have_mod{'GD::Graph'}
|| !$have_mod{'GD::Text::Align'}
|| !$have_mod{'Template::Plugin::GD::Image'})
&& !$silent)
{
print "If you want to see graphical bug reports (bar, pie and line ";
print "charts of \ncurrent data), you should install libgd and the ";
print "following Perl modules:\n\n";
print "GD: " . install_command("GD") . "\n" if !$have_mod{'GD'};
print "GD::Graph: " . install_command("GD::Graph") . "\n"
if !$have_mod{'GD::Graph'};
print "GD::Text::Align: " . install_command("GD::Text::Align") . "\n"
if !$have_mod{'GD::Text::Align'};
print "Template::Plugin::GD: " . install_command('Template::Plugin::GD')
. "\n" if !$have_mod{'Template::Plugin::GD::Image'};
print "\n";
}
if (!$have_mod{'PatchReader'} && !$silent) {
print "If you want to see pretty HTML views of patches, you should ";
print "install the \nPatchReader module:\n";
print "PatchReader: " . install_command("PatchReader") . "\n\n";
}
if (!$have_mod{'Net::LDAP'} && !$silent) {
print "If you wish to use LDAP authentication, then you must",
" install Net::LDAP:\n",
"Net::LDAP: " . install_command('Net::LDAP') . "\n\n";
}
if (!$have_mod{'mod_perl2'} && !$silent) {
print "If you would like mod_perl support, you must install at least\n",
"the minimum required version of mod_perl. You can download",
" mod_perl from:\n",
" http://perl.apache.org/download/binaries.html\n",
"Make sure that you get the 2.0 version, not the 1.0 version.\n\n";
}
if ((!$have_mod{'Apache::DBI'} || !$have_mod{'CGI'}) && !$silent) {
print "For mod_perl support, you must install the following perl",
" module(s):\n";
print " Apache::DBI: " . install_command('Apache::DBI') . "\n"
if !$have_mod{'Apache::DBI'};
print " CGI: " . install_command('CGI') . "\n"
if !$have_mod{'CGI'};
print "\n";
}
if (!$have_one_dbd) {
print "\n";
print "Bugzilla requires that at least one DBD module be installed in\n",
"order to access a database. You can install the correct one by\n",
"picking the command listed below for your database:\n";
foreach my $db (keys %$db_modules) {
print " " . $db_modules->{$db}->{name} . ": "
. install_command($db_modules->{$db}->{dbd}) . "\n";
print " Minimum version required: "
. $db_modules->{$db}->{dbd_version} . "\n";
}
print "\n";
}
if (%missing) {
print "\n";
print "Bugzilla requires some Perl modules which are either missing from\n",
"your system, or the version on your system is too old.\n",
"They can be installed by running (as $::root) the following:\n";
foreach my $module (keys %missing) {
print " " . install_command("$module") . "\n";
if ($missing{$module} > 0) {
print " Minimum version required: $missing{$module}\n";
}
}
print "\n";
}
exit if (%missing || !$have_one_dbd);
exit if !check_requirements(!$silent)->{pass};
}
}
......@@ -438,6 +282,8 @@ BEGIN {
# Cute, ey?
#
my $root = ROOT_USER;
print "Checking user setup ...\n" unless $silent;
$@ = undef;
my $localconfig = bz_locations()->{'localconfig'};
......@@ -617,7 +463,7 @@ LocalVar('webservergroup', <<"END");
# want. You should only have this set to "" if this is a testing installation
# and you cannot set this up any other way. YOU HAVE BEEN WARNED!
# If you set this to anything other than "", you will need to run checksetup.pl
# as $::root, or as a user who is a member of the specified group.
# as $root, or as a user who is a member of the specified group.
\$webservergroup = "$webservergroup_default";
END
......@@ -725,10 +571,10 @@ if ($my_webservergroup && !$silent) {
print <<EOF;
Warning: you have entered a value for the "webservergroup" parameter in
localconfig, but you are not either a) running this script as $::root; or b) a
localconfig, but you are not either a) running this script as $root; or b) a
member of this group. This can cause permissions problems and decreased
security. If you experience problems running Bugzilla scripts, log in as
$::root and re-run this script, become a member of the group, or remove the
$root and re-run this script, become a member of the group, or remove the
value of the "webservergroup" parameter. Note that any warnings about
"uninitialized values" that you may see below are caused by this.
......@@ -798,7 +644,7 @@ if ($my_db_check) {
my $actual_dbd_ver = DB_MODULE->{lc($my_db_driver)}->{dbd_version};
my $sql_server = DB_MODULE->{lc($my_db_driver)}->{name};
my $sql_want = DB_MODULE->{lc($my_db_driver)}->{db_version};
unless (have_vers($actual_dbd, $actual_dbd_ver, $silent)) {
unless (have_vers($actual_dbd, $actual_dbd_ver, !$silent)) {
print "For $sql_server, Bugzilla requires that perl's"
. " $actual_dbd be installed.\nTo install this module,"
. " you can do:\n " . install_command($actual_dbd) . "\n";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment