2 # BEGIN BPS TAGGED BLOCK {{{
6 # This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
7 # <sales@bestpractical.com>
9 # (Except where explicitly superseded by other copyright notices)
14 # This work is made available to you under the terms of Version 2 of
15 # the GNU General Public License. A copy of that license should have
16 # been provided with this software, but in any event can be snarfed
19 # This work is distributed in the hope that it will be useful, but
20 # WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 # General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with this program; if not, write to the Free Software
26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
27 # 02110-1301 or visit their web page on the internet at
28 # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
31 # CONTRIBUTION SUBMISSION POLICY:
33 # (The following paragraph is not intended to limit the rights granted
34 # to you to modify and distribute this software under the terms of
35 # the GNU General Public License and is only of importance to you if
36 # you choose to contribute your changes and enhancements to the
37 # community by submitting them to Best Practical Solutions, LLC.)
39 # By intentionally submitting any modifications, corrections or
40 # derivatives to this work, or any other work intended for use with
41 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
42 # you are the copyright holder for those contributions and you grant
43 # Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
44 # royalty-free, perpetual, license to use, copy, create derivative
45 # works based on those contributions, and sublicense and distribute
46 # those contributions and any derivatives thereof.
48 # END BPS TAGGED BLOCK }}}
50 # This is just a basic script that checks to make sure that all
51 # the modules needed by RT before you can install it.
56 no warnings qw(numeric redefine);
60 my @orig_argv = @ARGV;
64 'with-MYSQL', 'with-PG', 'with-SQLITE', 'with-ORACLE',
65 'with-FASTCGI', 'with-MODPERL1', 'with-MODPERL2', 'with-STANDALONE',
83 Pod::Usage::pod2usage( { verbose => 2 } );
92 'with-DEVELOPER' => 0,
98 'with-DASHBOARDS' => 1,
100 'with-HTML-DOC' => 0,
102 $args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default;
106 my %always_show_sections = (
114 print "$s:\n" unless $args{'list-deps'};
122 unless ( $args{'list-deps'} ) {
123 if ( $args{'v'} or not $test or $always_show_sections{$section} ) {
125 print $test ? "found" : "MISSING";
129 print "\t\t$extra\n" if defined $extra;
135 my %missing_by_type = @_;
137 unless ( $args{'list-deps'} ) {
138 unless ( keys %missing_by_type ) {
139 print "\nAll dependencies have been found.\n";
143 print "\nSOME DEPENDENCIES WERE MISSING.\n";
145 for my $type ( keys %missing_by_type ) {
146 my $missing = $missing_by_type{$type};
148 print "$type missing dependencies:\n";
149 for my $name ( keys %$missing ) {
150 my $module = $missing->{$name};
151 my $version = $module->{version};
152 my $error = $module->{error};
153 print_found( $name . ( $version && !$error ? " >= $version" : "" ),
154 0, $module->{error} );
158 print "\nPerl library path for /usr/bin/perl:\n";
159 print " $_\n" for @INC;
167 for my $line ( split /\n/, $_[0] ) {
168 my($key, $value) = $line =~ /(\S+)\s*(\S*)/;
170 $hash{$key} = $value;
176 $deps{'CORE'} = [ text_to_hash( << '.') ];
189 DateTime::Format::Natural 0.67
190 DateTime::Locale 0.40
192 DBIx::SearchBuilder 1.65
193 Devel::GlobalDestruction
194 Devel::StackTrace 1.19
207 HTML::FormatText::WithLinks 0.14
208 HTML::FormatText::WithLinks::AndTables
210 HTML::Mason::PSGIHandler 0.52
212 HTML::RewriteAttributes 0.05
219 Locale::Maketext 1.06
220 Locale::Maketext::Fuzzy 0.11
221 Locale::Maketext::Lexicon 0.32
227 Module::Versions::Report 1.05
230 Plack::Handler::Starlet
232 Regexp::Common::net::CIDR
237 Symbol::Global::Name 0.04
239 Text::Password::Pronounceable
242 Text::WikiFormat 0.76
251 $deps{'MAILGATE'} = [ text_to_hash( << '.') ];
261 $deps{'CLI'} = [ text_to_hash( << '.') ];
263 HTTP::Request::Common
270 $deps{'DEVELOPER'} = [ text_to_hash( << '.') ];
277 Plack::Middleware::Test::StashWarnings 0.06
279 String::ShellQuote 0 # needed for gnupg-incoming.t
280 Test::Builder 0.90 # needed for is_passing
281 Test::Deep 0 # needed for shredder tests
288 Test::WWW::Mechanize 1.30
289 Test::WWW::Mechanize::PSGI
294 $deps{'FASTCGI'} = [ text_to_hash( << '.') ];
299 $deps{'MODPERL1'} = [ text_to_hash( << '.') ];
304 $deps{'MODPERL2'} = [ text_to_hash( << '.') ];
308 $deps{'MYSQL'} = [ text_to_hash( << '.') ];
312 $deps{'ORACLE'} = [ text_to_hash( << '.') ];
316 $deps{'PG'} = [ text_to_hash( << '.') ];
320 $deps{'SQLITE'} = [ text_to_hash( << '.') ];
324 $deps{'GPG'} = [ text_to_hash( << '.') ];
330 $deps{'SMIME'} = [ text_to_hash( << '.') ];
336 $deps{'ICAL'} = [ text_to_hash( << '.') ];
340 $deps{'DASHBOARDS'} = [ text_to_hash( << '.') ];
346 $deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ];
351 $deps{'GD'} = [ text_to_hash( << '.') ];
357 $deps{'USERLOGO'} = [ text_to_hash( << '.') ];
361 $deps{'HTML-DOC'} = [ text_to_hash( <<'.') ];
367 'DBD::Oracle' => [qw(1.23)],
368 'Devel::StackTrace' => [qw(1.28 1.29)],
371 if ($args{'download'}) {
376 check_perl_version();
380 my %Missing_By_Type = ();
381 foreach my $type (sort grep $args{$_}, keys %args) {
382 next unless ($type =~ /^with-(.*?)$/) and $deps{$1};
385 section("$type dependencies");
388 my @deps = @{ $deps{$type} };
390 my %missing = test_deps(@deps);
392 if ( $args{'install'} ) {
393 for my $module (keys %missing) {
394 resolve_dep($module, $missing{$module}{version});
395 my $m = $module . '.pm';
397 if ( delete $INC{$m} ) {
398 my $symtab = $module . '::';
400 for my $symbol ( keys %{$symtab} ) {
401 next if substr( $symbol, -2, 2 ) eq '::';
402 delete $symtab->{$symbol};
405 delete $missing{$module}
406 if test_dep($module, $missing{$module}{version}, $AVOID{$module});
410 $Missing_By_Type{$type} = \%missing if keys %missing;
413 if ( $args{'install'} && keys %Missing_By_Type ) {
414 exec($0, @orig_argv, '--no-install');
417 conclude(%Missing_By_Type);
425 my $module = shift @deps;
426 my $version = shift @deps;
427 my($test, $error) = test_dep($module, $version, $AVOID{$module});
428 my $msg = $module . ($version && !$error ? " >= $version" : '');
429 print_found($msg, $test, $error);
431 $missing{$module} = { version => $version, error => $error } unless $test;
442 if ( $args{'list-deps'} ) {
443 print $module, ': ', $version || 0, "\n";
446 eval "{ local \$ENV{__WARN__}; use $module $version () }";
447 if ( my $error = $@ ) {
448 return 0 unless wantarray;
450 $error =~ s/\n(.*)$//s;
451 $error =~ s/at \(eval \d+\) line \d+\.$//;
452 undef $error if $error =~ /this is only/;
456 undef $error if defined $error and $error =~ /^Can't locate $path\.pm in \@INC/;
458 return ( 0, $error );
462 my $version = $module->VERSION;
463 if ( grep $version eq $_, @$avoid ) {
464 return 0 unless wantarray;
465 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.");
477 print "\nInstall module $module\n";
479 my $ext = $ENV{'RT_FIX_DEPS_CMD'} || $ENV{'PERL_PREFER_CPAN_CLIENT'};
484 if ( $ENV{'HOME'} ) {
485 unshift @INC, "$ENV{'HOME'}/.cpan";
487 $configured = eval { require CPAN::MyConfig } || eval { require CPAN::Config };
489 unless ( $configured ) {
491 You haven't configured the CPAN shell yet.
492 Please run `/usr/bin/perl -MCPAN -e shell` to configure it.
496 my $rv = eval { require CPAN; CPAN::Shell->install($module) };
497 return $rv unless $@;
500 Failed to load module CPAN.
502 -------- Error ---------
504 ------------------------
506 When we tried to start installing RT's perl dependencies,
507 we were unable to load the CPAN client. This module is usually distributed
508 with Perl. This usually indicates that your vendor has shipped an unconfigured
509 or incorrectly configured CPAN client.
510 The error above may (or may not) give you a hint about what went wrong
512 You have several choices about how to install dependencies in
515 1) use a different tool to install dependencies by running setting the following
516 shell environment variable and rerunning this tool:
517 RT_FIX_DEPS_CMD='/usr/bin/perl -MCPAN -e"install %s"'
518 2) Attempt to configure CPAN by running:
519 `/usr/bin/perl -MCPAN -e shell` program from shell.
520 If this fails, you may have to manually upgrade CPAN (see below)
521 3) Try to update the CPAN client. Download it from:
522 http://search.cpan.org/dist/CPAN and try again
523 4) Install each dependency manually by downloading them one by one from
524 http://search.cpan.org
531 $ext =~ s/\%s/$module/g; # sprintf( $ext, $module );
535 print "\t\tcommand: '$ext'\n";
536 return scalar `$ext 1>&2`;
539 sub check_perl_version {
541 eval {require 5.010_001};
543 print_found("5.10.1", 0, sprintf("RT requires Perl v5.10.1 or newer. Your current Perl is v%vd", $^V));
546 print_found( sprintf(">=5.10.1(%vd)", $^V), 1 );
552 print_found("rt group (uio-rt)", defined getgrnam("uio-rt"));
553 print_found("bin owner (root)", defined getpwnam("root"));
554 print_found("libs owner (root)", defined getpwnam("root"));
555 print_found("libs group (bin)", defined getgrnam("bin"));
556 print_found("web owner (httpd)", defined getpwnam("httpd"));
557 print_found("web group (httpd)", defined getgrnam("httpd"));
566 rt-test-dependencies - test rt's dependencies
571 rt-test-dependencies --install
572 rt-test-dependencies --with-mysql --with-fastcgi
576 by default, C<rt-test-dependencies> determines whether you have installed all
577 the perl modules RT needs to run.
579 the "RT_FIX_DEPS_CMD" environment variable, if set, will be used instead of
580 the standard CPAN shell by --install to install any required modules. it will
581 be called with the module name, or, if "RT_FIX_DEPS_CMD" contains a "%s", will
582 replace the "%s" with the module name before calling the program.
590 install missing modules
594 list the status of all dependencies, rather than just the missing ones.
596 -v is equal to --verbose
598 =item specify dependencies
604 database interface for mysql
608 database interface for postgresql
612 database interface for oracle
616 database interface and driver for sqlite (unsupported)
620 libraries needed to support the fastcgi handler
622 =item --with-modperl1
624 libraries needed to support the modperl 1 handler
626 =item --with-modperl2
628 libraries needed to support the modperl 2 handler
630 =item --with-developer
632 tools needed for RT development