#!@PERL@ # BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: # # This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) # # # LICENSE: # # 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. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # # CONTRIBUTION SUBMISSION POLICY: # # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) # # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that # you are the copyright holder for those contributions and you grant # Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. # # END BPS TAGGED 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; my %args; my %deps; GetOptions( \%args, 'v|verbose', 'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', 'with-ORACLE', 'with-FASTCGI', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2', 'with-DEV', 'download=s', 'repository=s' ); unless (keys %args) { help(); exit(0); } # Set up defaults $args{'with-MASON'} = 1; $args{'with-CORE'} = 1; $args{'with-DEV'} =1; $args{'with-CLI'} =1; $args{'with-MAILGATE'} =1; { my $section; my %always_show_sections = ( perl => 1, users => 1, ); sub section { my $s = shift; $section = $s; print "$s:\n"; } my $any_missing = 0; sub found { my $msg = shift; my $test = shift; my $extra = shift; $any_missing = 1 unless $test; if ($args{'v'} or not $test or $always_show_sections{$section}) { print "\t$msg..."; print $test ? "found" : "MISSING"; print "\n"; } print "\t\t$extra\n" if defined $extra; } sub conclude { if ($any_missing) { print "\nSOMETHING WAS MISSING!\n"; } else { print "\nEverything was found.\n"; } } } 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 You can also specify -v or --verbose to list the status of all dependencies, rather than just the missing ones. . } sub _ { map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] ); } $deps{'CORE'} = [ _( << '.') ]; Digest::base Digest::MD5 2.27 DBI 1.37 Test::Inline Class::ReturnValue 0.40 DBIx::SearchBuilder 1.26 Text::Template File::Spec 0.8 HTML::Entities HTML::Scrubber 0.08 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 Time::HiRes File::Temp Term::ReadKey Text::Autoformat Text::Quoted 1.3 Tree::Simple 1.04 Scalar::Util Module::Versions::Report Cache::Simple::TimedExpiry XML::Simple . $deps{'MASON'} = [ _( << '.') ]; Params::Validate 0.02 Cache::Cache Exception::Class 1.14 HTML::Mason 1.23 MLDBM Errno FreezeThaw Digest::MD5 2.27 CGI::Cookie 1.20 Storable 2.08 Apache::Session 1.53 XML::RSS 1.05 HTTP::Server::Simple 0.07 HTTP::Server::Simple::Mason 0.09 Text::WikiFormat . $deps{'MAILGATE'} = [ _( << '.') ]; HTML::TreeBuilder HTML::FormatText Getopt::Long LWP::UserAgent . $deps{'CLI'} = [ _( << '.') ]; Getopt::Long 2.24 . $deps{'DEV'} = [ _( << '.') ]; Regexp::Common Test::Inline Apache::Test HTML::Form HTML::TokeParser WWW::Mechanize Test::WWW::Mechanize Module::Refresh 0.03 . $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 HTML::Mason 1.31 . $deps{'MYSQL'} = [ _( << '.') ]; DBD::mysql 2.1018 . $deps{'ORACLE'} = [ _( << '.') ]; DBD::Oracle . $deps{'POSTGRESQL'} = [ _( << '.') ]; DBD::Pg 1.41 . $deps{'SQLITE'} = [ _( << '.') ]; DBD::SQLite . if ($args{'download'}) { download_mods(); } check_perl_version(); check_users(); foreach my $type (keys %args) { next unless ($type =~ /^with-(.*?)$/); my $type = $1; section("$type dependencies"); my @deps = (@{$deps{$type}}); while (@deps) { my $module = shift @deps; my $version = shift @deps; my $ret = test_dep($module, $version); if ($args{'install'} && !$ret) { resolve_dep($module); } } } conclude(); sub test_dep { my $module = shift; my $version = shift; eval "use $module $version ()"; if ($@) { my $error = $@; $error =~ s/\n(.*)$//s; undef $error unless $error =~ /this is only/; found("$module $version", 0, $error); return undef; } else { found("$module $version", 1); return 1; } } sub resolve_dep { my $module = shift; system( qq[@PERL@ -MCPAN -e'install("$module")'] ); } sub download_mods { my %modules; use CPAN; foreach my $key (keys %deps) { my @deps = (@{$deps{$key}}); while (@deps) { my $mod = shift @deps; my $ver = shift @deps; next if ($mod =~ /^(DBD-|Apache-Request)/); $modules{$mod} = $ver; } } my @mods = keys %modules; CPAN::get(); my $moddir = $args{'download'}; foreach my $mod (@mods) { $CPAN::Config->{'build_dir'} = $moddir; CPAN::get($mod); } opendir(DIR, $moddir); while ( my $dir = readdir(DIR)) { print "Dir is $dir\n"; next if ( $dir =~ /^\.\.?$/); # Skip things we've previously tagged my $out = `svn ls $args{'repository'}/tags/$dir`; next if ($out); if ($dir =~ /^(.*)-(.*?)$/) { `svn_load_dirs -no_user_input -t tags/$dir -v $args{'repository'} dists/$1 $moddir/$dir`; `rm -rf $moddir/$dir`; } } closedir(DIR); exit; } sub check_perl_version { section("perl"); eval {require 5.008003}; if ($@) { found("5.8.3", 0, "RT is known to be non-functional on versions of perl older than 5.8.3. Please upgrade to 5.8.3 or newer."); die; } else { found("5.8.3", 1); } } sub check_users { section("users"); found("rt group (@RTGROUP@)", defined getgrnam("@RTGROUP@")); found("bin owner (@BIN_OWNER@)", defined getpwnam("@BIN_OWNER@")); found("libs owner (@LIBS_OWNER@)", defined getpwnam("@LIBS_OWNER@")); found("libs group (@LIBS_GROUP@)", defined getgrnam("@LIBS_GROUP@")); found("web owner (@WEB_USER@)", defined getpwnam("@WEB_USER@")); found("web group (@WEB_GROUP@)", defined getgrnam("@WEB_GROUP@")); } 1;