]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 344855: Create a subroutine that does all of checksetup's requirements checking
authormkanat%bugzilla.org <>
Fri, 28 Jul 2006 15:28:05 +0000 (15:28 +0000)
committermkanat%bugzilla.org <>
Fri, 28 Jul 2006 15:28:05 +0000 (15:28 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> (module owner) a=myk

Bugzilla/Constants.pm
Bugzilla/Install/Requirements.pm
checksetup.pl

index 8a57b343a53b4c16616fdbbe0bebc3e91e810bae..0bbbfa7d5e201a42fe61a5251b65d656beea6597 100644 (file)
@@ -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
index f38af2a099b10be891e83b777ce6dfb1709843e4..6d119044c2c3f2ab12a582e0af9931189e3462f7 100644 (file)
@@ -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.
index 5c2d889f4af7c41f866677b698253de57fc41ad5..a7f459bb19841aca9e7a1008a285585fb84b242a 100755 (executable)
@@ -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";