#!/usr/bin/perl # BEGIN LICENSE BLOCK # # Copyright (c) 1996-2003 Jesse Vincent # # (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. # # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # Unless otherwise specified, all modifications, corrections or # extensions to this work which alter its source code become the # property of Best Practical Solutions, LLC when submitted for # inclusion in the work. # # # END LICENSE BLOCK # # This is just a basic script that checks to make sure that all # the modules needed by RT before you can install it. # use strict; no warnings qw(numeric redefine); use Getopt::Long; use CPAN; my %args; my %deps; GetOptions(\%args,'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', 'with-ORACLE', 'with-FASTCGI', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2' ,'with-DEV'); if (!keys %args) { help(); exit(0); } if ($args{'with-MODPERL2'}) { warn_modperl2(); } $args{'with-MASON'} = 1; $args{'with-CORE'} = 1; $args{'with-DEV'} =1; $args{'with-CLI'} =1; $args{'with-MAILGATE'} =1; if ($] < 5.007) { $args{'with-I18N-COMPAT'} = 1; } sub warn_modperl2 { print <<'.'; NOTE: mod_perl 2.0 isn't quite ready for prime_time just yet; Best Practical Solutions strongly recommends that sites use Apache 1.3 or FastCGI. If you MUST use mod_perl 2.0 (or 1.99), please read the mailing list archives before asking for help. . sleep 5; } sub help { print <<'.'; By default, testdeps determine whether you have installed all the perl modules RT needs to run. --install Install missing modules The following switches will tell the tool to check for specific dependencies --with-mysql Database interface for MySQL --with-postgresql Database interface for PostgreSQL --with-sqlite Database interface and driver for SQLite (unsupported) --with-oracle Database interface for oracle (unsupported) --with-fastcgi Libraries needed to support the fastcgi handler --with-speedycgi Libraries needed to support the speedycgi handler --with-modperl1 Libraries needed to support the modperl 1 handler --with-modperl2 Libraries needed to support the modperl 2 handler --with-dev Tools needed for RT development . } sub _ { map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] ); } $deps{'CORE'} = [ _( << '.') ]; Digest::MD5 2.27 DBI 1.37 Test::Inline Class::ReturnValue 0.40 DBIx::SearchBuilder 0.97 Text::Template File::Spec 0.8 HTML::Entities Net::Domain Log::Dispatch 2.0 Locale::Maketext 1.06 Locale::Maketext::Lexicon 0.32 Locale::Maketext::Fuzzy MIME::Entity 5.108 Mail::Mailer 1.57 Net::SMTP Text::Wrapper Time::ParseDate File::Temp Term::ReadKey Text::Autoformat Text::Quoted 1.3 Scalar::Util . $deps{'MASON'} = [ _( << '.') ]; Params::Validate 0.02 Cache::Cache Exception::Class HTML::Mason 1.16 MLDBM Errno FreezeThaw Digest::MD5 2.27 CGI::Cookie 1.20 Storable 2.08 Apache::Session 1.53 . $deps{'MAILGATE'} = [ _( << '.') ]; HTML::TreeBuilder HTML::FormatText Getopt::Long LWP::UserAgent . $deps{'CLI'} = [ _( << '.') ]; Getopt::Long 2.24 . $deps{'DEV'} = [ _( << '.') ]; Regexp::Common Time::HiRes Test::Inline WWW::Mechanize . $deps{'FASTCGI'} = [ _( << '.') ]; CGI 2.92 FCGI CGI::Fast . $deps{'SPEEDYCGI'} = [ _( << '.') ]; CGI 2.92 CGI::SpeedyCGI . $deps{'MODPERL1'} = [ _( << '.') ]; CGI 2.92 Apache::Request Apache::DBI 0.92 . $deps{'MODPERL2'} = [ _( << '.') ]; CGI 2.92 Apache::DBI . $deps{'I18N-COMPAT'} = [ _( << '.') ]; Text::Iconv Encode::compat 0.04 . $deps{'MYSQL'} = [ _( << '.') ]; DBD::mysql 2.1018 . $deps{'ORACLE'} = [ _( << '.') ]; DBD::Oracle . $deps{'POSTGRESQL'} = [ _( << '.') ]; DBD::Pg . print "perl:\n"; print "\t5.8.0"; eval {require 5.008}; if ($@) { print "...missing.\n"; eval {require 5.006001}; if ($@) { print " RT is known to be non-functional on versions of perl older than 5.6.1. Please upgrade to 5.8.0 or newer"; die; } else { print " RT is not supported on perl 5.6.1\n"; } } else { print "...found\n"; } foreach my $type (keys %args) { next unless ($type =~ /^with-(.*?)$/); my $type = $1; print "$type dependencies:\n"; my @deps = (@{$deps{$type}}); while (@deps) { my $module = shift @deps; my $version = shift @deps; my $ret; $ret =test_dep($module, $version); if ($args{'install'} && !$ret) { resolve_dep($module); } } } sub test_dep { my $module = shift; my $version = shift; print "\t$module $version"; eval "use $module $version" ; if ($@) { my $error = $@; $error =~ s/\n(.*)$//s; print "...MISSING\n"; print "\t\t$error\n" if $error =~ /this is only/; return undef; } else { print "...found\n"; return 1; } } sub resolve_dep { my $module = shift; use CPAN; CPAN::Shell->install($module); } sub print_help { print << "EOF"; $0 FLAG DBTYPE $0 is a tool for RT that will tell you if you've got all the modules RT depends on properly installed. Flags: (only one flag is valid for a given run) -quiet will check to see if we've got everything we need and will exit with a return code of (1) if we don't. -warn will tell you what isn't properly installed -fix will use CPANPLUS.pm or CPAN.pm to magically make everything better DBTYPE is one of: oracle, pg, mysql EOF exit(0); }