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::packagepool; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse Digest::MD5; 27*b1cdbd2cSJim Jagielskiuse installer::exiter; 28*b1cdbd2cSJim Jagielskiuse installer::globals; 29*b1cdbd2cSJim Jagielskiuse installer::logger; 30*b1cdbd2cSJim Jagielskiuse installer::pathanalyzer; 31*b1cdbd2cSJim Jagielskiuse installer::worker; 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski###################################################### 34*b1cdbd2cSJim Jagielski# Checking the md5sum of a file 35*b1cdbd2cSJim Jagielski###################################################### 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielskisub get_md5sum 38*b1cdbd2cSJim Jagielski{ 39*b1cdbd2cSJim Jagielski my ($filename) = @_; 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski open(FILE, "<$filename") or die "ERROR: Can't open $filename for creating file hash"; 42*b1cdbd2cSJim Jagielski binmode(FILE); 43*b1cdbd2cSJim Jagielski my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest; 44*b1cdbd2cSJim Jagielski close(FILE); 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski return $digest; 47*b1cdbd2cSJim Jagielski} 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski#################################################### 50*b1cdbd2cSJim Jagielski# Setting a unique sessionid to identify this 51*b1cdbd2cSJim Jagielski# packaging process. 52*b1cdbd2cSJim Jagielski#################################################### 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielskisub set_sessionid 55*b1cdbd2cSJim Jagielski{ 56*b1cdbd2cSJim Jagielski my $pid = $$; # process id 57*b1cdbd2cSJim Jagielski my $timer = time(); # time 58*b1cdbd2cSJim Jagielski $installer::globals::sessionid = $pid . $timer; 59*b1cdbd2cSJim Jagielski $installer::globals::sessionidset = 1; 60*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 61*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("Pool: Setting session id: $installer::globals::sessionid.\n"); 62*b1cdbd2cSJim Jagielski} 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski#################################################### 65*b1cdbd2cSJim Jagielski# Setting and creating pool path. 66*b1cdbd2cSJim Jagielski#################################################### 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielskisub set_pool_path 69*b1cdbd2cSJim Jagielski{ 70*b1cdbd2cSJim Jagielski $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 71*b1cdbd2cSJim Jagielski $installer::globals::poolpath = $installer::globals::unpackpath . $installer::globals::separator . "pool_" . $installer::globals::packageformat; 72*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($installer::globals::poolpath); 73*b1cdbd2cSJim Jagielski $installer::globals::poolpathset = 1; 74*b1cdbd2cSJim Jagielski} 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski#################################################### 77*b1cdbd2cSJim Jagielski# Comparing the content of two epm files. 78*b1cdbd2cSJim Jagielski#################################################### 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielskisub compare_epm_content 81*b1cdbd2cSJim Jagielski{ 82*b1cdbd2cSJim Jagielski my ($oldcontent, $newcontent) = @_; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski my $identical = 1; 85*b1cdbd2cSJim Jagielski my $diffinfo = ""; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski # Removing empty lines and files from $newcontent 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski my @newlocalcontent = (); 90*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$newcontent}; $i++ ) 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski if ( ${$newcontent}[$i] =~ /^\s*$/ ) { next; } # Removing empty lines from $newcontent. Empty lines are also not included into pcf file, from where $oldcontent was read. 93*b1cdbd2cSJim Jagielski if ( ${$newcontent}[$i] =~ /^\s*f\s+/ ) { next; } # Ignoring files, they can contain temporary pathes 94*b1cdbd2cSJim Jagielski if (( ${$newcontent}[$i] =~ /^\s*%readme\s+/ ) || ( ${$newcontent}[$i] =~ /^\s*%license\s+/ )) { next; } # ignoring license and readme (language specific!) 95*b1cdbd2cSJim Jagielski my $oneline = ${$newcontent}[$i]; 96*b1cdbd2cSJim Jagielski $oneline =~ s/\s*$//; # Removing line ends. Also not included in old epm file, that is read from pcf file. 97*b1cdbd2cSJim Jagielski push(@newlocalcontent, $oneline); 98*b1cdbd2cSJim Jagielski } 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski my $oldmember = $#{$oldcontent} + 1; 101*b1cdbd2cSJim Jagielski my $newmember = $#newlocalcontent + 1; 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski # comparing the count 104*b1cdbd2cSJim Jagielski if ( $oldmember != $newmember ) 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski $identical = 0; 107*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 108*b1cdbd2cSJim Jagielski $installer::logger::Info->print("...... changed length of EPM file\n"); 109*b1cdbd2cSJim Jagielski $diffinfo = "Pool: EPM, different line count: old epm file: $oldmember, new epm file: $newmember\n"; 110*b1cdbd2cSJim Jagielski push(@installer::globals::epmdifflist, $diffinfo); 111*b1cdbd2cSJim Jagielski } 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski # comparing the content line for line, so the order must not change 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski if ( $identical ) 116*b1cdbd2cSJim Jagielski { 117*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$oldcontent}; $i++ ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski if ( ${$oldcontent}[$i] ne $newlocalcontent[$i] ) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski $identical = 0; 122*b1cdbd2cSJim Jagielski my $line = $i + 1; 123*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 124*b1cdbd2cSJim Jagielski $installer::logger::Info->print("...... different content in EPM file\n"); 125*b1cdbd2cSJim Jagielski $diffinfo = "Pool: EPM, line $line changed from \"${$oldcontent}[$i]\" to \"$newlocalcontent[$i]\".\n"; 126*b1cdbd2cSJim Jagielski push(@installer::globals::epmdifflist, $diffinfo); 127*b1cdbd2cSJim Jagielski last; 128*b1cdbd2cSJim Jagielski } 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski return $identical; 133*b1cdbd2cSJim Jagielski} 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski#################################################### 136*b1cdbd2cSJim Jagielski# Comparing the content of two pcf files. 137*b1cdbd2cSJim Jagielski#################################################### 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielskisub compare_package_content 140*b1cdbd2cSJim Jagielski{ 141*b1cdbd2cSJim Jagielski my ($oldcontent, $newcontent) = @_; 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski my $identical = 1; 144*b1cdbd2cSJim Jagielski my $infoline = ""; 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski my $oldmember = scalar keys %{$oldcontent}; 147*b1cdbd2cSJim Jagielski my $newmember = scalar keys %{$newcontent}; 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski # comparing the count 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski if ( $oldmember != $newmember ) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski # Logging the difference 154*b1cdbd2cSJim Jagielski $identical = 0; 155*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 156*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... different number of files in packages. New number: %s, old number: %s\n", $newmember, $oldmember); 157*b1cdbd2cSJim Jagielski $infoline = "Different number of files in packages. New number: $newmember, old number: $oldmember\n"; 158*b1cdbd2cSJim Jagielski push(@installer::globals::pcfdiffcomment, $infoline); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski # comparing the keys 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski if ( $identical ) 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski my $first = 1; 166*b1cdbd2cSJim Jagielski foreach my $dest ( keys %{$newcontent} ) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski if ( ! exists($oldcontent->{$dest}) ) 169*b1cdbd2cSJim Jagielski { 170*b1cdbd2cSJim Jagielski $identical = 0; 171*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n") if $first; 172*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... file only in one package (A): %s\n", $dest); 173*b1cdbd2cSJim Jagielski $infoline = "File only in existing pool package: $dest\n"; 174*b1cdbd2cSJim Jagielski push(@installer::globals::pcfdiffcomment, $infoline); 175*b1cdbd2cSJim Jagielski $first = 0; 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski } 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski # collecting all differences 180*b1cdbd2cSJim Jagielski if ( ! $identical ) 181*b1cdbd2cSJim Jagielski { 182*b1cdbd2cSJim Jagielski foreach my $dest ( keys %{$oldcontent} ) 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski if ( ! exists($newcontent->{$dest}) ) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski $identical = 0; 187*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n") if $first; 188*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... file only in one package (B): %s\n", $dest); 189*b1cdbd2cSJim Jagielski $infoline = "File only in new package: $dest\n"; 190*b1cdbd2cSJim Jagielski push(@installer::globals::pcfdiffcomment, $infoline); 191*b1cdbd2cSJim Jagielski $first = 0; 192*b1cdbd2cSJim Jagielski } 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski } 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski # comparing the checksum 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski if ( $identical ) 200*b1cdbd2cSJim Jagielski { 201*b1cdbd2cSJim Jagielski my $first = 1; 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski foreach my $dest ( keys %{$newcontent} ) 204*b1cdbd2cSJim Jagielski { 205*b1cdbd2cSJim Jagielski if ( $newcontent->{$dest}->{'md5sum'} ne $oldcontent->{$dest}->{'md5sum'} ) 206*b1cdbd2cSJim Jagielski { 207*b1cdbd2cSJim Jagielski $identical = 0; 208*b1cdbd2cSJim Jagielski if ( $first == 1 ) 209*b1cdbd2cSJim Jagielski { 210*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 211*b1cdbd2cSJim Jagielski $first = 0; 212*b1cdbd2cSJim Jagielski } 213*b1cdbd2cSJim Jagielski $installer::globals::pcfdifflist{$dest} = 1; 214*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... different file: %s\n", $dest); 215*b1cdbd2cSJim Jagielski # last; 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski if ( $installer::globals::iswindowsbuild ) 219*b1cdbd2cSJim Jagielski { 220*b1cdbd2cSJim Jagielski if ( $newcontent->{$dest}->{'uniquename'} ne $oldcontent->{$dest}->{'uniquename'} ) 221*b1cdbd2cSJim Jagielski { 222*b1cdbd2cSJim Jagielski $identical = 0; 223*b1cdbd2cSJim Jagielski $installer::globals::pcfdifflist{$dest} = 1; 224*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 225*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("...... different file: %s", $dest); 226*b1cdbd2cSJim Jagielski # last; 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski } 229*b1cdbd2cSJim Jagielski } 230*b1cdbd2cSJim Jagielski } 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski return $identical; 233*b1cdbd2cSJim Jagielski} 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski#################################################### 236*b1cdbd2cSJim Jagielski# Calculating content of pcf file. 237*b1cdbd2cSJim Jagielski#################################################### 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielskisub calculate_current_content 240*b1cdbd2cSJim Jagielski{ 241*b1cdbd2cSJim Jagielski my ($filesarray, $packagename) = @_; 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 244*b1cdbd2cSJim Jagielski $installer::logger::Lang->add_timestamp("Calculating content for package content file ($packagename), start"); 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski my %globalcontent = (); 247*b1cdbd2cSJim Jagielski 248*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) 249*b1cdbd2cSJim Jagielski { 250*b1cdbd2cSJim Jagielski my %onefilehash = (); 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski my $onefile = ${$filesarray}[$i]; 253*b1cdbd2cSJim Jagielski if ( ! $onefile->{'sourcepath'} ) { installer::exiter::exit_program("ERROR: No sourcepath found for file $onefile->{'gid'}", "calculate_current_content"); } 254*b1cdbd2cSJim Jagielski my $source = $onefile->{'sourcepath'}; 255*b1cdbd2cSJim Jagielski if ( $onefile->{'zipfilesource'} ) { $source = $onefile->{'zipfilesource'}; } 256*b1cdbd2cSJim Jagielski if ( ! -f $source ) { installer::exiter::exit_program("ERROR: Sourcefile not found: $source ($onefile->{'gid'})", "calculate_current_content"); } 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski # For Windows the unique name inside the cabinet file also has to be saved 259*b1cdbd2cSJim Jagielski my $uniquename = ""; 260*b1cdbd2cSJim Jagielski if ( $installer::globals::iswindowsbuild ) { $uniquename = $onefile->{'uniquename'};} 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski my $destination = $onefile->{'destination'}; 263*b1cdbd2cSJim Jagielski my $checksum = get_md5sum($source); 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski $onefilehash{'md5sum'} = $checksum; 266*b1cdbd2cSJim Jagielski $onefilehash{'uniquename'} = $uniquename; 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski if ( exists($globalcontent{$destination}) ) { installer::exiter::exit_program("ERROR: Destination not unique: $destination ($onefile->{'gid'})", "calculate_current_content"); } 269*b1cdbd2cSJim Jagielski $globalcontent{$destination} = \%onefilehash; 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 273*b1cdbd2cSJim Jagielski $installer::logger::Lang->add_timestamp("Calculating content for package content file ($packagename), start"); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski return \%globalcontent; 276*b1cdbd2cSJim Jagielski} 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski#################################################### 279*b1cdbd2cSJim Jagielski# Writing pcf file. 280*b1cdbd2cSJim Jagielski#################################################### 281*b1cdbd2cSJim Jagielski 282*b1cdbd2cSJim Jagielskisub create_pcfcontent_file 283*b1cdbd2cSJim Jagielski{ 284*b1cdbd2cSJim Jagielski my ($realpackagename, $md5sum, $filesize, $fullpackagename, $pkgversion, $epmfilecontent, $pcffilename) = @_; 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski my @content = (); 287*b1cdbd2cSJim Jagielski my $oneline = "PackageName: $realpackagename\n"; 288*b1cdbd2cSJim Jagielski push(@content, $oneline); 289*b1cdbd2cSJim Jagielski 290*b1cdbd2cSJim Jagielski $oneline = "md5sum: $md5sum\n"; 291*b1cdbd2cSJim Jagielski push(@content, $oneline); 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski $oneline = "FileSize: $filesize\n"; 294*b1cdbd2cSJim Jagielski push(@content, $oneline); 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski $oneline = "FullPackageName: $fullpackagename\n"; 297*b1cdbd2cSJim Jagielski push(@content, $oneline); 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski $oneline = "PkgVersion: $pkgversion\n"; 300*b1cdbd2cSJim Jagielski push(@content, $oneline); 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski foreach my $dest (keys %{$installer::globals::newpcfcontent} ) 303*b1cdbd2cSJim Jagielski { 304*b1cdbd2cSJim Jagielski $oneline = "Files:\t$dest\t$installer::globals::newpcfcontent->{$dest}->{'md5sum'}\t$installer::globals::newpcfcontent->{$dest}->{'uniquename'}\n"; 305*b1cdbd2cSJim Jagielski push(@content, $oneline); 306*b1cdbd2cSJim Jagielski } 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$epmfilecontent}; $i++ ) 309*b1cdbd2cSJim Jagielski { 310*b1cdbd2cSJim Jagielski if ( ${$epmfilecontent}[$i] =~ /^\s*$/ ) { next; } # avoiding empty lines 311*b1cdbd2cSJim Jagielski if ( ${$epmfilecontent}[$i] =~ /^\s*f\s+/ ) { next; } # ignoring files, because they can contain temporary pathes 312*b1cdbd2cSJim Jagielski if (( ${$epmfilecontent}[$i] =~ /^\s*%readme\s+/ ) || ( ${$epmfilecontent}[$i] =~ /^\s*%license\s+/ )) { next; } # ignoring license and readme (language specific!) 313*b1cdbd2cSJim Jagielski $oneline = "EPM:\t${$epmfilecontent}[$i]"; 314*b1cdbd2cSJim Jagielski push(@content, $oneline); 315*b1cdbd2cSJim Jagielski } 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski installer::files::save_file($pcffilename, \@content); 318*b1cdbd2cSJim Jagielski} 319*b1cdbd2cSJim Jagielski 320*b1cdbd2cSJim Jagielski####################################################### 321*b1cdbd2cSJim Jagielski# Reading the content of the package content file. 322*b1cdbd2cSJim Jagielski####################################################### 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielskisub read_pcf_content 325*b1cdbd2cSJim Jagielski{ 326*b1cdbd2cSJim Jagielski my ($pcffilename) = @_; 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski my %allcontent = (); 329*b1cdbd2cSJim Jagielski my @epmfile = (); 330*b1cdbd2cSJim Jagielski my $realpackagename = ""; 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski my $content = installer::files::read_file($pcffilename); 333*b1cdbd2cSJim Jagielski 334*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$content}; $i++ ) 335*b1cdbd2cSJim Jagielski { 336*b1cdbd2cSJim Jagielski my $line = ${$content}[$i]; 337*b1cdbd2cSJim Jagielski 338*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*PackageName\:\s*(.*?)\s*$/ ) 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski $realpackagename = $1; 341*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'RealPackageName'} = $realpackagename; 342*b1cdbd2cSJim Jagielski next; 343*b1cdbd2cSJim Jagielski } 344*b1cdbd2cSJim Jagielski 345*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*FullPackageName\:\s*(.*?)\s*$/ ) 346*b1cdbd2cSJim Jagielski { 347*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'FullPackageName'} = $1; 348*b1cdbd2cSJim Jagielski next; 349*b1cdbd2cSJim Jagielski } 350*b1cdbd2cSJim Jagielski 351*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*FileSize\:\s*(.*?)\s*$/ ) 352*b1cdbd2cSJim Jagielski { 353*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'FileSize'} = $1; 354*b1cdbd2cSJim Jagielski next; 355*b1cdbd2cSJim Jagielski } 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*PkgVersion\:\s*(.*?)\s*$/ ) 358*b1cdbd2cSJim Jagielski { 359*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'PkgVersion'} = $1; 360*b1cdbd2cSJim Jagielski next; 361*b1cdbd2cSJim Jagielski } 362*b1cdbd2cSJim Jagielski 363*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*md5sum\:\s*(.*?)\s*$/ ) 364*b1cdbd2cSJim Jagielski { 365*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'md5sum'} = $1; 366*b1cdbd2cSJim Jagielski next; 367*b1cdbd2cSJim Jagielski } 368*b1cdbd2cSJim Jagielski 369*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*Files:\t(.+?)\t(.+?)\t(.*?)\s*$/ ) 370*b1cdbd2cSJim Jagielski { 371*b1cdbd2cSJim Jagielski my $destination = $1; 372*b1cdbd2cSJim Jagielski my $checksum = $2; 373*b1cdbd2cSJim Jagielski my $uniquename = $3; 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielski my %onefilehash = (); 376*b1cdbd2cSJim Jagielski $onefilehash{'md5sum'} = $checksum; 377*b1cdbd2cSJim Jagielski $onefilehash{'uniquename'} = $uniquename; 378*b1cdbd2cSJim Jagielski 379*b1cdbd2cSJim Jagielski $allcontent{$destination} = \%onefilehash; 380*b1cdbd2cSJim Jagielski next; 381*b1cdbd2cSJim Jagielski } 382*b1cdbd2cSJim Jagielski 383*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*EPM:\t(.*?)\s*$/ ) # A line can be empty in epm file 384*b1cdbd2cSJim Jagielski { 385*b1cdbd2cSJim Jagielski my $epmcontent = $1; 386*b1cdbd2cSJim Jagielski push(@epmfile, $epmcontent); 387*b1cdbd2cSJim Jagielski next; 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski } 390*b1cdbd2cSJim Jagielski 391*b1cdbd2cSJim Jagielski if ( $realpackagename eq "" ) { installer::exiter::exit_program("ERROR: Real package name not found in pcf file: \"$pcffilename\"", "read_pcf_content"); } 392*b1cdbd2cSJim Jagielski 393*b1cdbd2cSJim Jagielski return ($realpackagename, \%allcontent, \@epmfile); 394*b1cdbd2cSJim Jagielski} 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski#################################################### 397*b1cdbd2cSJim Jagielski# Checking, if a specific package can be 398*b1cdbd2cSJim Jagielski# created at the moment. 399*b1cdbd2cSJim Jagielski#################################################### 400*b1cdbd2cSJim Jagielski 401*b1cdbd2cSJim Jagielskisub check_package_availability 402*b1cdbd2cSJim Jagielski{ 403*b1cdbd2cSJim Jagielski my ($packagename) = @_; 404*b1cdbd2cSJim Jagielski 405*b1cdbd2cSJim Jagielski my $package_is_available = 1; 406*b1cdbd2cSJim Jagielski 407*b1cdbd2cSJim Jagielski my $checkfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.check"; 408*b1cdbd2cSJim Jagielski my $lockfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.lock"; 409*b1cdbd2cSJim Jagielski 410*b1cdbd2cSJim Jagielski if (( -f $checkfilename ) || ( -f $lockfilename )) { $package_is_available = 0; } 411*b1cdbd2cSJim Jagielski 412*b1cdbd2cSJim Jagielski return $package_is_available; 413*b1cdbd2cSJim Jagielski} 414*b1cdbd2cSJim Jagielski 415*b1cdbd2cSJim Jagielski#################################################### 416*b1cdbd2cSJim Jagielski# Check, if the existence of the check or lock 417*b1cdbd2cSJim Jagielski# file requires an exit of packaging process. 418*b1cdbd2cSJim Jagielski#################################################### 419*b1cdbd2cSJim Jagielski 420*b1cdbd2cSJim Jagielskisub check_pool_exit 421*b1cdbd2cSJim Jagielski{ 422*b1cdbd2cSJim Jagielski my ( $lockfilename, $timecounter ) = @_; 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski # How old is this lock file? 425*b1cdbd2cSJim Jagielski my $timeage = installer::logger::get_file_age($lockfilename); 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski # if ( $timeage > 1800 ) # file is older than half an hour 428*b1cdbd2cSJim Jagielski if ( $timeage > 3600 ) # file is older than an hour 429*b1cdbd2cSJim Jagielski { 430*b1cdbd2cSJim Jagielski my $timestring = installer::logger::convert_timestring($timeage); 431*b1cdbd2cSJim Jagielski my $infoline = "\nPool: Attention: \"$lockfilename\" is too old ($timestring). Removing file!\n"; 432*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 433*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s", $infoline); 434*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 435*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 436*b1cdbd2cSJim Jagielski unlink $lockfilename; 437*b1cdbd2cSJim Jagielski # installer::exiter::exit_program("ERROR: Waiting too long for removal of lock file \"$lockfilename\"", "check_pool_exit (packagepool)"); 438*b1cdbd2cSJim Jagielski } 439*b1cdbd2cSJim Jagielski else 440*b1cdbd2cSJim Jagielski { 441*b1cdbd2cSJim Jagielski my $filecontent = installer::files::read_file($lockfilename); 442*b1cdbd2cSJim Jagielski my $waittime = $timecounter * 10; 443*b1cdbd2cSJim Jagielski $waittime = installer::logger::convert_timestring($waittime); 444*b1cdbd2cSJim Jagielski my $infoline = "Pool: Warning: \"$lockfilename\" blocks this process for $waittime. Lock content: \"${$filecontent}[0]\"\n"; 445*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 446*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s", $infoline); 447*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 448*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 449*b1cdbd2cSJim Jagielski } 450*b1cdbd2cSJim Jagielski} 451*b1cdbd2cSJim Jagielski 452*b1cdbd2cSJim Jagielski############################################################################ 453*b1cdbd2cSJim Jagielski# This function logs some information, that can be used to find 454*b1cdbd2cSJim Jagielski# pool problems. 455*b1cdbd2cSJim Jagielski############################################################################ 456*b1cdbd2cSJim Jagielski 457*b1cdbd2cSJim Jagielskisub log_pool_info 458*b1cdbd2cSJim Jagielski{ 459*b1cdbd2cSJim Jagielski my ( $file_exists ) = @_; 460*b1cdbd2cSJim Jagielski 461*b1cdbd2cSJim Jagielski my $infoline = ""; 462*b1cdbd2cSJim Jagielski 463*b1cdbd2cSJim Jagielski # Content saved in 464*b1cdbd2cSJim Jagielski # $installer::globals::savelockfilecontent = installer::files::read_file($filename); 465*b1cdbd2cSJim Jagielski # $installer::globals::savelockfilename = $filename; 466*b1cdbd2cSJim Jagielski 467*b1cdbd2cSJim Jagielski if ( $file_exists ) 468*b1cdbd2cSJim Jagielski { 469*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 470*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 471*b1cdbd2cSJim Jagielski "Pool Problem: Lock file \"%s\" belongs to another process. This process has session id: %s.\n", 472*b1cdbd2cSJim Jagielski $installer::globals::savelockfilename, 473*b1cdbd2cSJim Jagielski $installer::globals::sessionid); 474*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("Content of Lock file:\n"); 475*b1cdbd2cSJim Jagielski foreach my $line ( @{$installer::globals::savelockfilecontent} ) 476*b1cdbd2cSJim Jagielski { 477*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($line); 478*b1cdbd2cSJim Jagielski } 479*b1cdbd2cSJim Jagielski } 480*b1cdbd2cSJim Jagielski else 481*b1cdbd2cSJim Jagielski { 482*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 483*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 484*b1cdbd2cSJim Jagielski "Pool Problem: Lock file \"%s\" does not exist anymore (this process has session id: %s).\n", 485*b1cdbd2cSJim Jagielski $installer::globals::savelockfilename, 486*b1cdbd2cSJim Jagielski $installer::globals::sessionid); 487*b1cdbd2cSJim Jagielski } 488*b1cdbd2cSJim Jagielski} 489*b1cdbd2cSJim Jagielski 490*b1cdbd2cSJim Jagielski############################################################################ 491*b1cdbd2cSJim Jagielski# Checking, if this process is the owner of the lock file in the pool. 492*b1cdbd2cSJim Jagielski# This can be determined by the Process ID, that is written at the 493*b1cdbd2cSJim Jagielski# beginning of the first line into the lock file. 494*b1cdbd2cSJim Jagielski############################################################################ 495*b1cdbd2cSJim Jagielski 496*b1cdbd2cSJim Jagielskisub process_is_owner 497*b1cdbd2cSJim Jagielski{ 498*b1cdbd2cSJim Jagielski my ( $filename ) = @_; 499*b1cdbd2cSJim Jagielski 500*b1cdbd2cSJim Jagielski my $process_is_owner = 0; 501*b1cdbd2cSJim Jagielski 502*b1cdbd2cSJim Jagielski $installer::globals::savelockfilecontent = installer::files::read_file($filename); 503*b1cdbd2cSJim Jagielski $installer::globals::savelockfilename = $filename; 504*b1cdbd2cSJim Jagielski 505*b1cdbd2cSJim Jagielski if ( ${$installer::globals::savelockfilecontent}[0] =~ /^\s*\Q$installer::globals::sessionid\E\s+/ ) { $process_is_owner = 1; } 506*b1cdbd2cSJim Jagielski 507*b1cdbd2cSJim Jagielski return $process_is_owner; 508*b1cdbd2cSJim Jagielski} 509*b1cdbd2cSJim Jagielski 510*b1cdbd2cSJim Jagielski#################################################### 511*b1cdbd2cSJim Jagielski# Removing a package from installation set, if 512*b1cdbd2cSJim Jagielski# there were pooling problems. 513*b1cdbd2cSJim Jagielski#################################################### 514*b1cdbd2cSJim Jagielski 515*b1cdbd2cSJim Jagielskisub remove_package_from_installset 516*b1cdbd2cSJim Jagielski{ 517*b1cdbd2cSJim Jagielski my ($newpackagepath) = @_; 518*b1cdbd2cSJim Jagielski 519*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Pool problem: Removing package \"%s\" from installation set!\n", 520*b1cdbd2cSJim Jagielski $newpackagepath); 521*b1cdbd2cSJim Jagielski 522*b1cdbd2cSJim Jagielski if ( -f $newpackagepath ) { unlink $newpackagepath; } 523*b1cdbd2cSJim Jagielski if ( -d $newpackagepath ) { installer::systemactions::remove_complete_directory($newpackagepath, 1); } 524*b1cdbd2cSJim Jagielski 525*b1cdbd2cSJim Jagielski # Keeping the content of @installer::globals::installsetcontent up to date. Removing the last package. 526*b1cdbd2cSJim Jagielski pop(@installer::globals::installsetcontent); 527*b1cdbd2cSJim Jagielski} 528*b1cdbd2cSJim Jagielski 529*b1cdbd2cSJim Jagielski#################################################### 530*b1cdbd2cSJim Jagielski# Check, if the package is in the pool and if 531*b1cdbd2cSJim Jagielski# there are no changes in the package. 532*b1cdbd2cSJim Jagielski#################################################### 533*b1cdbd2cSJim Jagielski 534*b1cdbd2cSJim Jagielskisub package_is_up_to_date 535*b1cdbd2cSJim Jagielski{ 536*b1cdbd2cSJim Jagielski my ($allvariables, $onepackage, $packagename, $newepmcontent, $filesinpackage, $installdir, $subdir, $languagestringref) = @_; 537*b1cdbd2cSJim Jagielski 538*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... checking pool package ...\n", $packagename); 539*b1cdbd2cSJim Jagielski 540*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Checking package in pool: $packagename"); 541*b1cdbd2cSJim Jagielski 542*b1cdbd2cSJim Jagielski if ( ! $installer::globals::poolpathset ) { installer::packagepool::set_pool_path(); } 543*b1cdbd2cSJim Jagielski if ( ! $installer::globals::sessionidset ) { installer::packagepool::set_sessionid(); } 544*b1cdbd2cSJim Jagielski 545*b1cdbd2cSJim Jagielski my $infoline = ""; 546*b1cdbd2cSJim Jagielski # Resetting some variables for this package 547*b1cdbd2cSJim Jagielski my $package_is_up_to_date = 0; 548*b1cdbd2cSJim Jagielski my $realpackagename = ""; 549*b1cdbd2cSJim Jagielski my $oldepmcontent = ""; 550*b1cdbd2cSJim Jagielski my $waited_for_check = 0; 551*b1cdbd2cSJim Jagielski my $waited_for_lock = 0; 552*b1cdbd2cSJim Jagielski $installer::globals::newpcfcontentcalculated = 0; 553*b1cdbd2cSJim Jagielski %installer::globals::pcfdifflist = (); 554*b1cdbd2cSJim Jagielski @installer::globals::pcfdiffcomment = (); 555*b1cdbd2cSJim Jagielski @installer::globals::epmdifflist = (); 556*b1cdbd2cSJim Jagielski 557*b1cdbd2cSJim Jagielski # Reading the package content file, if this file exists (extension *.pcf) 558*b1cdbd2cSJim Jagielski my $filename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf"; 559*b1cdbd2cSJim Jagielski my $checkfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.check"; 560*b1cdbd2cSJim Jagielski my $lockfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.lock"; 561*b1cdbd2cSJim Jagielski # Saving name in global variable, so that this file can be removed somewhere else (at the end of "put_content_into_pool"). 562*b1cdbd2cSJim Jagielski $installer::globals::poolcheckfilename = $checkfilename; 563*b1cdbd2cSJim Jagielski $installer::globals::poollockfilename = $lockfilename; 564*b1cdbd2cSJim Jagielski 565*b1cdbd2cSJim Jagielski my @checkfilecontent = ("$installer::globals::sessionid $installer::globals::product $$languagestringref $checkfilename"); # $$ is the process id 566*b1cdbd2cSJim Jagielski my @lockfilecontent = ("$installer::globals::sessionid $installer::globals::product $$languagestringref $lockfilename"); # $$ is the process id 567*b1cdbd2cSJim Jagielski 568*b1cdbd2cSJim Jagielski # Waiting, step 1 569*b1cdbd2cSJim Jagielski # Checking, if another process checks this package at the moment 570*b1cdbd2cSJim Jagielski my $timecounter = 0; 571*b1cdbd2cSJim Jagielski while ( -f $checkfilename ) 572*b1cdbd2cSJim Jagielski { 573*b1cdbd2cSJim Jagielski $timecounter++; 574*b1cdbd2cSJim Jagielski 575*b1cdbd2cSJim Jagielski # including an exit to enable creation of other packages 576*b1cdbd2cSJim Jagielski if (( $timecounter == 1 ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) 577*b1cdbd2cSJim Jagielski { 578*b1cdbd2cSJim Jagielski $package_is_up_to_date = 3; # repeat this package later 579*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 580*b1cdbd2cSJim Jagielski } 581*b1cdbd2cSJim Jagielski 582*b1cdbd2cSJim Jagielski $infoline = "Pool: $checkfilename exists. WAITING 10 seconds ($timecounter).\n"; 583*b1cdbd2cSJim Jagielski if ( $timecounter == 1 ) 584*b1cdbd2cSJim Jagielski { 585*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 586*b1cdbd2cSJim Jagielski } 587*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s", $infoline); 588*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 589*b1cdbd2cSJim Jagielski if ( $timecounter % 100 == 0 ) { check_pool_exit($checkfilename, $timecounter); } 590*b1cdbd2cSJim Jagielski sleep 10; # process sleeps 10 seconds 591*b1cdbd2cSJim Jagielski $waited_for_check = 1; 592*b1cdbd2cSJim Jagielski } 593*b1cdbd2cSJim Jagielski 594*b1cdbd2cSJim Jagielski # Creating file, showing that this package is checked at the moment by this process. No other process can reach this. 595*b1cdbd2cSJim Jagielski installer::files::save_file($checkfilename, \@checkfilecontent); # Creating the Lock, to check this package. This blocks all other processes. 596*b1cdbd2cSJim Jagielski $installer::globals::processhaspoolcheckfile = 1; 597*b1cdbd2cSJim Jagielski 598*b1cdbd2cSJim Jagielski # Check, if the Lock file creation was really successful 599*b1cdbd2cSJim Jagielski if ( ! -f $checkfilename ) 600*b1cdbd2cSJim Jagielski { 601*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" could not be created successfully or was removed by another process (A)!\n"; 602*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 603*b1cdbd2cSJim Jagielski log_pool_info(0); 604*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 605*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 606*b1cdbd2cSJim Jagielski } 607*b1cdbd2cSJim Jagielski 608*b1cdbd2cSJim Jagielski if ( ! process_is_owner($checkfilename) ) 609*b1cdbd2cSJim Jagielski { 610*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (A)!\n"; 611*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 612*b1cdbd2cSJim Jagielski log_pool_info(1); 613*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 614*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 615*b1cdbd2cSJim Jagielski } 616*b1cdbd2cSJim Jagielski 617*b1cdbd2cSJim Jagielski $infoline = "Pool: Created file: $checkfilename\n"; 618*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 619*b1cdbd2cSJim Jagielski if ( $waited_for_check ) 620*b1cdbd2cSJim Jagielski { 621*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s", $infoline); 622*b1cdbd2cSJim Jagielski } 623*b1cdbd2cSJim Jagielski 624*b1cdbd2cSJim Jagielski # Waiting, step 2 625*b1cdbd2cSJim Jagielski # Checking, if another process creates this package at the moment 626*b1cdbd2cSJim Jagielski $timecounter = 0; 627*b1cdbd2cSJim Jagielski while ( -f $lockfilename ) 628*b1cdbd2cSJim Jagielski { 629*b1cdbd2cSJim Jagielski $timecounter++; 630*b1cdbd2cSJim Jagielski $infoline = "Pool: $lockfilename exists. WAITING 10 seconds ($timecounter).\n"; 631*b1cdbd2cSJim Jagielski if ( $timecounter == 1 ) 632*b1cdbd2cSJim Jagielski { 633*b1cdbd2cSJim Jagielski $installer::logger::Info->print("\n"); 634*b1cdbd2cSJim Jagielski } 635*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... %s", $infoline); 636*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 637*b1cdbd2cSJim Jagielski if ( $timecounter % 100 == 0 ) { check_pool_exit($lockfilename, $timecounter); } 638*b1cdbd2cSJim Jagielski sleep 10; # process sleeps 10 seconds 639*b1cdbd2cSJim Jagielski $waited_for_lock = 1; 640*b1cdbd2cSJim Jagielski } 641*b1cdbd2cSJim Jagielski 642*b1cdbd2cSJim Jagielski # No lock file exists, therefore no process creates this package at the moment. Check can be done now. 643*b1cdbd2cSJim Jagielski if ( $waited_for_lock ) 644*b1cdbd2cSJim Jagielski { 645*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... Pool: Proceeding, %s was removed.\n", $lockfilename); 646*b1cdbd2cSJim Jagielski } 647*b1cdbd2cSJim Jagielski 648*b1cdbd2cSJim Jagielski my $package_already_exists = 0; 649*b1cdbd2cSJim Jagielski 650*b1cdbd2cSJim Jagielski if ( -f $filename ) 651*b1cdbd2cSJim Jagielski { 652*b1cdbd2cSJim Jagielski # Calculating content for pcf file 653*b1cdbd2cSJim Jagielski $installer::globals::newpcfcontent = calculate_current_content($filesinpackage, $packagename); 654*b1cdbd2cSJim Jagielski $installer::globals::newpcfcontentcalculated = 1; 655*b1cdbd2cSJim Jagielski 656*b1cdbd2cSJim Jagielski # reading the existing pcf file 657*b1cdbd2cSJim Jagielski ($realpackagename, $oldpcfcontent, $oldepmcontent) = read_pcf_content($filename); 658*b1cdbd2cSJim Jagielski 659*b1cdbd2cSJim Jagielski # First check: Package has to exist in pool (directories on Solaris) 660*b1cdbd2cSJim Jagielski my $fullpackage = $installer::globals::poolpath . $installer::globals::separator . $realpackagename; 661*b1cdbd2cSJim Jagielski if ( $installer::globals::issolarisbuild ) { $fullpackage = $fullpackage . ".tar"; } 662*b1cdbd2cSJim Jagielski if ( -f $fullpackage ) 663*b1cdbd2cSJim Jagielski { 664*b1cdbd2cSJim Jagielski $package_already_exists = 1; 665*b1cdbd2cSJim Jagielski # Second check: Only files 666*b1cdbd2cSJim Jagielski my $content_is_identical = compare_package_content($oldpcfcontent, $installer::globals::newpcfcontent); 667*b1cdbd2cSJim Jagielski 668*b1cdbd2cSJim Jagielski # Third check for Unix: Changes in the epm file? 669*b1cdbd2cSJim Jagielski if (( $content_is_identical ) && ( ! $installer::globals::iswindowsbuild )) 670*b1cdbd2cSJim Jagielski { 671*b1cdbd2cSJim Jagielski $content_is_identical = compare_epm_content($oldepmcontent, $newepmcontent); 672*b1cdbd2cSJim Jagielski } 673*b1cdbd2cSJim Jagielski 674*b1cdbd2cSJim Jagielski if ( $content_is_identical ) { $package_is_up_to_date = 1; } 675*b1cdbd2cSJim Jagielski } 676*b1cdbd2cSJim Jagielski } 677*b1cdbd2cSJim Jagielski 678*b1cdbd2cSJim Jagielski if ( $package_is_up_to_date ) 679*b1cdbd2cSJim Jagielski { 680*b1cdbd2cSJim Jagielski $infoline = "Pool: $packagename: No new content, using existing package\n"; 681*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 682*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... using package from pool\n"); 683*b1cdbd2cSJim Jagielski } 684*b1cdbd2cSJim Jagielski else 685*b1cdbd2cSJim Jagielski { 686*b1cdbd2cSJim Jagielski if ( $package_already_exists ) 687*b1cdbd2cSJim Jagielski { 688*b1cdbd2cSJim Jagielski $infoline = "Pool: $packagename: Contains new content, creating new package. Differences:\n"; 689*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 690*b1cdbd2cSJim Jagielski foreach my $dest ( sort keys %installer::globals::pcfdifflist ) 691*b1cdbd2cSJim Jagielski { 692*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("%s\n", $dest); 693*b1cdbd2cSJim Jagielski } 694*b1cdbd2cSJim Jagielski foreach my $dest ( @installer::globals::pcfdiffcomment ) 695*b1cdbd2cSJim Jagielski { 696*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("%s\n", $dest); 697*b1cdbd2cSJim Jagielski } 698*b1cdbd2cSJim Jagielski foreach my $dest ( @installer::globals::epmdifflist ) 699*b1cdbd2cSJim Jagielski { 700*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("%s\n", $dest); 701*b1cdbd2cSJim Jagielski } 702*b1cdbd2cSJim Jagielski } 703*b1cdbd2cSJim Jagielski else 704*b1cdbd2cSJim Jagielski { 705*b1cdbd2cSJim Jagielski $infoline = "Pool: $packagename: Does not exist in pool.\n"; 706*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 707*b1cdbd2cSJim Jagielski } 708*b1cdbd2cSJim Jagielski 709*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("... packaging required\n"); 710*b1cdbd2cSJim Jagielski %installer::globals::xpdpackageinfo = (); # reset the filled hash, because the package cannot be used. 711*b1cdbd2cSJim Jagielski 712*b1cdbd2cSJim Jagielski # Creating lock mechanism, so that other processes do not create this package, too. 713*b1cdbd2cSJim Jagielski installer::files::save_file($lockfilename, \@lockfilecontent); # Creating the Lock, to create this package (Lock for check still exists). 714*b1cdbd2cSJim Jagielski $installer::globals::processhaspoollockfile = 1; 715*b1cdbd2cSJim Jagielski 716*b1cdbd2cSJim Jagielski # Check if creation of Lock file was really successful 717*b1cdbd2cSJim Jagielski 718*b1cdbd2cSJim Jagielski if ( ! -f $lockfilename ) 719*b1cdbd2cSJim Jagielski { 720*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$lockfilename\" could not be created successfully or was removed by another process (D)!\n"; 721*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 722*b1cdbd2cSJim Jagielski log_pool_info(0); 723*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 724*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 725*b1cdbd2cSJim Jagielski } 726*b1cdbd2cSJim Jagielski 727*b1cdbd2cSJim Jagielski if ( ! process_is_owner($lockfilename) ) 728*b1cdbd2cSJim Jagielski { 729*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$lockfilename\" belongs to another process (D)!\n"; 730*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 731*b1cdbd2cSJim Jagielski log_pool_info(1); 732*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 733*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 734*b1cdbd2cSJim Jagielski } 735*b1cdbd2cSJim Jagielski 736*b1cdbd2cSJim Jagielski $infoline = "Pool: Created file: $lockfilename\n"; 737*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 738*b1cdbd2cSJim Jagielski } 739*b1cdbd2cSJim Jagielski 740*b1cdbd2cSJim Jagielski my $newpackagepath = ""; 741*b1cdbd2cSJim Jagielski 742*b1cdbd2cSJim Jagielski if ( $package_is_up_to_date ) 743*b1cdbd2cSJim Jagielski { 744*b1cdbd2cSJim Jagielski # Before the package is copied into the installation set, it has to be checked, if this process is really the owner of this lock file.. 745*b1cdbd2cSJim Jagielski # Check, if lock file still exists and if this process is the owner. 746*b1cdbd2cSJim Jagielski 747*b1cdbd2cSJim Jagielski if ( ! -f $checkfilename ) 748*b1cdbd2cSJim Jagielski { 749*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" was removed by another process (B)!\n"; 750*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 751*b1cdbd2cSJim Jagielski log_pool_info(0); 752*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 753*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 754*b1cdbd2cSJim Jagielski } 755*b1cdbd2cSJim Jagielski 756*b1cdbd2cSJim Jagielski if ( ! process_is_owner($checkfilename) ) 757*b1cdbd2cSJim Jagielski { 758*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (B)!\n"; 759*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 760*b1cdbd2cSJim Jagielski log_pool_info(1); 761*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 762*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 763*b1cdbd2cSJim Jagielski } 764*b1cdbd2cSJim Jagielski 765*b1cdbd2cSJim Jagielski # Copying the package from the pool into the installation set 766*b1cdbd2cSJim Jagielski $newpackagepath = copy_package_from_pool($installdir, $subdir, $realpackagename); 767*b1cdbd2cSJim Jagielski } 768*b1cdbd2cSJim Jagielski 769*b1cdbd2cSJim Jagielski # Before the lock file in the pool can be removed, it has to be checked, if this process is still the owner of this lock file. 770*b1cdbd2cSJim Jagielski # Check, if lock file still exists and if this process is the owner. 771*b1cdbd2cSJim Jagielski if ( ! -f $checkfilename ) 772*b1cdbd2cSJim Jagielski { 773*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" was removed by another process (C)!\n"; 774*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 775*b1cdbd2cSJim Jagielski log_pool_info(0); 776*b1cdbd2cSJim Jagielski 777*b1cdbd2cSJim Jagielski # removing new package from installation set 778*b1cdbd2cSJim Jagielski if ( $newpackagepath ne "" ) { remove_package_from_installset($newpackagepath); } # A file was copied and a problem occured with pooling 779*b1cdbd2cSJim Jagielski 780*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 781*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 782*b1cdbd2cSJim Jagielski } 783*b1cdbd2cSJim Jagielski 784*b1cdbd2cSJim Jagielski if ( ! process_is_owner($checkfilename) ) 785*b1cdbd2cSJim Jagielski { 786*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (C)!\n"; 787*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 788*b1cdbd2cSJim Jagielski log_pool_info(1); 789*b1cdbd2cSJim Jagielski 790*b1cdbd2cSJim Jagielski # removing new package from installation set 791*b1cdbd2cSJim Jagielski if ( $newpackagepath ne "" ) { remove_package_from_installset($newpackagepath); } # A file was copied and a problem occured with pooling 792*b1cdbd2cSJim Jagielski 793*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 794*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 795*b1cdbd2cSJim Jagielski } 796*b1cdbd2cSJim Jagielski 797*b1cdbd2cSJim Jagielski # Removing the check file, releasing this package for the next process. 798*b1cdbd2cSJim Jagielski # The Lock to create this package still exists, if required. 799*b1cdbd2cSJim Jagielski unlink $checkfilename; 800*b1cdbd2cSJim Jagielski $installer::globals::processhaspoolcheckfile = 0; 801*b1cdbd2cSJim Jagielski $infoline = "Pool: Removing file: $checkfilename\n"; 802*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 803*b1cdbd2cSJim Jagielski 804*b1cdbd2cSJim Jagielski # Last chance before packaging starts, to check, if this process is really still owner 805*b1cdbd2cSJim Jagielski # of the packaging lock file. If not, this packaging process can be repeated. 806*b1cdbd2cSJim Jagielski if ( $installer::globals::processhaspoollockfile ) 807*b1cdbd2cSJim Jagielski { 808*b1cdbd2cSJim Jagielski if ( ! -f $lockfilename ) 809*b1cdbd2cSJim Jagielski { 810*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$lockfilename\" was removed by another process (E)!\n"; 811*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 812*b1cdbd2cSJim Jagielski log_pool_info(0); 813*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 814*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 815*b1cdbd2cSJim Jagielski } 816*b1cdbd2cSJim Jagielski 817*b1cdbd2cSJim Jagielski if ( ! process_is_owner($lockfilename) ) 818*b1cdbd2cSJim Jagielski { 819*b1cdbd2cSJim Jagielski $infoline = "Pool problem: Pool lock file \"$lockfilename\" belongs to another process (E)!\n"; 820*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 821*b1cdbd2cSJim Jagielski log_pool_info(1); 822*b1cdbd2cSJim Jagielski $package_is_up_to_date = 4; # repeat this package 823*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 824*b1cdbd2cSJim Jagielski } 825*b1cdbd2cSJim Jagielski } 826*b1cdbd2cSJim Jagielski 827*b1cdbd2cSJim Jagielski # Collecting log information 828*b1cdbd2cSJim Jagielski if ( $package_is_up_to_date == 1 ) { $installer::globals::poolpackages{$packagename} = 1; } 829*b1cdbd2cSJim Jagielski if ( $package_is_up_to_date == 0 ) 830*b1cdbd2cSJim Jagielski { 831*b1cdbd2cSJim Jagielski my @packreasons = (); 832*b1cdbd2cSJim Jagielski if ( $package_already_exists ) 833*b1cdbd2cSJim Jagielski { 834*b1cdbd2cSJim Jagielski $infoline = "\t\tPool: $packagename: Contains new content, creating new package. Differences:\n"; 835*b1cdbd2cSJim Jagielski push( @packreasons, $infoline); 836*b1cdbd2cSJim Jagielski foreach my $dest ( sort keys %installer::globals::pcfdifflist ) { push( @packreasons, "\t\t$dest\n"); } 837*b1cdbd2cSJim Jagielski foreach my $dest ( @installer::globals::pcfdiffcomment ) { push( @packreasons, "\t\t$dest"); } 838*b1cdbd2cSJim Jagielski foreach my $dest ( @installer::globals::epmdifflist ) { push( @packreasons, "\t\t$dest"); } 839*b1cdbd2cSJim Jagielski } 840*b1cdbd2cSJim Jagielski else 841*b1cdbd2cSJim Jagielski { 842*b1cdbd2cSJim Jagielski $infoline = "\t\tPool: $packagename: Does not exist in pool.\n"; 843*b1cdbd2cSJim Jagielski push( @packreasons, $infoline); 844*b1cdbd2cSJim Jagielski } 845*b1cdbd2cSJim Jagielski 846*b1cdbd2cSJim Jagielski $installer::globals::createpackages{$packagename} = \@packreasons; 847*b1cdbd2cSJim Jagielski } 848*b1cdbd2cSJim Jagielski 849*b1cdbd2cSJim Jagielski return $package_is_up_to_date; 850*b1cdbd2cSJim Jagielski} 851*b1cdbd2cSJim Jagielski 852*b1cdbd2cSJim Jagielski################################################### 853*b1cdbd2cSJim Jagielski# Determine, which package was created newly 854*b1cdbd2cSJim Jagielski################################################### 855*b1cdbd2cSJim Jagielski 856*b1cdbd2cSJim Jagielskisub determine_new_packagename 857*b1cdbd2cSJim Jagielski{ 858*b1cdbd2cSJim Jagielski my ( $dir ) = @_; 859*b1cdbd2cSJim Jagielski 860*b1cdbd2cSJim Jagielski my ($newcontent, $allcontent) = installer::systemactions::find_new_content_in_directory($dir, \@installer::globals::installsetcontent); 861*b1cdbd2cSJim Jagielski @installer::globals::installsetcontent = (); 862*b1cdbd2cSJim Jagielski foreach my $element ( @{$allcontent} ) { push(@installer::globals::installsetcontent, $element); } 863*b1cdbd2cSJim Jagielski 864*b1cdbd2cSJim Jagielski my $newentriesnumber = $#{$newcontent} + 1; 865*b1cdbd2cSJim Jagielski if ( $newentriesnumber > 1 ) 866*b1cdbd2cSJim Jagielski { 867*b1cdbd2cSJim Jagielski my $newpackages = ""; 868*b1cdbd2cSJim Jagielski foreach my $onepackage ( @{$newcontent} ) { $newpackages = $newpackages . " " . $onepackage; } 869*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: More than one new package in directory $dir ($newpackages)", "determine_new_packagename (packagepool)"); 870*b1cdbd2cSJim Jagielski } 871*b1cdbd2cSJim Jagielski elsif ( $newentriesnumber < 1 ) 872*b1cdbd2cSJim Jagielski { 873*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: No new package in directory $dir", "determine_new_packagename (packagepool)"); 874*b1cdbd2cSJim Jagielski } 875*b1cdbd2cSJim Jagielski my $newpackage = ${$newcontent}[0]; 876*b1cdbd2cSJim Jagielski 877*b1cdbd2cSJim Jagielski return $newpackage; 878*b1cdbd2cSJim Jagielski} 879*b1cdbd2cSJim Jagielski 880*b1cdbd2cSJim Jagielski#################################################### 881*b1cdbd2cSJim Jagielski# Including content into the package pool 882*b1cdbd2cSJim Jagielski#################################################### 883*b1cdbd2cSJim Jagielski 884*b1cdbd2cSJim Jagielskisub put_content_into_pool 885*b1cdbd2cSJim Jagielski{ 886*b1cdbd2cSJim Jagielski my ($packagename, $installdir, $subdir, $filesinpackage, $epmfilecontent) = @_; 887*b1cdbd2cSJim Jagielski 888*b1cdbd2cSJim Jagielski my $infoline = ""; 889*b1cdbd2cSJim Jagielski 890*b1cdbd2cSJim Jagielski my $fullinstalldir = $installdir . $installer::globals::separator . $subdir; 891*b1cdbd2cSJim Jagielski my $fullrealpackagename = determine_new_packagename($fullinstalldir); 892*b1cdbd2cSJim Jagielski my $realpackagename = $fullrealpackagename; 893*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$realpackagename); 894*b1cdbd2cSJim Jagielski 895*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Adding content into the package pool: $realpackagename (PackageName: $packagename)"); 896*b1cdbd2cSJim Jagielski 897*b1cdbd2cSJim Jagielski # Calculating content for pcf file, if not already done in "package_is_up_to_date" 898*b1cdbd2cSJim Jagielski if ( ! $installer::globals::newpcfcontentcalculated ) 899*b1cdbd2cSJim Jagielski { 900*b1cdbd2cSJim Jagielski $installer::globals::newpcfcontent = calculate_current_content($filesinpackage, $packagename); 901*b1cdbd2cSJim Jagielski $installer::globals::newpcfcontentcalculated = 1; 902*b1cdbd2cSJim Jagielski } 903*b1cdbd2cSJim Jagielski 904*b1cdbd2cSJim Jagielski # Determining md5sum and FileSize for the new package and saving in pcf file 905*b1cdbd2cSJim Jagielski my $md5sum = installer::xpdinstaller::get_md5_value($fullrealpackagename); 906*b1cdbd2cSJim Jagielski my $filesize = installer::xpdinstaller::get_size_value($fullrealpackagename); 907*b1cdbd2cSJim Jagielski my $fullpackagename = installer::xpdinstaller::get_fullpkgname_value($fullrealpackagename); 908*b1cdbd2cSJim Jagielski my $pkgversion = installer::xpdinstaller::get_pkgversion_value($fullrealpackagename); 909*b1cdbd2cSJim Jagielski 910*b1cdbd2cSJim Jagielski # Put package content file (pcf) into pool 911*b1cdbd2cSJim Jagielski my $pcffilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf"; 912*b1cdbd2cSJim Jagielski create_pcfcontent_file($realpackagename, $md5sum, $filesize, $fullpackagename, $pkgversion, $epmfilecontent, $pcffilename); 913*b1cdbd2cSJim Jagielski 914*b1cdbd2cSJim Jagielski # Creating xpd info 915*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'FileSize'} = $filesize; 916*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'FullPackageName'} = $fullpackagename; 917*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'md5sum'} = $md5sum; 918*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'RealPackageName'} = $realpackagename; 919*b1cdbd2cSJim Jagielski $installer::globals::xpdpackageinfo{'PkgVersion'} = $pkgversion; 920*b1cdbd2cSJim Jagielski 921*b1cdbd2cSJim Jagielski # Put package into pool 922*b1cdbd2cSJim Jagielski $infoline = "Pool: Adding package \"$packagename\" into pool.\n"; 923*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 924*b1cdbd2cSJim Jagielski 925*b1cdbd2cSJim Jagielski # Copying with unique name, containing PID. Only renaming if everything was fine. 926*b1cdbd2cSJim Jagielski my $realdestination = ""; 927*b1cdbd2cSJim Jagielski my $uniquedestination = ""; 928*b1cdbd2cSJim Jagielski if ( -f $fullrealpackagename ) 929*b1cdbd2cSJim Jagielski { 930*b1cdbd2cSJim Jagielski $realdestination = $installer::globals::poolpath . $installer::globals::separator . $realpackagename; 931*b1cdbd2cSJim Jagielski $uniquedestination = $realdestination . "." . $installer::globals::sessionid; 932*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($fullrealpackagename, $uniquedestination); 933*b1cdbd2cSJim Jagielski } 934*b1cdbd2cSJim Jagielski 935*b1cdbd2cSJim Jagielski # Copying Solaris packages (as tar files) 936*b1cdbd2cSJim Jagielski if ( -d $fullrealpackagename ) 937*b1cdbd2cSJim Jagielski { 938*b1cdbd2cSJim Jagielski my $tarfilename = $packagename . ".tar"; 939*b1cdbd2cSJim Jagielski my $fulltarfilename = $fullinstalldir . $installer::globals::separator . $tarfilename; 940*b1cdbd2cSJim Jagielski my $size = installer::worker::tar_package($fullinstalldir, $packagename, $tarfilename, $installer::globals::getuidpath); 941*b1cdbd2cSJim Jagielski if (( ! -f $fulltarfilename ) || ( ! ( $size > 0 ))) { installer::exiter::exit_program("ERROR: Missing file: $fulltarfilename", "put_content_into_pool"); } 942*b1cdbd2cSJim Jagielski $realdestination = $installer::globals::poolpath . $installer::globals::separator . $tarfilename; 943*b1cdbd2cSJim Jagielski $uniquedestination = $realdestination . "." . $installer::globals::sessionid; 944*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($fulltarfilename, $uniquedestination); 945*b1cdbd2cSJim Jagielski unlink $fulltarfilename; 946*b1cdbd2cSJim Jagielski } 947*b1cdbd2cSJim Jagielski 948*b1cdbd2cSJim Jagielski # Before the new package is renamed in the pool, it has to be checked, if this process still has the lock for this package. 949*b1cdbd2cSJim Jagielski # Check, if lock file still exists and if this process is the owner. Otherwise a pool error occured. 950*b1cdbd2cSJim Jagielski if ( ! -f $installer::globals::poollockfilename ) 951*b1cdbd2cSJim Jagielski { 952*b1cdbd2cSJim Jagielski unlink $uniquedestination; # removing file from pool 953*b1cdbd2cSJim Jagielski log_pool_info(0); 954*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" was removed by another process (F)!", "put_content_into_pool"); 955*b1cdbd2cSJim Jagielski } 956*b1cdbd2cSJim Jagielski 957*b1cdbd2cSJim Jagielski if ( ! process_is_owner($installer::globals::poollockfilename) ) 958*b1cdbd2cSJim Jagielski { 959*b1cdbd2cSJim Jagielski unlink $uniquedestination; # removing file from pool 960*b1cdbd2cSJim Jagielski log_pool_info(1); 961*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" belongs to another process (F)!", "put_content_into_pool"); 962*b1cdbd2cSJim Jagielski } 963*b1cdbd2cSJim Jagielski 964*b1cdbd2cSJim Jagielski # Renaming the file in the pool (atomic step) 965*b1cdbd2cSJim Jagielski rename($uniquedestination, $realdestination); 966*b1cdbd2cSJim Jagielski 967*b1cdbd2cSJim Jagielski $infoline = "Pool: Renamed file: \"$uniquedestination\" to \"$realdestination\".\n"; 968*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 969*b1cdbd2cSJim Jagielski 970*b1cdbd2cSJim Jagielski # Before the lock file in the pool can be removed, it has to be checked, if this process is still the owner of this lock file. 971*b1cdbd2cSJim Jagielski # Check, if lock file still exists and if this process is the owner. Otherwise a pool error occured. 972*b1cdbd2cSJim Jagielski if ( ! -f $installer::globals::poollockfilename ) 973*b1cdbd2cSJim Jagielski { 974*b1cdbd2cSJim Jagielski log_pool_info(0); 975*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" was removed by another process (G)!", "put_content_into_pool"); 976*b1cdbd2cSJim Jagielski } 977*b1cdbd2cSJim Jagielski 978*b1cdbd2cSJim Jagielski if ( ! process_is_owner($installer::globals::poollockfilename) ) 979*b1cdbd2cSJim Jagielski { 980*b1cdbd2cSJim Jagielski log_pool_info(1); 981*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" belongs to another process (G)!", "put_content_into_pool"); 982*b1cdbd2cSJim Jagielski } 983*b1cdbd2cSJim Jagielski 984*b1cdbd2cSJim Jagielski # Removing lock file, so that other processes can use this package now 985*b1cdbd2cSJim Jagielski unlink $installer::globals::poollockfilename; 986*b1cdbd2cSJim Jagielski $installer::globals::processhaspoollockfile = 0; 987*b1cdbd2cSJim Jagielski $infoline = "Pool: Removing file: $installer::globals::poollockfilename\n"; 988*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 989*b1cdbd2cSJim Jagielski} 990*b1cdbd2cSJim Jagielski 991*b1cdbd2cSJim Jagielski################################################################### 992*b1cdbd2cSJim Jagielski# Copying a package from the pool into the installation set 993*b1cdbd2cSJim Jagielski################################################################### 994*b1cdbd2cSJim Jagielski 995*b1cdbd2cSJim Jagielskisub copy_package_from_pool 996*b1cdbd2cSJim Jagielski{ 997*b1cdbd2cSJim Jagielski my ($installdir, $subdir, $packagename) = @_; 998*b1cdbd2cSJim Jagielski 999*b1cdbd2cSJim Jagielski my $infoline = "Pool: Using package \"$packagename\" from pool.\n"; 1000*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1001*b1cdbd2cSJim Jagielski my $sourcefile = $installer::globals::poolpath . $installer::globals::separator . $packagename; 1002*b1cdbd2cSJim Jagielski if ( $installer::globals::issolarisbuild ) { $sourcefile = $sourcefile . ".tar"; } 1003*b1cdbd2cSJim Jagielski if ( ! -f $sourcefile ) { installer::exiter::exit_program("ERROR: Missing package in package pool: \"$sourcefile\"", "copy_package_from_pool"); } 1004*b1cdbd2cSJim Jagielski my $destination = $installdir . $installer::globals::separator . $subdir; 1005*b1cdbd2cSJim Jagielski if ( ! -d $destination ) { installer::systemactions::create_directory($destination); } 1006*b1cdbd2cSJim Jagielski my $destinationfile = $destination . $installer::globals::separator . $packagename; 1007*b1cdbd2cSJim Jagielski if ( $installer::globals::issolarisbuild ) { $destinationfile = $destinationfile . ".tar"; } 1008*b1cdbd2cSJim Jagielski if ( -f $sourcefile ) { installer::systemactions::copy_one_file($sourcefile, $destinationfile); } 1009*b1cdbd2cSJim Jagielski # Unpacking for Solaris 1010*b1cdbd2cSJim Jagielski if ( $installer::globals::issolarisbuild ) 1011*b1cdbd2cSJim Jagielski { 1012*b1cdbd2cSJim Jagielski my $tarfilename = $packagename . ".tar"; 1013*b1cdbd2cSJim Jagielski installer::worker::untar_package($destination, $tarfilename, $installer::globals::getuidpath); 1014*b1cdbd2cSJim Jagielski unlink $destinationfile; 1015*b1cdbd2cSJim Jagielski $destinationfile =~ s/.tar\s*$//; 1016*b1cdbd2cSJim Jagielski } 1017*b1cdbd2cSJim Jagielski 1018*b1cdbd2cSJim Jagielski # Keeping the content of @installer::globals::installsetcontent up to date (with full pathes): 1019*b1cdbd2cSJim Jagielski push(@installer::globals::installsetcontent, $destinationfile); 1020*b1cdbd2cSJim Jagielski 1021*b1cdbd2cSJim Jagielski return $destinationfile; 1022*b1cdbd2cSJim Jagielski} 1023*b1cdbd2cSJim Jagielski 1024*b1cdbd2cSJim Jagielski################################################################### 1025*b1cdbd2cSJim Jagielski# Counting keys in hash 1026*b1cdbd2cSJim Jagielski################################################################### 1027*b1cdbd2cSJim Jagielski 1028*b1cdbd2cSJim Jagielskisub get_count 1029*b1cdbd2cSJim Jagielski{ 1030*b1cdbd2cSJim Jagielski my ( $hashref ) = @_; 1031*b1cdbd2cSJim Jagielski 1032*b1cdbd2cSJim Jagielski my $counter = 0; 1033*b1cdbd2cSJim Jagielski foreach my $onekey ( keys %{$hashref} ) { $counter++; } 1034*b1cdbd2cSJim Jagielski return $counter; 1035*b1cdbd2cSJim Jagielski} 1036*b1cdbd2cSJim Jagielski 1037*b1cdbd2cSJim Jagielski################################################################### 1038*b1cdbd2cSJim Jagielski# Logging some pool information 1039*b1cdbd2cSJim Jagielski################################################################### 1040*b1cdbd2cSJim Jagielski 1041*b1cdbd2cSJim Jagielskisub log_pool_statistics 1042*b1cdbd2cSJim Jagielski{ 1043*b1cdbd2cSJim Jagielski my $infoline = ""; 1044*b1cdbd2cSJim Jagielski 1045*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("Pool statistics:"); 1046*b1cdbd2cSJim Jagielski 1047*b1cdbd2cSJim Jagielski # Info collected in global hashes 1048*b1cdbd2cSJim Jagielski # %installer::globals::createpackages 1049*b1cdbd2cSJim Jagielski # %installer::globals::poolpackages 1050*b1cdbd2cSJim Jagielski 1051*b1cdbd2cSJim Jagielski my $pool_packages = get_count(\%installer::globals::poolpackages); 1052*b1cdbd2cSJim Jagielski my $created_packages = get_count(\%installer::globals::createpackages); 1053*b1cdbd2cSJim Jagielski 1054*b1cdbd2cSJim Jagielski $infoline = "Number of packages from pool: $pool_packages\n"; 1055*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1056*b1cdbd2cSJim Jagielski 1057*b1cdbd2cSJim Jagielski foreach my $packagename ( sort keys(%installer::globals::poolpackages) ) 1058*b1cdbd2cSJim Jagielski { 1059*b1cdbd2cSJim Jagielski $infoline = "\t$packagename\n"; 1060*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1061*b1cdbd2cSJim Jagielski } 1062*b1cdbd2cSJim Jagielski 1063*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 1064*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("Number of packages that were created: %s\n", $created_packages); 1065*b1cdbd2cSJim Jagielski 1066*b1cdbd2cSJim Jagielski foreach my $packagename ( sort keys(%installer::globals::createpackages) ) 1067*b1cdbd2cSJim Jagielski { 1068*b1cdbd2cSJim Jagielski $infoline = "\t$packagename\n"; 1069*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1070*b1cdbd2cSJim Jagielski my $reason = $installer::globals::createpackages{$packagename}; 1071*b1cdbd2cSJim Jagielski 1072*b1cdbd2cSJim Jagielski foreach my $line (@reason) 1073*b1cdbd2cSJim Jagielski { 1074*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($line); 1075*b1cdbd2cSJim Jagielski } 1076*b1cdbd2cSJim Jagielski } 1077*b1cdbd2cSJim Jagielski} 1078*b1cdbd2cSJim Jagielski 1079*b1cdbd2cSJim Jagielski1; 1080