X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Fsbin%2Frt-test-dependencies;h=f5eb584a31e744c77f5c0d5d1bac9cf60a9aabab;hb=43a06151e47d2c59b833cbd8c26d97865ee850b6;hp=1f9fa45b1c3e13c341ac88628a78353c114bcf49;hpb=232eb0de0d2b4dfa1c93a180b787126c3377ba02;p=freeside.git diff --git a/rt/sbin/rt-test-dependencies b/rt/sbin/rt-test-dependencies old mode 100644 new mode 100755 index 1f9fa45b1..f5eb584a3 --- a/rt/sbin/rt-test-dependencies +++ b/rt/sbin/rt-test-dependencies @@ -1,28 +1,51 @@ #!/usr/bin/perl -# BEGIN LICENSE BLOCK -# -# Copyright (c) 1996-2003 Jesse Vincent -# -# (Except where explictly superceded by other copyright notices) -# +# BEGIN BPS TAGGED BLOCK {{{ +# +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2012 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. -# -# 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 - +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 or visit their web page on the internet at +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# +# +# 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. @@ -31,251 +54,608 @@ 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(); +GetOptions( + \%args, 'v|verbose', + 'install', 'with-MYSQL', + 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', + 'with-ORACLE', 'with-FASTCGI', + 'with-MODPERL1', 'with-MODPERL2', + 'with-STANDALONE', + + 'with-DEV', + + 'with-GPG', + 'with-ICAL', + 'with-SMTP', + 'with-GRAPHVIZ', + 'with-GD', + 'with-DASHBOARDS', + 'with-USERLOGO', + 'with-SSL-MAILGATE', + + 'download=s', + 'repository=s', + 'list-deps', + 'help|h', +); + +if ( $args{help} ) { + require Pod::Usage; + Pod::Usage::pod2usage( { verbose => 2 } ); + exit; } -$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; -} +# Set up defaults +my %default = ( + 'with-MASON' => 1, + 'with-PSGI' => 0, + 'with-CORE' => 1, + 'with-CLI' => 1, + 'with-MAILGATE' => 1, + 'with-DEV' => 0, + 'with-GPG' => 1, + 'with-ICAL' => 1, + 'with-SMTP' => 1, + 'with-GRAPHVIZ' => 0, + 'with-GD' => 0, + 'with-DASHBOARDS' => 1, + 'with-USERLOGO' => 1, + 'with-SSL-MAILGATE' => 0, +); +$args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default; + +{ + my $section; + my %always_show_sections = ( + perl => 1, + users => 1, + ); + + sub section { + my $s = shift; + $section = $s; + print "$s:\n" unless $args{'list-deps'}; + } + + sub print_found { + my $msg = shift; + my $test = shift; + my $extra = shift; + + unless ( $args{'list-deps'} ) { + if ( $args{'v'} or not $test or $always_show_sections{$section} ) { + print "\t$msg ..."; + print $test ? "found" : "MISSING"; + print "\n"; + } -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; + print "\t\t$extra\n" if defined $extra; + } + } } +sub conclude { + my %missing_by_type = @_; -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 + unless ( $args{'list-deps'} ) { + unless ( keys %missing_by_type ) { + print "\nAll dependencies have been found.\n"; + return; + } - --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) + print "\nSOME DEPENDENCIES WERE MISSING.\n"; - --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 + for my $type ( keys %missing_by_type ) { + my $missing = $missing_by_type{$type}; - --with-dev Tools needed for RT development -. + print "$type missing dependencies:\n"; + for my $name ( keys %$missing ) { + my $module = $missing->{$name}; + my $version = $module->{version}; + my $error = $module->{error}; + print_found( $name . ( $version && !$error ? " >= $version" : "" ), + 0, $module->{error} ); + } + } + exit 1; + } } +sub text_to_hash { + my %hash; + for my $line ( split /\n/, $_[0] ) { + my($key, $value) = $line =~ /(\S+)\s*(\S*)/; + $value ||= ''; + $hash{$key} = $value; + } -sub _ { - map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] ); + return %hash; } -$deps{'CORE'} = [ _( << '.') ]; +$deps{'CORE'} = [ text_to_hash( << '.') ]; +Class::Accessor 0.34 +DateTime 0.44 +DateTime::Locale 0.40 +Digest::base Digest::MD5 2.27 +Digest::SHA DBI 1.37 -Test::Inline Class::ReturnValue 0.40 -DBIx::SearchBuilder 1.01 -Text::Template +DBIx::SearchBuilder 1.59 +Text::Template 1.44 +File::ShareDir File::Spec 0.8 -HTML::Entities -Net::Domain -Log::Dispatch 2.0 +HTML::Quoted +HTML::Scrubber 0.08 +Log::Dispatch 2.23 +Sys::Syslog 0.16 Locale::Maketext 1.06 Locale::Maketext::Lexicon 0.32 Locale::Maketext::Fuzzy -MIME::Entity 5.108 +MIME::Entity 5.425 Mail::Mailer 1.57 -Net::SMTP +Email::Address Text::Wrapper Time::ParseDate -File::Temp -Term::ReadKey -Text::Autoformat -Text::Quoted 1.3 +Time::HiRes +File::Temp 0.19 +Text::Quoted 2.02 +Tree::Simple 1.04 +UNIVERSAL::require +Regexp::Common Scalar::Util +Module::Versions::Report 1.05 +Cache::Simple::TimedExpiry +Encode 2.39 +CSS::Squish 0.06 +File::Glob +Devel::StackTrace 1.19 +Text::Password::Pronounceable +Devel::GlobalDestruction +List::MoreUtils +Net::CIDR +Regexp::Common::net::CIDR +Regexp::IPv6 . -$deps{'MASON'} = [ _( << '.') ]; -Params::Validate 0.02 -Cache::Cache -Exception::Class -HTML::Mason 1.16 -MLDBM +$deps{'MASON'} = [ text_to_hash( << '.') ]; +HTML::Mason 1.43 Errno -FreezeThaw Digest::MD5 2.27 CGI::Cookie 1.20 Storable 2.08 Apache::Session 1.53 +XML::RSS 1.05 +Text::WikiFormat 0.76 +CSS::Squish 0.06 +Devel::StackTrace 1.19 +JSON +IPC::Run3 +. + +$deps{'PSGI'} = [ text_to_hash( << '.') ]; +CGI 3.38 +CGI::PSGI 0.12 +HTML::Mason::PSGIHandler 0.52 +Plack 0.9971 +Plack::Handler::Starlet +CGI::Emulate::PSGI . -$deps{'MAILGATE'} = [ _( << '.') ]; +$deps{'MAILGATE'} = [ text_to_hash( << '.') ]; HTML::TreeBuilder HTML::FormatText Getopt::Long LWP::UserAgent +Pod::Usage . -$deps{'CLI'} = [ _( << '.') ]; -Getopt::Long 2.24 +$deps{'SSL-MAILGATE'} = [ text_to_hash( << '.') ]; +Crypt::SSLeay +Net::SSL +LWP::UserAgent 6.0 +LWP::Protocol::https +Mozilla::CA . -$deps{'DEV'} = [ _( << '.') ]; -Regexp::Common -Time::HiRes -Test::Inline -WWW::Mechanize +$deps{'CLI'} = [ text_to_hash( << '.') ]; +Getopt::Long 2.24 +LWP +HTTP::Request::Common +Text::ParseWords +Term::ReadLine +Term::ReadKey . -$deps{'FASTCGI'} = [ _( << '.') ]; -CGI 2.92 -FCGI -CGI::Fast +$deps{'DEV'} = [ text_to_hash( << '.') ]; +Email::Abstract +Test::Email +HTML::Form +HTML::TokeParser +WWW::Mechanize 1.52 +Test::WWW::Mechanize 1.30 +Module::Refresh 0.03 +Test::Expect 0.31 +XML::Simple +File::Find +Test::Deep 0 # needed for shredder tests +String::ShellQuote 0 # needed for gnupg-incoming.t +Log::Dispatch::Perl +Test::Warn +Test::Builder 0.90 # needed for is_passing +Test::MockTime +Log::Dispatch::Perl +Test::WWW::Mechanize::PSGI +Plack::Middleware::Test::StashWarnings +Test::LongString . -$deps{'SPEEDYCGI'} = [ _( << '.') ]; -CGI 2.92 -CGI::SpeedyCGI +$deps{'FASTCGI'} = [ text_to_hash( << '.') ]; +FCGI +FCGI::ProcManager . - -$deps{'MODPERL1'} = [ _( << '.') ]; -CGI 2.92 +$deps{'MODPERL1'} = [ text_to_hash( << '.') ]; Apache::Request Apache::DBI 0.92 . -$deps{'MODPERL2'} = [ _( << '.') ]; -CGI 2.92 +$deps{'MODPERL2'} = [ text_to_hash( << '.') ]; Apache::DBI +HTML::Mason 1.36 . -$deps{'I18N-COMPAT'} = [ _( << '.') ]; -Text::Iconv -Encode::compat 0.04 -. - -$deps{'MYSQL'} = [ _( << '.') ]; +$deps{'MYSQL'} = [ text_to_hash( << '.') ]; DBD::mysql 2.1018 . -$deps{'ORACLE'} = [ _( << '.') ]; + +$deps{'ORACLE'} = [ text_to_hash( << '.') ]; DBD::Oracle . -$deps{'POSTGRESQL'} = [ _( << '.') ]; -DBD::Pg + +$deps{'POSTGRESQL'} = [ text_to_hash( << '.') ]; +DBD::Pg 1.43 . -print "perl:\n"; -print "\t5.8.3"; -eval {require 5.008003}; -if ($@) { -print "...MISSING.\n"; - eval {require 5.008000}; - if ($@) { - print "\nRT is known to be non-functional on versions of perl older than 5.8.3.\nPlease upgrade to 5.8.3 or newer\n\n"; - die; - } - - eval {require 5.008003}; - if ($@) { - print "\nRT is known to be non-functional on versions of perl older than 5.8.3.\nPlease upgrade to 5.8.3 or newer\n\n"; - } -} else { - print "...found\n"; +$deps{'SQLITE'} = [ text_to_hash( << '.') ]; +DBD::SQLite 1.00 +. -} +$deps{'GPG'} = [ text_to_hash( << '.') ]; +GnuPG::Interface +PerlIO::eol +. + +$deps{'ICAL'} = [ text_to_hash( << '.') ]; +Data::ICal +. + +$deps{'SMTP'} = [ text_to_hash( << '.') ]; +Net::SMTP +. + +$deps{'DASHBOARDS'} = [ text_to_hash( << '.') ]; +HTML::RewriteAttributes 0.04 +MIME::Types +. + +$deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ]; +GraphViz +IPC::Run +. + +$deps{'GD'} = [ text_to_hash( << '.') ]; +GD +GD::Graph +GD::Text +. +$deps{'USERLOGO'} = [ text_to_hash( << '.') ]; +Convert::Color +. -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); +my %AVOID = ( + 'DBD::Oracle' => [qw(1.23)], +); -if ($args{'install'} && !$ret) { - resolve_dep($module); +if ($args{'download'}) { + download_mods(); } + + +check_perl_version(); + +check_users(); + +my %Missing_By_Type = (); +foreach my $type (sort grep $args{$_}, keys %args) { + next unless ($type =~ /^with-(.*?)$/) and $deps{$1}; + + $type = $1; + section("$type dependencies"); + + my @missing; + my @deps = @{ $deps{$type} }; + + my %missing = test_deps(@deps); + + if ( $args{'install'} ) { + for my $module (keys %missing) { + resolve_dep($module, $missing{$module}{version}); + my $m = $module . '.pm'; + $m =~ s!::!/!g; + if ( delete $INC{$m} ) { + my $symtab = $module . '::'; + no strict 'refs'; + for my $symbol ( keys %{$symtab} ) { + next if substr( $symbol, -2, 2 ) eq '::'; + delete $symtab->{$symbol}; + } + } + delete $missing{$module} + if test_dep($module, $missing{$module}{version}, $AVOID{$module}); + } + } + + $Missing_By_Type{$type} = \%missing if keys %missing; } + +conclude(%Missing_By_Type); + +sub test_deps { + my @deps = @_; + + my %missing; + while(@deps) { + my $module = shift @deps; + my $version = shift @deps; + my($test, $error) = test_dep($module, $version, $AVOID{$module}); + my $msg = $module . ($version && !$error ? " >= $version" : ''); + print_found($msg, $test, $error); + + $missing{$module} = { version => $version, error => $error } unless $test; + } + + return %missing; } + 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; - } + my $module = shift; + my $version = shift; + my $avoid = shift; + + if ( $args{'list-deps'} ) { + print $module, ': ', $version || 0, "\n"; + } + else { + eval "use $module $version ()"; + if ( my $error = $@ ) { + return 0 unless wantarray; + + $error =~ s/\n(.*)$//s; + $error =~ s/at \(eval \d+\) line \d+\.$//; + undef $error if $error =~ /this is only/; + + return ( 0, $error ); + } + + if ( $avoid ) { + my $version = $module->VERSION; + if ( grep $version eq $_, @$avoid ) { + return 0 unless wantarray; + return (0, "It's known that there are problems with RT and version '$version' of '$module' module. If it's the latest available version of the module then you have to downgrade manually."); + } + } + + return 1; + } } sub resolve_dep { - my $module = shift; - use CPAN; - CPAN::Shell->install($module); - + my $module = shift; + my $version = shift; + + print "\nInstall module $module\n"; + + my $ext = $ENV{'RT_FIX_DEPS_CMD'} || $ENV{'PERL_PREFER_CPAN_CLIENT'}; + unless( $ext ) { + my $configured = 1; + { + local @INC = @INC; + if ( $ENV{'HOME'} ) { + unshift @INC, "$ENV{'HOME'}/.cpan"; + } + $configured = eval { require CPAN::MyConfig } || eval { require CPAN::Config }; + } + unless ( $configured ) { + print <install($module) }; + return $rv unless $@; + + print <&2`; } +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`; -sub print_help { - print << "EOF"; + } -$0 FLAG DBTYPE + } + closedir(DIR); + exit; +} +sub check_perl_version { + section("perl"); + eval {require 5.008003}; + if ($@) { + print_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."); + exit(1); + } else { + print_found( sprintf(">=5.8.3(%vd)", $^V), 1 ); + } +} -$0 is a tool for RT that will tell you if you've got all -the modules RT depends on properly installed. +sub check_users { + section("users"); + print_found("rt group (freeside)", defined getgrnam("freeside")); + print_found("bin owner (root)", defined getpwnam("root")); + print_found("libs owner (root)", defined getpwnam("root")); + print_found("libs group (bin)", defined getgrnam("bin")); + print_found("web owner (freeside)", defined getpwnam("freeside")); + print_found("web group (freeside)", defined getgrnam("freeside")); +} -Flags: (only one flag is valid for a given run) +1; --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. +__END__ --warn will tell you what isn't properly installed +=head1 NAME --fix will use CPANPLUS.pm or CPAN.pm to magically make everything better +rt-test-dependencies - test rt's dependencies -DBTYPE is one of: - oracle, pg, mysql +=head1 SYNOPSIS -EOF + rt-test-dependencies + rt-test-dependencies --install + rt-test-dependencies --with-mysql --with-fastcgi + +=head1 DESCRIPTION + +by default, C determines whether you have installed all +the perl modules RT needs to run. + +the "RT_FIX_DEPS_CMD" environment variable, if set, will be used instead of +the standard CPAN shell by --install to install any required modules. it will +be called with the module name, or, if "RT_FIX_DEPS_CMD" contains a "%s", will +replace the "%s" with the module name before calling the program. + +=head1 OPTIONS + +=over + +=item install + + install missing modules + +=item verbose + +list the status of all dependencies, rather than just the missing ones. + +-v is equal to --verbose + +=item specify dependencies + +=over + +=item --with-mysql + + database interface for mysql + +=item --with-postgresql + + database interface for postgresql + +=item with-oracle + + database interface for oracle + +=item with-sqlite + + database interface and driver for sqlite (unsupported) + +=item with-fastcgi + + libraries needed to support the fastcgi handler + +=item with-modperl1 + + libraries needed to support the modperl 1 handler + +=item with-modperl2 + + libraries needed to support the modperl 2 handler + +=item with-dev + + tools needed for RT development + +=back + +=back - exit(0); -}