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::downloadsigner; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse installer::exiter; 27*b1cdbd2cSJim Jagielskiuse installer::files; 28*b1cdbd2cSJim Jagielskiuse installer::globals; 29*b1cdbd2cSJim Jagielskiuse installer::logger; 30*b1cdbd2cSJim Jagielskiuse installer::pathanalyzer; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski############################################ 33*b1cdbd2cSJim Jagielski# Parameter Operations 34*b1cdbd2cSJim Jagielski############################################ 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielskisub usage 37*b1cdbd2cSJim Jagielski{ 38*b1cdbd2cSJim Jagielski print <<Ende; 39*b1cdbd2cSJim Jagielski-------------------------------------------------------------------------------- 40*b1cdbd2cSJim Jagielskimake_download V1.0 41*b1cdbd2cSJim JagielskiThe following parameter are needed: 42*b1cdbd2cSJim Jagielski-d: Full path to the file containing the follow-me info or to a directory 43*b1cdbd2cSJim Jagielski containing the follow-me info files. In the latter case, all follow-me 44*b1cdbd2cSJim Jagielski info files are evaluated. If a directory is used, the successfully used 45*b1cdbd2cSJim Jagielski follow-me info files are renamed using a string "success". Files with 46*b1cdbd2cSJim Jagielski this string are ignored in repeated processes using "-d" with a 47*b1cdbd2cSJim Jagielski directory. 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim JagielskiThe following parameter are optional: 50*b1cdbd2cSJim Jagielski-nodownload: Only signing, no creation of download sets (Windows only) 51*b1cdbd2cSJim Jagielski-useminor: Important for installation sets, created without minor set 52*b1cdbd2cSJim Jagielski-writetotemp: Necessary, if you do not want to write into solver 53*b1cdbd2cSJim Jagielski This can be caused by missing privileges (Windows only) 54*b1cdbd2cSJim Jagielski-internalcabinet: Not only the cabinet files are signed, but also all 55*b1cdbd2cSJim Jagielski files included in the cabinet files (Windows only). 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski-sign: Uses signing mechanism to sign installation sets 58*b1cdbd2cSJim JagielskiIf \"-sign\" is set, the following two parameter are required: 59*b1cdbd2cSJim Jagielski-pfx: Full path to the pfx file 60*b1cdbd2cSJim Jagielski-pw: Full path to the file, containing the pfx password. 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim JagielskiExamples: 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim JagielskiSpecifying an installation set (with "-d"): 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielskiperl make_download.pl -d <followmeinfofilename> 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielskiperl make_download.pl -d <followmeinfofilename> 69*b1cdbd2cSJim Jagielski -sign 70*b1cdbd2cSJim Jagielski -pfx <pfxfilename> 71*b1cdbd2cSJim Jagielski -pw <passwordfilename> 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielskior without specifying an installation set: 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielskiperl make_download.pl -d <followmedirectory> 76*b1cdbd2cSJim Jagielski -sign 77*b1cdbd2cSJim Jagielski -pfx <pfxfilename> 78*b1cdbd2cSJim Jagielski -pw <passwordfilename> 79*b1cdbd2cSJim Jagielski-------------------------------------------------------------------------------- 80*b1cdbd2cSJim JagielskiEnde 81*b1cdbd2cSJim Jagielski exit(-1); 82*b1cdbd2cSJim Jagielski} 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski##################################### 85*b1cdbd2cSJim Jagielski# Reading parameter 86*b1cdbd2cSJim Jagielski##################################### 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielskisub getparameter 89*b1cdbd2cSJim Jagielski{ 90*b1cdbd2cSJim Jagielski while ( $#ARGV >= 0 ) 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski my $param = shift(@ARGV); 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski if ($param eq "-d") { $installer::globals::followmeinfofilename = shift(@ARGV); } 95*b1cdbd2cSJim Jagielski elsif ($param eq "-pw") { $installer::globals::pwfile = shift(@ARGV); } 96*b1cdbd2cSJim Jagielski elsif ($param eq "-pfx") { $installer::globals::pfxfile = shift(@ARGV); } 97*b1cdbd2cSJim Jagielski elsif ($param eq "-sign") { $installer::globals::dosign = 1; } 98*b1cdbd2cSJim Jagielski elsif ($param eq "-nodownload") { $installer::globals::nodownload = 1; } 99*b1cdbd2cSJim Jagielski elsif ($param eq "-writetotemp") { $installer::globals::writetotemp = 1; } 100*b1cdbd2cSJim Jagielski elsif ($param eq "-useminor") { $installer::globals::useminor = 1; } 101*b1cdbd2cSJim Jagielski elsif ($param eq "-internalcabinet") { $installer::globals::internal_cabinet_signing = 1; } 102*b1cdbd2cSJim Jagielski else 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski installer::logger::print_error( "unknown parameter: $param" ); 105*b1cdbd2cSJim Jagielski usage(); 106*b1cdbd2cSJim Jagielski exit(-1); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski} 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski##################################### 112*b1cdbd2cSJim Jagielski# Controlling required parameter 113*b1cdbd2cSJim Jagielski##################################### 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielskisub checkparameter 116*b1cdbd2cSJim Jagielski{ 117*b1cdbd2cSJim Jagielski if ( $installer::globals::followmeinfofilename eq "" ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: Required parameter is missing: -d\n" ); 120*b1cdbd2cSJim Jagielski usage(); 121*b1cdbd2cSJim Jagielski exit(-1); 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski if ( $installer::globals::dosign ) 125*b1cdbd2cSJim Jagielski { 126*b1cdbd2cSJim Jagielski # -pfx and -pw have to be set 127*b1cdbd2cSJim Jagielski if ( $installer::globals::pfxfile eq "" ) 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: If \"-sign\" is set, a pfx file has to be specified: -pfx\n" ); 130*b1cdbd2cSJim Jagielski usage(); 131*b1cdbd2cSJim Jagielski exit(-1); 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski # -pfx and -pw have to be set 135*b1cdbd2cSJim Jagielski if ( $installer::globals::pwfile eq "" ) 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: If \"-sign\" is set, a password file has to be specified: -pw\n" ); 138*b1cdbd2cSJim Jagielski usage(); 139*b1cdbd2cSJim Jagielski exit(-1); 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski # and both files have to exist 143*b1cdbd2cSJim Jagielski if ( ! -f $installer::globals::pfxfile ) 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: pfx file \"$installer::globals::pfxfile\" does not exist.\n" ); 146*b1cdbd2cSJim Jagielski usage(); 147*b1cdbd2cSJim Jagielski exit(-1); 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski if ( ! -f $installer::globals::pwfile ) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: Password file \"$installer::globals::pwfile\" does not exist (-pw).\n" ); 153*b1cdbd2cSJim Jagielski usage(); 154*b1cdbd2cSJim Jagielski exit(-1); 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski} 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski############################################# 160*b1cdbd2cSJim Jagielski# Setting the temporary path for the download 161*b1cdbd2cSJim Jagielski# and signing process 162*b1cdbd2cSJim Jagielski############################################# 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielskisub set_temp_path 165*b1cdbd2cSJim Jagielski{ 166*b1cdbd2cSJim Jagielski my $temppath = ""; 167*b1cdbd2cSJim Jagielski my $pid = $$; # process id 168*b1cdbd2cSJim Jagielski my $time = time(); # time 169*b1cdbd2cSJim Jagielski my $helperdir = "unpackdir_" . $pid . $time; 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} )) 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski if ( $ENV{'TMP'} ) { $temppath = $ENV{'TMP'}; } 174*b1cdbd2cSJim Jagielski elsif ( $ENV{'TEMP'} ) { $temppath = $ENV{'TEMP'}; } 175*b1cdbd2cSJim Jagielski $temppath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 176*b1cdbd2cSJim Jagielski $temppath = $temppath . $installer::globals::separator . $helperdir; 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski if( $^O =~ /cygwin/i ) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski $temppath = qx{cygpath -w "$temppath"}; 181*b1cdbd2cSJim Jagielski $temppath =~ s/\\/\//g; 182*b1cdbd2cSJim Jagielski $temppath =~ s/\s*$//g; 183*b1cdbd2cSJim Jagielski } 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski installer::systemactions::create_directory_structure($temppath); 186*b1cdbd2cSJim Jagielski } 187*b1cdbd2cSJim Jagielski else 188*b1cdbd2cSJim Jagielski { 189*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: TMP and TEMP not defined. This is required for this process.\n" ); 190*b1cdbd2cSJim Jagielski usage(); 191*b1cdbd2cSJim Jagielski exit(-1); 192*b1cdbd2cSJim Jagielski } 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 195*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("\n... using output path: %s ...\n", $temppath); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski push(@installer::globals::removedirs, $temppath); 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski return $temppath; 200*b1cdbd2cSJim Jagielski} 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski############################################# 203*b1cdbd2cSJim Jagielski# Setting output pathes to temp directory 204*b1cdbd2cSJim Jagielski# This are the: 205*b1cdbd2cSJim Jagielski# unpackpath and the loggingdir 206*b1cdbd2cSJim Jagielski############################################# 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielskisub set_output_pathes_to_temp 209*b1cdbd2cSJim Jagielski{ 210*b1cdbd2cSJim Jagielski my ($followmeinfohash, $temppath) = @_; 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski $followmeinfohash->{'loggingdir'} = $temppath . $installer::globals::separator; 213*b1cdbd2cSJim Jagielski $installer::globals::unpackpath = $temppath; 214*b1cdbd2cSJim Jagielski} 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski############################################# 217*b1cdbd2cSJim Jagielski# Setting the minor into the pathes. This is 218*b1cdbd2cSJim Jagielski# required, if the original installation set 219*b1cdbd2cSJim Jagielski# was created without minor 220*b1cdbd2cSJim Jagielski# Value is always saved in 221*b1cdbd2cSJim Jagielski# $installer::globals::lastminor 222*b1cdbd2cSJim Jagielski# which is saved in the follow_me file 223*b1cdbd2cSJim Jagielski############################################# 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielskisub set_minor_into_pathes 226*b1cdbd2cSJim Jagielski{ 227*b1cdbd2cSJim Jagielski my ($followmeinfohash, $temppath) = @_; 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 230*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... forcing into minor: %s ...\n", $installer::globals::lastminor); 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski my @pathnames = ("bin", "doc", "inc", "lib", "pck", "res", "xml"); 233*b1cdbd2cSJim Jagielski my $sourcename = "src"; 234*b1cdbd2cSJim Jagielski my $srcpath = $installer::globals::separator . $sourcename . $installer::globals::separator; 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski if ( $installer::globals::minor ne "" ) 237*b1cdbd2cSJim Jagielski { 238*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 239*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... already defined minor: %s -> ignoring parameter \"-useminor\" ...\n" , $installer::globals::minor); 240*b1cdbd2cSJim Jagielski return; 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski # Affected pathes: 244*b1cdbd2cSJim Jagielski # $contenthash{'installlogdir'} 245*b1cdbd2cSJim Jagielski # $contenthash{'includepatharray'} 246*b1cdbd2cSJim Jagielski # $installer::globals::unpackpath 247*b1cdbd2cSJim Jagielski # $installer::globals::idttemplatepath 248*b1cdbd2cSJim Jagielski # $installer::globals::idtlanguagepath 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Changing saved pathes to add the minor"); 251*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("Old pathes:\n"); 252*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$followmeinfohash->{'installlogdir'}: %s\n", $followmeinfohash->{'installlogdir'}); 253*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::unpackpath: %s\n", $installer::globals::unpackpath); 254*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::idttemplatepath: %s\n", $installer::globals::idttemplatepath); 255*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::idtlanguagepath: %s\n", $installer::globals::idtlanguagepath); 256*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Include pathes:\n"); 257*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) 258*b1cdbd2cSJim Jagielski { 259*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($path); 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski foreach $onepath ( @pathnames ) 263*b1cdbd2cSJim Jagielski { 264*b1cdbd2cSJim Jagielski my $oldvalue = $installer::globals::separator . $onepath . $installer::globals::separator; 265*b1cdbd2cSJim Jagielski my $newvalue = $installer::globals::separator . $onepath . "\." . $installer::globals::lastminor . $installer::globals::separator; 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski if (( $followmeinfohash->{'installlogdir'} =~ /\Q$oldvalue\E/ ) && ( ! ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ))) { $followmeinfohash->{'installlogdir'} =~ s/\Q$oldvalue\E/$newvalue/; } 268*b1cdbd2cSJim Jagielski if (( $installer::globals::unpackpath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ))) { $installer::globals::unpackpath =~ s/\Q$oldvalue\E/$newvalue/; } 269*b1cdbd2cSJim Jagielski if (( $installer::globals::idttemplatepath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idttemplatepath =~ s/\Q$oldvalue\E/$newvalue/; } 270*b1cdbd2cSJim Jagielski if (( $installer::globals::idtlanguagepath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idtlanguagepath =~ s/\Q$oldvalue\E/$newvalue/; } 271*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { if (( $path =~ /\Q$oldvalue\E/ ) && ( ! ( $path =~ /\Q$srcpath\E/ ))) { $path =~ s/\Q$oldvalue\E/$newvalue/; } } 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski # Checking for the end of the path 274*b1cdbd2cSJim Jagielski $oldvalue = $installer::globals::separator . $onepath; 275*b1cdbd2cSJim Jagielski $newvalue = $installer::globals::separator . $onepath . "\." . $installer::globals::lastminor; 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski if (( $followmeinfohash->{'installlogdir'} =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ))) { $followmeinfohash->{'installlogdir'} =~ s/\Q$oldvalue\E\s*$/$newvalue/; } 278*b1cdbd2cSJim Jagielski if (( $installer::globals::unpackpath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ))) { $installer::globals::unpackpath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } 279*b1cdbd2cSJim Jagielski if (( $installer::globals::idttemplatepath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idttemplatepath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } 280*b1cdbd2cSJim Jagielski if (( $installer::globals::idtlanguagepath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idtlanguagepath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } 281*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski if (( $path =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $path =~ /\Q$srcpath\E/ ))) 284*b1cdbd2cSJim Jagielski { 285*b1cdbd2cSJim Jagielski $path =~ s/\Q$oldvalue\E\s*$/$newvalue/; 286*b1cdbd2cSJim Jagielski $path = $path . "\n"; 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski } 289*b1cdbd2cSJim Jagielski } 290*b1cdbd2cSJim Jagielski 291*b1cdbd2cSJim Jagielski # And now can follow the replacement for the source path "src". Subdirs like "bin" in the source tree 292*b1cdbd2cSJim Jagielski # must not get the minor. This is instead "src.m9/instsetoo_native/common.pro/bin/..." 293*b1cdbd2cSJim Jagielski # Directory "src" can never be the end of the path 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski my $newsrcpath = $installer::globals::separator . $sourcename . "\." . $installer::globals::lastminor . $installer::globals::separator; 296*b1cdbd2cSJim Jagielski 297*b1cdbd2cSJim Jagielski if ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ) { $followmeinfohash->{'installlogdir'} =~ s/\Q$srcpath\E/$newsrcpath/; } 298*b1cdbd2cSJim Jagielski if ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ) { $installer::globals::unpackpath =~ s/\Q$srcpath\E/$newsrcpath/; } 299*b1cdbd2cSJim Jagielski if ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ) { $installer::globals::idttemplatepath =~ s/\Q$srcpath\E/$newsrcpath/; } 300*b1cdbd2cSJim Jagielski if ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ) { $installer::globals::idtlanguagepath =~ s/\Q$srcpath\E/$newsrcpath/; } 301*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { if ( $path =~ /\Q$srcpath\E/ ) { $path =~ s/\Q$srcpath\E/$newsrcpath/; } } 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 304*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("New pathes:\n"); 305*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$followmeinfohash->{'installlogdir'}: %s\n", $followmeinfohash->{'installlogdir'}); 306*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::unpackpath: %s\n", $installer::globals::unpackpath); 307*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::idttemplatepath: %s\n", $installer::globals::idttemplatepath); 308*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\$installer::globals::idtlanguagepath: %s\n", $installer::globals::idtlanguagepath); 309*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Include pathes:\n"); 310*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) 311*b1cdbd2cSJim Jagielski { 312*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($path); 313*b1cdbd2cSJim Jagielski } 314*b1cdbd2cSJim Jagielski} 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski############################################# 317*b1cdbd2cSJim Jagielski# Setting the name of the log file 318*b1cdbd2cSJim Jagielski############################################# 319*b1cdbd2cSJim Jagielski 320*b1cdbd2cSJim Jagielskisub setlogfilename 321*b1cdbd2cSJim Jagielski{ 322*b1cdbd2cSJim Jagielski if ( $installer::globals::dosign ) { $installer::globals::logfilename = "sign_and_download_" . $installer::globals::logfilename; } 323*b1cdbd2cSJim Jagielski else { $installer::globals::logfilename = "download_" . $installer::globals::logfilename; } 324*b1cdbd2cSJim Jagielski # reset the log file 325*b1cdbd2cSJim Jagielski @installer::globals::logfileinfo = (); 326*b1cdbd2cSJim Jagielski} 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski######################################################### 329*b1cdbd2cSJim Jagielski# Checking, if this is a task in a cws or 330*b1cdbd2cSJim Jagielski# on the master. Simple check of naming schema: 331*b1cdbd2cSJim Jagielski# CWS: follow_me_DEV300_m40_de.log 332*b1cdbd2cSJim Jagielski# Master: follow_me_4_DEV300_m40_en-US.log 333*b1cdbd2cSJim Jagielski######################################################### 334*b1cdbd2cSJim Jagielski 335*b1cdbd2cSJim Jagielskisub check_cws_build 336*b1cdbd2cSJim Jagielski{ 337*b1cdbd2cSJim Jagielski my ( $filename ) = @_; 338*b1cdbd2cSJim Jagielski 339*b1cdbd2cSJim Jagielski my $iscws = 1; 340*b1cdbd2cSJim Jagielski 341*b1cdbd2cSJim Jagielski if ( $filename =~ /follow_me_\d+_/ ) { $iscws = 0; } 342*b1cdbd2cSJim Jagielski # if ( $filename =~ /log_\d+_/ ) { $iscws = 0; } 343*b1cdbd2cSJim Jagielski 344*b1cdbd2cSJim Jagielski return $iscws; 345*b1cdbd2cSJim Jagielski} 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski######################################################### 348*b1cdbd2cSJim Jagielski# Reading a specific key from a follow-me file 349*b1cdbd2cSJim Jagielski######################################################### 350*b1cdbd2cSJim Jagielski 351*b1cdbd2cSJim Jagielskisub get_property_from_file 352*b1cdbd2cSJim Jagielski{ 353*b1cdbd2cSJim Jagielski my ($followmefile, $key) = @_; 354*b1cdbd2cSJim Jagielski 355*b1cdbd2cSJim Jagielski my $value = ""; 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski my $filecontent = installer::files::read_file($followmefile); 358*b1cdbd2cSJim Jagielski 359*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 360*b1cdbd2cSJim Jagielski { 361*b1cdbd2cSJim Jagielski if ( ${$filecontent}[$i] =~ /^\s*\Q$key\E\s*\:\s*(.*?)\s*$/ ) 362*b1cdbd2cSJim Jagielski { 363*b1cdbd2cSJim Jagielski $value = $1; 364*b1cdbd2cSJim Jagielski last; 365*b1cdbd2cSJim Jagielski } 366*b1cdbd2cSJim Jagielski } 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski return $value; 369*b1cdbd2cSJim Jagielski} 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski######################################################### 372*b1cdbd2cSJim Jagielski# Publishing the content of the product list 373*b1cdbd2cSJim Jagielski######################################################### 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielskisub publishproductlist 376*b1cdbd2cSJim Jagielski{ 377*b1cdbd2cSJim Jagielski my ($infofilelist) = @_; 378*b1cdbd2cSJim Jagielski 379*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 380*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... found products: ...\n"); 381*b1cdbd2cSJim Jagielski 382*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$infofilelist}; $i++ ) 383*b1cdbd2cSJim Jagielski { 384*b1cdbd2cSJim Jagielski my $onefile = ${$infofilelist}[$i]; 385*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onefile); 386*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... $onefile ...\n"); 387*b1cdbd2cSJim Jagielski } 388*b1cdbd2cSJim Jagielski 389*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("\n"); 390*b1cdbd2cSJim Jagielski} 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski######################################################### 393*b1cdbd2cSJim Jagielski# Filtering all files, that have correct minor 394*b1cdbd2cSJim Jagielski# and work stamp. 395*b1cdbd2cSJim Jagielski# Master: follow_me_4_DEV300_m40_en-US.log 396*b1cdbd2cSJim Jagielski######################################################### 397*b1cdbd2cSJim Jagielski 398*b1cdbd2cSJim Jagielskisub filter_all_files_with_correct_settings 399*b1cdbd2cSJim Jagielski{ 400*b1cdbd2cSJim Jagielski my ($allfollowmefiles) = @_; 401*b1cdbd2cSJim Jagielski 402*b1cdbd2cSJim Jagielski my @allfiles = (); 403*b1cdbd2cSJim Jagielski my @allfiles2 = (); 404*b1cdbd2cSJim Jagielski my $maxhash = (); 405*b1cdbd2cSJim Jagielski 406*b1cdbd2cSJim Jagielski my $minor = ""; 407*b1cdbd2cSJim Jagielski my $workstamp = ""; 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski if ( $ENV{'WORK_STAMP'} ) { $workstamp = $ENV{'WORK_STAMP'}; } 410*b1cdbd2cSJim Jagielski if ( $ENV{'UPDMINOR'} ) { $minor = $ENV{'UPDMINOR'}; } 411*b1cdbd2cSJim Jagielski 412*b1cdbd2cSJim Jagielski if ( $minor eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"UPDMINOR\" not set!", "filter_all_files_with_correct_settings"); } 413*b1cdbd2cSJim Jagielski if ( $workstamp eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"WORK_STAMP\" not set!", "filter_all_files_with_correct_settings"); } 414*b1cdbd2cSJim Jagielski 415*b1cdbd2cSJim Jagielski foreach my $onefile ( @{$allfollowmefiles} ) 416*b1cdbd2cSJim Jagielski { 417*b1cdbd2cSJim Jagielski if (( $onefile =~ /_\Q$minor\E_/i ) && ( $onefile =~ /_\Q$workstamp\E_/i )) 418*b1cdbd2cSJim Jagielski { 419*b1cdbd2cSJim Jagielski push(@allfiles, $onefile); 420*b1cdbd2cSJim Jagielski 421*b1cdbd2cSJim Jagielski # also collecting maximum hash 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski if ( $onefile =~ /follow_me_(\d+)_\Q$workstamp\E_\Q$minor\E_([-\w]+)\.log\s*$/i ) 424*b1cdbd2cSJim Jagielski { 425*b1cdbd2cSJim Jagielski my $sequence = $1; 426*b1cdbd2cSJim Jagielski my $lang = $2; 427*b1cdbd2cSJim Jagielski 428*b1cdbd2cSJim Jagielski if (( ! exists($maxhash{$lang})) || ( $maxhash{$lang} < $sequence )) { $maxhash{$lang} = $sequence; } 429*b1cdbd2cSJim Jagielski } 430*b1cdbd2cSJim Jagielski } 431*b1cdbd2cSJim Jagielski } 432*b1cdbd2cSJim Jagielski 433*b1cdbd2cSJim Jagielski # second run, because of sequence numbers 434*b1cdbd2cSJim Jagielski 435*b1cdbd2cSJim Jagielski foreach my $onefile ( @allfiles ) 436*b1cdbd2cSJim Jagielski { 437*b1cdbd2cSJim Jagielski if ( $onefile =~ /follow_me_(\d+)_\Q$workstamp\E_\Q$minor\E_([-\w]+)\.log\s*$/i ) 438*b1cdbd2cSJim Jagielski { 439*b1cdbd2cSJim Jagielski my $sequence = $1; 440*b1cdbd2cSJim Jagielski my $lang = $2; 441*b1cdbd2cSJim Jagielski 442*b1cdbd2cSJim Jagielski if ( $sequence == $maxhash{$lang} ) { push(@allfiles2, $onefile); } 443*b1cdbd2cSJim Jagielski } 444*b1cdbd2cSJim Jagielski } 445*b1cdbd2cSJim Jagielski 446*b1cdbd2cSJim Jagielski return ( \@allfiles2 ); 447*b1cdbd2cSJim Jagielski} 448*b1cdbd2cSJim Jagielski 449*b1cdbd2cSJim Jagielski######################################################### 450*b1cdbd2cSJim Jagielski# Creating a list of products, that need to be signed 451*b1cdbd2cSJim Jagielski# or for which download sets need to be created. 452*b1cdbd2cSJim Jagielski######################################################### 453*b1cdbd2cSJim Jagielski 454*b1cdbd2cSJim Jagielskisub createproductlist 455*b1cdbd2cSJim Jagielski{ 456*b1cdbd2cSJim Jagielski # If "-d" specifies an installation set, there is only one product 457*b1cdbd2cSJim Jagielski 458*b1cdbd2cSJim Jagielski my @infofilelist = (); 459*b1cdbd2cSJim Jagielski my @infofilelist2 = (); 460*b1cdbd2cSJim Jagielski 461*b1cdbd2cSJim Jagielski if ( -f $installer::globals::followmeinfofilename ) 462*b1cdbd2cSJim Jagielski { 463*b1cdbd2cSJim Jagielski push(@infofilelist, $installer::globals::followmeinfofilename); 464*b1cdbd2cSJim Jagielski # Saving info, that this is a file 465*b1cdbd2cSJim Jagielski $installer::globals::followme_from_directory = 0; 466*b1cdbd2cSJim Jagielski } 467*b1cdbd2cSJim Jagielski elsif ( -d $installer::globals::followmeinfofilename ) 468*b1cdbd2cSJim Jagielski { 469*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("\n"); 470*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... reading directory: %s ...\n", $installer::globals::followmeinfofilename); 471*b1cdbd2cSJim Jagielski $installer::globals::followmeinfofilename =~ s/$installer::globals::separator\s*$//; 472*b1cdbd2cSJim Jagielski my $allfollowmefiles = installer::systemactions::find_file_with_file_extension("log", $installer::globals::followmeinfofilename); 473*b1cdbd2cSJim Jagielski 474*b1cdbd2cSJim Jagielski if ( ! ( $#{$allfollowmefiles} > -1 )) 475*b1cdbd2cSJim Jagielski { 476*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: Nothing to do! No follow-me file in directory \"$installer::globals::followmeinfofilename\"!.\n" ); 477*b1cdbd2cSJim Jagielski usage(); 478*b1cdbd2cSJim Jagielski exit(-1); 479*b1cdbd2cSJim Jagielski } 480*b1cdbd2cSJim Jagielski 481*b1cdbd2cSJim Jagielski # Saving info, that this is a directory 482*b1cdbd2cSJim Jagielski $installer::globals::followme_from_directory = 1; 483*b1cdbd2cSJim Jagielski 484*b1cdbd2cSJim Jagielski # Collect all possible installation sets 485*b1cdbd2cSJim Jagielski # CWS: All installation sets 486*b1cdbd2cSJim Jagielski # Master: All installation sets with same major, minor and buildid. Additionally using the highest number. 487*b1cdbd2cSJim Jagielski 488*b1cdbd2cSJim Jagielski my $iscws = check_cws_build(${$allfollowmefiles}[0]); 489*b1cdbd2cSJim Jagielski 490*b1cdbd2cSJim Jagielski if ( $iscws ) 491*b1cdbd2cSJim Jagielski { 492*b1cdbd2cSJim Jagielski # Simply read all follow-me files and check existence of installation sets 493*b1cdbd2cSJim Jagielski foreach my $onefile ( @{$allfollowmefiles} ) 494*b1cdbd2cSJim Jagielski { 495*b1cdbd2cSJim Jagielski my $fullfilename = $installer::globals::followmeinfofilename . $installer::globals::separator . $onefile; 496*b1cdbd2cSJim Jagielski my $installdir = get_property_from_file($fullfilename, "finalinstalldir"); 497*b1cdbd2cSJim Jagielski if (( $installdir ne "" ) && ( -d $installdir )) { push(@infofilelist2, $fullfilename); } 498*b1cdbd2cSJim Jagielski } 499*b1cdbd2cSJim Jagielski } 500*b1cdbd2cSJim Jagielski else 501*b1cdbd2cSJim Jagielski { 502*b1cdbd2cSJim Jagielski $allfollowmefiles = filter_all_files_with_correct_settings($allfollowmefiles); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski foreach my $onefile ( @{$allfollowmefiles} ) 505*b1cdbd2cSJim Jagielski { 506*b1cdbd2cSJim Jagielski my $fullfilename = $installer::globals::followmeinfofilename . $installer::globals::separator . $onefile; 507*b1cdbd2cSJim Jagielski # Check, if installation set still exists 508*b1cdbd2cSJim Jagielski my $installdir = get_property_from_file($fullfilename, "finalinstalldir"); 509*b1cdbd2cSJim Jagielski if (( $installdir ne "" ) && ( -d $installdir )) { push(@infofilelist2, $fullfilename); } 510*b1cdbd2cSJim Jagielski } 511*b1cdbd2cSJim Jagielski } 512*b1cdbd2cSJim Jagielski 513*b1cdbd2cSJim Jagielski # Removing all files, starting with "follow_me_success_" in their names. This have already been used successfully. 514*b1cdbd2cSJim Jagielski 515*b1cdbd2cSJim Jagielski foreach my $onefile ( @infofilelist2 ) 516*b1cdbd2cSJim Jagielski { 517*b1cdbd2cSJim Jagielski if ( $onefile =~ /follow_me_success_/ ) { next; } 518*b1cdbd2cSJim Jagielski push(@infofilelist, $onefile); 519*b1cdbd2cSJim Jagielski } 520*b1cdbd2cSJim Jagielski 521*b1cdbd2cSJim Jagielski # Checking, if there is content in the list 522*b1cdbd2cSJim Jagielski if ( ! ( $#infofilelist > -1 )) 523*b1cdbd2cSJim Jagielski { 524*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: Nothing to do! No installation set found for follow-me files in directory \"$installer::globals::followmeinfofilename\"!.\n" ); 525*b1cdbd2cSJim Jagielski usage(); 526*b1cdbd2cSJim Jagielski exit(-1); 527*b1cdbd2cSJim Jagielski } 528*b1cdbd2cSJim Jagielski } 529*b1cdbd2cSJim Jagielski else 530*b1cdbd2cSJim Jagielski { 531*b1cdbd2cSJim Jagielski installer::logger::print_error( "Error: Nothing to do! \"$installer::globals::followmeinfofilename\" is no file and no directory (-d).\n" ); 532*b1cdbd2cSJim Jagielski usage(); 533*b1cdbd2cSJim Jagielski exit(-1); 534*b1cdbd2cSJim Jagielski } 535*b1cdbd2cSJim Jagielski 536*b1cdbd2cSJim Jagielski return \@infofilelist; 537*b1cdbd2cSJim Jagielski} 538*b1cdbd2cSJim Jagielski 539*b1cdbd2cSJim Jagielski############################################# 540*b1cdbd2cSJim Jagielski# Logging the content of the download hash 541*b1cdbd2cSJim Jagielski############################################# 542*b1cdbd2cSJim Jagielski 543*b1cdbd2cSJim Jagielskisub logfollowmeinfohash 544*b1cdbd2cSJim Jagielski{ 545*b1cdbd2cSJim Jagielski my ( $followmehash ) = @_; 546*b1cdbd2cSJim Jagielski 547*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("\n"); 548*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("*****************************************\n"); 549*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("Content of follow-me info file:\n"); 550*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("finalinstalldir: %s\n", $followmehash->{'finalinstalldir'}); 551*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("downloadname: %s\n", $followmehash->{'downloadname'}); 552*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("languagestring: %s\n", $followmehash->{'languagestring'}); 553*b1cdbd2cSJim Jagielski foreach my $lang ( @{$followmehash->{'languagesarray'}} ) 554*b1cdbd2cSJim Jagielski { 555*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("languagesarray: %s\n", $lang); 556*b1cdbd2cSJim Jagielski } 557*b1cdbd2cSJim Jagielski foreach my $path ( @{$followmehash->{'includepatharray'}} ) 558*b1cdbd2cSJim Jagielski { 559*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("includepatharray: %s\n", $path); 560*b1cdbd2cSJim Jagielski } 561*b1cdbd2cSJim Jagielski foreach my $key ( sort keys %{$followmehash->{'allvariableshash'}} ) 562*b1cdbd2cSJim Jagielski { 563*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("allvariableshash: %s : %s\n", 564*b1cdbd2cSJim Jagielski $key, 565*b1cdbd2cSJim Jagielski $followmehash->{'allvariableshash'}->{$key}); 566*b1cdbd2cSJim Jagielski } 567*b1cdbd2cSJim Jagielski} 568*b1cdbd2cSJim Jagielski 569*b1cdbd2cSJim Jagielski######################################################################## 570*b1cdbd2cSJim Jagielski# Renaming the follow me info file, if it was successfully used. 571*b1cdbd2cSJim Jagielski# This can only be done, if the parameter "-d" was used with a 572*b1cdbd2cSJim Jagielski# directory, not a name. In this case the repeated use of parameter 573*b1cdbd2cSJim Jagielski# "-d" with this directory has to ignore this already successfully 574*b1cdbd2cSJim Jagielski# used file. 575*b1cdbd2cSJim Jagielski######################################################################## 576*b1cdbd2cSJim Jagielski 577*b1cdbd2cSJim Jagielskisub rename_followme_infofile 578*b1cdbd2cSJim Jagielski{ 579*b1cdbd2cSJim Jagielski my ( $filename ) = @_; 580*b1cdbd2cSJim Jagielski 581*b1cdbd2cSJim Jagielski my $newfilename = $filename; 582*b1cdbd2cSJim Jagielski $newfilename =~ s/follow_me_/follow_me_success_/; # including "_success" after "follow_me" 583*b1cdbd2cSJim Jagielski 584*b1cdbd2cSJim Jagielski if ( $filename ne $newfilename ) 585*b1cdbd2cSJim Jagielski { 586*b1cdbd2cSJim Jagielski my $returnvalue = rename($filename, $newfilename); 587*b1cdbd2cSJim Jagielski if ( $returnvalue ) 588*b1cdbd2cSJim Jagielski { 589*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("\n"); 590*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... renamed file \"%s\" to \"%s\" ...\n", $filename, $newfilename); 591*b1cdbd2cSJim Jagielski } 592*b1cdbd2cSJim Jagielski } 593*b1cdbd2cSJim Jagielski} 594*b1cdbd2cSJim Jagielski 595*b1cdbd2cSJim Jagielski1; 596