You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2014/11/20 19:17:32 UTC

svn commit: r1640778 - /vcl/trunk/managementnode/bin/install_perl_libs.pl

Author: arkurth
Date: Thu Nov 20 18:17:31 2014
New Revision: 1640778

URL: http://svn.apache.org/r1640778
Log:
VCL-750
Updated install_perl_libs.pl to be able to download and install EPEL under RHEL/CentOS 7.

Modified:
    vcl/trunk/managementnode/bin/install_perl_libs.pl

Modified: vcl/trunk/managementnode/bin/install_perl_libs.pl
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/bin/install_perl_libs.pl?rev=1640778&r1=1640777&r2=1640778&view=diff
==============================================================================
--- vcl/trunk/managementnode/bin/install_perl_libs.pl (original)
+++ vcl/trunk/managementnode/bin/install_perl_libs.pl Thu Nov 20 18:17:31 2014
@@ -41,16 +41,56 @@ Run this script from the command line:
 
 ##############################################################################
 use strict;
-use warnings;
-use diagnostics;
 
 use English;
 use Getopt::Long;
-use Data::Dumper;
-use POSIX;
 
 #/////////////////////////////////////////////////////////////////////////////
 
+my @LINUX_PACKAGES = (
+	'expat-devel',
+	'gcc',
+	'krb5-devel',
+	'krb5-libs',
+	'libxml2-devel',
+	'make',
+	'nmap',
+	'openssl-devel',
+	'perl-Archive-Tar',
+	'perl-CPAN',
+	'perl-Crypt-OpenSSL-RSA',
+	'perl-DBD-MySQL',
+	'perl-DBI',
+	'perl-Digest-SHA1',
+	'perl-IO-String',
+	'perl-MailTools',
+	'perl-Net-Jabber',
+	'perl-Net-Netmask',
+	'perl-Net-SSH-Expect',
+	'perl-RPC-XML',
+	'perl-Text-CSV_XS',
+	'perl-Time-HiRes',
+	'perl-XML-Simple',
+	'perl-YAML',
+	'xmlsec1-openssl',
+);
+
+my @PERL_MODULES = (
+	'CPAN',
+	'DBI',
+	'Digest::SHA1',
+	'LWP::Protocol::https',
+	'Mail::Mailer',
+	'Mo::builder',
+	'Net::SSH::Expect',
+	'Object::InsideOut',
+	'RPC::XML',
+	'Scalar::Util',
+	'Time::HiRes',
+	'URI',
+	'YAML',
+);
+	
 # Store the command line options in hash
 my $AGREE;
 my $INSTALL_LINUX_PACKAGES;
@@ -81,7 +121,17 @@ elsif (defined($INSTALL_LINUX_PACKAGES) 
 
 if ($INSTALL_LINUX_PACKAGES) {
 	print_break('=');
-	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 "WARNING: yum is not available on this OS, skipping Linux package installation\n";
+		return 0;
+	}
+	else {
+		install_epel();
+		print_break('=');
+		install_linux_packages();
+	}
 }
 
 if ($INSTALL_PERL_MODULES) {
@@ -107,137 +157,67 @@ exit;
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 install_linux_packages
+=head2 install_epel
 
  Parameters  : none
  Returns     : boolean
- Description : Installs the Linux operating system packages required by the VCL
-               managment node components.
+ Description : Creates a temporary /etc/yum.repos.d/epel-install.repo file and
+               installs the epel-release package.
 
 =cut
 
-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 "WARNING: yum is not available on this OS, skipping Linux package installation\n";
-		return 0;
-	}
+sub install_epel {
+	my $epel_install_repo_path = '/etc/yum.repos.d/epel-install.repo';
 	
-	my @uname = POSIX::uname();
-	my $arch = $uname[4];
-	my $version = $uname[2];
+	my $epel_install_repo_contents = <<EOF;
+[epel-install]
+name=EPEL Repository
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-\$releasever&arch=\$basearch
+failovermethod=priority
+enabled=1
+gpgcheck=0
+EOF
 	
-	if (!$arch || !$version) {
-		print "WARNING: unable to determine OS architecture and version, skipping Linux package installation\n";
-		return;
-	}
+	unlink $epel_install_repo_path;
 	
-	if ($arch =~ /i686/) {
-		$arch = 'i386';
+	print "Creating file: $epel_install_repo_path\n";
+	if (!open FILE, ">", $epel_install_repo_path) {
+		print "ERROR: failed to create file: $epel_install_repo_path\n";
+		exit;
 	}
-	
-	my $rhel_version;
-	if ($version =~ /el(\d+)/) {
-		$rhel_version = $1;
+	if (!print FILE $epel_install_repo_contents) {
+		print "ERROR: failed to write to file: $epel_install_repo_path\n";
+		exit;
 	}
+	close FILE;
 	
+	my $result = yum_install_linux_package('epel-release');
 	
-	if ($rhel_version) {
-		print "Attempting to install 'Extra Packages for Enterprise Linux (EPEL)'\n";
-		my $epel_url = "http://dl.fedoraproject.org/pub/epel/$rhel_version/$arch";
-		
-		# Run wget to retrieve the list of files available in the repository
-		# Do this to determine the EPEL RPM file name
-		my $wget_command = "wget  --output-document=- $epel_url";
-		my ($wget_exit_status, $wget_output) = run_command($wget_command);
-		if ($wget_exit_status eq '0' && $wget_output =~ /(epel-release-[\d-]+\.noarch\.rpm)/) {
-			my $rpm_file_name = $1;
-			$epel_url .= "/$rpm_file_name";
-			print "Constructed EPEL URL: '$epel_url'\n\n";
-			
-			# Download the EPEL RPM file
-			my $rpm_command = "rpm -Uvh $epel_url";
-			my ($rpm_exit_status, $rpm_output) = run_command($rpm_command);
-			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";
-				$ERRORS->{'Linux package'}{'EPEL'} = 1;
-			}
-			elsif ($rpm_output =~ /already installed/i) {
-				print "SUCCESS: EPEL is already installed\n";
-			}
-			else {
-				print "SUCCESS: installed EPEL\n";
-			}
-		}
-		else {
-			print "WARNING: failed to determine name of EPEL RPM, did not locate 'epel-relase' line in wget output, some Perl modules may not install correctly\nwget command: '$wget_command'\nexit status: $wget_exit_status\noutput:\n$wget_output\n";
-			$ERRORS->{'Linux package'}{'EPEL'} = 1;
-		}
-		
-		
+	if (unlink $epel_install_repo_path) {
+		print "Removed file: $epel_install_repo_path\n";
 	}
 	else {
-		print "OS version does not appear to be RHEL: $version, skipping EPEL installation\n";
+		print "WARNING: failed to remove file: $epel_install_repo_path\n";
 	}
 	
-	my @linux_packages = (
-		'expat-devel',
-		'gcc',
-		'krb5-libs',
-		'krb5-devel',
-		'libxml2-devel',
-		'make',
-		'nmap',
-		'openssl-devel',
-		'perl-Archive-Tar',
-		'perl-CPAN',
-		'perl-Crypt-OpenSSL-RSA',
-		'perl-DBD-MySQL',
-		'perl-DBI',
-		'perl-Digest-SHA1',
-		'perl-IO-String',
-		'perl-MailTools',
-		'perl-Net-Jabber',
-		'perl-Net-Netmask',
-		'perl-Net-SSH-Expect',
-		'perl-RPC-XML',
-		'perl-Text-CSV_XS',
-		'perl-Time-HiRes',
-		'perl-XML-Simple',
-		'perl-YAML',
-		'xmlsec1-openssl',
-	);
-	
-	for my $linux_package (@linux_packages) {
+	return $result;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 install_linux_packages
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Installs the Linux operating system packages required by the VCL
+               managment node components.
+
+=cut
+
+sub install_linux_packages {
+	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 --nogpgcheck";
-		#print "Yum command: $yum_command\n";
-		
-		my $yum_output = `$yum_command 2>&1 | grep -v '^\\(Load\\|Setting\\|Nothing\\| \\*\\)'`;
-		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";
-			$ERRORS->{'Linux package'}{$linux_package} = 1;
-		}
-		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";
-		}
-		elsif ($yum_output =~ /No package.*available/i) {
-			print "WARNING: Linux package is not available via yum: $linux_package\n";
-			$ERRORS->{'Linux package'}{$linux_package} = 1;
-		}
-		else {
-			print "WARNING: unexpected output returned while installing Linux package: $linux_package\n";
+		if (!yum_install_linux_package($linux_package)) {
 			$ERRORS->{'Linux package'}{$linux_package} = 1;
 		}
 	}
@@ -246,6 +226,56 @@ sub install_linux_packages {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 yum_install_linux_package
+
+ Parameters  : $linux_package
+ Returns     : boolean
+ Description : Attempts to install a single Linux package using yum.
+
+=cut
+
+sub yum_install_linux_package {
+	my ($linux_package) = @_;
+	if (!$linux_package) {
+		print "ERROR: package name argument was not provided\n";
+		return;
+	}
+	
+	print "Attempting to install Linux package using yum: $linux_package\n";
+	
+	my $yum_command = "yum install $linux_package -y --nogpgcheck";
+	#print "Yum command: $yum_command\n";
+	
+	my $yum_output = `$yum_command 2>&1 | grep -v '^\\(Load\\|Setting\\|Nothing\\| \\*\\)'`;
+	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";
+		return 0;
+	}
+	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";
+	}
+	elsif ($yum_output =~ /No package.*available/i) {
+		print "WARNING: Linux package is not available via yum: $linux_package\n";
+		return 0;
+	}
+	else {
+		print "WARNING: unexpected output returned while installing Linux package: $linux_package\n";
+		return 0;
+	}
+	
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 configure_cpan
 
  Parameters  : none
@@ -333,11 +363,12 @@ sub configure_cpan {
 		"yaml_load_code" => "0",
 	};
 	
+	# Use $CPAN::Config once to avoid warning
+	if ($CPAN::Config) {};
+	
 	eval { CPAN::Config->commit($config_file_path) };
 	if ($EVAL_ERROR) {
-		print format_data($CPAN::Config) . "\n";
-		
-		print "\nERROR: failed to create CPAN configuration file: $config_file_path\n";
+		print "\nERROR: failed to create CPAN configuration file: $config_file_path\n$EVAL_ERROR\n";
 		exit 1;
 	}
 	else {
@@ -363,24 +394,11 @@ sub install_perl_modules {
 		$ERRORS->{'Perl module'}{'ALL'} = 1;
 		return;
 	}
-	
+	print "Running CPAN version: $CPAN::VERSION\n";
+
 	configure_cpan();
 
-	my @perl_modules = (
-		'CPAN',
-		'DBI',
-		'Scalar::Util',
-		'Digest::SHA1',
-		'LWP::Protocol::https',
-		'Mail::Mailer',
-		'Mo::builder',
-		'Object::InsideOut',
-		'RPC::XML',
-		'URI',
-		'YAML',
-	);
-	
-	PERL_MODULE: for my $perl_module (@perl_modules) {
+	PERL_MODULE: for my $perl_module (@PERL_MODULES) {
 		print_break('*');
 		
 		my $cpan_version = get_perl_module_cpan_version($perl_module);
@@ -596,40 +614,6 @@ sub print_break {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 format_data
-
- Parameters  : @data
- Returns     :
- Description :
-
-=cut
-
-sub format_data {
-	my @data = @_;
-	
-	if (!(@data)) {
-		return '<undefined>';
-	}
-	
-	$Data::Dumper::Indent    = 1;
-	$Data::Dumper::Purity    = 1;
-	$Data::Dumper::Useqq     = 1;      # Use double quotes for representing string values
-	$Data::Dumper::Terse     = 1;
-	$Data::Dumper::Quotekeys = 1;      # Quote hash keys
-	$Data::Dumper::Pair      = ' => '; # Specifies the separator between hash keys and values
-	$Data::Dumper::Sortkeys  = 1;      # Hash keys are dumped in sorted order
-	
-	my $formatted_string = Dumper(@data);
-	
-	my @formatted_lines = split("\n", $formatted_string);
-	
-	map { $_ = ": $_" } @formatted_lines;
-	
-	return join("\n", @formatted_lines);
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
 =head2 help
 
  Parameters  : none