#!/usr/bin/perl
# BEGIN LICENSE BLOCK
# 
# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
# 
# (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);
}
$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 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.92
Text::Template
File::Spec 0.8
HTML::Entities 
Net::Domain
Log::Dispatch 2.0
Locale::Maketext 1.06
Locale::Maketext::Lexicon 0.25
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
.

$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
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
FCGI
CGI::Fast 
.

$deps{'SPEEDYCGI'} = [ _( << '.') ];
CGI
CGI::SpeedyCGI
.


$deps{'MODPERL1'} = [ _( << '.') ];
CGI
Apache::Request
Apache::DBI 0.92
.

$deps{'MODPERL2'} = [ _( << '.') ];
CGI 2.89
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);
}
