Author: arkurth
Date: Mon Mar 14 14:35:21 2011
New Revision: 1081397
URL: http://svn.apache.org/viewvc?rev=1081397&view=rev
Log:
VCL-434
Updated install_perl_libs.pl. It now attempts to install EPEL so that
additional Perl packages can be installed via yum. Improved error checking.
Modified:
incubator/vcl/trunk/managementnode/bin/install_perl_libs.pl
Modified: incubator/vcl/trunk/managementnode/bin/install_perl_libs.pl
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/bin/install_perl_libs.pl?rev=1081397&r1=1081396&r2=1081397&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/bin/install_perl_libs.pl (original)
+++ incubator/vcl/trunk/managementnode/bin/install_perl_libs.pl Mon Mar 14
14:35:21 2011
@@ -44,9 +44,10 @@ use strict;
use warnings;
use diagnostics;
+use English;
use Getopt::Long;
use Data::Dumper;
-use CPAN;
+use POSIX;
#/////////////////////////////////////////////////////////////////////////////
@@ -54,11 +55,13 @@ use CPAN;
my $AGREE;
my %OPTIONS;
GetOptions(\%OPTIONS,
- 'y!' => \$AGREE,
+ 'y!' => \$AGREE,
);
show_disclaimer() if !$AGREE;
+my @ERRORS;
+
print_break('=');
install_linux_packages();
@@ -66,11 +69,63 @@ print_break('=');
install_perl_modules();
print_break('=');
+
+if (@ERRORS) {
+ print "WARNING: failed to install the following components:\n" .
join("\n", @ERRORS) . "\n";
+}
+else {
+ print "COMPLETE: installed all components\n";
+}
+
exit;
#/////////////////////////////////////////////////////////////////////////////
sub install_linux_packages {
+ # Check if yum is available
+ my ($which_exit_status, $which_output) = run_command("which yum");
+ if ($which_exit_status ne '0') {
+ print "yum is not available on this OS, skipping Linux package
installation\n";
+ return 0;
+ }
+
+ my @uname = POSIX::uname();
+ my $arch = $uname[4];
+ my $version = $uname[2];
+
+ if (!$arch || !$version) {
+ print "WARNING: unable to determine OS architecture and
version, skipping Linux package installation\n";
+ return;
+ }
+
+ if ($arch =~ /i686/) {
+ $arch = 'i386';
+ }
+
+ my $rhel_version;
+ if ($version =~ /el(\d+)/) {
+ $rhel_version = $1;
+ }
+
+ if ($rhel_version) {
+ my $epel_url =
"http://download.fedora.redhat.com/pub/epel/$rhel_version/$arch/epel-release-5-4.noarch.rpm";
+ print "constructed EPEL URL:\n$epel_url\n\n";
+
+ my $rpm_command = "rpm -Uvh $epel_url";
+ my $rpm_output = `$rpm_command 2>&1`;
+ my $rpm_exit_status = $? >> 8;
+ if ($rpm_exit_status ne '0' && $rpm_output !~ /already
installed/i) {
+ print "WARNING: failed to install EPEL, some Perl
modules may not install correctly\nrpm command: $rpm_command\nrpm exit status:
$rpm_exit_status\nrpm output:\n$rpm_output\n";
+ push @ERRORS, 'EPEL';
+ }
+ else {
+ print "SUCCESS: installed EPEL\n";
+ }
+ }
+ else {
+ print "OS version does not appear to be RHEL: $version,
skipping EPEL installation\n";
+ }
+
my @linux_packages = (
'expat',
'expat-devel',
@@ -82,71 +137,103 @@ sub install_linux_packages {
'nmap',
'openssl',
'openssl-devel',
+ 'perl-CPAN',
'perl-DBD-MySQL',
+ 'perl-DBI',
+ 'perl-Digest-SHA1',
+ 'perl-MailTools',
+ 'perl-Net-Jabber',
+ 'perl-RPC-XML',
+ 'perl-YAML',
'xmlsec1-openssl',
);
- my $which_exit_status = run_command("which yum");
- if ($which_exit_status ne '0') {
- print "yum is not available on this OS, skipping Linux package
installation\n";
- return 0;
- }
-
- my $yum_exit_status = run_command("yum install -y " . join(" ",
@linux_packages));
- print "yum installation exit status: $yum_exit_status\n";
- if ($yum_exit_status ne '0') {
- print "failed to install all Linux packages using yum, exit
status: $yum_exit_status\n";
- exit 1;
+ for my $linux_package (@linux_packages) {
+ print_break('*');
+ print "attempting to install Linux package using yum:
$linux_package\n";
+
+ my $yum_command = "yum install $linux_package -y";
+ print "yum command: $yum_command\n";
+
+ my $yum_output = `$yum_command 2>&1`;
+ my $yum_exit_status = $? >> 8;
+
+ chomp $yum_output;
+ print "$yum_output\n\n";
+
+ if ($yum_exit_status ne '0') {
+ print "WARNING: failed to install Linux package:
$linux_package, exit status: $yum_exit_status\n";
+ #push @ERRORS, "Linux package: $linux_package";
+ }
+ elsif ($yum_output =~ /$linux_package[^\n]*already installed/i)
{
+ print "SUCCESS: Linux package is already installed:
$linux_package\n";
+ }
+ elsif ($yum_output =~ /Complete\!/i) {
+ print "SUCCESS: installed Linux package:
$linux_package\n";
+ }
+ else {
+ print "WARNING: unexpected output returned while
installing Linux package: $linux_package\n";
+ #push @ERRORS, "Linux package: $linux_package";
+ }
+
}
- print "successfully installed Linux packages using yum\n";
return 1;
}
#/////////////////////////////////////////////////////////////////////////////
sub install_perl_modules {
+
+ eval "use CPAN";
+ if ($EVAL_ERROR) {
+ print "ERROR: CPAN Perl module is not installed, unable to
install other Perl module dependencies\n";
+ exit;
+ }
+
$ENV{PERL_MM_USE_DEFAULT} = 1;
$ENV{PERL_MM_NONINTERACTIVE} = 1;
$ENV{AUTOMATED_TESTING} = 1;
$ENV{FTP_PASSIVE} = 1;
- my $cpan_directory = '/tmp/cpan';
- `rm -rf $cpan_directory`;
+ my $cpan_directory = $ENV{HOME} . '/.cpan';
+ my $config_file_path = "$cpan_directory/CPAN/MyConfig.pm";
+ `mkdir -p $cpan_directory/CPAN`;
$CPAN::Config = {
"applypatch" => "",
"auto_commit" => "1",
- "build_cache" => "0",
+ "build_cache" => "1",
"build_dir" => "$cpan_directory/build",
"build_requires_install_policy" => "yes",
- "bzip2" => `echo -n \`which bzip2\``,
+ "bzip2" => `echo -n \`which bzip2\`` || "",
"cache_metadata" => "1",
"check_sigs" => "0",
"connect_to_internet_ok" => "1",
"cpan_home" => "$cpan_directory",
- "curl" => `echo -n \`which curl\``,
+ "debug" => "all",
+ "curl" => `echo -n \`which curl\`` || "",
"force" => "1",
- "ftp" => `echo -n \`which ftp\``,
+ "ftp" => `echo -n \`which ftp\`` || "",
"ftp_passive" => "1",
"ftp_proxy" => "",
"getcwd" => "cwd",
- "gpg" => `echo -n \`which gpg\``,
- "gzip" => `echo -n \`which gzip\``,
+ "gpg" => `echo -n \`which gpg\`` || "",
+ "gzip" => `echo -n \`which gzip\`` || "",
"halt_on_failure" => "0",
"histfile" => "$cpan_directory/histfile",
"histsize" => "1000",
"http_proxy" => "",
"inactivity_timeout" => "60",
- "index_expire" => "1",
+ "index_expire" => "10",
"inhibit_startup_message" => "1",
"keep_source_where" => "$cpan_directory/sources",
- "links" => `echo -n \`which links\``,
- "load_module_verbosity" => "0",
- "make" => `echo -n \`which make\``,
+ "links" => `echo -n \`which links\`` || "",
+ "load_module_verbosity" => "1",
+ "make" => `echo -n \`which make\`` || "",
"make_arg" => "",
"make_install_arg" => "",
- "make_install_make_command" => `echo -n \`which make\``,
+ "make_install_make_command" => `echo -n \`which make\`` || "",
"makepl_arg" => "",
"mbuild_arg" => "",
"mbuild_install_arg" => "",
@@ -155,7 +242,7 @@ sub install_perl_modules {
"ncftp" => "",
"ncftpget" => "",
"no_proxy" => "",
- "pager" => `echo -n \`which less\``,
+ "pager" => `echo -n \`which less\`` || "",
"perl5lib_verbosity" => "",
"prefer_installer" => "MB",
"prefs_dir" => "$cpan_directory/prefs",
@@ -163,26 +250,37 @@ sub install_perl_modules {
"proxy_user" => "",
"randomize_urllist" => "1",
"scan_cache" => "never",
- "shell" => `echo -n \`which bash\``,
+ "shell" => `echo -n \`which bash\`` || "",
"show_upload_date" => "0",
- "tar" => `echo -n \`which tar\``,
+ "tar" => `echo -n \`which tar\`` || "",
"tar_verbosity" => "0",
"term_ornaments" => "1",
"trust_test_report_history" => "1",
- "unzip" => `echo -n \`which unzip\``,
- "urllist" => "",
+ "unzip" => `echo -n \`which unzip\`` || "",
+ "urllist" => [q[http://www.perl.com/CPAN/]],
"use_sqlite" => "0",
- "wget" => `echo -n \`which wget\``,
+ "wget" => `echo -n \`which wget\`` || "",
"yaml_load_code" => "0",
};
- print Dumper($CPAN::Config);
+ eval { CPAN::Config->commit($config_file_path) };
+ if ($EVAL_ERROR) {
+ print "CPAN configuration:\n";
+ print Dumper($CPAN::Config) . "\n";
+
+ print "\nERROR: failed to create CPAN configuration file:
$config_file_path\n";
+ exit 1;
+ }
+ else {
+ print "created CPAN configuration file: $config_file_path\n";
+ }
+
+ print_cpan_configuration();
my @perl_modules = (
'DBI',
'Digest::SHA1',
'Mail::Mailer',
- 'Net::Jabber',
'Object::InsideOut',
'RPC::XML',
'YAML',
@@ -191,16 +289,16 @@ sub install_perl_modules {
for my $perl_module (@perl_modules) {
print_break('-');
print "attempting to install Perl module using CPAN:
$perl_module\n";
- CPAN::install($perl_module);
+
+ eval { CPAN::Shell->install($perl_module) };
if (!is_perl_module_installed($perl_module)) {
- exit 1;
+ print "ERROR: failed to install Perl module:
$perl_module\n";
+ push @ERRORS, "Perl module: $perl_module";
}
-
}
print_break("*");
- print "successfully installed required Perl modules\n";
return 1;
}
@@ -228,8 +326,8 @@ sub is_perl_module_installed {
return $version;
}
else {
- print "$module_package Perl module is installed but the version
could not be determined, output:\n$output";
- return 1;
+ print "Perl module $module_package appears to be installed but
the version could not be determined\ncommand: $command\noutput:\n$output";
+ return;
}
}
@@ -239,10 +337,10 @@ sub run_command {
my $command = shift;
print "attempting to run command: $command\n";
- system $command;
+ my $output = `$command 2>&1`;
my $exit_status = $? >> 8;
print "ran command: $command, exit status: $exit_status\n";
- return $exit_status;
+ return ($exit_status, $output);
}
#/////////////////////////////////////////////////////////////////////////////
@@ -286,5 +384,12 @@ EOF
sub print_break {
my $character = shift;
$character = '-' if !defined($character);
- print $character x 80 . "\n";
+ print $character x 100 . "\n";
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+sub print_cpan_configuration {
+ $Data::Dumper::Sortkeys = 1;
+ print "CPAN configuration:\n" . Dumper($CPAN::Config) . "\n";
}