1*b1cdbd2cSJim Jagielski#************************************************************** 2*b1cdbd2cSJim Jagielski# 3*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski# distributed with this work for additional information 6*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski# 11*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski# 13*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski# under the License. 19*b1cdbd2cSJim Jagielski# 20*b1cdbd2cSJim Jagielski#************************************************************** 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielskipackage installer::simplepackage; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski# use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); 27*b1cdbd2cSJim Jagielskiuse Cwd; 28*b1cdbd2cSJim Jagielskiuse File::Copy; 29*b1cdbd2cSJim Jagielskiuse installer::download; 30*b1cdbd2cSJim Jagielskiuse installer::exiter; 31*b1cdbd2cSJim Jagielskiuse installer::globals; 32*b1cdbd2cSJim Jagielskiuse installer::logger; 33*b1cdbd2cSJim Jagielskiuse installer::strip; 34*b1cdbd2cSJim Jagielskiuse installer::systemactions; 35*b1cdbd2cSJim Jagielskiuse installer::worker; 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski#################################################### 38*b1cdbd2cSJim Jagielski# Checking if the simple packager is required. 39*b1cdbd2cSJim Jagielski# This can be achieved by setting the global 40*b1cdbd2cSJim Jagielski# variable SIMPLE_PACKAGE in *.lst file or by 41*b1cdbd2cSJim Jagielski# setting the environment variable SIMPLE_PACKAGE. 42*b1cdbd2cSJim Jagielski#################################################### 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielskisub check_simple_packager_project 45*b1cdbd2cSJim Jagielski{ 46*b1cdbd2cSJim Jagielski my ( $allvariables ) = @_; 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski if (( $installer::globals::packageformat eq "installed" ) || 49*b1cdbd2cSJim Jagielski ( $installer::globals::packageformat eq "archive" )) 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski $installer::globals::is_simple_packager_project = 1; 52*b1cdbd2cSJim Jagielski $installer::globals::patch_user_dir = 1; 53*b1cdbd2cSJim Jagielski } 54*b1cdbd2cSJim Jagielski elsif( $installer::globals::packageformat eq "dmg" ) 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski $installer::globals::is_simple_packager_project = 1; 57*b1cdbd2cSJim Jagielski } 58*b1cdbd2cSJim Jagielski} 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski#################################################### 61*b1cdbd2cSJim Jagielski# Detecting the directory with extensions 62*b1cdbd2cSJim Jagielski#################################################### 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielskisub get_extensions_dir 65*b1cdbd2cSJim Jagielski{ 66*b1cdbd2cSJim Jagielski my ( $subfolderdir ) = @_; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski my $extensiondir = $subfolderdir . $installer::globals::separator; 69*b1cdbd2cSJim Jagielski if ( $installer::globals::officedirhostname ne "" ) { $extensiondir = $extensiondir . $installer::globals::officedirhostname . $installer::globals::separator; } 70*b1cdbd2cSJim Jagielski my $extensionsdir = $extensiondir . "share" . $installer::globals::separator . "extensions"; 71*b1cdbd2cSJim Jagielski my $preregdir = $extensiondir . "share" . $installer::globals::separator . "prereg" . $installer::globals::separator . "bundled"; 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski return ( $extensionsdir, $preregdir ); 74*b1cdbd2cSJim Jagielski} 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski#################################################### 77*b1cdbd2cSJim Jagielski# Registering extensions 78*b1cdbd2cSJim Jagielski#################################################### 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielskisub register_extensions 81*b1cdbd2cSJim Jagielski{ 82*b1cdbd2cSJim Jagielski my ($officedir, $languagestringref, $preregdir) = @_; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski my $infoline = ""; 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski if ( $preregdir eq "" ) 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski $infoline = "ERROR: Failed to determine directory \"prereg\" for extension registration! Please check your installation set.\n"; 89*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 90*b1cdbd2cSJim Jagielski installer::exiter::exit_program($infoline, "register_extensions"); 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski my $programdir = $officedir . $installer::globals::separator; 94*b1cdbd2cSJim Jagielski if ( $installer::globals::officedirhostname ne "" ) { $programdir = $programdir . $installer::globals::officedirhostname . $installer::globals::separator; } 95*b1cdbd2cSJim Jagielski $programdir = $programdir . "program"; 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski my $from = cwd(); 98*b1cdbd2cSJim Jagielski chdir($programdir); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski my $unopkgfile = $installer::globals::unopkgfile; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski my $unopkgexists = 1; 103*b1cdbd2cSJim Jagielski if (( $installer::globals::languagepack ) && ( ! -f $unopkgfile )) 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski $unopkgexists = 0; 106*b1cdbd2cSJim Jagielski $infoline = "Language packs do not contain unopkg!\n"; 107*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski if ( ! -f $unopkgfile ) 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski $unopkgexists = 0; 113*b1cdbd2cSJim Jagielski $infoline = "Info: File $unopkgfile does not exist! Extensions cannot be registered.\n"; 114*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 115*b1cdbd2cSJim Jagielski } 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski if ( $unopkgexists ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski my $currentdir = cwd(); 120*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... current dir: %s ...\n", $currentdir); 121*b1cdbd2cSJim Jagielski $infoline = "Current dir: $currentdir\n"; 122*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski if ( ! -f $unopkgfile ) { installer::exiter::exit_program("ERROR: $unopkgfile not found!", "register_extensions"); } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski my $systemcall = $unopkgfile . " sync --verbose" . " -env:UNO_JAVA_JFW_ENV_JREHOME=true 2\>\&1 |"; 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s ...\n", $systemcall); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski $infoline = "Systemcall: $systemcall\n"; 131*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski my @unopkgoutput = (); 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski open (UNOPKG, $systemcall); 136*b1cdbd2cSJim Jagielski while (<UNOPKG>) 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski my $lastline = $_; 139*b1cdbd2cSJim Jagielski push(@unopkgoutput, $lastline); 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski close (UNOPKG); 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski my $returnvalue = $?; # $? contains the return value of the systemcall 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski if ($returnvalue) 146*b1cdbd2cSJim Jagielski { 147*b1cdbd2cSJim Jagielski # Writing content of @unopkgoutput only in the error case into the log file. Sometimes it 148*b1cdbd2cSJim Jagielski # contains strings like "Error" even in the case of success. This causes a packaging error 149*b1cdbd2cSJim Jagielski # when the log file is analyzed at the end, even if there is no real error. 150*b1cdbd2cSJim Jagielski foreach my $line (@unopkgoutput) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf($line); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n"; 156*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 157*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: $systemcall failed!", "register_extensions"); 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski else 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski $infoline = "Success: Executed \"$systemcall\" successfully!\n"; 162*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski chdir($from); 167*b1cdbd2cSJim Jagielski} 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski######################################################################## 170*b1cdbd2cSJim Jagielski# Getting the translation file for the Mac Language Pack installer 171*b1cdbd2cSJim Jagielski######################################################################## 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielskisub get_mac_translation_file 174*b1cdbd2cSJim Jagielski{ 175*b1cdbd2cSJim Jagielski my $translationfilename = $installer::globals::maclangpackfilename; 176*b1cdbd2cSJim Jagielski if ( ! -f $translationfilename ) { installer::exiter::exit_program("ERROR: Could not find language file $translationfilename!", "get_mac_translation_file"); } 177*b1cdbd2cSJim Jagielski my $translationfile = installer::files::read_file($translationfilename); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski my $infoline = "Reading translation file: $translationfilename\n"; 180*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski return $translationfile; 183*b1cdbd2cSJim Jagielski} 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski################################################################## 186*b1cdbd2cSJim Jagielski# Collecting all identifier from ulf file 187*b1cdbd2cSJim Jagielski################################################################## 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielskisub get_identifier 190*b1cdbd2cSJim Jagielski{ 191*b1cdbd2cSJim Jagielski my ( $translationfile ) = @_; 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski my @identifier = (); 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$translationfile}; $i++ ) 196*b1cdbd2cSJim Jagielski { 197*b1cdbd2cSJim Jagielski my $oneline = ${$translationfile}[$i]; 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski if ( $oneline =~ /^\s*\[(.+)\]\s*$/ ) 200*b1cdbd2cSJim Jagielski { 201*b1cdbd2cSJim Jagielski my $identifier = $1; 202*b1cdbd2cSJim Jagielski push(@identifier, $identifier); 203*b1cdbd2cSJim Jagielski } 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski return \@identifier; 207*b1cdbd2cSJim Jagielski} 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski############################################################## 210*b1cdbd2cSJim Jagielski# Returning the complete block in all languages 211*b1cdbd2cSJim Jagielski# for a specified string 212*b1cdbd2cSJim Jagielski############################################################## 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielskisub get_language_block_from_language_file 215*b1cdbd2cSJim Jagielski{ 216*b1cdbd2cSJim Jagielski my ($searchstring, $languagefile) = @_; 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski my @language_block = (); 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) 221*b1cdbd2cSJim Jagielski { 222*b1cdbd2cSJim Jagielski if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) 223*b1cdbd2cSJim Jagielski { 224*b1cdbd2cSJim Jagielski my $counter = $i; 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski push(@language_block, ${$languagefile}[$counter]); 227*b1cdbd2cSJim Jagielski $counter++; 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) 230*b1cdbd2cSJim Jagielski { 231*b1cdbd2cSJim Jagielski push(@language_block, ${$languagefile}[$counter]); 232*b1cdbd2cSJim Jagielski $counter++; 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski last; 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski return \@language_block; 240*b1cdbd2cSJim Jagielski} 241*b1cdbd2cSJim Jagielski 242*b1cdbd2cSJim Jagielski############################################################## 243*b1cdbd2cSJim Jagielski# Returning a specific language string from the block 244*b1cdbd2cSJim Jagielski# of all translations 245*b1cdbd2cSJim Jagielski############################################################## 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielskisub get_language_string_from_language_block 248*b1cdbd2cSJim Jagielski{ 249*b1cdbd2cSJim Jagielski my ($language_block, $language) = @_; 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski my $newstring = ""; 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$language_block}; $i++ ) 254*b1cdbd2cSJim Jagielski { 255*b1cdbd2cSJim Jagielski if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) 256*b1cdbd2cSJim Jagielski { 257*b1cdbd2cSJim Jagielski $newstring = $1; 258*b1cdbd2cSJim Jagielski last; 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski if ( $newstring eq "" ) 263*b1cdbd2cSJim Jagielski { 264*b1cdbd2cSJim Jagielski $language = "en-US"; # defaulting to english 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$language_block}; $i++ ) 267*b1cdbd2cSJim Jagielski { 268*b1cdbd2cSJim Jagielski if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) 269*b1cdbd2cSJim Jagielski { 270*b1cdbd2cSJim Jagielski $newstring = $1; 271*b1cdbd2cSJim Jagielski last; 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski } 274*b1cdbd2cSJim Jagielski } 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski return $newstring; 277*b1cdbd2cSJim Jagielski} 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski######################################################################## 280*b1cdbd2cSJim Jagielski# Localizing the script for the Mac Language Pack installer 281*b1cdbd2cSJim Jagielski######################################################################## 282*b1cdbd2cSJim Jagielski 283*b1cdbd2cSJim Jagielskisub localize_scriptfile 284*b1cdbd2cSJim Jagielski{ 285*b1cdbd2cSJim Jagielski my ($scriptfile, $translationfile, $languagestringref) = @_; 286*b1cdbd2cSJim Jagielski 287*b1cdbd2cSJim Jagielski # my $translationfile = get_mac_translation_file(); 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski my $onelanguage = $$languagestringref; 290*b1cdbd2cSJim Jagielski if ( $onelanguage =~ /^\s*(.*?)_/ ) { $onelanguage = $1; } 291*b1cdbd2cSJim Jagielski 292*b1cdbd2cSJim Jagielski # Analyzing the ulf file, collecting all Identifier 293*b1cdbd2cSJim Jagielski my $allidentifier = get_identifier($translationfile); 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$allidentifier}; $i++ ) 296*b1cdbd2cSJim Jagielski { 297*b1cdbd2cSJim Jagielski my $identifier = ${$allidentifier}[$i]; 298*b1cdbd2cSJim Jagielski my $language_block = get_language_block_from_language_file($identifier, $translationfile); 299*b1cdbd2cSJim Jagielski my $newstring = get_language_string_from_language_block($language_block, $onelanguage); 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski # removing mask 302*b1cdbd2cSJim Jagielski $newstring =~ s/\\\'/\'/g; 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $newstring, $identifier); 305*b1cdbd2cSJim Jagielski } 306*b1cdbd2cSJim Jagielski} 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski################################################################################# 309*b1cdbd2cSJim Jagielski# Replacing one variable in Mac shell script 310*b1cdbd2cSJim Jagielski################################################################################# 311*b1cdbd2cSJim Jagielski 312*b1cdbd2cSJim Jagielskisub replace_one_variable_in_shellscript 313*b1cdbd2cSJim Jagielski{ 314*b1cdbd2cSJim Jagielski my ($scriptfile, $variable, $searchstring) = @_; 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) 317*b1cdbd2cSJim Jagielski { 318*b1cdbd2cSJim Jagielski ${$scriptfile}[$i] =~ s/\[$searchstring\]/$variable/g; 319*b1cdbd2cSJim Jagielski } 320*b1cdbd2cSJim Jagielski} 321*b1cdbd2cSJim Jagielski 322*b1cdbd2cSJim Jagielski############################################# 323*b1cdbd2cSJim Jagielski# Replacing variables in Mac shell script 324*b1cdbd2cSJim Jagielski############################################# 325*b1cdbd2cSJim Jagielski 326*b1cdbd2cSJim Jagielskisub replace_variables_in_scriptfile 327*b1cdbd2cSJim Jagielski{ 328*b1cdbd2cSJim Jagielski my ($scriptfile, $volume_name, $volume_name_app, $allvariables) = @_; 329*b1cdbd2cSJim Jagielski 330*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $volume_name, "FULLPRODUCTNAME" ); 331*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $volume_name_app, "FULLAPPPRODUCTNAME" ); 332*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTNAME'}, "PRODUCTNAME" ); 333*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTVERSION'}, "PRODUCTVERSION" ); 334*b1cdbd2cSJim Jagielski 335*b1cdbd2cSJim Jagielski my $scriptname = lc($allvariables->{'PRODUCTNAME'}) . "\.script"; 336*b1cdbd2cSJim Jagielski if ( $allvariables->{'PRODUCTNAME'} eq "OpenOffice" ) 337*b1cdbd2cSJim Jagielski { 338*b1cdbd2cSJim Jagielski $scriptname = "org.openoffice.script"; 339*b1cdbd2cSJim Jagielski } 340*b1cdbd2cSJim Jagielski 341*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfile, $scriptname, "SEARCHSCRIPTNAME" ); 342*b1cdbd2cSJim Jagielski} 343*b1cdbd2cSJim Jagielski 344*b1cdbd2cSJim Jagielski############################################# 345*b1cdbd2cSJim Jagielski# Creating the "simple" package. 346*b1cdbd2cSJim Jagielski# "zip" for Windows 347*b1cdbd2cSJim Jagielski# "tar.gz" for all other platforms 348*b1cdbd2cSJim Jagielski# additionally "dmg" on Mac OS X 349*b1cdbd2cSJim Jagielski############################################# 350*b1cdbd2cSJim Jagielski 351*b1cdbd2cSJim Jagielskisub create_package 352*b1cdbd2cSJim Jagielski{ 353*b1cdbd2cSJim Jagielski my ( $installdir, $archivedir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $format ) = @_; 354*b1cdbd2cSJim Jagielski 355*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... creating %s file ...\n", $installer::globals::packageformat); 356*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Creating $installer::globals::packageformat file:"); 357*b1cdbd2cSJim Jagielski 358*b1cdbd2cSJim Jagielski # moving dir into temporary directory 359*b1cdbd2cSJim Jagielski my $pid = $$; # process id 360*b1cdbd2cSJim Jagielski my $tempdir = $installdir . "_temp" . "." . $pid; 361*b1cdbd2cSJim Jagielski my $systemcall = ""; 362*b1cdbd2cSJim Jagielski my $from = ""; 363*b1cdbd2cSJim Jagielski my $makesystemcall = 1; 364*b1cdbd2cSJim Jagielski my $return_to_start = 0; 365*b1cdbd2cSJim Jagielski installer::systemactions::rename_directory($installdir, $tempdir); 366*b1cdbd2cSJim Jagielski 367*b1cdbd2cSJim Jagielski # creating new directory with original name 368*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($archivedir); 369*b1cdbd2cSJim Jagielski 370*b1cdbd2cSJim Jagielski my $archive = $archivedir . $installer::globals::separator . $packagename . $format; 371*b1cdbd2cSJim Jagielski 372*b1cdbd2cSJim Jagielski if ( $archive =~ /zip$/ ) 373*b1cdbd2cSJim Jagielski { 374*b1cdbd2cSJim Jagielski $from = cwd(); 375*b1cdbd2cSJim Jagielski $return_to_start = 1; 376*b1cdbd2cSJim Jagielski chdir($tempdir); 377*b1cdbd2cSJim Jagielski if ( $^O =~ /os2/i ) 378*b1cdbd2cSJim Jagielski { 379*b1cdbd2cSJim Jagielski my $zip = Cwd::realpath($archive); 380*b1cdbd2cSJim Jagielski $systemcall = "$installer::globals::zippath -qr $zip ."; 381*b1cdbd2cSJim Jagielski } 382*b1cdbd2cSJim Jagielski else 383*b1cdbd2cSJim Jagielski { 384*b1cdbd2cSJim Jagielski $systemcall = "$installer::globals::zippath -qr $archive ."; 385*b1cdbd2cSJim Jagielski } 386*b1cdbd2cSJim Jagielski 387*b1cdbd2cSJim Jagielski # Using Archive::Zip fails because of very long path names below "share/uno_packages/cache" 388*b1cdbd2cSJim Jagielski # my $packzip = Archive::Zip->new(); 389*b1cdbd2cSJim Jagielski # $packzip->addTree("."); # after changing into $tempdir 390*b1cdbd2cSJim Jagielski # $packzip->writeToFileNamed($archive); 391*b1cdbd2cSJim Jagielski # $makesystemcall = 0; 392*b1cdbd2cSJim Jagielski } 393*b1cdbd2cSJim Jagielski elsif ( $archive =~ /dmg$/ ) 394*b1cdbd2cSJim Jagielski { 395*b1cdbd2cSJim Jagielski my $folder = (( -l "$tempdir/$packagename/Applications" ) or ( -l "$tempdir/$packagename/opt" )) ? $packagename : "\."; 396*b1cdbd2cSJim Jagielski 397*b1cdbd2cSJim Jagielski if ( $allvariables->{'PACK_INSTALLED'} ) { 398*b1cdbd2cSJim Jagielski $folder = $packagename; 399*b1cdbd2cSJim Jagielski } 400*b1cdbd2cSJim Jagielski 401*b1cdbd2cSJim Jagielski # my $volume_name = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'}; # Adding PRODUCTVERSION makes this difficult to maintain! 402*b1cdbd2cSJim Jagielski my $volume_name = $allvariables->{'PRODUCTNAME'}; 403*b1cdbd2cSJim Jagielski my $volume_name_classic = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'}; 404*b1cdbd2cSJim Jagielski my $volume_name_classic_app = $volume_name; # "app" should not contain version number 405*b1cdbd2cSJim Jagielski # $volume_name = $volume_name . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; # Adding PRODUCTEXTENSION makes this difficult to maintain! 406*b1cdbd2cSJim Jagielski $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; 407*b1cdbd2cSJim Jagielski $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; 408*b1cdbd2cSJim Jagielski if ( $allvariables->{'DMG_VOLUMEEXTENSION'} ) { 409*b1cdbd2cSJim Jagielski $volume_name = $volume_name . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; 410*b1cdbd2cSJim Jagielski $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; 411*b1cdbd2cSJim Jagielski $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; 412*b1cdbd2cSJim Jagielski } 413*b1cdbd2cSJim Jagielski 414*b1cdbd2cSJim Jagielski my $sla = 'sla.r'; 415*b1cdbd2cSJim Jagielski my $ref = ""; 416*b1cdbd2cSJim Jagielski 417*b1cdbd2cSJim Jagielski if ( ! $allvariables->{'HIDELICENSEDIALOG'} ) 418*b1cdbd2cSJim Jagielski { 419*b1cdbd2cSJim Jagielski installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$sla, $includepatharrayref, 0); 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski 422*b1cdbd2cSJim Jagielski my $localtempdir = $tempdir; 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski if (( $installer::globals::languagepack ) || ( $installer::globals::patch )) 425*b1cdbd2cSJim Jagielski { 426*b1cdbd2cSJim Jagielski $localtempdir = "$tempdir/$packagename"; 427*b1cdbd2cSJim Jagielski if ( $installer::globals::languagepack ) 428*b1cdbd2cSJim Jagielski { 429*b1cdbd2cSJim Jagielski $volume_name = "$volume_name Language Pack"; 430*b1cdbd2cSJim Jagielski $volume_name_classic = "$volume_name_classic Language Pack"; 431*b1cdbd2cSJim Jagielski $volume_name_classic_app = "$volume_name_classic_app Language Pack"; 432*b1cdbd2cSJim Jagielski } 433*b1cdbd2cSJim Jagielski if ( $installer::globals::patch ) 434*b1cdbd2cSJim Jagielski { 435*b1cdbd2cSJim Jagielski $volume_name = "$volume_name Patch"; 436*b1cdbd2cSJim Jagielski $volume_name_classic = "$volume_name_classic Patch"; 437*b1cdbd2cSJim Jagielski $volume_name_classic_app = "$volume_name_classic_app Patch"; 438*b1cdbd2cSJim Jagielski } 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski # Create tar ball named tarball.tar.bz2 441*b1cdbd2cSJim Jagielski # my $appfolder = $localtempdir . "/" . $volume_name . "\.app"; 442*b1cdbd2cSJim Jagielski my $appfolder = $localtempdir . "/" . $volume_name_classic_app . "\.app"; 443*b1cdbd2cSJim Jagielski my $contentsfolder = $appfolder . "/Contents"; 444*b1cdbd2cSJim Jagielski my $tarballname = "tarball.tar.bz2"; 445*b1cdbd2cSJim Jagielski 446*b1cdbd2cSJim Jagielski my $localfrom = cwd(); 447*b1cdbd2cSJim Jagielski chdir $appfolder; 448*b1cdbd2cSJim Jagielski 449*b1cdbd2cSJim Jagielski $systemcall = "tar -cjf $tarballname Contents/"; 450*b1cdbd2cSJim Jagielski 451*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s ...\n", $systemcall); 452*b1cdbd2cSJim Jagielski my $localreturnvalue = system($systemcall); 453*b1cdbd2cSJim Jagielski $infoline = "Systemcall: $systemcall\n"; 454*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 455*b1cdbd2cSJim Jagielski 456*b1cdbd2cSJim Jagielski if ($localreturnvalue) 457*b1cdbd2cSJim Jagielski { 458*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; 459*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 460*b1cdbd2cSJim Jagielski } 461*b1cdbd2cSJim Jagielski else 462*b1cdbd2cSJim Jagielski { 463*b1cdbd2cSJim Jagielski $infoline = "Success: Executed \"$systemcall\" successfully!\n"; 464*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 465*b1cdbd2cSJim Jagielski } 466*b1cdbd2cSJim Jagielski 467*b1cdbd2cSJim Jagielski my $sourcefile = $appfolder . "/" . $tarballname; 468*b1cdbd2cSJim Jagielski my $destfile = $contentsfolder . "/" . $tarballname; 469*b1cdbd2cSJim Jagielski 470*b1cdbd2cSJim Jagielski installer::systemactions::remove_complete_directory($contentsfolder); 471*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($contentsfolder); 472*b1cdbd2cSJim Jagielski 473*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($sourcefile, $destfile); 474*b1cdbd2cSJim Jagielski unlink($sourcefile); 475*b1cdbd2cSJim Jagielski 476*b1cdbd2cSJim Jagielski # Copy two files into installation set next to the tar ball 477*b1cdbd2cSJim Jagielski # 1. "osx_install.applescript" 478*b1cdbd2cSJim Jagielski # 2 "OpenOffice.org Languagepack" 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski my $scriptrealfilename = "osx_install.applescript"; 481*b1cdbd2cSJim Jagielski my $scriptfilename = ""; 482*b1cdbd2cSJim Jagielski if ( $installer::globals::languagepack ) { $scriptfilename = "osx_install_languagepack.applescript"; } 483*b1cdbd2cSJim Jagielski if ( $installer::globals::patch ) { $scriptfilename = "osx_install_patch.applescript"; } 484*b1cdbd2cSJim Jagielski my $scripthelpersolverfilename = "mac_install.script"; 485*b1cdbd2cSJim Jagielski # my $scripthelperrealfilename = $volume_name; 486*b1cdbd2cSJim Jagielski my $scripthelperrealfilename = $volume_name_classic_app; 487*b1cdbd2cSJim Jagielski my $translationfilename = $installer::globals::macinstallfilename; 488*b1cdbd2cSJim Jagielski 489*b1cdbd2cSJim Jagielski # Finding both files in solver 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scriptfilename, $includepatharrayref, 0); 492*b1cdbd2cSJim Jagielski if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scriptfilename!", "create_package"); } 493*b1cdbd2cSJim Jagielski my $scripthelperref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scripthelpersolverfilename, $includepatharrayref, 0); 494*b1cdbd2cSJim Jagielski if ($$scripthelperref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scripthelpersolverfilename!", "create_package"); } 495*b1cdbd2cSJim Jagielski my $translationfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$translationfilename, $includepatharrayref, 0); 496*b1cdbd2cSJim Jagielski if ($$translationfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script translation file $translationfilename!", "create_package"); } 497*b1cdbd2cSJim Jagielski 498*b1cdbd2cSJim Jagielski $scriptfilename = $contentsfolder . "/" . $scriptrealfilename; 499*b1cdbd2cSJim Jagielski $scripthelperrealfilename = $contentsfolder . "/" . $scripthelperrealfilename; 500*b1cdbd2cSJim Jagielski 501*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($$scriptref, $scriptfilename); 502*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($$scripthelperref, $scripthelperrealfilename); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski # Replacing variables in script $scriptfilename 505*b1cdbd2cSJim Jagielski # Localizing script $scriptfilename 506*b1cdbd2cSJim Jagielski my $scriptfilecontent = installer::files::read_file($scriptfilename); 507*b1cdbd2cSJim Jagielski my $translationfilecontent = installer::files::read_file($$translationfileref); 508*b1cdbd2cSJim Jagielski localize_scriptfile($scriptfilecontent, $translationfilecontent, $languagestringref); 509*b1cdbd2cSJim Jagielski # replace_variables_in_scriptfile($scriptfilecontent, $volume_name, $allvariables); 510*b1cdbd2cSJim Jagielski replace_variables_in_scriptfile($scriptfilecontent, $volume_name_classic, $volume_name_classic_app, $allvariables); 511*b1cdbd2cSJim Jagielski installer::files::save_file($scriptfilename, $scriptfilecontent); 512*b1cdbd2cSJim Jagielski 513*b1cdbd2cSJim Jagielski $systemcall = "chmod 775 " . "\"" . $scriptfilename . "\""; 514*b1cdbd2cSJim Jagielski system($systemcall); 515*b1cdbd2cSJim Jagielski $systemcall = "chmod 775 " . "\"" . $scripthelperrealfilename . "\""; 516*b1cdbd2cSJim Jagielski system($systemcall); 517*b1cdbd2cSJim Jagielski 518*b1cdbd2cSJim Jagielski # Copy also Info.plist and icon file 519*b1cdbd2cSJim Jagielski # Finding both files in solver 520*b1cdbd2cSJim Jagielski my $iconfile = "ooo3_installer.icns"; 521*b1cdbd2cSJim Jagielski my $iconfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$iconfile, $includepatharrayref, 0); 522*b1cdbd2cSJim Jagielski if ($$iconfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script icon file $iconfile!", "create_package"); } 523*b1cdbd2cSJim Jagielski my $subdir = $contentsfolder . "/" . "Resources"; 524*b1cdbd2cSJim Jagielski if ( ! -d $subdir ) { installer::systemactions::create_directory($subdir); } 525*b1cdbd2cSJim Jagielski $destfile = $subdir . "/" . $iconfile; 526*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($$iconfileref, $destfile); 527*b1cdbd2cSJim Jagielski 528*b1cdbd2cSJim Jagielski my $infoplistfile = "Info.plist.langpack"; 529*b1cdbd2cSJim Jagielski my $installname = "Info.plist"; 530*b1cdbd2cSJim Jagielski my $infoplistfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$infoplistfile, $includepatharrayref, 0); 531*b1cdbd2cSJim Jagielski if ($$infoplistfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script Info.plist: $infoplistfile!", "create_package"); } 532*b1cdbd2cSJim Jagielski $destfile = $contentsfolder . "/" . $installname; 533*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($$infoplistfileref, $destfile); 534*b1cdbd2cSJim Jagielski 535*b1cdbd2cSJim Jagielski # Replacing variables in Info.plist 536*b1cdbd2cSJim Jagielski $scriptfilecontent = installer::files::read_file($destfile); 537*b1cdbd2cSJim Jagielski # replace_one_variable_in_shellscript($scriptfilecontent, $volume_name, "FULLPRODUCTNAME" ); 538*b1cdbd2cSJim Jagielski replace_one_variable_in_shellscript($scriptfilecontent, $volume_name_classic_app, "FULLAPPPRODUCTNAME" ); # OpenOffice.org Language Pack 539*b1cdbd2cSJim Jagielski installer::files::save_file($destfile, $scriptfilecontent); 540*b1cdbd2cSJim Jagielski 541*b1cdbd2cSJim Jagielski chdir $localfrom; 542*b1cdbd2cSJim Jagielski } 543*b1cdbd2cSJim Jagielski 544*b1cdbd2cSJim Jagielski $systemcall = "cd $localtempdir && hdiutil makehybrid -hfs -hfs-openfolder $folder $folder -hfs-volume-name \"$volume_name\" -ov -o $installdir/tmp && hdiutil convert -ov -format UDZO $installdir/tmp.dmg -o $archive && "; 545*b1cdbd2cSJim Jagielski if (( $ref ne "" ) && ( $$ref ne "" )) { 546*b1cdbd2cSJim Jagielski $systemcall .= "hdiutil unflatten $archive && Rez -a $$ref -o $archive && hdiutil flatten $archive &&"; 547*b1cdbd2cSJim Jagielski } 548*b1cdbd2cSJim Jagielski $systemcall .= "rm -f $installdir/tmp.dmg"; 549*b1cdbd2cSJim Jagielski } 550*b1cdbd2cSJim Jagielski else 551*b1cdbd2cSJim Jagielski { 552*b1cdbd2cSJim Jagielski # getting the path of the getuid.so (only required for Solaris and Linux) 553*b1cdbd2cSJim Jagielski my $getuidlibrary = ""; 554*b1cdbd2cSJim Jagielski my $ldpreloadstring = ""; 555*b1cdbd2cSJim Jagielski if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) 556*b1cdbd2cSJim Jagielski { 557*b1cdbd2cSJim Jagielski $getuidlibrary = installer::download::get_path_for_library($includepatharrayref); 558*b1cdbd2cSJim Jagielski if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } 559*b1cdbd2cSJim Jagielski } 560*b1cdbd2cSJim Jagielski 561*b1cdbd2cSJim Jagielski $systemcall = "cd $tempdir; $ldpreloadstring tar -cf - . | gzip > $archive"; 562*b1cdbd2cSJim Jagielski } 563*b1cdbd2cSJim Jagielski 564*b1cdbd2cSJim Jagielski if ( $makesystemcall ) 565*b1cdbd2cSJim Jagielski { 566*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s ...\n", $systemcall); 567*b1cdbd2cSJim Jagielski my $returnvalue = system($systemcall); 568*b1cdbd2cSJim Jagielski my $infoline = "Systemcall: $systemcall\n"; 569*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 570*b1cdbd2cSJim Jagielski 571*b1cdbd2cSJim Jagielski if ($returnvalue) 572*b1cdbd2cSJim Jagielski { 573*b1cdbd2cSJim Jagielski $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; 574*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 575*b1cdbd2cSJim Jagielski } 576*b1cdbd2cSJim Jagielski else 577*b1cdbd2cSJim Jagielski { 578*b1cdbd2cSJim Jagielski $infoline = "Success: Executed \"$systemcall\" successfully!\n"; 579*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 580*b1cdbd2cSJim Jagielski } 581*b1cdbd2cSJim Jagielski } 582*b1cdbd2cSJim Jagielski 583*b1cdbd2cSJim Jagielski if ( $return_to_start ) { chdir($from); } 584*b1cdbd2cSJim Jagielski 585*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... removing %s ...\n", $tempdir); 586*b1cdbd2cSJim Jagielski installer::systemactions::remove_complete_directory($tempdir); 587*b1cdbd2cSJim Jagielski} 588*b1cdbd2cSJim Jagielski 589*b1cdbd2cSJim Jagielski#################################################### 590*b1cdbd2cSJim Jagielski# Main method for creating the simple package 591*b1cdbd2cSJim Jagielski# installation sets 592*b1cdbd2cSJim Jagielski#################################################### 593*b1cdbd2cSJim Jagielski 594*b1cdbd2cSJim Jagielskisub create_simple_package 595*b1cdbd2cSJim Jagielski{ 596*b1cdbd2cSJim Jagielski my ( $filesref, $dirsref, $scpactionsref, $linksref, $unixlinksref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariables, $includepatharrayref ) = @_; 597*b1cdbd2cSJim Jagielski 598*b1cdbd2cSJim Jagielski # Creating directories 599*b1cdbd2cSJim Jagielski 600*b1cdbd2cSJim Jagielski my $current_install_number = ""; 601*b1cdbd2cSJim Jagielski my $infoline = ""; 602*b1cdbd2cSJim Jagielski 603*b1cdbd2cSJim Jagielski $installer::logger::Info->print( "... creating installation directory ...\n" ); 604*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Creating installation directory"); 605*b1cdbd2cSJim Jagielski 606*b1cdbd2cSJim Jagielski $installer::globals::csp_installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); 607*b1cdbd2cSJim Jagielski $installer::globals::csp_installlogdir = installer::systemactions::create_directory_next_to_directory($installer::globals::csp_installdir, "log"); 608*b1cdbd2cSJim Jagielski 609*b1cdbd2cSJim Jagielski my $installdir = $installer::globals::csp_installdir; 610*b1cdbd2cSJim Jagielski my $installlogdir = $installer::globals::csp_installlogdir; 611*b1cdbd2cSJim Jagielski 612*b1cdbd2cSJim Jagielski # Setting package name (similar to the download name) 613*b1cdbd2cSJim Jagielski my $packagename = ""; 614*b1cdbd2cSJim Jagielski 615*b1cdbd2cSJim Jagielski if ( $installer::globals::packageformat eq "archive" || 616*b1cdbd2cSJim Jagielski $installer::globals::packageformat eq "dmg" ) 617*b1cdbd2cSJim Jagielski { 618*b1cdbd2cSJim Jagielski $installer::globals::csp_languagestring = $$languagestringref; 619*b1cdbd2cSJim Jagielski 620*b1cdbd2cSJim Jagielski my $locallanguage = $installer::globals::csp_languagestring; 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski if ( $allvariables->{'AOODOWNLOADNAME'} ) 623*b1cdbd2cSJim Jagielski { 624*b1cdbd2cSJim Jagielski $packagename = installer::download::set_download_filename(\$locallanguage, $allvariables); 625*b1cdbd2cSJim Jagielski } 626*b1cdbd2cSJim Jagielski else 627*b1cdbd2cSJim Jagielski { 628*b1cdbd2cSJim Jagielski $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); 629*b1cdbd2cSJim Jagielski if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); } 630*b1cdbd2cSJim Jagielski if ( $installer::globals::patch ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "patchdownloadname"); } 631*b1cdbd2cSJim Jagielski $packagename = installer::download::resolve_variables_in_downloadname($allvariables, $$downloadname, \$locallanguage); 632*b1cdbd2cSJim Jagielski } 633*b1cdbd2cSJim Jagielski } 634*b1cdbd2cSJim Jagielski 635*b1cdbd2cSJim Jagielski # Work around Windows problems with long pathnames (see issue 50885) by 636*b1cdbd2cSJim Jagielski # putting the to-be-archived installation tree into the temp directory 637*b1cdbd2cSJim Jagielski # instead of the module output tree (unless LOCALINSTALLDIR dictates 638*b1cdbd2cSJim Jagielski # otherwise, anyway); can be removed once issue 50885 is fixed: 639*b1cdbd2cSJim Jagielski my $tempinstalldir = $installdir; 640*b1cdbd2cSJim Jagielski if ( $installer::globals::iswindowsbuild && 641*b1cdbd2cSJim Jagielski $installer::globals::packageformat eq "archive" && 642*b1cdbd2cSJim Jagielski !$installer::globals::localinstalldirset ) 643*b1cdbd2cSJim Jagielski { 644*b1cdbd2cSJim Jagielski $tempinstalldir = File::Temp::tempdir; 645*b1cdbd2cSJim Jagielski } 646*b1cdbd2cSJim Jagielski 647*b1cdbd2cSJim Jagielski # Creating subfolder in installdir, which shall become the root of package or zip file 648*b1cdbd2cSJim Jagielski my $subfolderdir = ""; 649*b1cdbd2cSJim Jagielski if ( $packagename ne "" ) { $subfolderdir = $tempinstalldir . $installer::globals::separator . $packagename; } 650*b1cdbd2cSJim Jagielski else { $subfolderdir = $tempinstalldir; } 651*b1cdbd2cSJim Jagielski 652*b1cdbd2cSJim Jagielski if ( ! -d $subfolderdir ) { installer::systemactions::create_directory($subfolderdir); } 653*b1cdbd2cSJim Jagielski 654*b1cdbd2cSJim Jagielski # Create directories, copy files and ScpActions 655*b1cdbd2cSJim Jagielski 656*b1cdbd2cSJim Jagielski $installer::logger::Info->print("... creating directories ...\n"); 657*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Creating directories:"); 658*b1cdbd2cSJim Jagielski 659*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) 660*b1cdbd2cSJim Jagielski { 661*b1cdbd2cSJim Jagielski my $onedir = ${$dirsref}[$i]; 662*b1cdbd2cSJim Jagielski 663*b1cdbd2cSJim Jagielski if ( $onedir->{'HostName'} ) 664*b1cdbd2cSJim Jagielski { 665*b1cdbd2cSJim Jagielski my $destdir = $subfolderdir . $installer::globals::separator . $onedir->{'HostName'}; 666*b1cdbd2cSJim Jagielski 667*b1cdbd2cSJim Jagielski if ( ! -d $destdir ) 668*b1cdbd2cSJim Jagielski { 669*b1cdbd2cSJim Jagielski if ( $^O =~ /cygwin/i || $^O =~ /os2/i ) # Cygwin performance check 670*b1cdbd2cSJim Jagielski { 671*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Try to create directory %s\n", $destdir); 672*b1cdbd2cSJim Jagielski # Directories in $dirsref are sorted and all parents were added -> "mkdir" works without parent creation! 673*b1cdbd2cSJim Jagielski if ( ! ( -d $destdir )) { mkdir($destdir, 0775); } 674*b1cdbd2cSJim Jagielski } 675*b1cdbd2cSJim Jagielski else 676*b1cdbd2cSJim Jagielski { 677*b1cdbd2cSJim Jagielski installer::systemactions::create_directory_structure($destdir); 678*b1cdbd2cSJim Jagielski } 679*b1cdbd2cSJim Jagielski } 680*b1cdbd2cSJim Jagielski } 681*b1cdbd2cSJim Jagielski } 682*b1cdbd2cSJim Jagielski 683*b1cdbd2cSJim Jagielski # stripping files ?! 684*b1cdbd2cSJim Jagielski if (( $installer::globals::strip ) && ( ! $installer::globals::iswindowsbuild ) && ( ! $installer::globals::isos2 )) { installer::strip::strip_libraries($filesref, $languagestringref); } 685*b1cdbd2cSJim Jagielski 686*b1cdbd2cSJim Jagielski # copy Files 687*b1cdbd2cSJim Jagielski $installer::logger::Info->print("... copying files ...\n"); 688*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Copying files:"); 689*b1cdbd2cSJim Jagielski 690*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 691*b1cdbd2cSJim Jagielski { 692*b1cdbd2cSJim Jagielski my $onefile = ${$filesref}[$i]; 693*b1cdbd2cSJim Jagielski 694*b1cdbd2cSJim Jagielski if (( $onefile->{'Styles'} ) && ( $onefile->{'Styles'} =~ /\bBINARYTABLE_ONLY\b/ )) { next; } 695*b1cdbd2cSJim Jagielski if (( $installer::globals::patch ) && ( $onefile->{'Styles'} ) && ( ! ( $onefile->{'Styles'} =~ /\bPATCH\b/ ))) { next; } 696*b1cdbd2cSJim Jagielski if (( $installer::globals::patch ) && ( $installer::globals::packageformat eq "dmg" )) { push(@installer::globals::patchfilecollector, "$onefile->{'destination'}\n"); } 697*b1cdbd2cSJim Jagielski 698*b1cdbd2cSJim Jagielski my $source = $onefile->{'sourcepath'}; 699*b1cdbd2cSJim Jagielski my $destination = $onefile->{'destination'}; 700*b1cdbd2cSJim Jagielski $destination = $subfolderdir . $installer::globals::separator . $destination; 701*b1cdbd2cSJim Jagielski 702*b1cdbd2cSJim Jagielski # Replacing $$ by $ is necessary to install files with $ in its name (back-masquerading) 703*b1cdbd2cSJim Jagielski # Otherwise, the following shell command does not work and the file list is not correct 704*b1cdbd2cSJim Jagielski $source =~ s/\$\$/\$/; 705*b1cdbd2cSJim Jagielski $destination =~ s/\$\$/\$/; 706*b1cdbd2cSJim Jagielski 707*b1cdbd2cSJim Jagielski if ( $^O =~ /cygwin/i || $^O =~ /os2/i ) # Cygwin performance, do not use copy_one_file. "chmod -R" at the end 708*b1cdbd2cSJim Jagielski { 709*b1cdbd2cSJim Jagielski my $copyreturn = copy($source, $destination); 710*b1cdbd2cSJim Jagielski 711*b1cdbd2cSJim Jagielski if ($copyreturn) 712*b1cdbd2cSJim Jagielski { 713*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Copy: $source to %s\n", $destination); 714*b1cdbd2cSJim Jagielski $returnvalue = 1; 715*b1cdbd2cSJim Jagielski } 716*b1cdbd2cSJim Jagielski else 717*b1cdbd2cSJim Jagielski { 718*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("ERROR: Could not copy %s to %s\n", $source, $destination); 719*b1cdbd2cSJim Jagielski $returnvalue = 0; 720*b1cdbd2cSJim Jagielski } 721*b1cdbd2cSJim Jagielski } 722*b1cdbd2cSJim Jagielski else 723*b1cdbd2cSJim Jagielski { 724*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($source, $destination); 725*b1cdbd2cSJim Jagielski 726*b1cdbd2cSJim Jagielski if ( ! $installer::globals::iswindowsbuild ) 727*b1cdbd2cSJim Jagielski { 728*b1cdbd2cSJim Jagielski # see issue 102274 729*b1cdbd2cSJim Jagielski my $unixrights = ""; 730*b1cdbd2cSJim Jagielski if ( $onefile->{'UnixRights'} ) 731*b1cdbd2cSJim Jagielski { 732*b1cdbd2cSJim Jagielski $unixrights = $onefile->{'UnixRights'}; 733*b1cdbd2cSJim Jagielski 734*b1cdbd2cSJim Jagielski my $localcall = "$installer::globals::wrapcmd chmod $unixrights \'$destination\' \>\/dev\/null 2\>\&1"; 735*b1cdbd2cSJim Jagielski system($localcall); 736*b1cdbd2cSJim Jagielski } 737*b1cdbd2cSJim Jagielski } 738*b1cdbd2cSJim Jagielski } 739*b1cdbd2cSJim Jagielski } 740*b1cdbd2cSJim Jagielski 741*b1cdbd2cSJim Jagielski # creating Links 742*b1cdbd2cSJim Jagielski 743*b1cdbd2cSJim Jagielski $installer::logger::Info->print("... creating links ...\n"); 744*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Creating links:"); 745*b1cdbd2cSJim Jagielski 746*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$linksref}; $i++ ) 747*b1cdbd2cSJim Jagielski { 748*b1cdbd2cSJim Jagielski my $onelink = ${$linksref}[$i]; 749*b1cdbd2cSJim Jagielski 750*b1cdbd2cSJim Jagielski if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; } 751*b1cdbd2cSJim Jagielski 752*b1cdbd2cSJim Jagielski my $destination = $onelink->{'destination'}; 753*b1cdbd2cSJim Jagielski $destination = $subfolderdir . $installer::globals::separator . $destination; 754*b1cdbd2cSJim Jagielski my $destinationfile = $onelink->{'destinationfile'}; 755*b1cdbd2cSJim Jagielski 756*b1cdbd2cSJim Jagielski my $localcall = "ln -sf \'$destinationfile\' \'$destination\' \>\/dev\/null 2\>\&1"; 757*b1cdbd2cSJim Jagielski system($localcall); 758*b1cdbd2cSJim Jagielski 759*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Creating link: \"ln -sf %s %s\"\n", 760*b1cdbd2cSJim Jagielski $destinationfile, 761*b1cdbd2cSJim Jagielski $destination); 762*b1cdbd2cSJim Jagielski } 763*b1cdbd2cSJim Jagielski 764*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ ) 765*b1cdbd2cSJim Jagielski { 766*b1cdbd2cSJim Jagielski my $onelink = ${$unixlinksref}[$i]; 767*b1cdbd2cSJim Jagielski 768*b1cdbd2cSJim Jagielski if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; } 769*b1cdbd2cSJim Jagielski 770*b1cdbd2cSJim Jagielski my $target = $onelink->{'Target'}; 771*b1cdbd2cSJim Jagielski my $destination = $subfolderdir . $installer::globals::separator . $onelink->{'destination'}; 772*b1cdbd2cSJim Jagielski 773*b1cdbd2cSJim Jagielski my $localcall = "ln -sf \'$target\' \'$destination\' \>\/dev\/null 2\>\&1"; 774*b1cdbd2cSJim Jagielski system($localcall); 775*b1cdbd2cSJim Jagielski 776*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Creating Unix link: \"ln -sf %s %s\"\n", 777*b1cdbd2cSJim Jagielski $target, 778*b1cdbd2cSJim Jagielski $destination); 779*b1cdbd2cSJim Jagielski } 780*b1cdbd2cSJim Jagielski 781*b1cdbd2cSJim Jagielski # Setting privileges for cygwin globally 782*b1cdbd2cSJim Jagielski 783*b1cdbd2cSJim Jagielski if ( $^O =~ /cygwin/i ) 784*b1cdbd2cSJim Jagielski { 785*b1cdbd2cSJim Jagielski $installer::logger::Lang->print( "... changing privileges in $subfolderdir ...\n" ); 786*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Changing privileges in $subfolderdir:"); 787*b1cdbd2cSJim Jagielski 788*b1cdbd2cSJim Jagielski my $localcall = "chmod -R 755 " . "\"" . $subfolderdir . "\""; 789*b1cdbd2cSJim Jagielski system($localcall); 790*b1cdbd2cSJim Jagielski } 791*b1cdbd2cSJim Jagielski 792*b1cdbd2cSJim Jagielski $installer::logger::Lang->print( "... removing superfluous directories ...\n" ); 793*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Removing superfluous directories:"); 794*b1cdbd2cSJim Jagielski 795*b1cdbd2cSJim Jagielski my ( $extensionfolder, $preregdir ) = get_extensions_dir($subfolderdir); 796*b1cdbd2cSJim Jagielski installer::systemactions::remove_empty_dirs_in_folder($extensionfolder); 797*b1cdbd2cSJim Jagielski 798*b1cdbd2cSJim Jagielski # Registering the extensions 799*b1cdbd2cSJim Jagielski 800*b1cdbd2cSJim Jagielski $installer::logger::Lang->print( "... registering extensions ...\n" ); 801*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Registering extensions:"); 802*b1cdbd2cSJim Jagielski register_extensions($subfolderdir, $languagestringref, $preregdir); 803*b1cdbd2cSJim Jagielski 804*b1cdbd2cSJim Jagielski if ( $installer::globals::compiler =~ /^unxmac/ ) 805*b1cdbd2cSJim Jagielski { 806*b1cdbd2cSJim Jagielski installer::worker::put_scpactions_into_installset("$installdir/$packagename"); 807*b1cdbd2cSJim Jagielski } 808*b1cdbd2cSJim Jagielski 809*b1cdbd2cSJim Jagielski # Creating archive file 810*b1cdbd2cSJim Jagielski if ( $installer::globals::packageformat eq "archive" ) 811*b1cdbd2cSJim Jagielski { 812*b1cdbd2cSJim Jagielski create_package($tempinstalldir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $installer::globals::archiveformat); 813*b1cdbd2cSJim Jagielski } 814*b1cdbd2cSJim Jagielski elsif ( $installer::globals::packageformat eq "dmg" ) 815*b1cdbd2cSJim Jagielski { 816*b1cdbd2cSJim Jagielski create_package($installdir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, ".dmg"); 817*b1cdbd2cSJim Jagielski } 818*b1cdbd2cSJim Jagielski 819*b1cdbd2cSJim Jagielski # Analyzing the log file 820*b1cdbd2cSJim Jagielski 821*b1cdbd2cSJim Jagielski installer::worker::clean_output_tree(); # removing directories created in the output tree 822*b1cdbd2cSJim Jagielski installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 823*b1cdbd2cSJim Jagielski} 824*b1cdbd2cSJim Jagielski 825*b1cdbd2cSJim Jagielski1; 826