# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. # # NAME # crsxag.pm # # DESCRIPTION # This module installs XAG components on Linux and Windows # # NOTES # # MODIFIED (MM/DD/YY) # dpham 04/27/16 - add CRS_HOME parameter # dpham 02/17/16 - creation package crsxag; use strict; use Config; use English; use Env qw(NLS_LANG); use File::Basename; use File::Copy; use File::Spec::Functions; # root script modules use crsutils; use s_crsutils; use Exporter; use vars qw(@ISA @EXPORT @EXPORT_OK); @ISA = qw(Exporter); my @exp_func = qw(install_xag); push @EXPORT, @exp_func; ################################################################################ # Function: Install XAG component ################################################################################ sub install_xag { if (is_dev_env()) { return SUCCESS; } trace("Installing XAG component"); my $CRS_HOME = $_[0]; my $XAG_HOME = catdir($CRS_HOME, 'xag'); my $ORACLE_BASE = $CFG->params('ORACLE_BASE'); my $fileExt; trace("xag_home=$XAG_HOME crs_home=$CRS_HOME oracle_base=$ORACLE_BASE"); # set up substitution vars table my %subsVars = (); $subsVars{XAG_HOME} = $XAG_HOME; $subsVars{CRS_HOME} = $CRS_HOME; $subsVars{PERL_HOME} = catdir($CRS_HOME, 'perl'); $subsVars{DEPLOYMENT} = 'bundled'; $subsVars{ORACLE_BASE} = $ORACLE_BASE; # substitute vars in sbs directory trace("substitute vars in sbs directory"); my @sbsFiles = (); my $sbsDir; my $binDir = catdir($CRS_HOME, 'bin'); if ($OSNAME eq 'MSWin32') { $fileExt = '.bat'; $subsVars{XAG_OLR_LOC} = $CFG->OLR_LOCATION; @sbsFiles = myGlob(catfile($XAG_HOME, 'sbs', 'windows', '*')); } else { $fileExt = ''; $subsVars{XAG_OLR_LOC} = $CFG->params('OLRCONFIG'); @sbsFiles = myGlob(catfile($XAG_HOME, 'sbs', '*')); } # instantiate variables foreach my $sbsFile (@sbsFiles) { if (! -f $sbsFile) { trace("skipping sbsFile=$sbsFile"); next; } my @sbsContent = read_file($sbsFile); my $dstfile = basename($sbsFile); if (scalar(grep(/clsecho/, $sbsFile))) { $dstfile =~ s/\.sbs//g; # there's no clsecho.bat on Windows } else { $dstfile =~ s/\.sbs/$fileExt/g; # strip off .sbs suffix } my $dstpath = catfile ($binDir, $dstfile); trace("sbsFile=$sbsFile dstPath=$dstpath"); open (DSTPATH, ">${dstpath}") || die(dieformat(185, $dstpath, $!)); foreach my $line (@sbsContent) { if ($line !~ /^#|^\s*$/) { # If it contains a pattern of the form '%foo%' AND a mapping exists # for 'foo', replace '%foo%' with the corresponding value. my $rexp = "[a-zA-Z_]+"; my @matchlist = $line =~ /%(${rexp})%/g; my $sub; foreach my $match (@matchlist) { if (exists $subsVars{$match}) { $sub = $subsVars{$match}; $line =~ s/%(${match})%/$sub/g; } else { trace("Can't substitue variable=$match file=$sbsFile"); } } } print DSTPATH "$line"; } close (DSTPATH); s_set_perms(755, $dstpath); } # for big-endian platforms, instantiate appropriate msb files if ($Config{byteorder} eq '87654321' || $Config{byteorder} eq '4321') { instantiateXAGMsbFilesForPorts(); } else { trace("Platform is little-endian"); } # move xag_inventory to $XAG_HOME/install dir and change permission my $invFile = catfile($XAG_HOME, 'xag_inventory'); move(catfile($binDir, "xag_inventory$fileExt"), $invFile); s_set_perms(444, $invFile); s_set_ownergroup($CFG->params('ORACLE_OWNER'), $CFG->params('ORA_DBA_GROUP'), $invFile); return SUCCESS; } ################################################################################ ## Function: Instantiate XAG msb files on sparc/IBM ################################################################################ sub instantiateXAGMsbFilesForPorts { trace("Entered instantiateMsbFilesForPorts"); my $XAG_HOME = catdir($CFG->ORA_CRS_HOME, 'xag'); my $msbDir = catdir($XAG_HOME, 'mesg'); my @msbFiles = glob(catfile($msbDir, "*.msb")); #copy current .msb files to .le # foreach my $msbFile (@msbFiles) { my ($fname, $fpath, $fext) = fileparse($msbFile,'\..*'); my $newFilePath = catfile(dirname($msbFile), "$fname.le"); trace("copying $msbFile to $newFilePath"); if (!copy($msbFile, $newFilePath)) { my $errMsg = $!; trace("Error in copying $msbFile to $newFilePath:$errMsg"); return FAILED; } } #copy 'be' files to .msb so that they are in use #verify that the file is not stale by comparing the #sizes of the default and big-endian versions my @beMsbFiles = glob(catfile($msbDir, "*.be")); if (scalar(@beMsbFiles) == 0) { trace("Error: no .be msb files found for this platform"); } foreach my $beMsbFile (@beMsbFiles) { my ($fname, $fpath, $fext) = fileparse($beMsbFile,'\..*'); my $newFilePath = catfile(dirname($beMsbFile), "$fname.msb"); my $leMsbFile = catfile(dirname($beMsbFile), "$fname.le"); my $beMsbFileSize = -s $beMsbFile; my $leMsbFileSize = -s $leMsbFile; trace("$beMsbFile size = $beMsbFileSize"); trace("$leMsbFile size = $leMsbFileSize"); if ($beMsbFileSize != $leMsbFileSize) { trace("Warning: $fname.msb for this platform is not latest, contact Oracle Support"); } trace("copying $beMsbFile to $newFilePath"); if (!copy($beMsbFile, $newFilePath)) { trace("Error in copying $beMsbFile to $newFilePath"); return FAILED; } } trace("instantiateMsbFilesForPorts() done"); return SUCCESS; } sub myGlob { my $dir = $_[0]; my @files = (); if ($dir =~ / /) { @files = glob("\'".$dir."\'"); } else { @files = glob($dir); } return @files; } 1;