#!/usr/bin/perl -w # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html # #(C)IBM Corp package imgutils; use strict; use warnings "all"; use File::Basename; use File::Path; use Cwd qw(realpath); sub get_profile_def_filename { my $osver = shift; my $profile = shift; my $arch = shift; my $tmp_base=shift; my $base=realpath($tmp_base); #get the full path if (!$base) { $base=$tmp_base;} my $ext=shift; my $dotpos; # OS version on s390x can contain 'sp', e.g. sles11sp1 # If OS version contains 'sp', get the index of 'sp' instead of '.' if ($osver =~ /sles/ && $osver =~ /sp/) { $dotpos = rindex($osver, "sp"); } else { $dotpos = rindex($osver, "."); } my $osbase = substr($osver, 0, $dotpos); if (-r "$base/$profile.$osver.$arch.$ext") { return "$base/$profile.$osver.$arch.$ext"; } elsif (-r "$base/$profile.$osbase.$arch.$ext") { return "$base/$profile.$osbase.$arch.$ext"; } elsif (-r "$base/$profile.$arch.$ext") { return "$base/$profile.$arch.$ext"; } elsif (-r "$base/$profile.$osver.$ext") { return "$base/$profile.$osver.$ext"; } elsif (-r "$base/$profile.$osbase.$ext") { return "$base/$profile.$osbase.$ext"; } elsif (-r "$base/$profile.$ext") { return "$base/$profile.$ext"; } return ""; } sub include_file { my $file = shift; my $idir = shift; my @text = (); unless ($file =~ /^\//) { $file = $idir."/".$file; } open(INCLUDE,$file) || return "#INCLUDEBAD:cannot open $file#"; while() { chomp($_); s/\s+$//; #remove trailing spaces next if /^\s*$/; #-- skip empty lines next if ( /^\s*#/ && !/^\s*#INCLUDE:[^#^\n]+#/ && !/^\s*#NEW_INSTALL_LIST#/ && !/^\s*#ENV:[^#^\n]+#/); #-- skip comments push(@text, $_); } close(INCLUDE); return join(',', @text); } sub get_package_names { my $plist_file_list=shift; my %pkgnames=(); my @plist_file_names = split ',', $plist_file_list; foreach my $plist_file_name ( @plist_file_names ) { # this variable needs to be cleaned when loop the pkglist files my @tmp_array=(); if ($plist_file_name && -r $plist_file_name) { my $pkgfile; open($pkgfile,"<","$plist_file_name"); while (<$pkgfile>) { chomp; s/\s+$//; #remove trailing white spaces next if /^\s*$/; #-- skip empty lines next if ( /^\s*#/ && !/^\s*#INCLUDE:[^#^\n]+#/ && !/^\s*#NEW_INSTALL_LIST#/ && !/^\s*#ENV:[^#^\n]+#/); #-- skip comments push(@tmp_array,$_); } close($pkgfile); if ( @tmp_array > 0) { my $pkgtext=join(',',@tmp_array); #handle the #INLCUDE# tag recursively my $idir = dirname($plist_file_name); my $doneincludes=0; while (not $doneincludes) { $doneincludes=1; if ($pkgtext =~ /#INCLUDE:[^#^\n]+#/) { $doneincludes=0; $pkgtext =~ s/#INCLUDE:([^#^\n]+)#/include_file($1,$idir)/eg; } } #print "pkgtext=$pkgtext\n"; my @tmp=split(',', $pkgtext); my $pass=1; foreach (@tmp) { my $idir; if (/^--/) { $idir="POST_REMOVE"; #line starts with -- means the package should be removed after otherpkgs are installed s/^--//; } elsif (/^-/) { $idir="PRE_REMOVE"; #line starts with single - means the package should be removed before otherpkgs are installed s/^-//; } elsif (/^#NEW_INSTALL_LIST#/) { $pass++; next; } elsif (/^#ENV:([^#^\n]+)#/) { my $pa=$pkgnames{$pass}{ENVLIST}; my $env = $1; if (exists($pkgnames{$pass}{ENVLIST})){ push(@$pa,$env); } else { $pkgnames{$pass}{ENVLIST} = [$env]; } next; } elsif (/^#/) { # ignore all other comment lines next; } else { $idir=dirname($_); } my $fn=basename($_); if (exists($pkgnames{$pass}{$idir})) { my $pa=$pkgnames{$pass}{$idir}; push(@$pa, $fn); } else { $pkgnames{$pass}{$idir}=[$fn]; } } } } } return %pkgnames; } 1;