diff options
Diffstat (limited to 'solenv/bin/modules/installer/epmfile.pm')
-rw-r--r-- | solenv/bin/modules/installer/epmfile.pm | 3359 |
1 files changed, 0 insertions, 3359 deletions
diff --git a/solenv/bin/modules/installer/epmfile.pm b/solenv/bin/modules/installer/epmfile.pm deleted file mode 100644 index 3aeb4d8db..000000000 --- a/solenv/bin/modules/installer/epmfile.pm +++ /dev/null @@ -1,3359 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org 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 Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::epmfile; - -use Cwd; -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::packagelist; -use installer::pathanalyzer; -use installer::remover; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; -use POSIX; - -############################################################################ -# Reading the package map to find Solaris package names for -# the corresponding abbreviations -############################################################################ - -sub read_packagemap -{ - my ($allvariables, $includepatharrayref, $languagesarrayref) = @_; - - my $packagemapname = ""; - if ( $allvariables->{'PACKAGEMAP'} ) { $packagemapname = $allvariables->{'PACKAGEMAP'}; } - if ( $packagemapname eq "" ) { installer::exiter::exit_program("ERROR: Property PACKAGEMAP must be defined!", "read_packagemap"); } - - my $infoline = "\n\nCollected abbreviations and package names:\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Can be a comma separated list. All files have to be found in include pathes - my $allpackagemapnames = installer::converter::convert_stringlist_into_hash(\$packagemapname, ","); - foreach my $onepackagemapname ( keys %{$allpackagemapnames} ) - { - my $packagemapref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onepackagemapname, $includepatharrayref, 0); - - if ( $$packagemapref eq "" ) { installer::exiter::exit_program("ERROR: Could not find package map file \"$onepackagemapname\" (propery PACKAGEMAP)!", "read_packagemap"); } - - my $packagemapcontent = installer::files::read_file($$packagemapref); - - for ( my $i = 0; $i <= $#{$packagemapcontent}; $i++ ) - { - my $line = ${$packagemapcontent}[$i]; - - if ( $line =~ /^\s*\#/ ) { next; } # comment line - if ( $line =~ /^\s*$/ ) { next; } # empty line - - if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ ) - { - my $abbreviation = $1; - my $packagename = $2; - installer::packagelist::resolve_packagevariables(\$abbreviation, $allvariables, 0); - installer::packagelist::resolve_packagevariables(\$packagename, $allvariables, 0); - - # Special handling for language strings %LANGUAGESTRING - - if (( $abbreviation =~ /\%LANGUAGESTRING/ ) || ( $packagename =~ /\%LANGUAGESTRING/ )) - { - foreach my $onelang ( @{$languagesarrayref} ) - { - my $local_abbreviation = $abbreviation; - my $local_packagename = $packagename; - $local_abbreviation =~ s/\%LANGUAGESTRING/$onelang/g; - $local_packagename =~ s/\%LANGUAGESTRING/$onelang/g; - - # Logging all abbreviations and packagenames - $infoline = "$onelang : $local_abbreviation : $local_packagename\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( exists($installer::globals::dependfilenames{$local_abbreviation}) ) - { - installer::exiter::exit_program("ERROR: Packagename for Solaris package $local_abbreviation already defined ($installer::globals::dependfilenames{$local_abbreviation})!", "read_packagemap"); - } - else - { - $installer::globals::dependfilenames{$local_abbreviation} = $local_packagename; - } - } - } - else - { - # Logging all abbreviations and packagenames - $infoline = "$abbreviation : $packagename\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( exists($installer::globals::dependfilenames{$abbreviation}) ) - { - installer::exiter::exit_program("ERROR: Packagename for Solaris package $abbreviation already defined ($installer::globals::dependfilenames{$abbreviation})!", "read_packagemap"); - } - else - { - $installer::globals::dependfilenames{$abbreviation} = $packagename; - } - } - } - else - { - my $errorline = $i + 1; - installer::exiter::exit_program("ERROR: Wrong syntax in file \"$onepackagemapname\" (line $errorline)!", "read_packagemap"); - } - } - } - - $infoline = "\n\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################################ -# The header file contains the strings for the epm header in all languages -############################################################################ - -sub get_string_from_headerfile -{ - my ($searchstring, $language, $fileref) = @_; - - my $returnstring = ""; - my $onestring = ""; - my $englishstring = ""; - my $foundblock = 0; - my $foundstring = 0; - my $foundenglishstring = 0; - my $englishidentifier = "01"; - - $searchstring = "[" . $searchstring . "]"; - - for ( my $i = 0; $i <= $#{$fileref}; $i++ ) - { - my $line = ${$fileref}[$i]; - - if ( $line =~ /^\s*\Q$searchstring\E\s*$/ ) - { - $foundblock = 1; - my $counter = $i + 1; - - $line = ${$fileref}[$counter]; - - # Beginning of the next block oder Dateiende - - while ((!($line =~ /^\s*\[\s*\w+\s*\]\s*$/ )) && ( $counter <= $#{$fileref} )) - { - if ( $line =~ /^\s*\Q$language\E\s+\=\s*\"(.*)\"\s*$/ ) - { - $onestring = $1; - $foundstring = 1; - last; - } - - if ( $line =~ /^\s*\Q$englishidentifier\E\s+\=\s*\"(.*)\"\s*$/ ) - { - $englishstring = $1; - $foundenglishstring = 1; - } - - $counter++; - $line = ${$fileref}[$counter]; - } - } - } - - if ( $foundstring ) - { - $returnstring = $onestring; - } - else - { - if ( $foundenglishstring ) - { - $returnstring = $englishstring; - } - else - { - installer::exiter::exit_program("ERROR: No string found for $searchstring in epm header file (-h)", "get_string_from_headerfile"); - } - } - - return \$returnstring; -} - -########################################################## -# Filling the epm file with directories, files and links -########################################################## - -sub put_directories_into_epmfile -{ - my ($directoriesarrayref, $epmfileref, $allvariables, $packagerootpath) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) - { - $group = "root"; - } - - for ( my $i = 0; $i <= $#{$directoriesarrayref}; $i++ ) - { - my $onedir = ${$directoriesarrayref}[$i]; - my $dir = ""; - - if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } - - if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )) - { - my $hostname = $onedir->{'HostName'}; - - my $line = "d 755 root $group $hostname -\n"; - - push(@{$epmfileref}, $line) - } - } -} - -sub put_files_into_epmfile -{ - my ($filesinproductarrayref, $epmfileref) = @_; - - for ( my $i = 0; $i <= $#{$filesinproductarrayref}; $i++ ) - { - my $onefile = ${$filesinproductarrayref}[$i]; - - my $unixrights = $onefile->{'UnixRights'}; - my $destination = $onefile->{'destination'}; - my $sourcepath = $onefile->{'sourcepath'}; - - my $filetype = "f"; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bCONFIGFILE\b/ ) { $filetype = "c"; } - - my $group = "bin"; - if ( $installer::globals::islinuxbuild ) { $group = "root"; } - if (( $installer::globals::issolarisbuild ) && ( $onefile->{'SolarisGroup'} )) { $group = $onefile->{'SolarisGroup'}; } - - my $line = "$filetype $unixrights root $group $destination $sourcepath\n"; - - push(@{$epmfileref}, $line); - } -} - -sub put_links_into_epmfile -{ - my ($linksinproductarrayref, $epmfileref) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) - { - $group = "root"; - } - - - for ( my $i = 0; $i <= $#{$linksinproductarrayref}; $i++ ) - { - my $onelink = ${$linksinproductarrayref}[$i]; - my $destination = $onelink->{'destination'}; - my $destinationfile = $onelink->{'destinationfile'}; - - my $line = "l 000 root $group $destination $destinationfile\n"; - - push(@{$epmfileref}, $line) - } -} - -sub put_unixlinks_into_epmfile -{ - my ($unixlinksinproductarrayref, $epmfileref) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) { $group = "root"; } - - for ( my $i = 0; $i <= $#{$unixlinksinproductarrayref}; $i++ ) - { - my $onelink = ${$unixlinksinproductarrayref}[$i]; - my $destination = $onelink->{'destination'}; - my $target = $onelink->{'Target'}; - - my $line = "l 000 root $group $destination $target\n"; - - push(@{$epmfileref}, $line) - } -} - -############################################### -# Creating epm header file -############################################### - -sub create_epm_header -{ - my ($variableshashref, $filesinproduct, $languagesref, $onepackage) = @_; - - my @epmheader = (); - - my ($licensefilename, $readmefilename, $readmefilenameen); - - my $foundlicensefile = 0; - my $foundreadmefile = 0; - - my $line = ""; - my $infoline = ""; - - # %product LibreOffice Software - # %version 2.0 - # %description A really great software - # %copyright 1999-2003 by OOo - # %vendor LibreOffice - # %license /test/replace/01/LICENSE01 - # %readme /test/replace/01/README01 - # %requires foo - # %provides bar - - # The first language in the languages array determines the language of license and readme file - - my $searchlanguage = ${$languagesref}[0]; - - # using the description for the %product line in the epm list file - - my $productnamestring = $onepackage->{'description'}; - installer::packagelist::resolve_packagevariables(\$productnamestring, $variableshashref, 0); - if ( $variableshashref->{'PRODUCTEXTENSION'} ) { $productnamestring = $productnamestring . " " . $variableshashref->{'PRODUCTEXTENSION'}; } - - $line = "%product" . " " . $productnamestring . "\n"; - push(@epmheader, $line); - - # Determining the release version - # This release version has to be listed in the line %version : %version versionnumber releasenumber - - if ( ! $onepackage->{'packageversion'} ) { installer::exiter::exit_program("ERROR: No packageversion defined for package: $onepackage->{'module'}!", "create_epm_header"); } - $installer::globals::packageversion = $onepackage->{'packageversion'}; - installer::packagelist::resolve_packagevariables(\$installer::globals::packageversion, $variableshashref, 0); - if ( $variableshashref->{'PACKAGEREVISION'} ) { $installer::globals::packagerevision = $variableshashref->{'PACKAGEREVISION'}; } - - $line = "%version" . " " . $installer::globals::packageversion . "\n"; - push(@epmheader, $line); - - $line = "%release" . " " . $installer::globals::packagerevision . "\n"; - if ( $installer::globals::isrpmbuild ) { $line = "%release" . " " . $installer::globals::buildid . "\n"; } - push(@epmheader, $line); - - # Description, Copyright and Vendor are multilingual and are defined in - # the string file for the header file ($headerfileref) - - my $descriptionstring = $onepackage->{'description'}; - installer::packagelist::resolve_packagevariables(\$descriptionstring, $variableshashref, 0); - $line = "%description" . " " . $descriptionstring . "\n"; - push(@epmheader, $line); - - my $copyrightstring = $onepackage->{'copyright'}; - installer::packagelist::resolve_packagevariables(\$copyrightstring, $variableshashref, 0); - $line = "%copyright" . " " . $copyrightstring . "\n"; - push(@epmheader, $line); - - my $vendorstring = $onepackage->{'vendor'}; - installer::packagelist::resolve_packagevariables(\$vendorstring, $variableshashref, 0); - $line = "%vendor" . " " . $vendorstring . "\n"; - push(@epmheader, $line); - - # License and Readme file can be included automatically from the file list - - if ( $installer::globals::iswindowsbuild ) - { - $licensefilename = "license.txt"; - $readmefilename = "readme.txt"; - $readmefilenameen = "readme_en-US.txt"; - } - else - { - $licensefilename = "LICENSE"; - $readmefilename = "README"; - $readmefilenameen = "README_en-US"; - } - - if (( $installer::globals::languagepack ) # in language packs and help packs the files LICENSE and README are removed, because they are not language specific - || ( $installer::globals::helppack ) - || ( $variableshashref->{'NO_README_IN_ROOTDIR'} )) - { - if ( $installer::globals::iswindowsbuild ) - { - $licensefilename = "license.txt"; # _$searchlanguage.txt"; - $readmefilename = "readme_$searchlanguage.txt"; - } - else - { - $licensefilename = "LICENSE"; # _$searchlanguage"; - $readmefilename = "README_$searchlanguage"; - } - } - - my $license_in_package_defined = 0; - - if ( $installer::globals::issolarisbuild ) - { - if ( $onepackage->{'solariscopyright'} ) - { - $licensefilename = $onepackage->{'solariscopyright'}; - $license_in_package_defined = 1; - } - } - - # Process for Linux packages, in which only a very basic license file is - # included into the package. - - if ( $installer::globals::islinuxbuild ) - { - if ( $variableshashref->{'COPYRIGHT_INTO_LINUXPACKAGE'} ) - { - $licensefilename = "linuxcopyrightfile"; - $license_in_package_defined = 1; - } - } - - # searching for and readme file; - # URE uses special README; others use README_en-US - # it does not matter which one is passed for epm if both are packaged - foreach my $possiblereadmefilename ($readmefilenameen, $readmefilename) - { - last if ($foundreadmefile); - for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ ) - { - my $onefile = ${$filesinproduct}[$i]; - my $filename = $onefile->{'Name'}; - if ( $filename eq $possiblereadmefilename ) - { - $foundreadmefile = 1; - $line = "%readme" . " " . $onefile->{'sourcepath'} . "\n"; - push(@epmheader, $line); - last; - } - } - } - - # the readme file need not be packaged more times in the help content - # it needs to be installed in parallel with the main package anyway - # try to find the README file between all available files (not only between the packaged) - if (!($foundreadmefile) && $installer::globals::helppack) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$readmefilenameen, "" , 0); - if($$fileref ne "" ) - { - $infoline = "Fallback to readme file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundreadmefile = 1; - $line = "%readme" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - } - - # searching for and license file - - if ( $license_in_package_defined ) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0); - - if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (A)!", "create_epm_header"); } - - # Special handling to add the content of the file "license_en-US" to the solaris copyrightfile. But not for all products - - if (( $installer::globals::issolarispkgbuild ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) - { - if ( ! $installer::globals::englishlicenseset ) { installer::worker::set_english_license() } - - # The location for the new file - my $languagestring = ""; - for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) { $languagestring = $languagestring . "_" . ${$languagesref}[$i]; } - $languagestring =~ s/^\s*_//; - - my $copyrightdir = installer::systemactions::create_directories("copyright", \$languagestring); - - my $copyrightfile = installer::files::read_file($$fileref); - - # Adding license content to copyright file - push(@{$copyrightfile}, "\n"); - for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); } - - # New destination for $$fileref - $$fileref = $copyrightdir . $installer::globals::separator . "solariscopyrightfile_" . $onepackage->{'module'}; - if ( -f $$fileref ) { unlink $$fileref; } - installer::files::save_file($$fileref, $copyrightfile); - } - - $infoline = "Using license file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundlicensefile = 1; - $line = "%license" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - else - { - for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ ) - { - my $onefile = ${$filesinproduct}[$i]; - my $filename = $onefile->{'Name'}; - - if ( $filename eq $licensefilename ) - { - $foundlicensefile = 1; - $line = "%license" . " " . $onefile->{'sourcepath'} . "\n"; - push(@epmheader, $line); - last; - } - } - - # the license file need not be packaged more times in the langpacks - # they need to be installed in parallel with the main package anyway - # try to find the LICENSE file between all available files (not only between the packaged) - if (!($foundlicensefile) && ($installer::globals::languagepack || $installer::globals::helppack)) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0); - if($$fileref ne "" ) - { - $infoline = "Fallback to license file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundlicensefile = 1; - $line = "%license" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - } - } - - if (!($foundlicensefile)) - { - installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (B)", "create_epm_header"); - } - - if (!($foundreadmefile)) - { - installer::exiter::exit_program("ERROR: Could not find readme file $readmefilename (C)", "create_epm_header"); - } - - # including %replaces - - my $replaces = ""; - - if (( $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::patch )) - { - $replaces = "solarisreplaces"; # the name in the packagelist - } - elsif (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::patch )) - { - $replaces = "linuxreplaces"; # the name in the packagelist - } - - if (( $replaces ) && ( ! $installer::globals::patch )) - { - if ( $onepackage->{$replaces} ) - { - my $replacesstring = $onepackage->{$replaces}; - - my $allreplaces = installer::converter::convert_stringlist_into_array(\$replacesstring, ","); - - for ( my $i = 0; $i <= $#{$allreplaces}; $i++ ) - { - my $onereplaces = ${$allreplaces}[$i]; - $onereplaces =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$onereplaces, $variableshashref, 1); - if ( $installer::globals::linuxlinkrpmprocess ) { $onereplaces = $onereplaces . "u"; } - $line = "%replaces" . " " . $onereplaces . "\n"; - push(@epmheader, $line); - - # Force the openofficeorg packages to get removed, - # see http://www.debian.org/doc/debian-policy/ch-relationships.html - # 7.5.2 Replacing whole packages, forcing their removal - - if ( $installer::globals::debian ) - { - $line = "%incompat" . " " . $onereplaces . "\n"; - push(@epmheader, $line); - } - } - - if ( $installer::globals::debian && $variableshashref->{'UNIXPRODUCTNAME'} eq 'libreoffice' ) - { - $line = "%provides" . " libreoffice-unbundled\n"; - push(@epmheader, $line); - $line = "%incompat" . " libreoffice-bundled\n"; - push(@epmheader, $line); - } - } - } - - # including the directives for %requires and %provides - - my $provides = ""; - my $requires = ""; - - if ( $installer::globals::issolarispkgbuild ) - { - $provides = "solarisprovides"; # the name in the packagelist - $requires = "solarisrequires"; # the name in the packagelist - } - elsif ( $installer::globals::isfreebsdpkgbuild ) - { - $provides = "freebsdprovides"; # the name in the packagelist - $requires = "freebsdrequires"; # the name in the packagelist - } - elsif (( $installer::globals::isrpmbuild ) && - ( $installer::globals::patch ) && - ( exists($onepackage->{'linuxpatchrequires'}) )) - { - $provides = "provides"; # the name in the packagelist - $requires = "linuxpatchrequires"; # the name in the packagelist - } - else - { - $provides = "provides"; # the name in the packagelist - $requires = "requires"; # the name in the packagelist - } - - my $isdict = 0; - if ( $onepackage->{'packagename'} =~ /-dict-/ ) { $isdict = 1; } - - if ( $onepackage->{$provides} ) - { - my $providesstring = $onepackage->{$provides}; - - my $allprovides = installer::converter::convert_stringlist_into_array(\$providesstring, ","); - - for ( my $i = 0; $i <= $#{$allprovides}; $i++ ) - { - my $oneprovides = ${$allprovides}[$i]; - $oneprovides =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$oneprovides, $variableshashref, 1); - if ( $installer::globals::linuxlinkrpmprocess ) { $oneprovides = $oneprovides . "u"; } - $line = "%provides" . " " . $oneprovides . "\n"; - push(@epmheader, $line); - } - } - - if ( $onepackage->{$requires} ) - { - my $requiresstring = $onepackage->{$requires}; - - if ( $installer::globals::add_required_package ) { $requiresstring = $requiresstring . "," . $installer::globals::add_required_package; } - - # The requires string can contain the separator "," in the names (descriptions) of the packages - # (that are required for Solaris depend files). Therefore "," inside such a description has to - # masked with a backslash. - # This masked separator need to be found and replaced, before the stringlist is converted into an array. - # This replacement has to be turned back after the array is created. - - my $replacementstring = "COMMAREPLACEMENT"; - $requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring"); - - my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ","); - - installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring); - - for ( my $i = 0; $i <= $#{$allrequires}; $i++ ) - { - my $onerequires = ${$allrequires}[$i]; - $onerequires =~ s/\s*$//; - installer::packagelist::resolve_packagevariables2(\$onerequires, $variableshashref, 0, $isdict); - - $line = "%requires" . " " . $onerequires . "\n"; - push(@epmheader, $line); - } - } - else - { - if ( $installer::globals::add_required_package ) - { - my $requiresstring = $installer::globals::add_required_package; - - my $replacementstring = "COMMAREPLACEMENT"; - $requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring"); - my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ","); - installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring); - - for ( my $i = 0; $i <= $#{$allrequires}; $i++ ) - { - my $onerequires = ${$allrequires}[$i]; - $onerequires =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$onerequires, $variableshashref, 0); - - $line = "%requires" . " " . $onerequires . "\n"; - push(@epmheader, $line); - } - } - } - - return \@epmheader; -} - -####################################### -# Adding header to epm file -####################################### - -sub adding_header_to_epm_file -{ - my ($epmfileref, $epmheaderref) = @_; - - for ( my $i = 0; $i <= $#{$epmheaderref}; $i++ ) - { - push( @{$epmfileref}, ${$epmheaderref}[$i] ); - } - - push( @{$epmfileref}, "\n\n" ); -} - -##################################################### -# Replace one in shell scripts ( ${VARIABLENAME} ) -##################################################### - -sub replace_variable_in_shellscripts -{ - my ($scriptref, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - ${$scriptref}[$i] =~ s/\$\{$searchstring\}/$variable/g; - } -} - -################################################### -# Replace one in shell scripts ( %VARIABLENAME ) -################################################### - -sub replace_percent_variable_in_shellscripts -{ - my ($scriptref, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - ${$scriptref}[$i] =~ s/\%$searchstring/$variable/g; - } -} - -################################################ -# Replacing many variables in shell scripts -################################################ - -sub replace_many_variables_in_shellscripts -{ - my ($scriptref, $variableshashref) = @_; - - my $key; - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - replace_variable_in_shellscripts($scriptref, $value, $key); - } -} - -####################################### -# Adding shell scripts to epm file -####################################### - -sub adding_shellscripts_to_epm_file -{ - my ($epmfileref, $shellscriptsfilename, $localrootpath, $allvariableshashref, $filesinpackage) = @_; - - push( @{$epmfileref}, "\n\n" ); - - my $shellscriptsfileref = installer::files::read_file($shellscriptsfilename); - - replace_variable_in_shellscripts($shellscriptsfileref, $localrootpath, "rootpath"); - - replace_many_variables_in_shellscripts($shellscriptsfileref, $allvariableshashref); - - for ( my $i = 0; $i <= $#{$shellscriptsfileref}; $i++ ) - { - push( @{$epmfileref}, ${$shellscriptsfileref}[$i] ); - } - - push( @{$epmfileref}, "\n" ); -} - -################################################# -# Determining the epm on the system -################################################# - -sub find_epm_on_system -{ - my ($includepatharrayref) = @_; - - installer::logger::include_header_into_logfile("Check epm on system"); - - my $epmname = "epm"; - - # epm should be defined through the configure script but we need to - # check for it to be defined because of the Sun environment. - # Check the environment variable first and if it is not defined, - # or if it is but the location is not executable, search further. - # It has to be found in the solver or it has to be in the path - # (saved in $installer::globals::epm_in_path) or we get the specified - # one through the environment (i.e. when --with-epm=... is specified) - - if ($ENV{'EPM'}) - { - if (($ENV{'EPM'} ne "") && (-x "$ENV{'EPM'}")) - { - $epmname = $ENV{'EPM'}; - } - elsif ( ($ENV{'EPM'} eq "no") || ($ENV{'EPM'} eq "internal") ) - { - $epmname = "epm"; - my $epmref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$epmname, $includepatharrayref, 0); - if ($$epmref eq "") { installer::exiter::exit_program("ERROR: Could not find program $epmname (EPM set to \"internal\" or \"no\")!", "find_epm_on_system"); } - $epmname = $$epmref; - } - else - { - installer::exiter::exit_program("Environment variable EPM set (\"$ENV{'EPM'}\"), but file does not exist or is not executable!", "find_epm_on_system"); - } - } - else - { - my $epmfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$epmname, $includepatharrayref, 0); - - if (($$epmfileref eq "") && (!($installer::globals::epm_in_path))) { installer::exiter::exit_program("ERROR: Could not find program $epmname!", "find_epm_on_system"); } - if (($$epmfileref eq "") && ($installer::globals::epm_in_path)) { $epmname = $installer::globals::epm_path; } - if (!($$epmfileref eq "")) { $epmname = $$epmfileref; } - } - - my $infoline = "Using epmfile: $epmname\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $epmname; -} - -################################################# -# Determining the epm patch state -# saved in $installer::globals::is_special_epm -################################################# - -sub set_patch_state -{ - my ($epmexecutable) = @_; - - my $infoline = ""; - - my $systemcall = "$epmexecutable |"; - open (EPMPATCH, "$systemcall"); - - while (<EPMPATCH>) - { - chop; - if ( $_ =~ /Patched for OpenOffice.org/ ) { $installer::globals::is_special_epm = 1; } - } - - close (EPMPATCH); - - if ( $installer::globals::is_special_epm ) - { - $infoline = "\nPatch state: This is a patched version of epm!\n\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "\nPatch state: This is an unpatched version of epm!\n\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( ( $installer::globals::is_special_epm ) && (($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild)) ) - { - # Special postprocess handling only for Linux RPM and Solaris packages - $installer::globals::postprocess_specialepm = 1; - $installer::globals::postprocess_standardepm = 0; - } - else - { - $installer::globals::postprocess_specialepm = 0; - $installer::globals::postprocess_standardepm = 1; - } -} - -################################################# -# LD_PRELOAD string for Debian packages -################################################# - -sub get_ld_preload_string -{ - my ($includepatharrayref) = @_; - - my $getuidlibraryname = "getuid.so"; - - my $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0); - if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "get_ld_preload_string"); } - - my $ldpreloadstring = "LD_PRELOAD=" . $$getuidlibraryref; - - return $ldpreloadstring; -} - -################################################# -# Calling epm to create the installation sets -################################################# - -sub call_epm -{ - my ($epmname, $epmlistfilename, $packagename, $includepatharrayref) = @_; - - installer::logger::include_header_into_logfile("epm call for $packagename"); - - my $packageformat = $installer::globals::packageformat; - - my $localpackagename = $packagename; - # Debian allows only lowercase letters in package name - if ( $installer::globals::debian ) { $localpackagename = lc($localpackagename); } - - my $outdirstring = ""; - if ( $installer::globals::epmoutpath ne "" ) { $outdirstring = " --output-dir $installer::globals::epmoutpath"; } - - # Debian package build needs a LD_PRELOAD for correct rights - - my $ldpreloadstring = ""; - - if ( $installer::globals::debian ) { $ldpreloadstring = get_ld_preload_string($includepatharrayref) . " "; } - - my $extraflags = ""; - if ($ENV{'EPM_FLAGS'}) { $extraflags = $ENV{'EPM_FLAGS'}; } - - my $systemcall = $ldpreloadstring . $epmname . " -f " . $packageformat . " " . $extraflags . " " . $localpackagename . " " . $epmlistfilename . $outdirstring . " -v " . " 2\>\&1 |"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxepmcalls = 3; - - for ( my $i = 1; $i <= $maxepmcalls; $i++ ) - { - my @epmoutput = (); - - open (EPM, "$systemcall"); - while (<EPM>) {push(@epmoutput, $_); } - close (EPM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#epmoutput; $j++ ) - { - if ( $i < $maxepmcalls ) { $epmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; } - push( @installer::globals::logfileinfo, "$epmoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $i == $maxepmcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "call_epm"); } - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -##################################################################### -# Adding the new line for relocatables into pkginfo file (Solaris) -# or spec file (Linux) created by epm -##################################################################### - -sub add_one_line_into_file -{ - my ($file, $insertline, $filename) = @_; - - if ( $installer::globals::issolarispkgbuild ) - { - push(@{$file}, $insertline); # simply adding at the end of pkginfo file - } - - if ( $installer::globals::isrpmbuild ) - { - # Adding behind the line beginning with: Group: - - my $inserted_line = 0; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$file},$i+1,0,$insertline); - $inserted_line = 1; - last; - } - } - - if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "add_one_line_into_file"); } - } - - $insertline =~ s/\s*$//; # removing line end for correct logging - my $infoline = "Success: Added line $insertline into file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -##################################################################### -# Setting the revision VERSION=1.9,REV=66 . -# Also adding the new line: "AutoReqProv: no" -##################################################################### - -sub set_revision_in_pkginfo -{ - my ($file, $filename, $variables, $packagename) = @_; - - my $revisionstring = "\,REV\=" . $installer::globals::packagerevision; - - # Adding also a time string to the revision. Syntax: VERSION=8.0.0,REV=66.2005.01.24 - - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - - $mday = $mday; - $mon = $mon + 1; - $year = $year + 1900; - - if ( $mday < 10 ) { $mday = "0" . $mday; } - if ( $mon < 10 ) { $mon = "0" . $mon; } - $datestring = $year . "." . $mon . "." . $mday; - $revisionstring = $revisionstring . "." . $datestring; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*(VERSION\=.*?)\s*$/ ) - { - my $oldstring = $1; - my $newstring = $oldstring . $revisionstring; # also adding the date string - ${$file}[$i] =~ s/$oldstring/$newstring/; - my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # For Update and Patch reasons, this string can also be kept constant - - my $pkgversion = "SOLSPARCPKGVERSION"; - if ( $installer::globals::issolarisx86build ) { $pkgversion = "SOLIAPKGVERSION"; } - - if (( $variables->{$pkgversion} ) && ( $variables->{$pkgversion} ne "" )) - { - if ( $variables->{$pkgversion} ne "FINALVERSION" ) - { - # In OOo 3.x timeframe, this string is no longer unique for all packages, because of the three layer. - # In the string: "3.0.0,REV=9.2008.09.30" only the part "REV=9.2008.09.30" can be unique for all packages - # and therefore be set as $pkgversion. - # The first part "3.0.0" has to be derived from the - - my $version = $installer::globals::packageversion; - if ( $version =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) - { - my $major = $1; - my $minor = $2; - my $micro = $3; - - my $finalmajor = $major; - my $finalminor = $minor; - my $finalmicro = 0; - - $version = "$finalmajor.$finalminor.$finalmicro"; - } - - my $datestring = $variables->{$pkgversion}; - - # Allowing some packages to have another date of creation. - # They can be defined in product definition using a key like "SOLSPARCPKGVERSION_$packagename" - - my $additionalkey = $pkgversion . "_" . $packagename; - if (( $variables->{$additionalkey} ) && ( $variables->{$additionalkey} ne "" )) { $datestring = $variables->{$additionalkey}; } - - my $versionstring = "$version,$datestring"; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*(VERSION\=).*?\s*$/ ) - { - my $start = $1; - my $newstring = $start . $versionstring . "\n"; # setting the complete new string - my $oldstring = ${$file}[$i]; - ${$file}[$i] = $newstring; - $oldstring =~ s/\s*$//; - $newstring =~ s/\s*$//; - my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - } - } -} - -######################################################## -# Setting Patch information for Respin versions -# into pkginfo file. This prevents Respin versions -# from patching. -######################################################## - -sub set_patchlist_in_pkginfo_for_respin -{ - my ($changefile, $filename, $allvariables, $packagename) = @_; - - my $patchlistname = "SOLSPARCPATCHLISTFORRESPIN"; - if ( $installer::globals::issolarisx86build ) { $patchlistname = "SOLIAPATCHLISTFORRESPIN"; } - - if ( $allvariables->{$patchlistname} ) - { - # patchlist separator is a blank - my $allpatchesstring = $allvariables->{$patchlistname}; - my @usedpatches = (); - - # Analyzing the patchlist - # Syntax: 120186-10 126411-01(+core-01) -> use 126411-01 only for core-01 - # Syntax: 120186-10 126411-01(-core-01) -> use 126411-01 for all packages except for core-01 - my $allpatches = installer::converter::convert_whitespace_stringlist_into_array(\$allpatchesstring); - - for ( my $i = 0; $i <= $#{$allpatches}; $i++ ) - { - my $patchdefinition = ${$allpatches}[$i]; - - my $patchid = ""; - my $symbol = ""; - my $constraint = ""; - my $isusedpatch = 0; - - if ( $patchdefinition =~ /^\s*(.+)\(([+-])(.+)\)\s*$/ ) - { - $patchid = $1; - $symbol = $2; - $constraint = $3; - } - elsif (( $patchdefinition =~ /\(/ ) || ( $patchdefinition =~ /\)/ )) # small syntax check - { - # if there is a bracket in the $patchdefinition, but it does not - # match the if-condition, this is an erroneous definition. - installer::exiter::exit_program("ERROR: Unknown patch string: $patchdefinition", "set_patchlist_in_pkginfo_for_respin"); - } - else - { - $patchid = $patchdefinition; - $isusedpatch = 1; # patches without constraint are always included - } - - if ( $symbol ne "" ) - { - if ( $symbol eq "+" ) - { - if ( $packagename =~ /^.*\Q$constraint\E\s*$/ ) { $isusedpatch = 1; } - } - - if ( $symbol eq "-" ) - { - if ( ! ( $packagename =~ /^.*\Q$constraint\E\s*$/ )) { $isusedpatch = 1; } - } - } - - if ( $isusedpatch ) { push(@usedpatches, $patchid); } - } - - if ( $#usedpatches > -1 ) - { - my $patchstring = installer::converter::convert_array_to_space_separated_string(\@usedpatches); - - my $newline = "PATCHLIST=" . $patchstring . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - # Adding patch info for each used patch in the patchlist - - for ( my $i = 0; $i <= $#usedpatches; $i++ ) - { - my $patchid = $usedpatches[$i]; - my $key = "PATCH_INFO_" . $patchid; - $key =~ s/\s*$//; - - if ( ! $allvariables->{$key} ) { installer::exiter::exit_program("ERROR: No Patch info available in zip list file for $key", "set_patchlist_in_pkginfo"); } - my $value = set_timestamp_in_patchinfo($allvariables->{$key}); - $newline = $key . "=" . $value . "\n"; - - add_one_line_into_file($changefile, $newline, $filename); - } - } - } -} - -######################################################## -# Solaris requires, that the time of patch installation -# must not be empty. -# Format: Mon Mar 24 11:20:56 PDT 2008 -# Log file: Tue Apr 29 23:26:19 2008 (04:31 min.) -# Replace string: ${TIMESTAMP} -######################################################## - -sub set_timestamp_in_patchinfo -{ - my ($value) = @_; - - my $currenttime = localtime(); - - if ( $currenttime =~ /^\s*(.+?)(\d\d\d\d)\s*$/ ) - { - my $start = $1; - my $year = $2; - $currenttime = $start . "CET " . $year; - } - - $value =~ s/\$\{TIMESTAMP\}/$currenttime/; - - return $value; -} - -######################################################## -# Setting MAXINST=1000 into the pkginfo file. -######################################################## - -sub set_maxinst_in_pkginfo -{ - my ($changefile, $filename) = @_; - - my $newline = "MAXINST\=1000\n"; - - add_one_line_into_file($changefile, $newline, $filename); -} - -############################################################# -# Setting several Solaris variables into the pkginfo file. -############################################################# - -sub set_solaris_parameter_in_pkginfo -{ - my ($changefile, $filename, $allvariables) = @_; - - my $newline = ""; - - # SUNW_PRODNAME - # SUNW_PRODVERS - # SUNW_PKGVERS - # Not: SUNW_PKGTYPE - # HOTLINE - # EMAIL - - my $productname = $allvariables->{'PRODUCTNAME'}; - $newline = "SUNW_PRODNAME=$productname\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $productversion = ""; - if ( $allvariables->{'PRODUCTVERSION'} ) - { - $productversion = $allvariables->{'PRODUCTVERSION'}; - if ( $allvariables->{'PRODUCTEXTENSION'} ) { $productversion = $productversion . "/" . $allvariables->{'PRODUCTEXTENSION'}; } - } - $newline = "SUNW_PRODVERS=$productversion\n"; - add_one_line_into_file($changefile, $newline, $filename); - - $newline = "SUNW_PKGVERS=1\.0\n"; - add_one_line_into_file($changefile, $newline, $filename); - - if ( $allvariables->{'SUNW_PKGTYPE'} ) - { - $newline = "SUNW_PKGTYPE=$allvariables->{'SUNW_PKGTYPE'}\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - else - { - $newline = "SUNW_PKGTYPE=\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - - $newline = "HOTLINE=Please contact your local service provider\n"; - add_one_line_into_file($changefile, $newline, $filename); - - $newline = "EMAIL=\n"; - add_one_line_into_file($changefile, $newline, $filename); - -} - -##################################################################### -# epm uses as archtecture for Solaris x86 "i86pc". This has to be -# changed to "i386". -##################################################################### - -sub fix_architecture_setting -{ - my ($changefile) = @_; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*ARCH=i86pc\s*$/ ) - { - ${$changefile}[$i] =~ s/i86pc/i386/; - last; - } - - } -} - -##################################################################### -# Adding a new line for topdir into specfile, removing old -# topdir if set. -##################################################################### - -sub set_topdir_in_specfile -{ - my ($changefile, $filename, $newepmdir) = @_; - - $newepmdir = cwd() . $installer::globals::separator . $newepmdir; # only absolute path allowed - - # removing "%define _topdir", if existing - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*\%define _topdir\s+/ ) - { - my $removeline = ${$changefile}[$i]; - $removeline =~ s/\s*$//; - splice(@{$changefile},$i,1); - my $infoline = "Info: Removed line \"$removeline\" from file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # Adding "topdir" behind the line beginning with: Group: - - my $inserted_line = 0; - - my $topdirline = "\%define _topdir $newepmdir\n"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$changefile},$i+1,0,$topdirline); - $inserted_line = 1; - $topdirline =~ s/\s*$//; - my $infoline = "Success: Added line $topdirline into file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "set_topdir_in_specfile"); } - -} - -##################################################################### -# Setting the packager in the spec file -# Syntax: Packager: abc@def -##################################################################### - -sub set_packager_in_specfile -{ - my ($changefile) = @_; - - my $packager = $installer::globals::longmanufacturer; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Packager\s*:\s*(.+?)\s*$/ ) - { - my $oldstring = $1; - ${$changefile}[$i] =~ s/\Q$oldstring\E/$packager/; - my $infoline = "Info: Changed Packager in spec file from $oldstring to $packager!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -##################################################################### -# Setting the requirements in the spec file (i81494) -# Syntax: PreReq: "requirements" (only for shared extensions) -##################################################################### - -sub set_prereq_in_specfile -{ - my ($changefile) = @_; - - my $prereq = "PreReq:"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Requires:\s*(.+?)\s*$/ ) - { - my $oldstring = ${$changefile}[$i]; - ${$changefile}[$i] =~ s/Requires:/$prereq/; - my $infoline = "Info: Changed requirements in spec file from $oldstring to ${$changefile}[$i]!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -##################################################################### -# Setting the Auto[Req]Prov line and __find_requires -##################################################################### - -sub set_autoprovreq_in_specfile -{ - my ($changefile, $findrequires, $bindir) = @_; - - my $autoreqprovline; - - if ( $findrequires ) - { - $autoreqprovline = "AutoProv\: no\n%define __find_requires $bindir/$findrequires\n"; - } - else - { - $autoreqprovline = "AutoReqProv\: no\n"; - } - - $autoreqprovline .= "%define _binary_filedigest_algorithm 1\n%define _binary_payload w9.gzdio\n"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - # Adding "autoreqprov" behind the line beginning with: Group: - if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$changefile},$i+1,0,$autoreqprovline); - $autoreqprovline =~ s/\s*$//; - $infoline = "Success: Added line $autoreqprovline into spec file!\n"; - push( @installer::globals::logfileinfo, $infoline); - - last; - } - } -} - -##################################################################### -# Replacing Copyright with License in the spec file -# Syntax: License: LGPL, SISSL -##################################################################### - -sub set_license_in_specfile -{ - my ($changefile, $variableshashref) = @_; - - my $license = $variableshashref->{'LICENSENAME'}; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Copyright\s*:\s*(.+?)\s*$/ ) - { - ${$changefile}[$i] = "License: $license\n"; - my $infoline = "Info: Replaced Copyright with License: $license !\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -######################################################### -# Building relocatable Solaris packages means: -# 1. Add "BASEDIR=/opt" into pkginfo -# 2. Remove "/opt/" from all objects in prototype file -# For step2 this function exists -# Sample: d none /opt/openofficeorg20/help 0755 root other -# -> d none openofficeorg20/help 0755 root other -######################################################### - -sub make_prototypefile_relocatable -{ - my ($prototypefile, $relocatablepath) = @_; - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*\w\s+\w+\s+\/\w+/ ) # this is an object line - { - ${$prototypefile}[$i] =~ s/$relocatablepath//; # Important: $relocatablepath has a "/" at the end. Example "/opt/" - } - } - - # If the $relocatablepath is "/opt/openoffice20/" the line "d none /opt/openoffice20" was not changed. - # This line has to be removed now - - if ( $relocatablepath ne "/" ) { $relocatablepath =~ s/\/\s*$//; } # removing the ending slash - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*d\s+\w+\s+\Q$relocatablepath\E/ ) - { - my $line = ${$prototypefile}[$i]; - splice(@{$prototypefile},$i,1); # removing the line - $line =~ s/\s*$//; - my $infoline = "Info: Removed line \"$line\" from prototype file!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # Making "\$" to "$" in prototype file. "\$" was created by epm. - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /\\\$/ ) - { - ${$prototypefile}[$i] =~ s/\\\$/\$/g; - my $infoline2 = "Info: Changed line in prototype file: ${$prototypefile}[$i] !\n"; - push( @installer::globals::logfileinfo, $infoline2); - } - } -} - - -######################################################################### -# In scp the flag VOLATEFILE can be used. This shall lead to style "v" -# in Solaris prototype file. This is not supported by epm and has -# therefore to be included in prototypefile, not in epm list file. -######################################################################### - -sub set_volatilefile_into_prototypefile -{ - my ($prototypefile, $filesref) = @_; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bVOLATILEFILE\b/ ) - { - my $sourcepath = $onefile->{'sourcepath'}; - - for ( my $j = 0; $j <= $#{$prototypefile}; $j++ ) - { - if (( ${$prototypefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$prototypefile}[$j] =~ /\=\Q$sourcepath\E\s+/ )) - { - my $oldline = ${$prototypefile}[$j]; - ${$prototypefile}[$j] =~ s/^\s*f/v/; - my $newline = ${$prototypefile}[$j]; - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - my $infoline = "Volatile file: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - last; - } - } - } - } -} - -######################################################################### -# Replacing the variables in the Solaris patch shell scripts. -# Taking care, that multiple slashes are not always removed. -######################################################################### - -sub replace_variables_in_shellscripts_for_patch -{ - my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ ) - { - my $oldline = ${$scriptfile}[$i]; - if (( $oldstring eq "PRODUCTDIRECTORYNAME" ) && ( $newstring eq "" )) { $oldstring = $oldstring . "/"; } - ${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g; - my $infoline = "Info: Substituting in $scriptfilename $oldstring by $newstring\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -######################################################################### -# Replacing the variables in the shell scripts or in the epm list file -# Linux: spec file -# Solaris: preinstall, postinstall, preremove, postremove -# If epm is used in the original version (not relocatable) -# the variables have to be exchanged in the list file, -# created for epm. -######################################################################### - -sub replace_variables_in_shellscripts -{ - my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_; - - my $debug = 0; - if ( $oldstring eq "PRODUCTDIRECTORYNAME" ) { $debug = 1; } - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ ) - { - my $oldline = ${$scriptfile}[$i]; - ${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g; - ${$scriptfile}[$i] =~ s/\/\//\//g; # replacing "//" by "/" , if path $newstring is empty! - my $infoline = "Info: Substituting in $scriptfilename $oldstring by $newstring\n"; - push(@installer::globals::logfileinfo, $infoline); - if ( $debug ) - { - $infoline = "Old Line: $oldline"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "New Line: ${$scriptfile}[$i]"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } -} - -############################################################ -# Determinig the directory created by epm, in which the -# RPMS or Solaris packages are created. -############################################################ - -sub determine_installdir_ooo -{ - # A simple "ls" command returns the directory name - - my $dirname = ""; - - my $systemcall = "ls |"; - open (LS, "$systemcall"); - $dirname = <LS>; - close (LS); - - $dirname =~ s/\s*$//; - - my $infoline = "Info: Directory created by epm: $dirname\n"; - push(@installer::globals::logfileinfo, $infoline); - - return $dirname; -} - -############################################################ -# Setting the tab content into the file container -############################################################ - -sub set_tab_into_datafile -{ - my ($changefile, $filesref) = @_; - - my @newclasses = (); - my $newclassesstring = ""; - - if ( $installer::globals::issolarispkgbuild ) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'SolarisClass'} ) - { - my $sourcepath = $onefile->{'sourcepath'}; - - for ( my $j = 0; $j <= $#{$changefile}; $j++ ) - { - if (( ${$changefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$changefile}[$j] =~ /\=\Q$sourcepath\E\s+/ )) - { - my $oldline = ${$changefile}[$j]; - ${$changefile}[$j] =~ s/f\s+none/e $onefile->{'SolarisClass'}/; - my $newline = ${$changefile}[$j]; - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - - my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - - # collecting all new classes - if (! installer::existence::exists_in_array($onefile->{'SolarisClass'}, \@newclasses)) - { - push(@newclasses, $onefile->{'SolarisClass'}); - } - - last; - } - } - } - } - - $newclassesstring = installer::converter::convert_array_to_space_separated_string(\@newclasses); - } - - if ( $installer::globals::isrpmbuild ) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'SpecFileContent'} ) - { - my $destination = $onefile->{'destination'}; - - for ( my $j = 0; $j <= $#{$changefile}; $j++ ) - { - if ( ${$changefile}[$j] =~ /^\s*(\%attr\(.*\))\s+(\".*?\Q$destination\E\"\s*)$/ ) - { - my $begin = $1; - my $end = $2; - - my $oldline = ${$changefile}[$j]; - ${$changefile}[$j] = $begin . " " . $onefile->{'SpecFileContent'} . " " . $end; - my $newline = ${$changefile}[$j]; - - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - - my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - - last; - } - } - } - } - } - - return $newclassesstring; -} - -############################################################ -# Including additional classes into the pkginfo file -############################################################ - -sub include_classes_into_pkginfo -{ - my ($changefile, $classesstring) = @_; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*CLASSES\=none/ ) - { - ${$changefile}[$i] =~ s/\s*$//; - my $oldline = ${$changefile}[$i]; - ${$changefile}[$i] = ${$changefile}[$i] . " " . $classesstring . "\n"; - my $newline = ${$changefile}[$i]; - $newline =~ s/\s*$//; - - my $infoline = "pkginfo file: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -########################################################################################## -# Checking, if an extension is included into the package (Linux). -# All extension files have to be installed into directory -# share/extension/install -# %attr(0444,root,root) "/opt/staroffice8/share/extension/install/SunSearchToolbar.oxt" -########################################################################################## - -sub is_extension_package -{ - my ($specfile) = @_; - - my $is_extension_package = 0; - - for ( my $i = 0; $i <= $#{$specfile}; $i++ ) - { - my $line = ${$specfile}[$i]; - if ( $line =~ /share\/extension\/install\/.*?\.oxt\"\s*$/ ) - { - $is_extension_package = 1; - last; - } - } - - return $is_extension_package; -} - -###################################################################### -# Checking, if an extension is included into the package (Solaris). -# All extension files have to be installed into directory -# share/extension/install -###################################################################### - -sub contains_extension_dir -{ - my ($prototypefile) = @_; - - my $contains_extension_dir = 0; - - # d none opt/openoffice.org3/share/extensions/ - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - my $line = ${$prototypefile}[$i]; - if ( $line =~ /^\s*d\s+none\s.*\/share\/extensions\// ) - { - $contains_extension_dir = 1; - last; - } - } - - return $contains_extension_dir; -} - -############################################################ -# A Solaris patch contains 7 specific scripts -############################################################ - -sub add_scripts_into_prototypefile -{ - my ($prototypefile, $prototypefilename, $languagestringref, $staticpath) = @_; - - # The files are stored in the directory $installer::globals::patchincludepath - # The file names are available via @installer::globals::solarispatchscripts - - my $path = $installer::globals::patchincludepath; - $path =~ s/\/\s*$//; - $path = $path . $installer::globals::separator; - - my @newlines = (); - my $is_extension_package = contains_extension_dir($prototypefile); - - if ( $is_extension_package ) - { - for ( my $i = 0; $i <= $#installer::globals::solarispatchscriptsforextensions; $i++ ) - { - my $sourcefilename = $path . $installer::globals::solarispatchscriptsforextensions[$i]; - my $destfile = $installer::globals::solarispatchscriptsforextensions[$i]; - - # If the sourcepath has "_extension" in its name, this has to be removed - $destfile =~ s/_extensions\s*$//; # hard coded renaming of script name - - # Creating unique directory name with $prototypefilename - my $extensiondir = installer::systemactions::create_directories("extensionscripts", $languagestringref); - - if ( $prototypefilename =~ /\/(\S*?)\s*$/ ) { $prototypefilename = $1; } - $prototypefilename =~ s/\./_/g; - my $destdir = $extensiondir . $installer::globals::separator . $prototypefilename; - if ( ! -d $destdir ) { installer::systemactions::create_directory($destdir); } - my $destpath = $destdir . $installer::globals::separator . $destfile; - if ( -f $destpath ) { unlink($destpath); } - - # Reading file - my $scriptfile = installer::files::read_file($sourcefilename); - - # Replacing variables - my $oldstring = "PRODUCTDIRECTORYNAME"; - replace_variables_in_shellscripts_for_patch($scriptfile, $destpath, $oldstring, $staticpath); - - # Saving file - installer::files::save_file($destpath, $scriptfile); - - # Writing file destination into prototype file - my $line = "i $destfile=" . $destpath . "\n"; - push(@newlines, $line); - } - } - else - { - for ( my $i = 0; $i <= $#installer::globals::solarispatchscripts; $i++ ) - { - my $line = "i $installer::globals::solarispatchscripts[$i]=" . $path . $installer::globals::solarispatchscripts[$i] . "\n"; - push(@newlines, $line); - } - } - - # Including the new lines after the last line starting with "i" - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*i\s+copyright/ ) - { - splice(@{$prototypefile}, $i, 1); # ignoring old copyright text, using patch standard - next; - } - if ( ${$prototypefile}[$i] =~ /^\s*i\s+/ ) { next; } - splice(@{$prototypefile}, $i, 0, @newlines); - last; - } -} - -############################################################ -# Adding patch infos in pkginfo file -############################################################ - -sub include_patchinfos_into_pkginfo -{ - my ( $changefile, $filename, $variableshashref ) = @_; - - # SUNW_PATCHID=101998-10 - # SUNW_OBSOLETES=114999-01 113999-01 - # SUNW_PKGTYPE=usr - # SUNW_PKGVERS=1.0 - # SUNW_REQUIRES=126411-01 - - my $patchidname = "SOLSPARCPATCHID"; - if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; } - - if ( ! $variableshashref->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "include_patchinfos_into_pkginfo"); } - - my $newline = "SUNW_PATCHID=" . $variableshashref->{$patchidname} . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $patchobsoletesname = "SOLSPARCPATCHOBSOLETES"; - if ( $installer::globals::issolarisx86build ) { $patchobsoletesname = "SOLIAPATCHOBSOLETES"; } - - my $obsoletes = ""; - if ( $variableshashref->{$patchobsoletesname} ) { $obsoletes = $variableshashref->{$patchobsoletesname}; } - $newline = "SUNW_OBSOLETES=" . $obsoletes . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $patchrequiresname = "SOLSPARCPATCHREQUIRES"; - if ( $installer::globals::issolarisx86build ) { $patchrequiresname = "SOLIAPATCHREQUIRES"; } - - if ( $variableshashref->{$patchrequiresname} ) - { - my $requires = $variableshashref->{$patchrequiresname}; - $newline = "SUNW_REQUIRES=" . $requires . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - $newline = "SUNW_PATCH_PROPERTIES=\n"; - add_one_line_into_file($changefile, $newline, $filename); -} - -############################################################ -# Setting the correct Solaris locales -############################################################ - -sub get_solaris_language_for_langpack -{ - my ( $onelanguage ) = @_; - - my $sollanguage = $onelanguage; - $sollanguage =~ s/\-/\_/; - - if ( $sollanguage eq "de" ) { $sollanguage = "de"; } - elsif ( $sollanguage eq "en_US" ) { $sollanguage = "en_AU,en_CA,en_GB,en_IE,en_MT,en_NZ,en_US,en_US.UTF-8"; } - elsif ( $sollanguage eq "es" ) { $sollanguage = "es"; } - elsif ( $sollanguage eq "fr" ) { $sollanguage = "fr"; } - elsif ( $sollanguage eq "hu" ) { $sollanguage = "hu_HU"; } - elsif ( $sollanguage eq "it" ) { $sollanguage = "it"; } - elsif ( $sollanguage eq "nl" ) { $sollanguage = "nl_BE,nl_NL"; } - elsif ( $sollanguage eq "pl" ) { $sollanguage = "pl_PL"; } - elsif ( $sollanguage eq "sv" ) { $sollanguage = "sv"; } - elsif ( $sollanguage eq "pt" ) { $sollanguage = "pt_PT"; } - elsif ( $sollanguage eq "pt_BR" ) { $sollanguage = "pt_BR"; } - elsif ( $sollanguage eq "ru" ) { $sollanguage = "ru_RU"; } - elsif ( $sollanguage eq "ja" ) { $sollanguage = "ja,ja_JP,ja_JP.PCK,ja_JP.UTF-8"; } - elsif ( $sollanguage eq "ko" ) { $sollanguage = "ko,ko.UTF-8"; } - elsif ( $sollanguage eq "zh_CN" ) { $sollanguage = "zh,zh.GBK,zh_CN.GB18030,zh.UTF-8"; } - elsif ( $sollanguage eq "zh_TW" ) { $sollanguage = "zh_TW,zh_TW.BIG5,zh_TW.UTF-8,zh_HK.BIG5HK,zh_HK.UTF-8"; } - - return $sollanguage; -} - -############################################################ -# Adding language infos in pkginfo file -############################################################ - -sub include_languageinfos_into_pkginfo -{ - my ( $changefile, $filename, $languagestringref, $onepackage, $variableshashref ) = @_; - - # SUNWPKG_LIST=core01 - # SUNW_LOC=de - - my $locallang = $onepackage->{'language'}; - my $solarislanguage = get_solaris_language_for_langpack($locallang); - - my $newline = "SUNW_LOC=" . $solarislanguage . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - # SUNW_PKGLIST is required, if SUNW_LOC is defined. - if ( $onepackage->{'pkg_list_entry'} ) - { - my $packagelistentry = $onepackage->{'pkg_list_entry'}; - installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1); - $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - else - { - # Using default package ooobasis30-core01. - my $packagelistentry = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"; - installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1); - $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } -} - -############################################################ -# Collecting all files included in patch in -# @installer::globals::patchfilecollector -############################################################ - -sub collect_patch_files -{ - my ($file, $packagename, $prefix) = @_; - - # $file is the spec file or the prototypefile - - $prefix = $prefix . "/"; - my $packagenamestring = "Package " . $packagename . " \:\n"; - push(@installer::globals::patchfilecollector, $packagenamestring); - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - - if ( $installer::globals::isrpmbuild ) - { - # %attr(0444,root,root) "/opt/openofficeorg20/program/about.bmp" - - if ( $line =~ /^\s*\%attr\(.*\)\s*\"(.*?)\"\s*$/ ) - { - my $filename = $1 . "\n"; - $filename =~ s/^\s*\Q$prefix\E//; - push(@installer::globals::patchfilecollector, $filename); - } - } - - if ( $installer::globals::issolarispkgbuild ) - { - # f none program/msomrl.rdb=/ab/SRC680/unxsols4.pro/bin/msomrl.rdb 0444 root bin - - if ( $line =~ /^\s*f\s+\w+\s+(.*?)\=/ ) - { - my $filename = $1 . "\n"; - push(@installer::globals::patchfilecollector, $filename); - } - } - } - - push(@installer::globals::patchfilecollector, "\n"); - -} - -############################################################ -# Including package names into the depend files. -# The package names have to be included into -# packagelist. They are already saved in -# %installer::globals::dependfilenames. -############################################################ - -sub put_packagenames_into_dependfile -{ - my ( $file ) = @_; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - if ( $line =~ /^\s*\w\s+(.*?)\s*$/ ) - { - my $abbreviation = $1; - - if ( $abbreviation =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package abbreviation \"$abbreviation\"!", "read_packagemap"); } - - if ( exists($installer::globals::dependfilenames{$abbreviation}) ) - { - my $packagename = $installer::globals::dependfilenames{$abbreviation}; - if ( $packagename =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package name \"$packagename\"!", "read_packagemap"); } - - $line =~ s/\s*$//; - ${$file}[$i] = $line . "\t" . $packagename . "\n"; - } - else - { - installer::exiter::exit_program("ERROR: Missing packagename for Solaris package \"$abbreviation\"!", "put_packagenames_into_dependfile"); - } - } - } -} - -############################################################ -# Including the relocatable directory into -# spec file and pkginfo file -# Linux: set topdir in specfile -# Solaris: remove $relocatablepath (/opt/) -# for all objects in prototype file -# and changing "topdir" for Linux -############################################################ - -sub prepare_packages -{ - my ($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $variableshashref, $filesref, $languagestringref) = @_; - - my $filename = ""; - my $newline = ""; - my $newepmdir = $installer::globals::epmoutpath . $installer::globals::separator; - - my $localrelocatablepath = $relocatablepath; - if ( $localrelocatablepath ne "/" ) { $localrelocatablepath =~ s/\/\s*$//; } - - if ( $installer::globals::issolarispkgbuild ) - { - $filename = $packagename . ".pkginfo"; - $newline = "BASEDIR\=" . $localrelocatablepath . "\n"; - } - - if ( $installer::globals::isrpmbuild ) - { - $filename = $packagename . ".spec"; - $newline = "Prefix\:\ " . $localrelocatablepath . "\n"; - } - - my $completefilename = $newepmdir . $filename; - - if ( ! -f $completefilename) { installer::exiter::exit_program("ERROR: Did not find file: $completefilename", "prepare_packages"); } - my $changefile = installer::files::read_file($completefilename); - if ( $newline ne "" ) - { - add_one_line_into_file($changefile, $newline, $filename); - installer::files::save_file($completefilename, $changefile); - } - - # adding new "topdir" and removing old "topdir" in specfile - - if ( $installer::globals::isrpmbuild ) - { - set_topdir_in_specfile($changefile, $filename, $newepmdir); - set_autoprovreq_in_specfile($changefile, $onepackage->{'findrequires'}, "$installer::globals::unpackpath" . "/bin"); - set_packager_in_specfile($changefile); - if ( is_extension_package($changefile) ) { set_prereq_in_specfile($changefile); } - set_license_in_specfile($changefile, $variableshashref); - set_tab_into_datafile($changefile, $filesref); - installer::files::save_file($completefilename, $changefile); - if ( $installer::globals::patch ) { collect_patch_files($changefile, $packagename, $localrelocatablepath); } - } - - # removing the relocatable path in prototype file - - if ( $installer::globals::issolarispkgbuild ) - { - set_revision_in_pkginfo($changefile, $filename, $variableshashref, $packagename); - set_maxinst_in_pkginfo($changefile, $filename); - set_solaris_parameter_in_pkginfo($changefile, $filename, $variableshashref); - if ( $installer::globals::issolarisx86build ) { fix_architecture_setting($changefile); } - if ( ! $installer::globals::patch ) { set_patchlist_in_pkginfo_for_respin($changefile, $filename, $variableshashref, $packagename); } - if ( $installer::globals::patch ) { include_patchinfos_into_pkginfo($changefile, $filename, $variableshashref); } - if (( $onepackage->{'language'} ) && ( $onepackage->{'language'} ne "" ) && ( $onepackage->{'language'} ne "en-US" )) { include_languageinfos_into_pkginfo($changefile, $filename, $languagestringref, $onepackage, $variableshashref); } - installer::files::save_file($completefilename, $changefile); - - my $prototypefilename = $packagename . ".prototype"; - $prototypefilename = $newepmdir . $prototypefilename; - if (! -f $prototypefilename) { installer::exiter::exit_program("ERROR: Did not find prototype file: $prototypefilename", "prepare_packages"); } - - my $prototypefile = installer::files::read_file($prototypefilename); - make_prototypefile_relocatable($prototypefile, $relocatablepath); - set_volatilefile_into_prototypefile($prototypefile, $filesref); - my $classesstring = set_tab_into_datafile($prototypefile, $filesref); - if ($classesstring) - { - include_classes_into_pkginfo($changefile, $classesstring); - installer::files::save_file($completefilename, $changefile); - } - - if ( $installer::globals::patch ) { add_scripts_into_prototypefile($prototypefile, $prototypefilename, $languagestringref, $staticpath); } - - installer::files::save_file($prototypefilename, $prototypefile); - if ( $installer::globals::patch ) { collect_patch_files($prototypefile, $packagename, ""); } - - # Adding package names into depend files for Solaris (not supported by epm) - my $dependfilename = $packagename . ".depend"; - $dependfilename = $newepmdir . $dependfilename; - if ( -f $dependfilename) - { - my $dependfile = installer::files::read_file($dependfilename); - put_packagenames_into_dependfile($dependfile); - installer::files::save_file($dependfilename, $dependfile); - } - } - - return $newepmdir; -} - -############################################################ -# Linux requirement for perl is changed by epm from -# /usr/bin/perl to perl . -# Requires: perl -############################################################ - -sub check_requirements_in_specfile -{ - my ( $specfile ) = @_; - - for ( my $i = 0; $i <= $#{$specfile}; $i++ ) - { - if (( ${$specfile}[$i] =~ /^\s*Requires/ ) && ( ${$specfile}[$i] =~ /\bperl\b/ ) && ( ! ( ${$specfile}[$i] =~ /\/usr\/bin\/perl\b/ ))) - { - my $oldline = ${$specfile}[$i]; - ${$specfile}[$i] =~ s/perl/\/usr\/bin\/perl/; - my $newline = ${$specfile}[$i]; - - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - my $infoline = "Spec File: Changing content from \"$oldline\" to \"$newline\".\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -############################################################################### -# Replacement of PRODUCTINSTALLLOCATION and PRODUCTDIRECTORYNAME in the -# epm list file. -# The complete rootpath is stored in $installer::globals::rootpath -# or for each package in $onepackage->{'destpath'} -# The static rootpath is stored in $staticpath -# The relocatable path is stored in $relocatablepath -# PRODUCTINSTALLLOCATION is the relocatable part ("/opt") and -# PRODUCTDIRECTORYNAME the static path ("openofficeorg20"). -# In standard epm process: -# No usage of package specific variables like $BASEDIR, because -# 1. These variables would be replaced in epm process -# 2. epm version 3.7 does not support relocatable packages -############################################################################### - -sub resolve_path_in_epm_list_before_packaging -{ - my ($listfile, $listfilename, $variable, $path) = @_; - - installer::logger::include_header_into_logfile("Replacing variables in epm list file:"); - - $path =~ s/\/\s*$//; - replace_variables_in_shellscripts($listfile, $listfilename, $variable, $path); - -} - -################################################################# -# Determining the rpm version. Beginning with rpm version 4.0 -# the tool to create RPMs is "rpmbuild" and no longer "rpm" -################################################################# - -sub determine_rpm_version -{ - my $rpmversion = 0; - my $rpmout = ""; - my $systemcall = ""; - - # "rpm --version" has problems since LD_LIBRARY_PATH was removed. Therefore the content of $RPM has to be called. - # "rpm --version" and "rpmbuild --version" have the same output. Therefore $RPM can be used. Its value - # is saved in $installer::globals::rpm - - if ( $installer::globals::rpm ne "" ) - { - $systemcall = "$installer::globals::rpm --version |"; - } - else - { - $systemcall = "rpm --version |"; - } - - open (RPM, "$systemcall"); - $rpmout = <RPM>; - close (RPM); - - if ( $rpmout ne "" ) - { - $rpmout =~ s/\s*$//g; - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $rpmout eq "" ) { $infoline = "ERROR: Could not find file \"rpm\" !\n"; } - else { $infoline = "Success: rpm version: $rpmout\n"; } - - push( @installer::globals::logfileinfo, $infoline); - - if ( $rpmout =~ /(\d+)\.(\d+)\.(\d+)/ ) { $rpmversion = $1; } - elsif ( $rpmout =~ /(\d+)\.(\d+)/ ) { $rpmversion = $1; } - elsif ( $rpmout =~ /(\d+)/ ) { $rpmversion = $1; } - else { installer::exiter::exit_program("ERROR: Unknown format: $rpmout ! Expected: \"a.b.c\", or \"a.b\", or \"a\"", "determine_rpm_version"); } - } - - return $rpmversion; -} - -#################################################### -# Writing some info about rpm into the log file -#################################################### - -sub log_rpm_info -{ - my $systemcall = ""; - my $infoline = ""; - - $infoline = "\nLogging rpmrc content using --showrc\n\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $installer::globals::rpm ne "" ) - { - $systemcall = "$installer::globals::rpm --showrc |"; - } - else - { - $systemcall = "rpm --showrc |"; - } - - my @fullrpmout = (); - - open (RPM, "$systemcall"); - while (<RPM>) {push(@fullrpmout, $_); } - close (RPM); - - if ( $#fullrpmout > -1 ) - { - for ( my $i = 0; $i <= $#fullrpmout; $i++ ) - { - my $rpmout = $fullrpmout[$i]; - $rpmout =~ s/\s*$//g; - - $infoline = "$rpmout\n"; - $infoline =~ s/error/e_r_r_o_r/gi; # avoiding log problems - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Problem in systemcall: $systemcall : No return value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $infoline = "End of logging rpmrc\n\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################# -# Systemcall to start the packaging process -################################################# - -sub create_packages_without_epm -{ - my ($epmdir, $packagename, $includepatharrayref, $allvariables, $languagestringref) = @_; - - # Solaris: pkgmk -o -f solaris-2.8-sparc/SUNWso8m34.prototype -d solaris-2.8-sparc - # Solaris: pkgtrans solaris-2.8-sparc SUNWso8m34.pkg SUNWso8m34 - # Solaris: tar -cf - SUNWso8m34 | gzip > SUNWso8m34.tar.gz - - if ( $installer::globals::issolarispkgbuild ) - { - my $prototypefile = $epmdir . $packagename . ".prototype"; - if (! -f $prototypefile) { installer::exiter::exit_program("ERROR: Did not find file: $prototypefile", "create_packages_without_epm"); } - - my $destinationdir = $prototypefile; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationdir); - $destinationdir =~ s/\/\s*$//; # removing ending slashes - - my $systemcall = "pkgmk -l 1073741824 -o -f $prototypefile -d $destinationdir 2\>\&1 |"; - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxpkgmkcalls = 3; - - for ( my $i = 1; $i <= $maxpkgmkcalls; $i++ ) - { - my @pkgmkoutput = (); - - open (PKGMK, "$systemcall"); - while (<PKGMK>) {push(@pkgmkoutput, $_); } - close (PKGMK); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#pkgmkoutput; $j++ ) - { - if ( $i < $maxpkgmkcalls ) { $pkgmkoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; } - push( @installer::globals::logfileinfo, "$pkgmkoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $i == $maxpkgmkcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); } - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # It might be necessary to save uncompressed Solaris packages - - if ( $allvariables->{'JDSBUILD'} ) - { - if ( ! $installer::globals::jds_language_controlled ) - { - my $correct_language = installer::worker::check_jds_language($allvariables, $languagestringref); - $installer::globals::correct_jds_language = $correct_language; - $installer::globals::jds_language_controlled = 1; - } - - if ( $installer::globals::correct_jds_language ) - { - if ( $installer::globals::saved_packages_path eq "" ) - { - $packagestempdir = installer::systemactions::create_directories("jds", $languagestringref); - $installer::globals::saved_packages_path = $packagestempdir; - push(@installer::globals::jdsremovedirs, $packagestempdir); - } - - $systemcall = "cd $destinationdir; cp -p -R $packagename $installer::globals::saved_packages_path;"; - make_systemcall($systemcall); - installer::logger::print_message( "... $systemcall ...\n" ); - - # Setting unix rights to "775" for all created directories inside the package, - # that is saved in temp directory - - $systemcall = "cd $packagestempdir; find $packagename -type d | xargs -i chmod 775 \{\} \;"; - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - - # compressing packages - - if ( ! $installer::globals::solarisdontcompress ) - { - my $faspac = "faspac-so.sh"; - - my $compressorref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$faspac, $includepatharrayref, 0); - if ($$compressorref ne "") - { - # Saving original pkginfo, to set time stamp later - my $pkginfoorig = "$destinationdir/$packagename/pkginfo"; - my $pkginfotmp = "$destinationdir/$packagename" . ".pkginfo.tmp"; - $systemcall = "cp -p $pkginfoorig $pkginfotmp"; - make_systemcall($systemcall); - - $faspac = $$compressorref; - $infoline = "Found compressor: $faspac\n"; - push( @installer::globals::logfileinfo, $infoline); - - installer::logger::print_message( "... $faspac ...\n" ); - installer::logger::include_timestamp_into_logfile("Starting $faspac"); - - $systemcall = "/bin/sh $faspac -a -q -d $destinationdir $packagename"; # $faspac has to be the absolute path! - make_systemcall($systemcall); - - # Setting time stamp for pkginfo, because faspac-so.sh changed the pkginfo file, - # updated the size and checksum, but not the time stamp. - $systemcall = "touch -r $pkginfotmp $pkginfoorig"; - make_systemcall($systemcall); - if ( -f $pkginfotmp ) { unlink($pkginfotmp); } - - installer::logger::include_timestamp_into_logfile("End of $faspac"); - } - else - { - $infoline = "Not found: $faspac\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - # Setting unix rights to "775" for all created directories inside the package - - $systemcall = "cd $destinationdir; find $packagename -type d | xargs -i chmod 775 \{\} \;"; - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - - ###################### - # making pkg files - ###################### - - # my $streamname = $packagename . ".pkg"; - # $systemcall = "pkgtrans $destinationdir $streamname $packagename"; - # print "... $systemcall ...\n"; - - # $returnvalue = system($systemcall); - - # $infoline = "Systemcall: $systemcall\n"; - # push( @installer::globals::logfileinfo, $infoline); - - # if ($returnvalue) - # { - # $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - # else - # { - # $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - - ######################### - # making tar.gz files - ######################### - - # my $targzname = $packagename . ".tar.gz"; - # $systemcall = "cd $destinationdir; tar -cf - $packagename | gzip > $targzname"; - # print "... $systemcall ...\n"; - - # $returnvalue = system($systemcall); - - # $infoline = "Systemcall: $systemcall\n"; - # push( @installer::globals::logfileinfo, $infoline); - - # if ($returnvalue) - # { - # $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - # else - # { - # $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - - } - - # Linux: rpm -bb so8m35.spec ( -> dependency check abklemmen? ) - - if ( $installer::globals::isrpmbuild ) - { - my $specfilename = $epmdir . $packagename . ".spec"; - if (! -f $specfilename) { installer::exiter::exit_program("ERROR: Did not find file: $specfilename", "create_packages_without_epm"); } - - my $rpmcommand = $installer::globals::rpm; - my $rpmversion = determine_rpm_version(); - - # saving globally for later usage - $installer::globals::rpmcommand = $rpmcommand; - $installer::globals::rpmquerycommand = "rpm"; - - my $target = ""; - if ( $installer::globals::compiler =~ /unxlngi/) { $target = "i586"; } - elsif ( $installer::globals::compiler =~ /unxaigppc/) { $target = "ppc"; } - elsif ( $installer::globals::compiler =~ /unxlng/) {$target = (POSIX::uname())[4]; } - - # rpm 4.6 ignores buildroot tag in spec file - - my $buildrootstring = ""; - - if ( $rpmversion >= 4 ) - { - my $dir = getcwd; - my $buildroot = $dir . "/" . $epmdir . "buildroot/"; - $buildrootstring = "--buildroot=$buildroot"; - mkdir($buildroot = $dir . "/" . $epmdir . "BUILD/"); - } - - if ( ! $installer::globals::rpminfologged ) - { - log_rpm_info(); - $installer::globals::rpminfologged = 1; - } - - my $systemcall = "$rpmcommand -bb --define \"_unpackaged_files_terminate_build 0\" $specfilename --target $target $buildrootstring 2\>\&1 |"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxrpmcalls = 3; - my $rpm_failed = 0; - - for ( my $i = 1; $i <= $maxrpmcalls; $i++ ) - { - my @rpmoutput = (); - - open (RPM, "$systemcall"); - while (<RPM>) {push(@rpmoutput, $_); } - close (RPM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#rpmoutput; $j++ ) - { - $rpmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; - push( @installer::globals::logfileinfo, "$rpmoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 1; - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 0; - last; - } - } - - if ( $rpm_failed ) - { - # Because of the problems with LD_LIBARY_PATH, a direct call of local "rpm" or "rpmbuild" might be successful - my $rpmprog = ""; - if ( -f "/usr/bin/rpmbuild" ) { $rpmprog = "/usr/bin/rpmbuild"; } - elsif ( -f "/usr/bin/rpm" ) { $rpmprog = "/usr/bin/rpm"; } - - if ( $rpmprog ne "" ) - { - installer::logger::print_message( "... $rpmprog ...\n" ); - - my $helpersystemcall = "$rpmprog -bb $specfilename --target $target $buildrootstring 2\>\&1 |"; - - my @helperrpmoutput = (); - - open (RPM, "$helpersystemcall"); - while (<RPM>) {push(@helperrpmoutput, $_); } - close (RPM); - - my $helperreturnvalue = $?; # $? contains the return value of the systemcall - - $infoline = "\nLast try: Using $rpmprog directly (problem with LD_LIBARY_PATH)\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "\nSystemcall: $helpersystemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#helperrpmoutput; $j++ ) { push( @installer::globals::logfileinfo, "$helperrpmoutput[$j]"); } - - if ($helperreturnvalue) - { - $infoline = "Could not execute \"$helpersystemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - installer::logger::print_message( "Success: \"$helpersystemcall\"\n" ); - $infoline = "Success: Executed \"$helpersystemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 0; - } - } - - # Now it is really time to exit this packaging process, if the error still occurs - if ( $rpm_failed ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); } - } - } -} - -################################################# -# Removing all temporary files created by epm -################################################# - -sub remove_temporary_epm_files -{ - my ($epmdir, $loggingdir, $packagename) = @_; - - # saving the files into the loggingdir - - if ( $installer::globals::issolarispkgbuild ) - { - my @extensions = (); - push(@extensions, ".pkginfo"); - push(@extensions, ".prototype"); - push(@extensions, ".postinstall"); - push(@extensions, ".postremove"); - push(@extensions, ".preinstall"); - push(@extensions, ".preremove"); - push(@extensions, ".depend"); - - for ( my $i = 0; $i <= $#extensions; $i++ ) - { - my $removefile = $epmdir . $packagename . $extensions[$i]; - my $destfile = $loggingdir . $packagename . $extensions[$i] . ".log"; - - if (! -f $removefile) { next; } - - my $systemcall = "mv -f $removefile $destfile"; - system($systemcall); # ignoring the return value - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $installer::globals::isrpmbuild ) - { - my $removefile = $epmdir . $packagename . ".spec"; - my $destfile = $loggingdir . $packagename . ".spec.log"; - - my $systemcall = "mv -f $removefile $destfile"; - system($systemcall); # ignoring the return value - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - # removing the directory "buildroot" - - my $removedir = $epmdir . "buildroot"; - - $systemcall = "rm -rf $removedir"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $returnvalue = system($systemcall); - - $removedir = $epmdir . "BUILD"; - - $systemcall = "rm -rf $removedir"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -###################################################### -# Making the systemcall -###################################################### - -sub make_systemcall -{ - my ($systemcall) = @_; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -########################################################### -# Creating a better directory structure in the solver. -########################################################### - -sub create_new_directory_structure -{ - my ($newepmdir) = @_; - - my $newdir = $installer::globals::epmoutpath; - - if ( $installer::globals::isrpmbuild ) - { - my $rpmdir; - my $machine = ""; - if ( $installer::globals::compiler =~ /unxlngi/) { - $rpmdir = "$installer::globals::epmoutpath/RPMS/i586"; - } - elsif ( $installer::globals::compiler =~ /unxaigppc/) { - $machine = "ppc"; - $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine"; - } - elsif ( $installer::globals::compiler =~ /unxlng/) { - $machine = (POSIX::uname())[4]; - $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine"; - } - else { installer::exiter::exit_program("ERROR: rpmdir undefined !", "create_new_directory_structure"); } - - my $systemcall = "mv $rpmdir/* $newdir"; # moving the rpms into the directory "RPMS" - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not move content of \"$rpmdir\" to \"$newdir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Moved content of \"$rpmdir\" to \"$newdir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # and removing the empty directory - - if ( $machine ne "" ) - { - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/$machine"); - } - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/powerpc"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/x86_64"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i586"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i386"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS"); - - } - - # Setting unix rights to "775" for $newdir ("RPMS" or "packages") - chmod 0775, $newdir; -} - -###################################################### -# Collect modules with product specific styles. -###################################################### - -sub collect_modules_with_style -{ - my ($style, $modulesarrayref) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $onemodule = ${$modulesarrayref}[$i]; - my $styles = ""; - if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; } - if ( $styles =~ /\b\Q$style\E\b/ ) - { - push(@allmodules, $onemodule); - } - } - - return \@allmodules; -} - -###################################################### -# Remove modules without packagecontent. -###################################################### - -sub remove_modules_without_package -{ - my ($allmodules) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $onemodule = ${$allmodules}[$i]; - my $packagename = ""; - if ( $onemodule->{'PackageName'} ) { $packagename = $onemodule->{'PackageName'}; } - if ( $packagename ne "" ) - { - push(@allmodules, $onemodule); - } - } - - return \@allmodules; -} - -###################################################### -# Unpacking tar.gz file and setting new packagename. -###################################################### - -sub unpack_tar_gz_file -{ - my ($packagename, $destdir) = @_; - - my $newpackagename = ""; - - if ( $packagename =~ /\.tar\.gz\s*$/ ) - { - # Collecting all packages in directory "packages" - my $oldcontent = installer::systemactions::read_directory($destdir); - - # unpacking gunzip - my $systemcall = "cd $destdir; cat $packagename | gunzip | tar -xf -"; - make_systemcall($systemcall); - - # deleting the tar.gz files - $systemcall = "cd $destdir; rm -f $packagename"; - make_systemcall($systemcall); - - # Finding new content -> that is the package name - my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent); - $newpackagename = ${$newcontent}[0]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newpackagename); - } - - if ( $newpackagename ne "" ) { $packagename = $newpackagename; } - - return $packagename; -} - -###################################################### -# Copying files of child projects. -###################################################### - -sub copy_childproject_files -{ - my ($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, $subdir, $includepatharrayref, $use_sopackpath) = @_; - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $localdestdir = $destdir; - my $onemodule = ${$allmodules}[$i]; - my $packagename = $onemodule->{'PackageName'}; - my $sourcefile = ""; - if ( $use_sopackpath ) - { - $sourcefile = $sopackpath . $installer::globals::separator . $installer::globals::compiler . $installer::globals::separator . $subdir . $installer::globals::separator . $packagename; - } - else - { - my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagename, $includepatharrayref, 1); - $sourcefile = $$sourcepathref; - } - - if ( ! -f $sourcefile ) { installer::exiter::exit_program("ERROR: File not found: $sourcefile ($packagename) !", "copy_childproject_files"); } - if ( $onemodule->{'Subdir'} ) - { - $localdestdir = $localdestdir . $installer::globals::separator . $onemodule->{'Subdir'}; - if ( ! -d $localdestdir ) { installer::systemactions::create_directory($localdestdir); } - } - installer::systemactions::copy_one_file($sourcefile, $localdestdir); - # Solaris: unpacking tar.gz files and setting new packagename - if ( $installer::globals::issolarispkgbuild ) { $packagename = unpack_tar_gz_file($packagename, $localdestdir); } - - if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} )) - { - installer::xpdinstaller::create_xpd_file_for_childproject($onemodule, $localdestdir, $packagename, $allvariableshashref, $modulesarrayref); - } - } - -} - -###################################################### -# Copying files for system integration. -###################################################### - -sub copy_and_unpack_tar_gz_files -{ - my ($sourcefile, $destdir) = @_; - - my $systemcall = "cd $destdir; cat $sourcefile | gunzip | tar -xf -"; - make_systemcall($systemcall); -} - -###################################################### -# Including child packages into the -# installation set. -###################################################### - -sub put_childprojects_into_installset -{ - my ($newdir, $allvariables, $modulesarrayref, $includepatharrayref) = @_; - - my $infoline = ""; - - my $sopackpath = ""; - if ( $ENV{'SO_PACK'} ) { $sopackpath = $ENV{'SO_PACK'}; } - else { installer::exiter::exit_program("ERROR: Environment variable SO_PACK not set!", "put_childprojects_into_installset"); } - - my $destdir = "$newdir"; - - # adding Java - - my $sourcefile = ""; - - # Finding the modules defined in scp (with flag JAVAMODULE, ADAMODULE, ...) - # Getting name of package from scp-Module - # Copy file into installation set - # Create xpd file and put it into xpd directory - # xpd file has to be created completely from module and package itself (-> no packagelist!) - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - # Collect all modules with flag "JAVAMODULE" - my $allmodules = collect_modules_with_style("JAVAMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "jre", $includepatharrayref, 1); - } - - # Adding additional required packages (freetype). - # This package names are stored in global array @installer::globals::requiredpackages - - if ( $allvariables->{'ADDREQUIREDPACKAGES'} ) - { - # Collect all modules with flag "REQUIREDPACKAGEMODULE" - my $allmodules = collect_modules_with_style("REQUIREDPACKAGEMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "requiredpackages", $includepatharrayref, 1); - } - - # Collect all modules with flag "USERLANDMODULE" - my $alluserlandmodules = collect_modules_with_style("USERLANDMODULE", $modulesarrayref); - $alluserlandmodules = remove_modules_without_package($alluserlandmodules); - copy_childproject_files($alluserlandmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "", $includepatharrayref, 0); - -} - -###################################################### -# Checking whether the new content is a directory and -# not a package. If it is a directory, the complete -# content of the directory has to be added to the -# array newcontent. -###################################################### - -sub control_subdirectories -{ - my ($content, $subdir) = @_; - - my @newcontent = (); - - for ( my $i = 0; $i <= $#{$content}; $i++ ) - { - if ( -d ${$content}[$i] ) - { - $subdir = ${$content}[$i]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$subdir); - my $allpackages = installer::systemactions::read_directory(${$content}[$i]); - for ( my $j = 0; $j <= $#{$allpackages}; $j++ ) - { - # Currently only Linux rpm is supported, debian packages cannot be installed via xpd installer - if (( $installer::globals::islinuxbuild ) && ( ! ( ${$allpackages}[$j] =~ /\.rpm\s*$/ ))) { next; } - push(@newcontent, ${$allpackages}[$j]); - } - } - else - { - push(@newcontent, ${$content}[$i]); - } - } - - return (\@newcontent, $subdir); -} - -###################################################### -# Including the system integration files into the -# installation sets. -###################################################### - -sub put_systemintegration_into_installset -{ - my ($newdir, $includepatharrayref, $allvariables, $modulesarrayref) = @_; - - my $destdir = $newdir; - - # adding System integration files - - my $sourcefile = ""; - - # Finding the modules defined in scp (with flag SYSTEMMODULE) - # Getting name of package from scp-Module - # Search package in list off all include files - # Copy file into installation set and unpack it (always tar.gz) - # Create xpd file and put it into xpd directory - # tar.gz can contain a different number of packages -> automatically create hidden sub modules - # xpd file has to be created completely from module and package itself (-> no packagelist!) - - # Collect all modules with flag "SYSTEMMODULE" - my $allmodules = collect_modules_with_style("SYSTEMMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $onemodule = ${$allmodules}[$i]; - my $packagetarfilename = $onemodule->{'PackageName'}; - - my $infoline = "Including into installation set: $packagetarfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagetarfilename, $includepatharrayref, 1); - if ( $$sourcepathref eq "" ) { installer::exiter::exit_program("ERROR: Source path not found for $packagetarfilename!", "copy_systemintegration_files"); } - - # Collecting all packages in directory "packages" or "RPMS" - my $oldcontent = installer::systemactions::read_directory($destdir); - - copy_and_unpack_tar_gz_files($$sourcepathref, $destdir); - - # Finding new content -> that is the package name - my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent); - - # special handling, if new content is a directory - my $subdir = ""; - if ( ! $installer::globals::issolarispkgbuild ) { ($newcontent, $subdir) = control_subdirectories($newcontent); } - - # Adding license content into Solaris packages - if (( $installer::globals::issolarispkgbuild ) && ( $installer::globals::englishlicenseset ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) { installer::worker::add_license_into_systemintegrationpackages($destdir, $newcontent); } - - if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} )) - { - installer::xpdinstaller::create_xpd_file_for_systemintegration($onemodule, $newcontent, $modulesarrayref, $subdir); - } - } -} - -###################################################### -# Analyzing the Unix installation path. -# From the installation path /opt/openofficeorg20 -# is the part /opt relocatable and the part -# openofficeorg20 static. -###################################################### - -sub analyze_rootpath -{ - my ($rootpath, $staticpathref, $relocatablepathref, $allvariables) = @_; - - $rootpath =~ s/\/\s*$//; # removing ending slash - - ############################################################## - # Version 3: "/" is variable and "/opt/openofficeorg20" fixed - ############################################################## - - $$relocatablepathref = "/"; - # Static path has to contain the office directory name. This is replaced in shellscripts. - $$staticpathref = $rootpath . $installer::globals::separator . $installer::globals::officedirhostname; - # For RPM version 3.x it is required, that Prefix is not "/" in spec file. In this case --relocate will not work, - # because RPM 3.x says, that the package is not relocatable. Therefore we have to use Prefix=/opt and for - # all usages of --relocate this path has to be on both sides of the "=": --relocate /opt=<myselectdir>/opt . - if ( $installer::globals::isrpmbuild ) - { - $$relocatablepathref = $rootpath . "\/"; # relocatable path must end with "/", will be "/opt/" - $$staticpathref = $installer::globals::officedirhostname; # to be used as replacement in shell scripts - } - - if ( $installer::globals::isdebbuild ) - { - $$relocatablepathref = ""; - # $$staticpathref is already "/opt/openoffice.org3", no additional $rootpath required. - } - -} - -###################################################### -# Including license and readme into -# Unix installation sets. -###################################################### - -sub put_installsetfiles_into_installset -{ - my ($destdir) = @_; - - # All files for the installation set are saved in the global - # array @installer::globals::installsetfiles - - for ( my $i = 0; $i <= $#installer::globals::installsetfiles; $i++ ) - { - my $onefile = $installer::globals::installsetfiles[$i]; - my $sourcefile = $onefile->{'sourcepath'}; - my $destfile = ""; - $destfile = $destdir . $installer::globals::separator . $onefile->{'Name'}; - installer::systemactions::copy_one_file($sourcefile, $destfile); - - my $infoline = "Adding to installation set \"$destfile\" from source \"$sourcefile\".\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -###################################################### -# Replacing one variable in patchinfo file -###################################################### - -sub replace_one_variable_in_file -{ - my ( $file, $placeholder, $value ) = @_; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - ${$file}[$i] =~ s/$placeholder/$value/g; - } -} - -###################################################### -# Setting variables in the patchinfo file -###################################################### - -sub set_patchinfo -{ - my ( $patchinfofile, $patchid, $allvariables ) = @_; - - # Setting: PATCHIDPLACEHOLDER and ARCHITECTUREPLACEHOLDER and PATCHCORRECTSPLACEHOLDER - - replace_one_variable_in_file($patchinfofile, "PATCHIDPLACEHOLDER", $patchid); - - my $architecture = ""; - if ( $installer::globals::issolarissparcbuild ) { $architecture = "sparc"; } - if ( $installer::globals::issolarisx86build ) { $architecture = "i386"; } - - replace_one_variable_in_file($patchinfofile, "ARCHITECTUREPLACEHOLDER", $architecture); - - if ( ! $allvariables->{'SOLARISPATCHCORRECTS'} ) { installer::exiter::exit_program("ERROR: No setting for PATCH_CORRECTS in zip list file!", "set_patchinfo"); } - my $patchcorrects = $allvariables->{'SOLARISPATCHCORRECTS'}; - - replace_one_variable_in_file($patchinfofile, "PATCHCORRECTSPLACEHOLDER", $patchcorrects); - - # Setting also PATCH_REQUIRES in patch info file, if entry in zip list file exists - my $requiresstring = ""; - if ( $installer::globals::issolarissparcbuild ) { $requiresstring = "SOLSPARCPATCHREQUIRES"; } - if ( $installer::globals::issolarisx86build ) { $requiresstring = "SOLIAPATCHREQUIRES"; } - - if ( $allvariables->{$requiresstring} ) - { - my $newline = "PATCH_REQUIRES=\"" . $allvariables->{$requiresstring} . "\"" . "\n"; - push(@{$patchinfofile}, $newline); - } -} - -###################################################### -# Finalizing patch: Renaming directory and -# including additional patch files. -###################################################### - -sub finalize_patch -{ - my ( $newepmdir, $allvariables ) = @_; - - my $patchidname = "SOLSPARCPATCHID"; - if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; } - - if ( ! $allvariables->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "finalize_patch"); } - my $patchid = $allvariables->{$patchidname}; - installer::systemactions::rename_directory($newepmdir, $patchid); - - # Copying all typical patch files into the patch directory - # All patch file names are stored in @installer::globals::solarispatchfiles - # Location of the file is $installer::globals::patchincludepath - - my $sourcepath = $installer::globals::patchincludepath; - $sourcepath =~ s/\/\s*$//; - - for ( my $i = 0; $i <= $#installer::globals::solarispatchfiles; $i++ ) - { - my $sourcefile = $sourcepath . $installer::globals::separator . $installer::globals::solarispatchfiles[$i]; - my $destfile = $patchid . $installer::globals::separator . $installer::globals::solarispatchfiles[$i]; - installer::systemactions::copy_one_file($sourcefile, $destfile); - } - - # And editing the patchinfo file - - my $patchinfofilename = $patchid . $installer::globals::separator . "patchinfo"; - my $patchinfofile = installer::files::read_file($patchinfofilename); - set_patchinfo($patchinfofile, $patchid, $allvariables); - installer::files::save_file($patchinfofilename, $patchinfofile); -} - -###################################################### -# Finalizing Linux patch: Renaming directory and -# including additional patch files. -###################################################### - -sub finalize_linux_patch -{ - my ( $newepmdir, $allvariables, $includepatharrayref ) = @_; - - # Copying the setup into the patch directory - # and including the list of RPMs into it - - print "... creating patch setup ...\n"; - - installer::logger::include_header_into_logfile("Creating Linux patch setup:"); - - # find and read setup script template - - my $scriptfilename = "linuxpatchscript.sh"; - my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0); - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find patch script template $scriptfilename!", "finalize_linux_patch"); } - my $scriptfile = installer::files::read_file($$scriptref); - - my $infoline = "Found script file $scriptfilename: $$scriptref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # Collecting all RPMs in the patch directory - - my $fileextension = "rpm"; - my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $newepmdir); - if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find rpm in directory $newepmdir!", "finalize_linux_patch"); } - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } - - # Searching packagename containing -core01 - my $found_package = 0; - my $searchpackagename = ""; - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) - { - if ( ${$rpmfiles}[$i] =~ /-core01-/ ) - { - $searchpackagename = ${$rpmfiles}[$i]; - $found_package = 1; - if ( $searchpackagename =~ /^\s*(.*?-core01)-.*/ ) { $searchpackagename = $1; } - last; - } - } - - if ( ! $found_package ) { installer::exiter::exit_program("ERROR: No package containing \"-core01\" found in directory \"$newepmdir\"", "finalize_linux_patch"); } - - # Replacing the searchpackagename - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/SEARCHPACKAGENAMEPLACEHOLDER/$searchpackagename/; } - - # Setting the PRODUCTDIRECTORYNAME to $installer::globals::officedirhostname - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTDIRECTORYNAME/$installer::globals::officedirhostname/; } - - # Replacing the productname - my $productname = $allvariables->{'PRODUCTNAME'}; - $productname = lc($productname); - $productname =~ s/ /_/g; # abc office -> abc_office - - $infoline = "Adding productname $productname into Linux patch script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; } - - # Saving the file - - my $newscriptfilename = "setup"; - installer::files::save_file($newscriptfilename, $scriptfile); - - $infoline = "Saved Linux patch setup $newscriptfilename \n"; - push( @installer::globals::logfileinfo, $infoline); - - # Setting unix rights 755 - chmod 0755, $newscriptfilename; -} - -1; |