admin.pl (86e1cf34) | admin.pl (95e2fe77) |
---|---|
1#************************************************************** | 1#************************************************************** |
2# | 2# |
3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at | 3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at |
10# | 10# |
11# http://www.apache.org/licenses/LICENSE-2.0 | 11# http://www.apache.org/licenses/LICENSE-2.0 |
12# | 12# |
13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. | 13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. |
19# | 19# |
20#************************************************************** 21 22 23 24use Cwd; 25use File::Copy; 26 27################################################################################# --- 52 unchanged lines hidden (view full) --- 80 81sub getparameter 82{ 83 if (( $#ARGV < 3 ) || ( $#ARGV > 3 )) { usage(); } 84 85 while ( $#ARGV >= 0 ) 86 { 87 my $param = shift(@ARGV); | 20#************************************************************** 21 22 23 24use Cwd; 25use File::Copy; 26 27################################################################################# --- 52 unchanged lines hidden (view full) --- 80 81sub getparameter 82{ 83 if (( $#ARGV < 3 ) || ( $#ARGV > 3 )) { usage(); } 84 85 while ( $#ARGV >= 0 ) 86 { 87 my $param = shift(@ARGV); |
88 | 88 |
89 if ($param eq "-t") { $targetdir = shift(@ARGV); } 90 elsif ($param eq "-d") { $databasepath = shift(@ARGV); } 91 else 92 { 93 print "\n**********************************************\n"; | 89 if ($param eq "-t") { $targetdir = shift(@ARGV); } 90 elsif ($param eq "-d") { $databasepath = shift(@ARGV); } 91 else 92 { 93 print "\n**********************************************\n"; |
94 print "Error: Unknows parameter: $param"; | 94 print "Error: Unknown parameter: $param"; |
95 print "\n**********************************************\n"; 96 usage(); 97 exit(-1); 98 } 99 } 100} 101 102################################################################################# --- 14 unchanged lines hidden (view full) --- 117 if ( $databasepath eq "" ) 118 { 119 print "\n******************************************************\n"; 120 print "Error: Path to msi database not defined (parameter -d)!"; 121 print "\n******************************************************\n"; 122 usage(); 123 exit(-1); 124 } | 95 print "\n**********************************************\n"; 96 usage(); 97 exit(-1); 98 } 99 } 100} 101 102################################################################################# --- 14 unchanged lines hidden (view full) --- 117 if ( $databasepath eq "" ) 118 { 119 print "\n******************************************************\n"; 120 print "Error: Path to msi database not defined (parameter -d)!"; 121 print "\n******************************************************\n"; 122 usage(); 123 exit(-1); 124 } |
125 | 125 |
126 if ( -d $databasepath ) 127 { 128 $databasepath =~ s/\\\s*$//; 129 $databasepath =~ s/\/\s*$//; | 126 if ( -d $databasepath ) 127 { 128 $databasepath =~ s/\\\s*$//; 129 $databasepath =~ s/\/\s*$//; |
130 | 130 |
131 my $msifiles = find_file_with_file_extension("msi", $databasepath); | 131 my $msifiles = find_file_with_file_extension("msi", $databasepath); |
132 | 132 |
133 if ( $#{$msifiles} < 0 ) { exit_program("ERROR: Did not find msi database in directory $installationdir"); } 134 if ( $#{$msifiles} > 0 ) { exit_program("ERROR: Did find more than one msi database in directory $installationdir"); } 135 136 $databasepath = $databasepath . $separator . ${$msifiles}[0]; 137 } 138 139 if ( ! -f $databasepath ) { exit_program("ERROR: Did not find msi database in directory $databasepath."); } | 133 if ( $#{$msifiles} < 0 ) { exit_program("ERROR: Did not find msi database in directory $installationdir"); } 134 if ( $#{$msifiles} > 0 ) { exit_program("ERROR: Did find more than one msi database in directory $installationdir"); } 135 136 $databasepath = $databasepath . $separator . ${$msifiles}[0]; 137 } 138 139 if ( ! -f $databasepath ) { exit_program("ERROR: Did not find msi database in directory $databasepath."); } |
140 | 140 |
141 if ( ! -d $targetdir ) { create_directories($targetdir); } 142} 143 144############################################################################# 145# The program msidb.exe can be located next to the Perl program. Then it is | 141 if ( ! -d $targetdir ) { create_directories($targetdir); } 142} 143 144############################################################################# 145# The program msidb.exe can be located next to the Perl program. Then it is |
146# not necessary to find it in the PATH variable. | 146# not necessary to find it in the PATH variable. |
147############################################################################# 148 149sub check_local_msidb 150{ 151 my $msidbname = "msidb.exe"; 152 my $perlprogramm = $0; 153 my $path = $perlprogramm; | 147############################################################################# 148 149sub check_local_msidb 150{ 151 my $msidbname = "msidb.exe"; 152 my $perlprogramm = $0; 153 my $path = $perlprogramm; |
154 | 154 |
155 get_path_from_fullqualifiedname(\$path); 156 157 $path =~ s/\\\s*$//; 158 $path =~ s/\/\s*$//; 159 160 my $msidbpath = ""; 161 if ( $path =~ /^\s*$/ ) { $msidbpath = $msidbname; } 162 else { $msidbpath = $path . $separator . $msidbname; } 163 164 if ( -f $msidbpath ) 165 { 166 $localmsidbpath = $msidbpath; 167 print "Using $msidbpath (next to \"admin.pl\")\n"; 168 } 169} 170 171############################################################################# | 155 get_path_from_fullqualifiedname(\$path); 156 157 $path =~ s/\\\s*$//; 158 $path =~ s/\/\s*$//; 159 160 my $msidbpath = ""; 161 if ( $path =~ /^\s*$/ ) { $msidbpath = $msidbname; } 162 else { $msidbpath = $path . $separator . $msidbname; } 163 164 if ( -f $msidbpath ) 165 { 166 $localmsidbpath = $msidbpath; 167 print "Using $msidbpath (next to \"admin.pl\")\n"; 168 } 169} 170 171############################################################################# |
172# Converting a string list with separator $listseparator | 172# Converting a string list with separator $listseparator |
173# into an array 174############################################################################# 175 176sub convert_stringlist_into_array 177{ 178 my ( $includestringref, $listseparator ) = @_; | 173# into an array 174############################################################################# 175 176sub convert_stringlist_into_array 177{ 178 my ( $includestringref, $listseparator ) = @_; |
179 | 179 |
180 my @newarray = (); 181 my $first; 182 my $last = ${$includestringref}; 183 184 while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching 185 { 186 $first = $1; | 180 my @newarray = (); 181 my $first; 182 my $last = ${$includestringref}; 183 184 while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching 185 { 186 $first = $1; |
187 $last = $2; | 187 $last = $2; |
188 # Problem with two directly following listseparators. For example a path with two ";;" directly behind each other 189 $first =~ s/^$listseparator//; 190 push(@newarray, "$first\n"); | 188 # Problem with two directly following listseparators. For example a path with two ";;" directly behind each other 189 $first =~ s/^$listseparator//; 190 push(@newarray, "$first\n"); |
191 } | 191 } |
192 | 192 |
193 push(@newarray, "$last\n"); 194 | 193 push(@newarray, "$last\n"); 194 |
195 return \@newarray; 196} 197 198######################################################### 199# Checking the local system 200# Checking existence of needed files in include path 201######################################################### 202 203sub check_system_path 204{ | 195 return \@newarray; 196} 197 198######################################################### 199# Checking the local system 200# Checking existence of needed files in include path 201######################################################### 202 203sub check_system_path 204{ |
205 my $onefile; | 205 my $onefile; |
206 my $error = 0; 207 my $pathvariable = $ENV{'PATH'}; 208 my $local_pathseparator = $pathseparator; | 206 my $error = 0; 207 my $pathvariable = $ENV{'PATH'}; 208 my $local_pathseparator = $pathseparator; |
209 | 209 |
210 if( $^O =~ /cygwin/i ) 211 { # When using cygwin's perl the PATH variable is POSIX style and ... 212 $pathvariable = qx{cygpath -mp "$pathvariable"} ; 213 # has to be converted to DOS style for further use. 214 $local_pathseparator = ';'; 215 } 216 my $patharrayref = convert_stringlist_into_array(\$pathvariable, $local_pathseparator); | 210 if( $^O =~ /cygwin/i ) 211 { # When using cygwin's perl the PATH variable is POSIX style and ... 212 $pathvariable = qx{cygpath -mp "$pathvariable"} ; 213 # has to be converted to DOS style for further use. 214 $local_pathseparator = ';'; 215 } 216 my $patharrayref = convert_stringlist_into_array(\$pathvariable, $local_pathseparator); |
217 | 217 |
218 my @needed_files_in_path = ("expand.exe"); 219 if ( $localmsidbpath eq "" ) { push(@needed_files_in_path, "msidb.exe"); } # not found locally -> search in path 220 my @optional_files_in_path = ("msiinfo.exe"); 221 222 print("\nChecking required files:\n"); 223 224 foreach $onefile ( @needed_files_in_path ) 225 { --- 4 unchanged lines hidden (view full) --- 230 if ( $$fileref eq "" ) 231 { 232 $error = 1; 233 print( "$onefile not found\n" ); 234 } 235 else 236 { 237 print( "\tFound: $$fileref\n" ); | 218 my @needed_files_in_path = ("expand.exe"); 219 if ( $localmsidbpath eq "" ) { push(@needed_files_in_path, "msidb.exe"); } # not found locally -> search in path 220 my @optional_files_in_path = ("msiinfo.exe"); 221 222 print("\nChecking required files:\n"); 223 224 foreach $onefile ( @needed_files_in_path ) 225 { --- 4 unchanged lines hidden (view full) --- 230 if ( $$fileref eq "" ) 231 { 232 $error = 1; 233 print( "$onefile not found\n" ); 234 } 235 else 236 { 237 print( "\tFound: $$fileref\n" ); |
238 } | 238 } |
239 } 240 241 if ( $error ) { exit_program("ERROR: Could not find all needed files in path (using setsolar should help)!"); } 242 243 print("\nChecking optional files:\n"); 244 245 foreach $onefile ( @optional_files_in_path ) 246 { --- 5 unchanged lines hidden (view full) --- 252 { 253 print( "$onefile not found\n" ); 254 if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 0; } 255 } 256 else 257 { 258 print( "\tFound: $$fileref\n" ); 259 if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 1; } | 239 } 240 241 if ( $error ) { exit_program("ERROR: Could not find all needed files in path (using setsolar should help)!"); } 242 243 print("\nChecking optional files:\n"); 244 245 foreach $onefile ( @optional_files_in_path ) 246 { --- 5 unchanged lines hidden (view full) --- 252 { 253 print( "$onefile not found\n" ); 254 if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 0; } 255 } 256 else 257 { 258 print( "\tFound: $$fileref\n" ); 259 if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 1; } |
260 } | 260 } |
261 } 262 263} 264 265########################################################################## 266# Searching a file in a list of paths 267########################################################################## 268 269sub get_sourcepath_from_filename_and_includepath 270{ 271 my ($searchfilenameref, $includepatharrayref) = @_; 272 273 my $onefile = ""; 274 my $foundsourcefile = 0; | 261 } 262 263} 264 265########################################################################## 266# Searching a file in a list of paths 267########################################################################## 268 269sub get_sourcepath_from_filename_and_includepath 270{ 271 my ($searchfilenameref, $includepatharrayref) = @_; 272 273 my $onefile = ""; 274 my $foundsourcefile = 0; |
275 | 275 |
276 for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ ) 277 { 278 my $includepath = ${$includepatharrayref}[$j]; 279 $includepath =~ s/^\s*//; 280 $includepath =~ s/\s*$//; 281 282 $onefile = $includepath . $separator . $$searchfilenameref; 283 284 if ( -f $onefile ) 285 { 286 $foundsourcefile = 1; 287 last; 288 } 289 } 290 291 if (!($foundsourcefile)) { $onefile = ""; } | 276 for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ ) 277 { 278 my $includepath = ${$includepatharrayref}[$j]; 279 $includepath =~ s/^\s*//; 280 $includepath =~ s/\s*$//; 281 282 $onefile = $includepath . $separator . $$searchfilenameref; 283 284 if ( -f $onefile ) 285 { 286 $foundsourcefile = 1; 287 last; 288 } 289 } 290 291 if (!($foundsourcefile)) { $onefile = ""; } |
292 | 292 |
293 return \$onefile; 294} 295 296############################################################## 297# Removing all empty directories below a specified directory 298############################################################## 299 300sub remove_empty_dirs_in_folder 301{ 302 my ( $dir, $firstrun ) = @_; 303 304 if ( $firstrun ) 305 { 306 print "Removing superfluous directories\n"; 307 } 308 309 my @content = (); | 293 return \$onefile; 294} 295 296############################################################## 297# Removing all empty directories below a specified directory 298############################################################## 299 300sub remove_empty_dirs_in_folder 301{ 302 my ( $dir, $firstrun ) = @_; 303 304 if ( $firstrun ) 305 { 306 print "Removing superfluous directories\n"; 307 } 308 309 my @content = (); |
310 | 310 |
311 $dir =~ s/\Q$separator\E\s*$//; 312 313 if ( -d $dir ) 314 { 315 opendir(DIR, $dir); 316 @content = readdir(DIR); 317 closedir(DIR); 318 319 my $oneitem; | 311 $dir =~ s/\Q$separator\E\s*$//; 312 313 if ( -d $dir ) 314 { 315 opendir(DIR, $dir); 316 @content = readdir(DIR); 317 closedir(DIR); 318 319 my $oneitem; |
320 | 320 |
321 foreach $oneitem (@content) 322 { 323 if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 324 { 325 my $item = $dir . $separator . $oneitem; 326 327 if ( -d $item ) # recursive 328 { 329 remove_empty_dirs_in_folder($item, 0); 330 } 331 } 332 } | 321 foreach $oneitem (@content) 322 { 323 if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 324 { 325 my $item = $dir . $separator . $oneitem; 326 327 if ( -d $item ) # recursive 328 { 329 remove_empty_dirs_in_folder($item, 0); 330 } 331 } 332 } |
333 334 # try to remove empty directory | 333 334 # try to remove empty directory |
335 my $returnvalue = rmdir $dir; 336 | 335 my $returnvalue = rmdir $dir; 336 |
337 # if ( $returnvalue ) { print "Successfully removed empty dir $dir\n"; } | 337 # if ( $returnvalue ) { print "Successfully removed empty dir $dir\n"; } |
338 } 339} 340 341#################################################### 342# Detecting the directory with extensions 343#################################################### 344 345sub get_extensions_dir 346{ 347 my ( $unopkgfile ) = @_; | 338 } 339} 340 341#################################################### 342# Detecting the directory with extensions 343#################################################### 344 345sub get_extensions_dir 346{ 347 my ( $unopkgfile ) = @_; |
348 | 348 |
349 my $localbranddir = $unopkgfile; 350 get_path_from_fullqualifiedname(\$localbranddir); # "program" dir in brand layer 351 get_path_from_fullqualifiedname(\$localbranddir); # root dir in brand layer 352 $localbranddir =~ s/\Q$separator\E\s*$//; 353 my $extensiondir = $localbranddir . $separator . "share" . $separator . "extensions"; 354 my $preregdir = $localbranddir . $separator . "share" . $separator . "prereg" . $separator . "bundled"; | 349 my $localbranddir = $unopkgfile; 350 get_path_from_fullqualifiedname(\$localbranddir); # "program" dir in brand layer 351 get_path_from_fullqualifiedname(\$localbranddir); # root dir in brand layer 352 $localbranddir =~ s/\Q$separator\E\s*$//; 353 my $extensiondir = $localbranddir . $separator . "share" . $separator . "extensions"; 354 my $preregdir = $localbranddir . $separator . "share" . $separator . "prereg" . $separator . "bundled"; |
355 356 return ($extensiondir, $preregdir); | 355 356 return ($extensiondir, $preregdir); |
357} 358 359######################################################## 360# Finding all files with a specified file extension 361# in a specified directory. 362######################################################## 363 364sub find_file_with_file_extension 365{ 366 my ($extension, $dir) = @_; | 357} 358 359######################################################## 360# Finding all files with a specified file extension 361# in a specified directory. 362######################################################## 363 364sub find_file_with_file_extension 365{ 366 my ($extension, $dir) = @_; |
367 | 367 |
368 my @allfiles = (); 369 my @sourcefiles = (); 370 371 $dir =~ s/\Q$separator\E\s*$//; 372 373 opendir(DIR, $dir); 374 @sourcefiles = readdir(DIR); 375 closedir(DIR); 376 377 my $onefile; | 368 my @allfiles = (); 369 my @sourcefiles = (); 370 371 $dir =~ s/\Q$separator\E\s*$//; 372 373 opendir(DIR, $dir); 374 @sourcefiles = readdir(DIR); 375 closedir(DIR); 376 377 my $onefile; |
378 | 378 |
379 foreach $onefile (@sourcefiles) 380 { 381 if ((!($onefile eq ".")) && (!($onefile eq ".."))) 382 { 383 if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) 384 { 385 push(@allfiles, $onefile) 386 } 387 } 388 } | 379 foreach $onefile (@sourcefiles) 380 { 381 if ((!($onefile eq ".")) && (!($onefile eq ".."))) 382 { 383 if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) 384 { 385 push(@allfiles, $onefile) 386 } 387 } 388 } |
389 | 389 |
390 return \@allfiles; 391} 392 393############################################################## 394# Creating a directory with all parent directories 395############################################################## 396 397sub create_directories 398{ 399 my ($directory) = @_; 400 401 if ( ! try_to_create_directory($directory) ) 402 { 403 my $parentdir = $directory; 404 get_path_from_fullqualifiedname(\$parentdir); 405 create_directories($parentdir); # recursive 406 } | 390 return \@allfiles; 391} 392 393############################################################## 394# Creating a directory with all parent directories 395############################################################## 396 397sub create_directories 398{ 399 my ($directory) = @_; 400 401 if ( ! try_to_create_directory($directory) ) 402 { 403 my $parentdir = $directory; 404 get_path_from_fullqualifiedname(\$parentdir); 405 create_directories($parentdir); # recursive 406 } |
407 | 407 |
408 create_directory($directory); # now it has to succeed 409} 410 411############################################################## 412# Creating one directory 413############################################################## 414 415sub create_directory --- 5 unchanged lines hidden (view full) --- 421 422############################################################## 423# Trying to create a directory, no error if this fails 424############################################################## 425 426sub try_to_create_directory 427{ 428 my ($directory) = @_; | 408 create_directory($directory); # now it has to succeed 409} 410 411############################################################## 412# Creating one directory 413############################################################## 414 415sub create_directory --- 5 unchanged lines hidden (view full) --- 421 422############################################################## 423# Trying to create a directory, no error if this fails 424############################################################## 425 426sub try_to_create_directory 427{ 428 my ($directory) = @_; |
429 | 429 |
430 my $returnvalue = 1; 431 my $created_directory = 0; 432 433 if (!(-d $directory)) 434 { 435 $returnvalue = mkdir($directory, 0775); 436 437 if ($returnvalue) 438 { 439 $created_directory = 1; | 430 my $returnvalue = 1; 431 my $created_directory = 0; 432 433 if (!(-d $directory)) 434 { 435 $returnvalue = mkdir($directory, 0775); 436 437 if ($returnvalue) 438 { 439 $created_directory = 1; |
440 441 my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; 442 system($localcall); | 440 441 my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; 442 system($localcall); |
443 } 444 else 445 { 446 $created_directory = 0; 447 } 448 } 449 else 450 { --- 7 unchanged lines hidden (view full) --- 458# Getting path from full file name 459########################################### 460 461sub get_path_from_fullqualifiedname 462{ 463 my ($longfilenameref) = @_; 464 465 if ( $$longfilenameref =~ /\Q$separator\E/ ) # Is there a separator in the path? Otherwise the path is empty. | 443 } 444 else 445 { 446 $created_directory = 0; 447 } 448 } 449 else 450 { --- 7 unchanged lines hidden (view full) --- 458# Getting path from full file name 459########################################### 460 461sub get_path_from_fullqualifiedname 462{ 463 my ($longfilenameref) = @_; 464 465 if ( $$longfilenameref =~ /\Q$separator\E/ ) # Is there a separator in the path? Otherwise the path is empty. |
466 { | 466 { |
467 if ( $$longfilenameref =~ /^\s*(\S.*\Q$separator\E)(\S.+\S?)/ ) 468 { 469 $$longfilenameref = $1; 470 } 471 } 472 else 473 { 474 $$longfilenameref = ""; # there is no path | 467 if ( $$longfilenameref =~ /^\s*(\S.*\Q$separator\E)(\S.+\S?)/ ) 468 { 469 $$longfilenameref = $1; 470 } 471 } 472 else 473 { 474 $$longfilenameref = ""; # there is no path |
475 } | 475 } |
476} 477 478############################################################## 479# Getting file name from full file name 480############################################################## 481 482sub make_absolute_filename_to_relative_filename 483{ 484 my ($longfilenameref) = @_; | 476} 477 478############################################################## 479# Getting file name from full file name 480############################################################## 481 482sub make_absolute_filename_to_relative_filename 483{ 484 my ($longfilenameref) = @_; |
485 | 485 |
486 # Either '/' or '\'. 487 if ( $$longfilenameref =~ /^.*[\/\\](\S.+\S?)/ ) 488 { 489 $$longfilenameref = $1; 490 } 491} 492 493############################################ --- 5 unchanged lines hidden (view full) --- 499{ 500 my ($message) = @_; 501 502 print "\n***************************************************************\n"; 503 print "$message\n"; 504 print "***************************************************************\n"; 505 remove_complete_directory($savetemppath, 1); 506 print "\n" . get_time_string(); | 486 # Either '/' or '\'. 487 if ( $$longfilenameref =~ /^.*[\/\\](\S.+\S?)/ ) 488 { 489 $$longfilenameref = $1; 490 } 491} 492 493############################################ --- 5 unchanged lines hidden (view full) --- 499{ 500 my ($message) = @_; 501 502 print "\n***************************************************************\n"; 503 print "$message\n"; 504 print "***************************************************************\n"; 505 remove_complete_directory($savetemppath, 1); 506 print "\n" . get_time_string(); |
507 exit(-1); | 507 exit(-1); |
508} 509 510################################################################################# 511# Unpacking cabinet files with expand 512################################################################################# 513 514sub unpack_cabinet_file 515{ 516 my ($cabfilename, $unpackdir) = @_; | 508} 509 510################################################################################# 511# Unpacking cabinet files with expand 512################################################################################# 513 514sub unpack_cabinet_file 515{ 516 my ($cabfilename, $unpackdir) = @_; |
517 | 517 |
518 my $expandfile = "expand.exe"; # has to be in the PATH | 518 my $expandfile = "expand.exe"; # has to be in the PATH |
519 | 519 |
520 # expand.exe has to be located in the system directory. | 520 # expand.exe has to be located in the system directory. |
521 # Cygwin has another tool expand.exe, that converts tabs to spaces. This cannot be used of course. 522 # But this wrong expand.exe is typically in the PATH before this expand.exe, to unpack | 521 # Cygwin has another tool expand.exe, that converts tabs to spaces. This cannot be used of course. 522 # But this wrong expand.exe is typically in the PATH before this expand.exe, to unpack |
523 # cabinet files. 524 525 if ( $^O =~ /cygwin/i ) 526 { 527 $expandfile = $ENV{'SYSTEMROOT'} . "/system32/expand.exe"; # Has to be located in the systemdirectory 528 $expandfile =~ s/\\/\//; 529 if ( ! -f $expandfile ) { exit_program("ERROR: Did not find file $expandfile in the Windows system folder!"); } 530 } | 523 # cabinet files. 524 525 if ( $^O =~ /cygwin/i ) 526 { 527 $expandfile = $ENV{'SYSTEMROOT'} . "/system32/expand.exe"; # Has to be located in the systemdirectory 528 $expandfile =~ s/\\/\//; 529 if ( ! -f $expandfile ) { exit_program("ERROR: Did not find file $expandfile in the Windows system folder!"); } 530 } |
531 | 531 |
532 my $expandlogfile = $unpackdir . $separator . "expand.log"; 533 534 # exclude cabinet file 535 # my $systemcall = $cabarc . " -o X " . $mergemodulehash->{'cabinetfile'}; 536 537 my $systemcall = ""; 538 if ( $^O =~ /cygwin/i ) { 539 my $localunpackdir = qx{cygpath -w "$unpackdir"}; --- 25 unchanged lines hidden (view full) --- 565 566 my $msidb = "msidb.exe"; # Has to be in the path 567 if ( $localmsidbpath ) { $msidb = $localmsidbpath; } 568 my $infoline = ""; 569 my $systemcall = ""; 570 my $returnvalue = ""; 571 572 if ( $^O =~ /cygwin/i ) { | 532 my $expandlogfile = $unpackdir . $separator . "expand.log"; 533 534 # exclude cabinet file 535 # my $systemcall = $cabarc . " -o X " . $mergemodulehash->{'cabinetfile'}; 536 537 my $systemcall = ""; 538 if ( $^O =~ /cygwin/i ) { 539 my $localunpackdir = qx{cygpath -w "$unpackdir"}; --- 25 unchanged lines hidden (view full) --- 565 566 my $msidb = "msidb.exe"; # Has to be in the path 567 if ( $localmsidbpath ) { $msidb = $localmsidbpath; } 568 my $infoline = ""; 569 my $systemcall = ""; 570 my $returnvalue = ""; 571 572 if ( $^O =~ /cygwin/i ) { |
573 chomp( $fullmsidatabasepath = qx{cygpath -w "$fullmsidatabasepath"} ); | 573 chomp( $fullmsidatabasepath = qx{cygpath -w "$fullmsidatabasepath"} ); |
574 # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) 575 $fullmsidatabasepath =~ s/\\/\\\\/g; 576 $workdir =~ s/\\/\\\\/g; 577 # and if there are still slashes, they also need to be double backslash 578 $fullmsidatabasepath =~ s/\//\\\\/g; 579 $workdir =~ s/\//\\\\/g; 580 } 581 582 # Export of all tables by using "*" | 574 # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) 575 $fullmsidatabasepath =~ s/\\/\\\\/g; 576 $workdir =~ s/\\/\\\\/g; 577 # and if there are still slashes, they also need to be double backslash 578 $fullmsidatabasepath =~ s/\//\\\\/g; 579 $workdir =~ s/\//\\\\/g; 580 } 581 582 # Export of all tables by using "*" |
583 | 583 |
584 $systemcall = $msidb . " -d " . $fullmsidatabasepath . " -f " . $workdir . " -e $tablelist"; 585 print "\nAnalyzing msi database\n"; 586 $returnvalue = system($systemcall); 587 588 if ($returnvalue) 589 { 590 $infoline = "ERROR: Could not execute $systemcall !\n"; 591 exit_program($infoline); --- 4 unchanged lines hidden (view full) --- 596# Check, if this installation set contains 597# internal cabinet files included into the msi 598# database. 599######################################################## 600 601sub check_for_internal_cabfiles 602{ 603 my ($cabfilehash) = @_; | 584 $systemcall = $msidb . " -d " . $fullmsidatabasepath . " -f " . $workdir . " -e $tablelist"; 585 print "\nAnalyzing msi database\n"; 586 $returnvalue = system($systemcall); 587 588 if ($returnvalue) 589 { 590 $infoline = "ERROR: Could not execute $systemcall !\n"; 591 exit_program($infoline); --- 4 unchanged lines hidden (view full) --- 596# Check, if this installation set contains 597# internal cabinet files included into the msi 598# database. 599######################################################## 600 601sub check_for_internal_cabfiles 602{ 603 my ($cabfilehash) = @_; |
604 | 604 |
605 my $contains_internal_cabfiles = 0; 606 my %allcabfileshash = (); | 605 my $contains_internal_cabfiles = 0; 606 my %allcabfileshash = (); |
607 | 607 |
608 foreach my $filename ( keys %{$cabfilehash} ) 609 { 610 if ( $filename =~ /^\s*\#/ ) # starting with a hash 611 { 612 $contains_internal_cabfiles = 1; 613 # setting real filename without hash as key and name with hash as value 614 my $realfilename = $filename; 615 $realfilename =~ s/^\s*\#//; 616 $allcabfileshash{$realfilename} = $filename; 617 } 618 } | 608 foreach my $filename ( keys %{$cabfilehash} ) 609 { 610 if ( $filename =~ /^\s*\#/ ) # starting with a hash 611 { 612 $contains_internal_cabfiles = 1; 613 # setting real filename without hash as key and name with hash as value 614 my $realfilename = $filename; 615 $realfilename =~ s/^\s*\#//; 616 $allcabfileshash{$realfilename} = $filename; 617 } 618 } |
619 | 619 |
620 return ( $contains_internal_cabfiles, \%allcabfileshash ); 621} 622 623################################################################# 624# Exclude all cab files from the msi database. 625################################################################# 626 627sub extract_cabs_from_database 628{ 629 my ($msidatabase, $allcabfiles) = @_; 630 631 my $infoline = ""; 632 my $fullsuccess = 1; 633 my $msidb = "msidb.exe"; # Has to be in the path 634 if ( $localmsidbpath ) { $msidb = $localmsidbpath; } | 620 return ( $contains_internal_cabfiles, \%allcabfileshash ); 621} 622 623################################################################# 624# Exclude all cab files from the msi database. 625################################################################# 626 627sub extract_cabs_from_database 628{ 629 my ($msidatabase, $allcabfiles) = @_; 630 631 my $infoline = ""; 632 my $fullsuccess = 1; 633 my $msidb = "msidb.exe"; # Has to be in the path 634 if ( $localmsidbpath ) { $msidb = $localmsidbpath; } |
635 | 635 |
636 my @all_excluded_cabfiles = (); 637 638 if( $^O =~ /cygwin/i ) 639 { 640 $msidatabase = qx{cygpath -w "$msidatabase"}; 641 $msidatabase =~ s/\\/\\\\/g; 642 $msidatabase =~ s/\s*$//g; 643 } 644 else 645 { 646 # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) 647 $msidatabase =~ s/\//\\\\/g; 648 } 649 650 foreach my $onefile ( keys %{$allcabfiles} ) 651 { 652 my $systemcall = $msidb . " -d " . $msidatabase . " -x " . $onefile; | 636 my @all_excluded_cabfiles = (); 637 638 if( $^O =~ /cygwin/i ) 639 { 640 $msidatabase = qx{cygpath -w "$msidatabase"}; 641 $msidatabase =~ s/\\/\\\\/g; 642 $msidatabase =~ s/\s*$//g; 643 } 644 else 645 { 646 # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) 647 $msidatabase =~ s/\//\\\\/g; 648 } 649 650 foreach my $onefile ( keys %{$allcabfiles} ) 651 { 652 my $systemcall = $msidb . " -d " . $msidatabase . " -x " . $onefile; |
653 system($systemcall); | 653 system($systemcall); |
654 push(@all_excluded_cabfiles, $onefile); 655 } | 654 push(@all_excluded_cabfiles, $onefile); 655 } |
656 | 656 |
657 \@all_excluded_cabfiles; 658} 659 660################################################################################ 661# Collect all DiskIds to the corresponding cabinet files from Media.idt. 662################################################################################ 663 664sub analyze_media_file 665{ 666 my ($filecontent) = @_; | 657 \@all_excluded_cabfiles; 658} 659 660################################################################################ 661# Collect all DiskIds to the corresponding cabinet files from Media.idt. 662################################################################################ 663 664sub analyze_media_file 665{ 666 my ($filecontent) = @_; |
667 | 667 |
668 my %diskidhash = (); 669 670 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 671 { 672 if ( $i < 3 ) { next; } 673 674 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 675 { --- 7 unchanged lines hidden (view full) --- 683 return \%diskidhash; 684} 685 686sub analyze_customaction_file 687{ 688 my ($filecontent) = @_; 689 690 my $register_extensions_exists = 0; | 668 my %diskidhash = (); 669 670 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 671 { 672 if ( $i < 3 ) { next; } 673 674 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 675 { --- 7 unchanged lines hidden (view full) --- 683 return \%diskidhash; 684} 685 686sub analyze_customaction_file 687{ 688 my ($filecontent) = @_; 689 690 my $register_extensions_exists = 0; |
691 | 691 |
692 my %table = (); 693 694 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 695 { 696 if ( ${$filecontent}[$i] =~ /^\s*RegisterExtensions\s+/ ) | 692 my %table = (); 693 694 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 695 { 696 if ( ${$filecontent}[$i] =~ /^\s*RegisterExtensions\s+/ ) |
697 { | 697 { |
698 $register_extensions_exists = 1; 699 last; 700 } 701 } 702 703 return $register_extensions_exists; 704} 705 706################################################################################ 707# Analyzing the content of Directory.idt 708################################################################################# 709 710sub analyze_directory_file 711{ 712 my ($filecontent) = @_; | 698 $register_extensions_exists = 1; 699 last; 700 } 701 } 702 703 return $register_extensions_exists; 704} 705 706################################################################################ 707# Analyzing the content of Directory.idt 708################################################################################# 709 710sub analyze_directory_file 711{ 712 my ($filecontent) = @_; |
713 | 713 |
714 my %table = (); 715 716 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 717 { 718 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 719 720 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) 721 { 722 my $dir = $1; 723 my $parent = $2; 724 my $name = $3; | 714 my %table = (); 715 716 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 717 { 718 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 719 720 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) 721 { 722 my $dir = $1; 723 my $parent = $2; 724 my $name = $3; |
725 | 725 |
726 if ( $name =~ /^\s*(.*?)\s*\:\s*(.*?)\s*$/ ) { $name = $2; } 727 if ( $name =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $name = $2; } | 726 if ( $name =~ /^\s*(.*?)\s*\:\s*(.*?)\s*$/ ) { $name = $2; } 727 if ( $name =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $name = $2; } |
728 | 728 |
729 my %helphash = (); 730 $helphash{'Directory_Parent'} = $parent; 731 $helphash{'DefaultDir'} = $name; 732 $table{$dir} = \%helphash; 733 } 734 } | 729 my %helphash = (); 730 $helphash{'Directory_Parent'} = $parent; 731 $helphash{'DefaultDir'} = $name; 732 $table{$dir} = \%helphash; 733 } 734 } |
735 736 return \%table; | 735 736 return \%table; |
737} 738 739################################################################################# 740# Analyzing the content of Component.idt 741################################################################################# 742 743sub analyze_component_file 744{ 745 my ($filecontent) = @_; | 737} 738 739################################################################################# 740# Analyzing the content of Component.idt 741################################################################################# 742 743sub analyze_component_file 744{ 745 my ($filecontent) = @_; |
746 | 746 |
747 my %table = (); | 747 my %table = (); |
748 | 748 |
749 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 750 { 751 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 752 753 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 754 { 755 my $component = $1; 756 my $dir = $3; | 749 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 750 { 751 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 752 753 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 754 { 755 my $component = $1; 756 my $dir = $3; |
757 | 757 |
758 $table{$component} = $dir; 759 } 760 } 761 | 758 $table{$component} = $dir; 759 } 760 } 761 |
762 return \%table; | 762 return \%table; |
763} 764 765################################################################################# 766# Analyzing the content of File.idt 767################################################################################# 768 769sub analyze_file_file 770{ 771 my ($filecontent) = @_; | 763} 764 765################################################################################# 766# Analyzing the content of File.idt 767################################################################################# 768 769sub analyze_file_file 770{ 771 my ($filecontent) = @_; |
772 | 772 |
773 my %table = (); 774 my %fileorder = (); 775 my $maxsequence = 0; | 773 my %table = (); 774 my %fileorder = (); 775 my $maxsequence = 0; |
776 | 776 |
777 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 778 { 779 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 780 781 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 782 { 783 my $file = $1; 784 my $comp = $2; 785 my $filename = $3; 786 my $sequence = $8; 787 788 if ( $filename =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $filename = $2; } | 777 for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) 778 { 779 if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } 780 781 if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 782 { 783 my $file = $1; 784 my $comp = $2; 785 my $filename = $3; 786 my $sequence = $8; 787 788 if ( $filename =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $filename = $2; } |
789 | 789 |
790 my %helphash = (); 791 $helphash{'Component'} = $comp; 792 $helphash{'FileName'} = $filename; 793 $helphash{'Sequence'} = $sequence; 794 795 $table{$file} = \%helphash; | 790 my %helphash = (); 791 $helphash{'Component'} = $comp; 792 $helphash{'FileName'} = $filename; 793 $helphash{'Sequence'} = $sequence; 794 795 $table{$file} = \%helphash; |
796 | 796 |
797 $fileorder{$sequence} = $file; | 797 $fileorder{$sequence} = $file; |
798 | 798 |
799 if ( $sequence > $maxsequence ) { $maxsequence = $sequence; } 800 } 801 } 802 803 return (\%table, \%fileorder, $maxsequence); 804} 805 806#################################################################################### 807# Recursively creating the directory tree 808#################################################################################### 809 810sub create_directory_tree 811{ | 799 if ( $sequence > $maxsequence ) { $maxsequence = $sequence; } 800 } 801 } 802 803 return (\%table, \%fileorder, $maxsequence); 804} 805 806#################################################################################### 807# Recursively creating the directory tree 808#################################################################################### 809 810sub create_directory_tree 811{ |
812 my ($parent, $pathcollector, $fulldir, $dirhash) = @_; | 812 my ($parent, $pathcollector, $fulldir, $dirhash) = @_; |
813 814 foreach my $dir ( keys %{$dirhash} ) 815 { 816 if (( $dirhash->{$dir}->{'Directory_Parent'} eq $parent ) && ( $dirhash->{$dir}->{'DefaultDir'} ne "." )) 817 { 818 my $dirname = $dirhash->{$dir}->{'DefaultDir'}; 819 # Create the directory 820 my $newdir = $fulldir . $separator . $dirname; --- 10 unchanged lines hidden (view full) --- 831# Creating the directory tree 832#################################################################################### 833 834sub create_directory_structure 835{ 836 my ($dirhash, $targetdir) = @_; 837 838 print "Creating directories\n"; | 813 814 foreach my $dir ( keys %{$dirhash} ) 815 { 816 if (( $dirhash->{$dir}->{'Directory_Parent'} eq $parent ) && ( $dirhash->{$dir}->{'DefaultDir'} ne "." )) 817 { 818 my $dirname = $dirhash->{$dir}->{'DefaultDir'}; 819 # Create the directory 820 my $newdir = $fulldir . $separator . $dirname; --- 10 unchanged lines hidden (view full) --- 831# Creating the directory tree 832#################################################################################### 833 834sub create_directory_structure 835{ 836 my ($dirhash, $targetdir) = @_; 837 838 print "Creating directories\n"; |
839 | 839 |
840 my %fullpathhash = (); | 840 my %fullpathhash = (); |
841 | 841 |
842 my @startparents = ("TARGETDIR", "INSTALLLOCATION"); | 842 my @startparents = ("TARGETDIR", "INSTALLLOCATION"); |
843 | 843 |
844 foreach $dir (@startparents) { create_directory_tree($dir, \%fullpathhash, $targetdir, $dirhash); } 845 846 # Also adding the paths of the startparents 847 foreach $dir (@startparents) 848 { 849 if ( ! exists($fullpathhash{$dir}) ) { $fullpathhash{$dir} = $targetdir; } 850 } | 844 foreach $dir (@startparents) { create_directory_tree($dir, \%fullpathhash, $targetdir, $dirhash); } 845 846 # Also adding the paths of the startparents 847 foreach $dir (@startparents) 848 { 849 if ( ! exists($fullpathhash{$dir}) ) { $fullpathhash{$dir} = $targetdir; } 850 } |
851 | 851 |
852 return \%fullpathhash; 853} 854 855#################################################################################### 856# Cygwin: Setting privileges for files 857#################################################################################### 858 859sub change_privileges 860{ 861 my ($destfile, $privileges) = @_; | 852 return \%fullpathhash; 853} 854 855#################################################################################### 856# Cygwin: Setting privileges for files 857#################################################################################### 858 859sub change_privileges 860{ 861 my ($destfile, $privileges) = @_; |
862 | 862 |
863 my $localcall = "chmod $privileges " . "\"" . $destfile . "\""; 864 system($localcall); 865} 866 867#################################################################################### 868# Cygwin: Setting privileges for files recursively 869#################################################################################### 870 --- 9 unchanged lines hidden (view full) --- 880 881###################################################### 882# Creating a new directory with defined privileges 883###################################################### 884 885sub create_directory_with_privileges 886{ 887 my ($directory, $privileges) = @_; | 863 my $localcall = "chmod $privileges " . "\"" . $destfile . "\""; 864 system($localcall); 865} 866 867#################################################################################### 868# Cygwin: Setting privileges for files recursively 869#################################################################################### 870 --- 9 unchanged lines hidden (view full) --- 880 881###################################################### 882# Creating a new directory with defined privileges 883###################################################### 884 885sub create_directory_with_privileges 886{ 887 my ($directory, $privileges) = @_; |
888 | 888 |
889 my $returnvalue = 1; 890 my $infoline = ""; 891 892 if (!(-d $directory)) 893 { 894 my $localprivileges = oct("0".$privileges); # changes "777" to 0777 895 $returnvalue = mkdir($directory, $localprivileges); 896 897 if ($returnvalue) | 889 my $returnvalue = 1; 890 my $infoline = ""; 891 892 if (!(-d $directory)) 893 { 894 my $localprivileges = oct("0".$privileges); # changes "777" to 0777 895 $returnvalue = mkdir($directory, $localprivileges); 896 897 if ($returnvalue) |
898 { 899 my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 900 system($localcall); | 898 { 899 my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 900 system($localcall); |
901 } 902 } 903 else 904 { | 901 } 902 } 903 else 904 { |
905 my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 906 system($localcall); | 905 my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 906 system($localcall); |
907 } 908} 909 910###################################################### | 907 } 908} 909 910###################################################### |
911# Creating a unique directory with pid extension | 911# Creating a unique directory with pid extension |
912###################################################### 913 914sub create_pid_directory 915{ 916 my ($directory) = @_; | 912###################################################### 913 914sub create_pid_directory 915{ 916 my ($directory) = @_; |
917 | 917 |
918 $directory =~ s/\Q$separator\E\s*$//; 919 my $pid = $$; # process id 920 my $time = time(); # time | 918 $directory =~ s/\Q$separator\E\s*$//; 919 my $pid = $$; # process id 920 my $time = time(); # time |
921 | 921 |
922 $directory = $directory . "_" . $pid . $time; 923 | 922 $directory = $directory . "_" . $pid . $time; 923 |
924 if ( ! -d $directory ) { create_directory($directory); } | 924 if ( ! -d $directory ) { create_directory($directory); } |
925 else { exit_program("ERROR: Directory $directory already exists!"); } | 925 else { exit_program("ERROR: Directory $directory already exists!"); } |
926 | 926 |
927 return $directory; 928} 929 930#################################################################################### 931# Copying files into installation set 932#################################################################################### 933 934sub copy_files_into_directory_structure 935{ 936 my ($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash) = @_; 937 938 print "Copying files\n"; 939 940 my $unopkgfile = ""; | 927 return $directory; 928} 929 930#################################################################################### 931# Copying files into installation set 932#################################################################################### 933 934sub copy_files_into_directory_structure 935{ 936 my ($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash) = @_; 937 938 print "Copying files\n"; 939 940 my $unopkgfile = ""; |
941 | 941 |
942 for ( my $i = 1; $i <= $maxsequence; $i++ ) 943 { 944 if ( exists($fileorder->{$i}) ) 945 { 946 my $file = $fileorder->{$i}; 947 if ( ! exists($filehash->{$file}->{'Component'}) ) { exit_program("ERROR: Did not find component for file: \"$file\"."); } 948 my $component = $filehash->{$file}->{'Component'}; 949 if ( ! exists($componenthash->{$component}) ) { exit_program("ERROR: Did not find directory for component: \"$component\"."); } 950 my $dirname = $componenthash->{$component}; 951 if ( ! exists($fullpathhash->{$dirname}) ) { exit_program("ERROR: Did not find full directory path for dir: \"$dirname\"."); } 952 my $destdir = $fullpathhash->{$dirname}; 953 if ( ! exists($filehash->{$file}->{'FileName'}) ) { exit_program("ERROR: Did not find \"FileName\" for file: \"$file\"."); } 954 my $destfile = $filehash->{$file}->{'FileName'}; 955 956 $destfile = $destdir . $separator . $destfile; 957 my $sourcefile = $unpackdir . $separator . $file; | 942 for ( my $i = 1; $i <= $maxsequence; $i++ ) 943 { 944 if ( exists($fileorder->{$i}) ) 945 { 946 my $file = $fileorder->{$i}; 947 if ( ! exists($filehash->{$file}->{'Component'}) ) { exit_program("ERROR: Did not find component for file: \"$file\"."); } 948 my $component = $filehash->{$file}->{'Component'}; 949 if ( ! exists($componenthash->{$component}) ) { exit_program("ERROR: Did not find directory for component: \"$component\"."); } 950 my $dirname = $componenthash->{$component}; 951 if ( ! exists($fullpathhash->{$dirname}) ) { exit_program("ERROR: Did not find full directory path for dir: \"$dirname\"."); } 952 my $destdir = $fullpathhash->{$dirname}; 953 if ( ! exists($filehash->{$file}->{'FileName'}) ) { exit_program("ERROR: Did not find \"FileName\" for file: \"$file\"."); } 954 my $destfile = $filehash->{$file}->{'FileName'}; 955 956 $destfile = $destdir . $separator . $destfile; 957 my $sourcefile = $unpackdir . $separator . $file; |
958 | 958 |
959 if ( ! -f $sourcefile ) 960 { 961 # It is possible, that this was an unpacked file 962 # Looking in the dirhash, to find the subdirectory in the installation set (the id is $dirname) 963 # subdir is not recursively analyzed, only one directory. | 959 if ( ! -f $sourcefile ) 960 { 961 # It is possible, that this was an unpacked file 962 # Looking in the dirhash, to find the subdirectory in the installation set (the id is $dirname) 963 # subdir is not recursively analyzed, only one directory. |
964 965 my $oldsourcefile = $sourcefile; | 964 965 my $oldsourcefile = $sourcefile; |
966 my $subdir = ""; 967 if ( exists($dirhash->{$dirname}->{'DefaultDir'}) ) { $subdir = $dirhash->{$dirname}->{'DefaultDir'} . $separator; } 968 my $realfilename = $filehash->{$file}->{'FileName'}; 969 my $localinstalldir = $installdir; | 966 my $subdir = ""; 967 if ( exists($dirhash->{$dirname}->{'DefaultDir'}) ) { $subdir = $dirhash->{$dirname}->{'DefaultDir'} . $separator; } 968 my $realfilename = $filehash->{$file}->{'FileName'}; 969 my $localinstalldir = $installdir; |
970 | 970 |
971 $localinstalldir =~ s/\\\s*$//; 972 $localinstalldir =~ s/\/\s*$//; | 971 $localinstalldir =~ s/\\\s*$//; 972 $localinstalldir =~ s/\/\s*$//; |
973 | 973 |
974 $sourcefile = $localinstalldir . $separator . $subdir . $realfilename; | 974 $sourcefile = $localinstalldir . $separator . $subdir . $realfilename; |
975 | 975 |
976 if ( ! -f $sourcefile ) { exit_program("ERROR: File not found: \"$oldsourcefile\" (or \"$sourcefile\")."); } 977 } 978 979 my $copyreturn = copy($sourcefile, $destfile); 980 981 if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); } 982 983 # Searching unopkg.exe 984 if ( $destfile =~ /unopkg\.exe\s*$/ ) { $unopkgfile = $destfile; } 985 # if (( $^O =~ /cygwin/i ) && ( $destfile =~ /\.exe\s*$/ )) { change_privileges($destfile, "775"); } 986 } 987 # else # allowing missing sequence numbers ? 988 # { 989 # exit_program("ERROR: No file assigned to sequence $i"); 990 # } 991 } | 976 if ( ! -f $sourcefile ) { exit_program("ERROR: File not found: \"$oldsourcefile\" (or \"$sourcefile\")."); } 977 } 978 979 my $copyreturn = copy($sourcefile, $destfile); 980 981 if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); } 982 983 # Searching unopkg.exe 984 if ( $destfile =~ /unopkg\.exe\s*$/ ) { $unopkgfile = $destfile; } 985 # if (( $^O =~ /cygwin/i ) && ( $destfile =~ /\.exe\s*$/ )) { change_privileges($destfile, "775"); } 986 } 987 # else # allowing missing sequence numbers ? 988 # { 989 # exit_program("ERROR: No file assigned to sequence $i"); 990 # } 991 } |
992 | 992 |
993 return ($unopkgfile); 994} 995 996###################################################### 997# Removing a complete directory with subdirectories 998###################################################### 999 1000sub remove_complete_directory 1001{ 1002 my ($directory, $start) = @_; 1003 1004 my @content = (); 1005 my $infoline = ""; | 993 return ($unopkgfile); 994} 995 996###################################################### 997# Removing a complete directory with subdirectories 998###################################################### 999 1000sub remove_complete_directory 1001{ 1002 my ($directory, $start) = @_; 1003 1004 my @content = (); 1005 my $infoline = ""; |
1006 | 1006 |
1007 $directory =~ s/\Q$separator\E\s*$//; 1008 1009 if ( -d $directory ) 1010 { 1011 if ( $start ) { print "Removing directory $directory\n"; } | 1007 $directory =~ s/\Q$separator\E\s*$//; 1008 1009 if ( -d $directory ) 1010 { 1011 if ( $start ) { print "Removing directory $directory\n"; } |
1012 | 1012 |
1013 opendir(DIR, $directory); 1014 @content = readdir(DIR); 1015 closedir(DIR); 1016 1017 my $oneitem; | 1013 opendir(DIR, $directory); 1014 @content = readdir(DIR); 1015 closedir(DIR); 1016 1017 my $oneitem; |
1018 | 1018 |
1019 foreach $oneitem (@content) 1020 { 1021 if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1022 { 1023 my $item = $directory . $separator . $oneitem; 1024 1025 if ( -f $item || -l $item ) # deleting files or links 1026 { 1027 unlink($item); 1028 } 1029 1030 if ( -d $item ) # recursive 1031 { 1032 remove_complete_directory($item, 0); 1033 } 1034 } 1035 } | 1019 foreach $oneitem (@content) 1020 { 1021 if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1022 { 1023 my $item = $directory . $separator . $oneitem; 1024 1025 if ( -f $item || -l $item ) # deleting files or links 1026 { 1027 unlink($item); 1028 } 1029 1030 if ( -d $item ) # recursive 1031 { 1032 remove_complete_directory($item, 0); 1033 } 1034 } 1035 } |
1036 | 1036 |
1037 # try to remove empty directory 1038 my $returnvalue = rmdir $directory; 1039 if ( ! $returnvalue ) { print "Warning: Problem with removing empty dir $directory\n"; } | 1037 # try to remove empty directory 1038 my $returnvalue = rmdir $directory; 1039 if ( ! $returnvalue ) { print "Warning: Problem with removing empty dir $directory\n"; } |
1040 } | 1040 } |
1041} 1042 1043#################################################################################### 1044# Defining a temporary path 1045#################################################################################### 1046 1047sub get_temppath 1048{ 1049 my $temppath = ""; | 1041} 1042 1043#################################################################################### 1044# Defining a temporary path 1045#################################################################################### 1046 1047sub get_temppath 1048{ 1049 my $temppath = ""; |
1050 | 1050 |
1051 if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} )) 1052 { 1053 if ( $ENV{'TMP'} ) { $temppath = $ENV{'TMP'}; } 1054 elsif ( $ENV{'TEMP'} ) { $temppath = $ENV{'TEMP'}; } 1055 1056 $temppath =~ s/\Q$separator\E\s*$//; # removing ending slashes and backslashes 1057 $temppath = $temppath . $separator . $globaltempdirname; 1058 create_directory_with_privileges($temppath, "777"); 1059 1060 my $dirsave = $temppath; 1061 1062 $temppath = $temppath . $separator . "a"; 1063 $temppath = create_pid_directory($temppath); 1064 1065 if ( ! -d $temppath ) { exit_program("ERROR: Failed to create directory $temppath ! Possible reason: Wrong privileges in directory $dirsave."); } 1066 1067 if ( $^O =~ /cygwin/i ) 1068 { 1069 $temppath =~ s/\\/\\\\/g; | 1051 if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} )) 1052 { 1053 if ( $ENV{'TMP'} ) { $temppath = $ENV{'TMP'}; } 1054 elsif ( $ENV{'TEMP'} ) { $temppath = $ENV{'TEMP'}; } 1055 1056 $temppath =~ s/\Q$separator\E\s*$//; # removing ending slashes and backslashes 1057 $temppath = $temppath . $separator . $globaltempdirname; 1058 create_directory_with_privileges($temppath, "777"); 1059 1060 my $dirsave = $temppath; 1061 1062 $temppath = $temppath . $separator . "a"; 1063 $temppath = create_pid_directory($temppath); 1064 1065 if ( ! -d $temppath ) { exit_program("ERROR: Failed to create directory $temppath ! Possible reason: Wrong privileges in directory $dirsave."); } 1066 1067 if ( $^O =~ /cygwin/i ) 1068 { 1069 $temppath =~ s/\\/\\\\/g; |
1070 chomp( $temppath = qx{cygpath -w "$temppath"} ); | 1070 chomp( $temppath = qx{cygpath -w "$temppath"} ); |
1071 } 1072 1073 $savetemppath = $temppath; 1074 } 1075 else 1076 { 1077 exit_program("ERROR: Could not set temporary directory (TMP and TEMP not set!)."); 1078 } | 1071 } 1072 1073 $savetemppath = $temppath; 1074 } 1075 else 1076 { 1077 exit_program("ERROR: Could not set temporary directory (TMP and TEMP not set!)."); 1078 } |
1079 | 1079 |
1080 return $temppath; 1081} 1082 1083#################################################################################### 1084# Registering extensions 1085#################################################################################### 1086 1087sub register_extensions_sync 1088{ 1089 my ($unopkgfile, $localtemppath, $preregdir) = @_; 1090 1091 if ( $preregdir eq "" ) 1092 { 1093 my $logtext = "ERROR: Failed to determine \"prereg\" folder for extension registration! Please check your installation set."; 1094 print $logtext . "\n"; | 1080 return $temppath; 1081} 1082 1083#################################################################################### 1084# Registering extensions 1085#################################################################################### 1086 1087sub register_extensions_sync 1088{ 1089 my ($unopkgfile, $localtemppath, $preregdir) = @_; 1090 1091 if ( $preregdir eq "" ) 1092 { 1093 my $logtext = "ERROR: Failed to determine \"prereg\" folder for extension registration! Please check your installation set."; 1094 print $logtext . "\n"; |
1095 exit_program($logtext); | 1095 exit_program($logtext); |
1096 } 1097 1098 my $from = cwd(); | 1096 } 1097 1098 my $from = cwd(); |
1099 | 1099 |
1100 my $path = $unopkgfile; 1101 get_path_from_fullqualifiedname(\$path); 1102 $path =~ s/\\\s*$//; 1103 $path =~ s/\/\s*$//; 1104 1105 my $executable = $unopkgfile; 1106 make_absolute_filename_to_relative_filename(\$executable); 1107 | 1100 my $path = $unopkgfile; 1101 get_path_from_fullqualifiedname(\$path); 1102 $path =~ s/\\\s*$//; 1103 $path =~ s/\/\s*$//; 1104 1105 my $executable = $unopkgfile; 1106 make_absolute_filename_to_relative_filename(\$executable); 1107 |
1108 chdir($path); | 1108 chdir($path); |
1109 1110 if ( ! $path_displayed ) 1111 { 1112 print "... current dir: $path ...\n"; 1113 $path_displayed = 1; 1114 } 1115 1116 $localtemppath =~ s/\\/\//g; 1117 1118 if ( $^O =~ /cygwin/i ) { 1119 $executable = "./" . $executable; 1120 $preregdir = qx{cygpath -m "$preregdir"}; 1121 chomp($preregdir); 1122 } 1123 1124 $preregdir =~ s/\/\s*$//g; | 1109 1110 if ( ! $path_displayed ) 1111 { 1112 print "... current dir: $path ...\n"; 1113 $path_displayed = 1; 1114 } 1115 1116 $localtemppath =~ s/\\/\//g; 1117 1118 if ( $^O =~ /cygwin/i ) { 1119 $executable = "./" . $executable; 1120 $preregdir = qx{cygpath -m "$preregdir"}; 1121 chomp($preregdir); 1122 } 1123 1124 $preregdir =~ s/\/\s*$//g; |
1125 | 1125 |
1126 my $systemcall = $executable . " sync --verbose 2\>\&1 |"; 1127 1128 print "... $systemcall\n"; 1129 1130 my @unopkgoutput = (); 1131 1132 open (UNOPKG, $systemcall); 1133 while (<UNOPKG>) {push(@unopkgoutput, $_); } 1134 close (UNOPKG); 1135 1136 my $returnvalue = $?; # $? contains the return value of the systemcall 1137 1138 if ($returnvalue) 1139 { 1140 print "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n"; 1141 for ( my $j = 0; $j <= $#unopkgoutput; $j++ ) { print "$unopkgoutput[$j]"; } 1142 exit_program("ERROR: $systemcall failed!"); 1143 } | 1126 my $systemcall = $executable . " sync --verbose 2\>\&1 |"; 1127 1128 print "... $systemcall\n"; 1129 1130 my @unopkgoutput = (); 1131 1132 open (UNOPKG, $systemcall); 1133 while (<UNOPKG>) {push(@unopkgoutput, $_); } 1134 close (UNOPKG); 1135 1136 my $returnvalue = $?; # $? contains the return value of the systemcall 1137 1138 if ($returnvalue) 1139 { 1140 print "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n"; 1141 for ( my $j = 0; $j <= $#unopkgoutput; $j++ ) { print "$unopkgoutput[$j]"; } 1142 exit_program("ERROR: $systemcall failed!"); 1143 } |
1144 | 1144 |
1145 chdir($from); 1146} 1147 1148#################################################################################### 1149# Registering all extensions located in /share/extension/install 1150#################################################################################### 1151 1152sub register_extensions 1153{ 1154 my ($unopkgfile, $temppath, $preregdir) = @_; | 1145 chdir($from); 1146} 1147 1148#################################################################################### 1149# Registering all extensions located in /share/extension/install 1150#################################################################################### 1151 1152sub register_extensions 1153{ 1154 my ($unopkgfile, $temppath, $preregdir) = @_; |
1155 1156 print "Registering extensions:\n"; | |
1157 | 1155 |
1156 print "Registering extensions:\n"; 1157 |
|
1158 if (( ! -f $unopkgfile ) || ( $unopkgfile eq "" )) 1159 { 1160 print("WARNING: Could not find unopkg.exe (Language Pack?)!\n"); 1161 } 1162 else 1163 { 1164 register_extensions_sync($unopkgfile, $temppath, $preregdir); 1165 remove_complete_directory($temppath, 1); --- 21 unchanged lines hidden (view full) --- 1187 } 1188 1189 close( IN ); 1190 1191 return \@localfile; 1192} 1193 1194############################################################### | 1158 if (( ! -f $unopkgfile ) || ( $unopkgfile eq "" )) 1159 { 1160 print("WARNING: Could not find unopkg.exe (Language Pack?)!\n"); 1161 } 1162 else 1163 { 1164 register_extensions_sync($unopkgfile, $temppath, $preregdir); 1165 remove_complete_directory($temppath, 1); --- 21 unchanged lines hidden (view full) --- 1187 } 1188 1189 close( IN ); 1190 1191 return \@localfile; 1192} 1193 1194############################################################### |
1195# Setting the time string for the 1196# Summary Information stream in the | 1195# Setting the time string for the 1196# Summary Information stream in the |
1197# msi database of the admin installations. 1198############################################################### 1199 1200sub get_sis_time_string | 1197# msi database of the admin installations. 1198############################################################### 1199 1200sub get_sis_time_string |
1201{ | 1201{ |
1202 # Syntax: <yyyy/mm/dd hh:mm:ss> 1203 my $second = (localtime())[0]; 1204 my $minute = (localtime())[1]; 1205 my $hour = (localtime())[2]; 1206 my $day = (localtime())[3]; 1207 my $month = (localtime())[4]; 1208 my $year = 1900 + (localtime())[5]; | 1202 # Syntax: <yyyy/mm/dd hh:mm:ss> 1203 my $second = (localtime())[0]; 1204 my $minute = (localtime())[1]; 1205 my $hour = (localtime())[2]; 1206 my $day = (localtime())[3]; 1207 my $month = (localtime())[4]; 1208 my $year = 1900 + (localtime())[5]; |
1209 $month++; 1210 | 1209 $month++; 1210 |
1211 if ( $second < 10 ) { $second = "0" . $second; } 1212 if ( $minute < 10 ) { $minute = "0" . $minute; } 1213 if ( $hour < 10 ) { $hour = "0" . $hour; } 1214 if ( $day < 10 ) { $day = "0" . $day; } 1215 if ( $month < 10 ) { $month = "0" . $month; } | 1211 if ( $second < 10 ) { $second = "0" . $second; } 1212 if ( $minute < 10 ) { $minute = "0" . $minute; } 1213 if ( $hour < 10 ) { $hour = "0" . $hour; } 1214 if ( $day < 10 ) { $day = "0" . $day; } 1215 if ( $month < 10 ) { $month = "0" . $month; } |
1216 | 1216 |
1217 my $timestring = $year . "/" . $month . "/" . $day . " " . $hour . ":" . $minute . ":" . $second; | 1217 my $timestring = $year . "/" . $month . "/" . $day . " " . $hour . ":" . $minute . ":" . $second; |
1218 | 1218 |
1219 return $timestring; 1220} 1221 1222############################################################### | 1219 return $timestring; 1220} 1221 1222############################################################### |
1223# Writing content of administrative installations into 1224# Summary Information Stream of msi database. | 1223# Writing content of administrative installations into 1224# Summary Information Stream of msi database. |
1225# This is required for example for following 1226# patch processes using Windows Installer service. 1227############################################################### 1228 1229sub write_sis_info 1230{ 1231 my ($msidatabase) = @_; 1232 1233 print "Setting SIS in msi database\n"; | 1225# This is required for example for following 1226# patch processes using Windows Installer service. 1227############################################################### 1228 1229sub write_sis_info 1230{ 1231 my ($msidatabase) = @_; 1232 1233 print "Setting SIS in msi database\n"; |
1234 | 1234 |
1235 if ( ! -f $msidatabase ) { exit_program("ERROR: Cannot find file $msidatabase"); } 1236 1237 my $msiinfo = "msiinfo.exe"; # Has to be in the path 1238 my $infoline = ""; 1239 my $systemcall = ""; 1240 my $returnvalue = ""; 1241 1242 # Required setting for administrative installations: 1243 # -w 4 (source files are unpacked), wordcount 1244 # -s <date of admin installation>, LastPrinted, Syntax: <yyyy/mm/dd hh:mm:ss> 1245 # -l <person_making_admin_installation>, LastSavedBy | 1235 if ( ! -f $msidatabase ) { exit_program("ERROR: Cannot find file $msidatabase"); } 1236 1237 my $msiinfo = "msiinfo.exe"; # Has to be in the path 1238 my $infoline = ""; 1239 my $systemcall = ""; 1240 my $returnvalue = ""; 1241 1242 # Required setting for administrative installations: 1243 # -w 4 (source files are unpacked), wordcount 1244 # -s <date of admin installation>, LastPrinted, Syntax: <yyyy/mm/dd hh:mm:ss> 1245 # -l <person_making_admin_installation>, LastSavedBy |
1246 | 1246 |
1247 my $wordcount = 4; # Unpacked files 1248 my $lastprinted = get_sis_time_string(); 1249 my $lastsavedby = "Installer"; | 1247 my $wordcount = 4; # Unpacked files 1248 my $lastprinted = get_sis_time_string(); 1249 my $lastsavedby = "Installer"; |
1250 | 1250 |
1251 my $localmsidatabase = $msidatabase; | 1251 my $localmsidatabase = $msidatabase; |
1252 | 1252 |
1253 if( $^O =~ /cygwin/i ) 1254 { 1255 $localmsidatabase = qx{cygpath -w "$localmsidatabase"}; 1256 $localmsidatabase =~ s/\\/\\\\/g; 1257 $localmsidatabase =~ s/\s*$//g; 1258 } | 1253 if( $^O =~ /cygwin/i ) 1254 { 1255 $localmsidatabase = qx{cygpath -w "$localmsidatabase"}; 1256 $localmsidatabase =~ s/\\/\\\\/g; 1257 $localmsidatabase =~ s/\s*$//g; 1258 } |
1259 | 1259 |
1260 $systemcall = $msiinfo . " " . "\"" . $localmsidatabase . "\"" . " -w " . $wordcount . " -s " . "\"" . $lastprinted . "\"" . " -l $lastsavedby"; 1261 1262 $returnvalue = system($systemcall); 1263 1264 if ($returnvalue) 1265 { 1266 $infoline = "ERROR: Could not execute $systemcall !\n"; 1267 exit_program($infoline); | 1260 $systemcall = $msiinfo . " " . "\"" . $localmsidatabase . "\"" . " -w " . $wordcount . " -s " . "\"" . $lastprinted . "\"" . " -l $lastsavedby"; 1261 1262 $returnvalue = system($systemcall); 1263 1264 if ($returnvalue) 1265 { 1266 $infoline = "ERROR: Could not execute $systemcall !\n"; 1267 exit_program($infoline); |
1268 } | 1268 } |
1269} 1270 1271############################################################### 1272# Convert time string 1273############################################################### 1274 1275sub convert_timestring 1276{ 1277 my ($secondstring) = @_; 1278 1279 my $timestring = ""; | 1269} 1270 1271############################################################### 1272# Convert time string 1273############################################################### 1274 1275sub convert_timestring 1276{ 1277 my ($secondstring) = @_; 1278 1279 my $timestring = ""; |
1280 | 1280 |
1281 if ( $secondstring < 60 ) # less than a minute 1282 { 1283 if ( $secondstring < 10 ) { $secondstring = "0" . $secondstring; } | 1281 if ( $secondstring < 60 ) # less than a minute 1282 { 1283 if ( $secondstring < 10 ) { $secondstring = "0" . $secondstring; } |
1284 $timestring = "00\:$secondstring min\."; | 1284 $timestring = "00\:$secondstring min\."; |
1285 } 1286 elsif ( $secondstring < 3600 ) 1287 { 1288 my $minutes = $secondstring / 60; 1289 my $seconds = $secondstring % 60; 1290 if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } 1291 if ( $minutes < 10 ) { $minutes = "0" . $minutes; } 1292 if ( $seconds < 10 ) { $seconds = "0" . $seconds; } --- 5 unchanged lines hidden (view full) --- 1298 my $secondstring = $secondstring % 3600; 1299 my $minutes = $secondstring / 60; 1300 my $seconds = $secondstring % 60; 1301 if ( $hours =~ /(\d*)\.\d*/ ) { $hours = $1; } 1302 if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } 1303 if ( $hours < 10 ) { $hours = "0" . $hours; } 1304 if ( $minutes < 10 ) { $minutes = "0" . $minutes; } 1305 if ( $seconds < 10 ) { $seconds = "0" . $seconds; } | 1285 } 1286 elsif ( $secondstring < 3600 ) 1287 { 1288 my $minutes = $secondstring / 60; 1289 my $seconds = $secondstring % 60; 1290 if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } 1291 if ( $minutes < 10 ) { $minutes = "0" . $minutes; } 1292 if ( $seconds < 10 ) { $seconds = "0" . $seconds; } --- 5 unchanged lines hidden (view full) --- 1298 my $secondstring = $secondstring % 3600; 1299 my $minutes = $secondstring / 60; 1300 my $seconds = $secondstring % 60; 1301 if ( $hours =~ /(\d*)\.\d*/ ) { $hours = $1; } 1302 if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } 1303 if ( $hours < 10 ) { $hours = "0" . $hours; } 1304 if ( $minutes < 10 ) { $minutes = "0" . $minutes; } 1305 if ( $seconds < 10 ) { $seconds = "0" . $seconds; } |
1306 $timestring = "$hours\:$minutes\:$seconds hours"; | 1306 $timestring = "$hours\:$minutes\:$seconds hours"; |
1307 } | 1307 } |
1308 | 1308 |
1309 return $timestring; 1310} 1311 1312############################################################### 1313# Returning time string for logging 1314############################################################### 1315 1316sub get_time_string --- 17 unchanged lines hidden (view full) --- 1334check_system_path(); 1335my $temppath = get_temppath(); 1336 1337print("\nmsi database: $databasepath\n"); 1338print("Destination directory: $targetdir\n" ); 1339 1340my $helperdir = $temppath . $separator . "installhelper"; 1341create_directory($helperdir); | 1309 return $timestring; 1310} 1311 1312############################################################### 1313# Returning time string for logging 1314############################################################### 1315 1316sub get_time_string --- 17 unchanged lines hidden (view full) --- 1334check_system_path(); 1335my $temppath = get_temppath(); 1336 1337print("\nmsi database: $databasepath\n"); 1338print("Destination directory: $targetdir\n" ); 1339 1340my $helperdir = $temppath . $separator . "installhelper"; 1341create_directory($helperdir); |
1342 | 1342 |
1343# Get File.idt, Component.idt and Directory.idt from database | 1343# Get File.idt, Component.idt and Directory.idt from database |
1344 | 1344 |
1345my $tablelist = "File Directory Component Media CustomAction"; 1346extract_tables_from_database($databasepath, $helperdir, $tablelist); 1347 1348# Set unpackdir 1349my $unpackdir = $helperdir . $separator . "unpack"; 1350create_directory($unpackdir); 1351 1352# Reading media table to check for internal cabinet files 1353my $filename = $helperdir . $separator . "Media.idt"; 1354if ( ! -f $filename ) { exit_program("ERROR: Could not find required file: $filename !"); } 1355my $filecontent = read_file($filename); 1356my $cabfilehash = analyze_media_file($filecontent); 1357 | 1345my $tablelist = "File Directory Component Media CustomAction"; 1346extract_tables_from_database($databasepath, $helperdir, $tablelist); 1347 1348# Set unpackdir 1349my $unpackdir = $helperdir . $separator . "unpack"; 1350create_directory($unpackdir); 1351 1352# Reading media table to check for internal cabinet files 1353my $filename = $helperdir . $separator . "Media.idt"; 1354if ( ! -f $filename ) { exit_program("ERROR: Could not find required file: $filename !"); } 1355my $filecontent = read_file($filename); 1356my $cabfilehash = analyze_media_file($filecontent); 1357 |
1358# Check, if there are internal cab files | 1358# Check, if there are internal cab files |
1359my ( $contains_internal_cabfiles, $all_internal_cab_files) = check_for_internal_cabfiles($cabfilehash); 1360 1361if ( $contains_internal_cabfiles ) 1362{ 1363 # Set unpackdir 1364 my $cabdir = $helperdir . $separator . "internal_cabs"; 1365 create_directory($cabdir); 1366 my $from = cwd(); 1367 chdir($cabdir); 1368 # Exclude all cabinet files from database 1369 my $all_excluded_cabs = extract_cabs_from_database($databasepath, $all_internal_cab_files); 1370 print "Unpacking files from internal cabinet file(s)\n"; 1371 foreach my $cabfile ( @{$all_excluded_cabs} ) { unpack_cabinet_file($cabfile, $unpackdir); } 1372 chdir($from); 1373} | 1359my ( $contains_internal_cabfiles, $all_internal_cab_files) = check_for_internal_cabfiles($cabfilehash); 1360 1361if ( $contains_internal_cabfiles ) 1362{ 1363 # Set unpackdir 1364 my $cabdir = $helperdir . $separator . "internal_cabs"; 1365 create_directory($cabdir); 1366 my $from = cwd(); 1367 chdir($cabdir); 1368 # Exclude all cabinet files from database 1369 my $all_excluded_cabs = extract_cabs_from_database($databasepath, $all_internal_cab_files); 1370 print "Unpacking files from internal cabinet file(s)\n"; 1371 foreach my $cabfile ( @{$all_excluded_cabs} ) { unpack_cabinet_file($cabfile, $unpackdir); } 1372 chdir($from); 1373} |
1374 | 1374 |
1375# Unpack all cab files into $helperdir, cab files must be located next to msi database 1376my $installdir = $databasepath; 1377 1378get_path_from_fullqualifiedname(\$installdir); 1379 1380my $databasefilename = $databasepath; 1381make_absolute_filename_to_relative_filename(\$databasefilename); 1382 1383my $cabfiles = find_file_with_file_extension("cab", $installdir); | 1375# Unpack all cab files into $helperdir, cab files must be located next to msi database 1376my $installdir = $databasepath; 1377 1378get_path_from_fullqualifiedname(\$installdir); 1379 1380my $databasefilename = $databasepath; 1381make_absolute_filename_to_relative_filename(\$databasefilename); 1382 1383my $cabfiles = find_file_with_file_extension("cab", $installdir); |
1384 | 1384 |
1385if (( $#{$cabfiles} < 0 ) && ( ! $contains_internal_cabfiles )) { exit_program("ERROR: Did not find any cab file in directory $installdir"); } 1386 1387print "Unpacking files from cabinet file(s)\n"; 1388for ( my $i = 0; $i <= $#{$cabfiles}; $i++ ) 1389{ 1390 my $cabfile = $installdir . $separator . ${$cabfiles}[$i]; 1391 unpack_cabinet_file($cabfile, $unpackdir); 1392} | 1385if (( $#{$cabfiles} < 0 ) && ( ! $contains_internal_cabfiles )) { exit_program("ERROR: Did not find any cab file in directory $installdir"); } 1386 1387print "Unpacking files from cabinet file(s)\n"; 1388for ( my $i = 0; $i <= $#{$cabfiles}; $i++ ) 1389{ 1390 my $cabfile = $installdir . $separator . ${$cabfiles}[$i]; 1391 unpack_cabinet_file($cabfile, $unpackdir); 1392} |
1393 | 1393 |
1394# Reading tables 1395$filename = $helperdir . $separator . "Directory.idt"; 1396$filecontent = read_file($filename); 1397my $dirhash = analyze_directory_file($filecontent); | 1394# Reading tables 1395$filename = $helperdir . $separator . "Directory.idt"; 1396$filecontent = read_file($filename); 1397my $dirhash = analyze_directory_file($filecontent); |
1398 | 1398 |
1399$filename = $helperdir . $separator . "Component.idt"; 1400$filecontent = read_file($filename); 1401my $componenthash = analyze_component_file($filecontent); | 1399$filename = $helperdir . $separator . "Component.idt"; 1400$filecontent = read_file($filename); 1401my $componenthash = analyze_component_file($filecontent); |
1402 | 1402 |
1403$filename = $helperdir . $separator . "File.idt"; 1404$filecontent = read_file($filename); 1405my ( $filehash, $fileorder, $maxsequence ) = analyze_file_file($filecontent); 1406 1407# Creating the directory structure 1408my $fullpathhash = create_directory_structure($dirhash, $targetdir); 1409 1410# Copying files 1411my ($unopkgfile) = copy_files_into_directory_structure($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash); 1412if ( $^O =~ /cygwin/i ) { change_privileges_full($targetdir); } | 1403$filename = $helperdir . $separator . "File.idt"; 1404$filecontent = read_file($filename); 1405my ( $filehash, $fileorder, $maxsequence ) = analyze_file_file($filecontent); 1406 1407# Creating the directory structure 1408my $fullpathhash = create_directory_structure($dirhash, $targetdir); 1409 1410# Copying files 1411my ($unopkgfile) = copy_files_into_directory_structure($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash); 1412if ( $^O =~ /cygwin/i ) { change_privileges_full($targetdir); } |
1413 | 1413 |
1414my $msidatabase = $targetdir . $separator . $databasefilename; 1415my $copyreturn = copy($databasepath, $msidatabase); 1416if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); } 1417 1418# Reading tables 1419$filename = $helperdir . $separator . "CustomAction.idt"; 1420$filecontent = read_file($filename); 1421my $register_extensions_exists = analyze_customaction_file($filecontent); --- 18 unchanged lines hidden --- | 1414my $msidatabase = $targetdir . $separator . $databasefilename; 1415my $copyreturn = copy($databasepath, $msidatabase); 1416if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); } 1417 1418# Reading tables 1419$filename = $helperdir . $separator . "CustomAction.idt"; 1420$filecontent = read_file($filename); 1421my $register_extensions_exists = analyze_customaction_file($filecontent); --- 18 unchanged lines hidden --- |