1#**************************************************************
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
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
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.
19#
20#**************************************************************
21
22
23
24package installer::epmfile;
25
26use Cwd;
27use installer::converter;
28use installer::existence;
29use installer::exiter;
30use installer::files;
31use installer::globals;
32use installer::logger;
33use installer::packagelist;
34use installer::pathanalyzer;
35use installer::remover;
36use installer::scriptitems;
37use installer::systemactions;
38use installer::worker;
39use POSIX qw(uname);
40
41############################################################################
42# Reading the package map to find Solaris package names for
43# the corresponding abbreviations
44############################################################################
45
46sub read_packagemap
47{
48	my ($allvariables, $includepatharrayref, $languagesarrayref) = @_;
49
50	my $packagemapname = "";
51	if ( $allvariables->{'PACKAGEMAP'} ) { $packagemapname = $allvariables->{'PACKAGEMAP'}; }
52	if ( $packagemapname eq "" ) { installer::exiter::exit_program("ERROR: Property PACKAGEMAP must be defined!", "read_packagemap"); }
53
54    $installer::logger::Lang->printf("\n");
55    $installer::logger::Lang->printf("\n");
56    $installer::logger::Lang->printf("nCollected abbreviations and package names:\n");
57
58	# Can be a comma separated list. All files have to be found in include pathes
59	my $allpackagemapnames = installer::converter::convert_stringlist_into_hash(\$packagemapname, ",");
60	foreach my $onepackagemapname ( keys %{$allpackagemapnames} )
61	{
62		my $packagemapref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onepackagemapname, $includepatharrayref, 0);
63
64		if ( $$packagemapref eq "" ) { installer::exiter::exit_program("ERROR: Could not find package map file \"$onepackagemapname\" (propery PACKAGEMAP)!", "read_packagemap"); }
65
66		my $packagemapcontent = installer::files::read_file($$packagemapref);
67
68		for ( my $i = 0; $i <= $#{$packagemapcontent}; $i++ )
69		{
70			my $line = ${$packagemapcontent}[$i];
71
72			if ( $line =~ /^\s*\#/ ) { next; }  # comment line
73			if ( $line =~ /^\s*$/ ) { next; }  # empty line
74
75			if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ )
76			{
77				my $abbreviation = $1;
78				my $packagename = $2;
79				installer::packagelist::resolve_packagevariables(\$abbreviation, $allvariables, 0);
80				installer::packagelist::resolve_packagevariables(\$packagename, $allvariables, 0);
81
82				# Special handling for language strings %LANGUAGESTRING
83
84				if (( $abbreviation =~ /\%LANGUAGESTRING/ ) || ( $packagename =~ /\%LANGUAGESTRING/ ))
85				{
86					foreach my $onelang ( @{$languagesarrayref} )
87					{
88                        my $local_abbreviation = $abbreviation;
89                        my $local_packagename = $packagename;
90						$local_abbreviation =~ s/\%LANGUAGESTRING/$onelang/g;
91						$local_packagename =~ s/\%LANGUAGESTRING/$onelang/g;
92
93                        # Logging all abbreviations and packagenames
94                        $installer::logger::Lang->printf("%s : %s : %s\n",
95                            $onelang,
96                            $local_abbreviation,
97                            $local_packagename);
98
99						if ( exists($installer::globals::dependfilenames{$local_abbreviation}) )
100						{
101							installer::exiter::exit_program("ERROR: Packagename for  Solaris package $local_abbreviation already defined ($installer::globals::dependfilenames{$local_abbreviation})!", "read_packagemap");
102						}
103						else
104						{
105							$installer::globals::dependfilenames{$local_abbreviation} = $local_packagename;
106						}
107					}
108				}
109				else
110				{
111                    # Logging all abbreviations and packagenames
112                    $installer::logger::Lang->printf("%s : %s\n", $abbreviation, $packagename);
113
114					if ( exists($installer::globals::dependfilenames{$abbreviation}) )
115					{
116						installer::exiter::exit_program("ERROR: Packagename for  Solaris package $abbreviation already defined ($installer::globals::dependfilenames{$abbreviation})!", "read_packagemap");
117					}
118					else
119					{
120						$installer::globals::dependfilenames{$abbreviation} = $packagename;
121					}
122				}
123			}
124			else
125			{
126				my $errorline = $i + 1;
127				installer::exiter::exit_program("ERROR: Wrong syntax in file \"$onepackagemapname\" (line $errorline)!", "read_packagemap");
128			}
129		}
130	}
131
132    $installer::logger::Lang->print("\n");
133    $installer::logger::Lang->print("\n");
134}
135
136############################################################################
137# The header file contains the strings for the epm header in all languages
138############################################################################
139
140sub get_string_from_headerfile
141{
142	my ($searchstring, $language, $fileref) = @_;
143
144	my $returnstring  = "";
145	my $onestring  = "";
146	my $englishstring  = "";
147	my $foundblock = 0;
148	my $foundstring = 0;
149	my $foundenglishstring = 0;
150	my $englishidentifier = "01";
151
152	$searchstring = "[" . $searchstring . "]";
153
154	for ( my $i = 0; $i <= $#{$fileref}; $i++ )
155	{
156		my $line = ${$fileref}[$i];
157
158		if ( $line =~ /^\s*\Q$searchstring\E\s*$/ )
159		{
160			$foundblock = 1;
161			my $counter = $i + 1;
162
163			$line = ${$fileref}[$counter];
164
165			# Beginning of the next block oder Dateiende
166
167			while ((!($line =~ /^\s*\[\s*\w+\s*\]\s*$/ )) && ( $counter <= $#{$fileref} ))
168			{
169				if ( $line =~ /^\s*\Q$language\E\s+\=\s*\"(.*)\"\s*$/ )
170				{
171					$onestring = $1;
172					$foundstring = 1;
173					last;
174				}
175
176				if ( $line =~ /^\s*\Q$englishidentifier\E\s+\=\s*\"(.*)\"\s*$/ )
177				{
178					$englishstring = $1;
179					$foundenglishstring = 1;
180				}
181
182				$counter++;
183				$line = ${$fileref}[$counter];
184			}
185		}
186	}
187
188	if ( $foundstring )
189	{
190		$returnstring = $onestring;
191	}
192	else
193	{
194		if ( $foundenglishstring )
195		{
196			$returnstring = $englishstring;
197		}
198		else
199		{
200			installer::exiter::exit_program("ERROR: No string found for $searchstring in epm header file (-h)", "get_string_from_headerfile");
201		}
202	}
203
204	return \$returnstring;
205}
206
207##########################################################
208# Filling the epm file with directories, files and links
209##########################################################
210
211sub put_directories_into_epmfile
212{
213	my ($directoriesarrayref, $epmfileref, $allvariables, $packagerootpath) = @_;
214	my $group = "bin";
215
216	if ( $installer::globals::islinuxbuild )
217	{
218		$group = "root";
219	}
220
221	for ( my $i = 0; $i <= $#{$directoriesarrayref}; $i++ )
222	{
223		my $onedir = ${$directoriesarrayref}[$i];
224		my $dir = "";
225
226		if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
227
228		# if (!($dir =~ /\bPREDEFINED_/ ))
229		if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ ))
230		{
231			my $hostname = $onedir->{'HostName'};
232
233			# not including simple directory "/opt"
234			# if (( $allvariables->{'SETSTATICPATH'} ) && ( $hostname eq $packagerootpath )) { next; }
235
236			my $line = "d 755 root $group $hostname -\n";
237
238			push(@{$epmfileref}, $line)
239		}
240	}
241}
242
243sub put_files_into_epmfile
244{
245	my ($filesinproductarrayref, $epmfileref) = @_;
246
247	for ( my $i = 0; $i <= $#{$filesinproductarrayref}; $i++ )
248	{
249		my $onefile = ${$filesinproductarrayref}[$i];
250
251		my $unixrights = $onefile->{'UnixRights'};
252		my $destination = $onefile->{'destination'};
253		my $sourcepath = $onefile->{'sourcepath'};
254
255		my $filetype = "f";
256		my $styles = "";
257		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
258		if ( $styles =~ /\bCONFIGFILE\b/ ) { $filetype = "c"; }
259
260		my $group = "bin";
261		if ( $installer::globals::islinuxbuild ) { $group = "root"; }
262		if (( $installer::globals::issolarisbuild ) && ( $onefile->{'SolarisGroup'} )) { $group = $onefile->{'SolarisGroup'}; }
263
264		my $line = "$filetype $unixrights root $group $destination $sourcepath\n";
265
266		push(@{$epmfileref}, $line);
267	}
268}
269
270sub put_links_into_epmfile
271{
272	my ($linksinproductarrayref, $epmfileref) = @_;
273	my $group = "bin";
274
275	if ( $installer::globals::islinuxbuild )
276	{
277		$group = "root";
278	}
279
280
281	for ( my $i = 0; $i <= $#{$linksinproductarrayref}; $i++ )
282	{
283		my $onelink = ${$linksinproductarrayref}[$i];
284		my $destination = $onelink->{'destination'};
285		my $destinationfile = $onelink->{'destinationfile'};
286
287		my $line = "l 000 root $group $destination $destinationfile\n";
288
289		push(@{$epmfileref}, $line)
290	}
291}
292
293sub put_unixlinks_into_epmfile
294{
295	my ($unixlinksinproductarrayref, $epmfileref) = @_;
296	my $group = "bin";
297
298	if ( $installer::globals::islinuxbuild ) { $group = "root";	}
299
300	for ( my $i = 0; $i <= $#{$unixlinksinproductarrayref}; $i++ )
301	{
302		my $onelink = ${$unixlinksinproductarrayref}[$i];
303		my $destination = $onelink->{'destination'};
304		my $target = $onelink->{'Target'};
305
306		my $line = "l 000 root $group $destination $target\n";
307
308		push(@{$epmfileref}, $line)
309	}
310}
311
312###############################################
313# Creating epm header file
314###############################################
315
316sub create_epm_header
317{
318	my ($variableshashref, $filesinproduct, $languagesref, $onepackage) = @_;
319
320	my @epmheader = ();
321
322	my ($licensefilename, $readmefilename);
323
324	my $foundlicensefile = 0;
325	my $foundreadmefile = 0;
326
327	my $line = "";
328	my $infoline = "";
329
330	# %product Apache OpenOffice Software
331	# %version 2.0
332	# %description A really great software
333	# %copyright 1999-2003 by OOo
334	# %vendor Apache OpenOffice project
335	# %license /test/replace/01/LICENSE01
336	# %readme /test/replace/01/README01
337	# %requires foo
338	# %provides bar
339
340	# The first language in the languages array determines the language of license and readme file
341
342	my $searchlanguage = ${$languagesref}[0];
343
344	# using the description for the %product line in the epm list file
345
346	my $productnamestring = $onepackage->{'description'};
347	installer::packagelist::resolve_packagevariables(\$productnamestring, $variableshashref, 0);
348	if ( $variableshashref->{'PRODUCTEXTENSION'} ) { $productnamestring = $productnamestring . " " . $variableshashref->{'PRODUCTEXTENSION'}; }
349
350	$line = "%product" . " " . $productnamestring . "\n";
351	push(@epmheader, $line);
352
353	# Determining the release version
354	# This release version has to be listed in the line %version : %version versionnumber releasenumber
355
356	# if ( $variableshashref->{'PACKAGEVERSION'} ) { $installer::globals::packageversion = $variableshashref->{'PACKAGEVERSION'}; }
357	if ( ! $onepackage->{'packageversion'} ) { installer::exiter::exit_program("ERROR: No packageversion defined for package: $onepackage->{'module'}!", "create_epm_header"); }
358	$installer::globals::packageversion = $onepackage->{'packageversion'};
359	installer::packagelist::resolve_packagevariables(\$installer::globals::packageversion, $variableshashref, 0);
360	if ( $variableshashref->{'PACKAGEREVISION'} ) { $installer::globals::packagerevision = $variableshashref->{'PACKAGEREVISION'}; }
361
362	$line = "%version" . " " . $installer::globals::packageversion . "\n";
363	push(@epmheader, $line);
364
365	$line = "%release" . " " . $installer::globals::packagerevision . "\n";
366	if ( $installer::globals::islinuxrpmbuild ) { $line = "%release" . " " . $installer::globals::buildid . "\n"; }
367	push(@epmheader, $line);
368
369	# Description, Copyright and Vendor are multilingual and are defined in
370	# the string file for the header file ($headerfileref)
371
372	my $descriptionstring = $onepackage->{'description'};
373	installer::packagelist::resolve_packagevariables(\$descriptionstring, $variableshashref, 0);
374	$line = "%description" . " " . $descriptionstring . "\n";
375	push(@epmheader, $line);
376
377	my $copyrightstring = $onepackage->{'copyright'};
378	installer::packagelist::resolve_packagevariables(\$copyrightstring, $variableshashref, 0);
379	$line = "%copyright" . " " . $copyrightstring . "\n";
380	push(@epmheader, $line);
381
382	my $vendorstring = $onepackage->{'vendor'};
383	installer::packagelist::resolve_packagevariables(\$vendorstring, $variableshashref, 0);
384	$line = "%vendor" . " " . $vendorstring . "\n";
385	push(@epmheader, $line);
386
387	# License and Readme file can be included automatically from the file list
388
389	if ( $installer::globals::iswindowsbuild || $installer::globals::isos2 )
390	{
391		$licensefilename = "LICENSE.txt";
392		$readmefilename = "readme.txt";
393	}
394	else
395	{
396		$licensefilename = "LICENSE";
397		$readmefilename = "README";
398	}
399
400	if (( $installer::globals::languagepack )	# in language packs the files LICENSE and README are removed, because they are not language specific
401		|| ( $variableshashref->{'NO_README_IN_ROOTDIR'} ))
402	{
403		if ( $installer::globals::iswindowsbuild || $installer::globals::isos2 )
404		{
405			$licensefilename = "LICENSE.txt";
406			$readmefilename = "readme_$searchlanguage.txt";
407		}
408		else
409		{
410			$licensefilename = "LICENSE";
411			$readmefilename = "README_$searchlanguage";
412		}
413	}
414
415	my $license_in_package_defined = 0;
416
417	if ( $installer::globals::issolarisbuild )
418	{
419		if ( $onepackage->{'solariscopyright'} )
420		{
421			$licensefilename = $onepackage->{'solariscopyright'};
422			$license_in_package_defined = 1;
423		}
424	}
425
426	# Process for Linux packages, in which only a very basic license file is
427	# included into the package.
428
429	if ( $installer::globals::islinuxbuild )
430	{
431		if ( $variableshashref->{'COPYRIGHT_INTO_LINUXPACKAGE'} )
432		{
433			$licensefilename = "linuxcopyrightfile";
434			$license_in_package_defined = 1;
435		}
436	}
437	# searching for and readme file
438
439	for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ )
440	{
441		my $onefile = ${$filesinproduct}[$i];
442		my $filename = $onefile->{'Name'};
443		if ( $filename eq $readmefilename )
444		{
445			$foundreadmefile = 1;
446			$line = "%readme" . " " . $onefile->{'sourcepath'} . "\n";
447			push(@epmheader, $line);
448			last;
449		}
450	}
451
452	# searching for and license file
453
454	if ( $license_in_package_defined )
455	{
456		my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0);
457
458		if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (A)!", "create_epm_header"); }
459
460		# Special handling to add the content of the file "license_en-US" to the solaris copyrightfile. But not for all products
461
462		if (( $installer::globals::issolarispkgbuild ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} ))
463		{
464			if ( ! $installer::globals::englishlicenseset ) { installer::worker::set_english_license() }
465
466			# The location for the new file
467			my $languagestring = "";
468			for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) { $languagestring = $languagestring . "_" . ${$languagesref}[$i]; }
469			$languagestring =~ s/^\s*_//;
470
471			my $copyrightdir = installer::systemactions::create_directories("copyright", \$languagestring);
472
473			my $copyrightfile = installer::files::read_file($$fileref);
474
475			# Adding license content to copyright file
476			push(@{$copyrightfile}, "\n");
477			for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); }
478
479			# New destination for $$fileref
480			$$fileref = $copyrightdir . $installer::globals::separator . "solariscopyrightfile_" . $onepackage->{'module'};
481			if ( -f $$fileref ) { unlink $$fileref; }
482			installer::files::save_file($$fileref, $copyrightfile);
483		}
484
485        $installer::logger::Lang->printf("Using license file: \"%s\"!\n", $$fileref);
486
487		$foundlicensefile = 1;
488		$line = "%license" . " " . $$fileref . "\n";
489		push(@epmheader, $line);
490	}
491	else
492	{
493		# refer to the license in the matching AOO installation
494		# TODO: sync AOO dest license full path with lpacks/sdks/exts
495		my $licpath = "openoffice4/program/" . $licensefilename;
496		$foundlicensefile = 1;
497		$line = "%license " . $licpath . "\n";
498		push(@epmheader, $line);
499	}
500
501	if (!($foundlicensefile))
502	{
503		installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (B)", "create_epm_header");
504	}
505
506	if (!($foundreadmefile))
507	{
508		installer::exiter::exit_program("ERROR: Could not find readme file $readmefilename (C)", "create_epm_header");
509	}
510
511	# including %replaces
512
513	my $replaces = "";
514
515	if (( $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::patch ))
516	{
517		$replaces = "solarisreplaces";	 # the name in the packagelist
518	}
519	elsif (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::patch ))
520	{
521		$replaces = "linuxreplaces";	# the name in the packagelist
522	}
523
524	if (( $replaces ) && ( ! $installer::globals::patch ))
525	{
526		if ( $onepackage->{$replaces} )
527		{
528			my $replacesstring = $onepackage->{$replaces};
529
530			my $allreplaces = installer::converter::convert_stringlist_into_array(\$replacesstring, ",");
531
532			for ( my $i = 0; $i <= $#{$allreplaces}; $i++ )
533			{
534				my $onereplaces = ${$allreplaces}[$i];
535				$onereplaces =~ s/\s*$//;
536				installer::packagelist::resolve_packagevariables(\$onereplaces, $variableshashref, 1);
537				if ( $installer::globals::linuxlinkrpmprocess ) { $onereplaces = $onereplaces . "u"; }
538				if ( $installer::globals::debian ) { $onereplaces =~ s/_/-/g; } # Debian allows no underline in package name
539				$line = "%replaces" . " " . $onereplaces . "\n";
540				push(@epmheader, $line);
541			}
542
543			if ( $installer::globals::debian && $variableshashref->{'UNIXPRODUCTNAME'} eq 'openoffice' )
544			{
545				$line = "%provides" . " openoffice.org-unbundled\n";
546				push(@epmheader, $line);
547				$line = "%replaces" . " openoffice.org-bundled\n";
548				push(@epmheader, $line);
549			}
550		}
551	}
552
553	# including the directives for %requires and %provides
554
555	my $provides = "";
556	my $requires = "";
557
558	if ( $installer::globals::issolarispkgbuild )
559	{
560		$provides = "solarisprovides";	 # the name in the packagelist
561		$requires = "solarisrequires";	 # the name in the packagelist
562	}
563	elsif ( $installer::globals::isfreebsdpkgbuild )
564	{
565		$provides = "freebsdprovides";	 # the name in the packagelist
566		$requires = "freebsdrequires";	 # the name in the packagelist
567	}
568	elsif (( $installer::globals::islinuxrpmbuild ) &&
569			( $installer::globals::patch ) &&
570			( exists($onepackage->{'linuxpatchrequires'}) ))
571	{
572		$provides = "provides";	 # the name in the packagelist
573		$requires = "linuxpatchrequires";	 # the name in the packagelist
574	}
575	else
576	{
577		$provides = "provides";	 		# the name in the packagelist
578		$requires = "requires";	 		# the name in the packagelist
579	}
580
581	# if ( $installer::globals::patch )
582	# {
583	#	$onepackage->{$provides} = "";
584		my $isdict = 0;
585		if ( $onepackage->{'packagename'} =~ /-dict-/ ) { $isdict = 1;  }
586
587	#	$onepackage->{$requires} = "";
588	# }
589
590	if ( $onepackage->{$provides} )
591	{
592		my $providesstring = $onepackage->{$provides};
593
594		my $allprovides = installer::converter::convert_stringlist_into_array(\$providesstring, ",");
595
596		for ( my $i = 0; $i <= $#{$allprovides}; $i++ )
597		{
598			my $oneprovides = ${$allprovides}[$i];
599			$oneprovides =~ s/\s*$//;
600			installer::packagelist::resolve_packagevariables(\$oneprovides, $variableshashref, 1);
601			if ( $installer::globals::linuxlinkrpmprocess ) { $oneprovides = $oneprovides . "u"; }
602			if ( $installer::globals::debian ) { $oneprovides =~ s/_/-/g; } # Debian allows no underline in package name
603			$line = "%provides" . " " . $oneprovides . "\n";
604			push(@epmheader, $line);
605		}
606	}
607
608	if ( $onepackage->{$requires} )
609	{
610		my $requiresstring = $onepackage->{$requires};
611
612		if ( $installer::globals::add_required_package ) { $requiresstring = $requiresstring . "," . $installer::globals::add_required_package; }
613
614		# The requires string can contain the separator "," in the names (descriptions) of the packages
615		# (that are required for Solaris depend files). Therefore "," inside such a description has to
616		# masked with a backslash.
617		# This masked separator need to be found and replaced, before the stringlist is converted into an array.
618		# This replacement has to be turned back after the array is created.
619
620		my $replacementstring = "COMMAREPLACEMENT";
621		$requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring");
622
623		my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ",");
624
625		installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring);
626
627		for ( my $i = 0; $i <= $#{$allrequires}; $i++ )
628		{
629			my $onerequires = ${$allrequires}[$i];
630			$onerequires =~ s/\s*$//;
631			installer::packagelist::resolve_packagevariables2(\$onerequires, $variableshashref, 0, $isdict);
632			if ( $installer::globals::debian ) { $onerequires =~ s/_/-/g; } # Debian allows no underline in package name
633
634			# Special handling for Solaris. In depend files, the names of the packages are required, not
635			# only the abbreviation. Therefore there is a special syntax for names in packagelist:
636			# solarisrequires = "SUNWcar (Name="Package name of SUNWcar"),SUNWkvm (Name="Package name of SUNWcar"), ...
637			# if ( $installer::globals::issolarispkgbuild )
638			# {
639			#	if ( $onerequires =~ /^\s*(.*?)\s+\(\s*Name\s*=\s*\"(.*?)\"\s*\)\s*$/ )
640			#	{
641			#		$onerequires = $1;
642			#		$packagename = $2;
643			#		$installer::globals::dependfilenames{$onerequires} = $packagename;
644			#	}
645			# }
646
647			$line = "%requires" . " " . $onerequires . "\n";
648			push(@epmheader, $line);
649		}
650	}
651	else
652	{
653		if ( $installer::globals::add_required_package )
654		{
655			my $requiresstring = $installer::globals::add_required_package;
656
657			my $replacementstring = "COMMAREPLACEMENT";
658			$requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring");
659			my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ",");
660			installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring);
661
662			for ( my $i = 0; $i <= $#{$allrequires}; $i++ )
663			{
664				my $onerequires = ${$allrequires}[$i];
665				$onerequires =~ s/\s*$//;
666				installer::packagelist::resolve_packagevariables(\$onerequires, $variableshashref, 0);
667				if ( $installer::globals::debian ) { $onerequires =~ s/_/-/g; } # Debian allows no underline in package name
668
669				# Special handling for Solaris. In depend files, the names of the packages are required, not
670				# only the abbreviation. Therefore there is a special syntax for names in packagelist:
671				# solarisrequires = "SUNWcar (Name="Package name of SUNWcar"),SUNWkvm (Name="Package name of SUNWcar"), ...
672				# if ( $installer::globals::issolarispkgbuild )
673				# {
674				#	if ( $onerequires =~ /^\s*(.*?)\s+\(\s*Name\s*=\s*\"(.*?)\"\s*\)\s*$/ )
675				#	{
676				#		$onerequires = $1;
677				#		$packagename = $2;
678				#		$installer::globals::dependfilenames{$onerequires} = $packagename;
679				#	}
680				# }
681
682				$line = "%requires" . " " . $onerequires . "\n";
683				push(@epmheader, $line);
684			}
685		}
686	}
687
688	return \@epmheader;
689}
690
691#######################################
692# Adding header to epm file
693#######################################
694
695sub adding_header_to_epm_file
696{
697	my ($epmfileref, $epmheaderref) = @_;
698
699	for ( my $i = 0; $i <= $#{$epmheaderref}; $i++ )
700	{
701		push( @{$epmfileref}, ${$epmheaderref}[$i] );
702	}
703
704	push( @{$epmfileref}, "\n\n" );
705}
706
707#####################################################
708# Replace one in shell scripts ( ${VARIABLENAME} )
709#####################################################
710
711sub replace_variable_in_shellscripts
712{
713	my ($scriptref, $variable, $searchstring) = @_;
714
715	for ( my $i = 0; $i <= $#{$scriptref}; $i++ )
716	{
717		${$scriptref}[$i] =~ s/\$\{$searchstring\}/$variable/g;
718	}
719}
720
721###################################################
722# Replace one in shell scripts ( %VARIABLENAME )
723###################################################
724
725sub replace_percent_variable_in_shellscripts
726{
727	my ($scriptref, $variable, $searchstring) = @_;
728
729	for ( my $i = 0; $i <= $#{$scriptref}; $i++ )
730	{
731		${$scriptref}[$i] =~ s/\%$searchstring/$variable/g;
732	}
733}
734
735################################################
736# Replacing many variables in shell scripts
737################################################
738
739sub replace_many_variables_in_shellscripts
740{
741	my ($scriptref, $variableshashref) = @_;
742
743	my $key;
744
745	foreach $key (keys %{$variableshashref})
746	{
747		my $value = $variableshashref->{$key};
748		# $value = lc($value); 	# lowercase !
749		# if ( $installer::globals::issolarisbuild) { $value =~ s/\.org/org/g; }	# openofficeorg instead of openoffice.org
750		replace_variable_in_shellscripts($scriptref, $value, $key);
751	}
752}
753
754#######################################
755# Adding shell scripts to epm file
756#######################################
757
758sub adding_shellscripts_to_epm_file
759{
760	my ($epmfileref, $shellscriptsfilename, $localrootpath, $allvariableshashref, $filesinpackage) = @_;
761
762	# $installer::globals::shellscriptsfilename
763
764	push( @{$epmfileref}, "\n\n" );
765
766	my $shellscriptsfileref = installer::files::read_file($shellscriptsfilename);
767
768	replace_variable_in_shellscripts($shellscriptsfileref, $localrootpath, "rootpath");
769
770	replace_many_variables_in_shellscripts($shellscriptsfileref, $allvariableshashref);
771
772	for ( my $i = 0; $i <= $#{$shellscriptsfileref}; $i++ )
773	{
774		push( @{$epmfileref}, ${$shellscriptsfileref}[$i] );
775	}
776
777	push( @{$epmfileref}, "\n" );
778}
779
780#################################################
781# Determining the epm on the system
782#################################################
783
784sub find_epm_on_system
785{
786	my ($includepatharrayref) = @_;
787
788	installer::logger::include_header_into_logfile("Check epm on system");
789
790	my $epmname = "epm";
791
792	# epm should be defined through the configure script but we need to
793	# check for it to be defined because of the Sun environment.
794	# Check the environment variable first and if it is not defined,
795	# or if it is but the location is not executable, search further.
796	# It has to be found in the solver or it has to be in the path
797	# (saved in $installer::globals::epm_in_path) or we get the specified
798	# one through the environment (i.e. when --with-epm=... is specified)
799
800	if ($ENV{'EPM'})
801	{
802		if (($ENV{'EPM'} ne "") && (-x "$ENV{'EPM'}"))
803		{
804			$epmname = $ENV{'EPM'};
805		}
806		elsif ( ($ENV{'EPM'} eq "no") || ($ENV{'EPM'} eq "internal") )
807		{
808			$epmname = "epm";
809			my $epmref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$epmname, $includepatharrayref, 0);
810			if ($$epmref eq "") { installer::exiter::exit_program("ERROR: Could not find program $epmname (EPM set to \"internal\" or \"no\")!", "find_epm_on_system"); }
811			$epmname = $$epmref;
812		}
813		else
814		{
815			installer::exiter::exit_program("Environment variable EPM set (\"$ENV{'EPM'}\"), but file does not exist or is not executable!", "find_epm_on_system");
816		}
817	}
818	else
819	{
820		my $epmfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$epmname, $includepatharrayref, 0);
821
822		if (($$epmfileref eq "") && (!($installer::globals::epm_in_path))) { installer::exiter::exit_program("ERROR: Could not find program $epmname!", "find_epm_on_system"); }
823		if (($$epmfileref eq "") && ($installer::globals::epm_in_path)) { $epmname = $installer::globals::epm_path; }
824		if (!($$epmfileref eq "")) { $epmname = $$epmfileref; }
825	}
826
827    $installer::logger::Lang->printf("Using epmfile: %s\n", $epmname);
828
829	return $epmname;
830}
831
832#################################################
833# Determining the epm patch state
834# saved in $installer::globals::is_special_epm
835#################################################
836
837sub set_patch_state
838{
839	my ($epmexecutable) = @_;
840
841	my $infoline = "";
842
843	my $systemcall = "$epmexecutable |";
844	open (EPMPATCH, "$systemcall");
845
846	while (<EPMPATCH>)
847	{
848		chop;
849		if ( $_ =~ /Patched for OpenOffice.org/ ) { $installer::globals::is_special_epm = 1; }
850	}
851
852	close (EPMPATCH);
853
854	if ( $installer::globals::is_special_epm )
855	{
856        $installer::logger::Lang->print("\n");
857        $installer::logger::Lang->print("Patch state: This is a patched version of epm!\n");
858        $installer::logger::Lang->print("\n");
859	}
860	else
861	{
862        $installer::logger::Lang->print("\n");
863        $installer::logger::Lang->print("Patch state: This is an unpatched version of epm!\n");
864        $installer::logger::Lang->print("\n");
865	}
866
867	if ( ( $installer::globals::is_special_epm ) && (($installer::globals::islinuxrpmbuild) || ($installer::globals::issolarispkgbuild)) )
868	{
869		# Special postprocess handling only for Linux RPM and Solaris packages
870		$installer::globals::postprocess_specialepm = 1;
871		$installer::globals::postprocess_standardepm = 0;
872	}
873	else
874	{
875		$installer::globals::postprocess_specialepm = 0;
876		$installer::globals::postprocess_standardepm = 1;
877	}
878}
879
880#################################################
881# LD_PRELOAD string for Debian packages
882#################################################
883
884sub get_ld_preload_string
885{
886	my ($includepatharrayref) = @_;
887
888	my $getuidlibraryname = "getuid.so";
889
890	my $ldpreloadstring;
891
892	my $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0);
893
894	if (($ENV{'FAKEROOT'} ne "no") && ($ENV{'FAKEROOT'} ne "")) {
895
896		$ldpreloadstring = $ENV{'FAKEROOT'};
897
898	} else {
899
900		if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "get_ld_preload_string"); }
901
902		my $ldpreloadstring = "LD_PRELOAD=" . $$getuidlibraryref;
903	}
904
905	return $ldpreloadstring;
906}
907
908#################################################
909# Calling epm to create the installation sets
910#################################################
911
912sub call_epm
913{
914	my ($epmname, $epmlistfilename, $packagename, $includepatharrayref) = @_;
915
916	installer::logger::include_header_into_logfile("epm call for $packagename");
917
918	my $packageformat = $installer::globals::packageformat;
919
920	my $localpackagename = $packagename;
921	# Debian allows only lowercase letters in package name
922	if ( $installer::globals::debian ) { $localpackagename = lc($localpackagename); }
923
924	my $outdirstring = "";
925	if ( $installer::globals::epmoutpath ne "" ) { $outdirstring = " --output-dir $installer::globals::epmoutpath"; }
926
927	# Debian package build needs fakeroot or our LD_PRELOAD hack for correct rights
928
929	my $ldpreloadstring = "";
930
931	if ( $installer::globals::debian ) { $ldpreloadstring = get_ld_preload_string($includepatharrayref) . " "; }
932
933	my $extraflags = "";
934        if ($ENV{'EPM_FLAGS'}) { $extraflags = $ENV{'EPM_FLAGS'}; }
935
936    my $verboseflag = "-v";
937    if ( ! $installer::globals::quiet ) { $verboseflag = "-v2"; };
938
939	my $systemcall = $ldpreloadstring . $epmname . " -f " . $packageformat . " " . $extraflags . " " . $localpackagename . " " . $epmlistfilename . $outdirstring . " " . $verboseflag . " " . " 2\>\&1 |";
940
941    $installer::logger::Info->printf("... %s ...\n", $systemcall);
942
943	my $maxepmcalls = 3;
944
945	for ( my $i = 1; $i <= $maxepmcalls; $i++ )
946	{
947		my @epmoutput = ();
948
949		open (EPM, "$systemcall");
950		while (<EPM>) {push(@epmoutput, $_); }
951		close (EPM);
952
953		my $returnvalue = $?;	# $? contains the return value of the systemcall
954
955        $installer::logger::Lang->printf("Systemcall  (Try %d): \n", $i, $systemcall);
956
957		for ( my $j = 0; $j <= $#epmoutput; $j++ )
958		{
959			if ( $i < $maxepmcalls ) { $epmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; }
960            $installer::logger::Lang->print($epmoutput[$j]);
961		}
962
963		if ($returnvalue)
964		{
965            $installer::logger::Lang->printf("Try %d : Could not execute \"%s\"!\n", $i, $systemcall);
966			if ( $i == $maxepmcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "call_epm"); }
967		}
968		else
969		{
970            $installer::logger::Info->printf("Success: Executed (Try %d): \"%s\" successfully\n", $i, $systemcall);
971            $installer::logger::Lang->printf("Success: Executed (Try %d): \"%s\" successfully\n", $i, $systemcall);
972			last;
973		}
974	}
975}
976
977#####################################################################
978# Adding the new line for relocatables into pkginfo file (Solaris)
979# or spec file (Linux) created by epm
980#####################################################################
981
982sub add_one_line_into_file
983{
984	my ($file, $insertline, $filename) = @_;
985
986	if ( $installer::globals::issolarispkgbuild )
987	{
988		push(@{$file}, $insertline);		# simply adding at the end of pkginfo file
989	}
990
991	if ( $installer::globals::islinuxrpmbuild )
992	{
993		# Adding behind the line beginning with: Group:
994
995		my $inserted_line = 0;
996
997		for ( my $i = 0; $i <= $#{$file}; $i++ )
998		{
999			if ( ${$file}[$i] =~ /^\s*Group\:\s*/ )
1000			{
1001				splice(@{$file},$i+1,0,$insertline);
1002				$inserted_line = 1;
1003				last;
1004			}
1005		}
1006
1007		if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "add_one_line_into_file"); }
1008	}
1009
1010	$insertline =~ s/\s*$//;	# removing line end for correct logging
1011    $installer::logger::Lang->printf("Success: Added line %s into file !\n", $insertline, $filename);
1012}
1013
1014#####################################################################
1015# Setting the revision VERSION=1.9,REV=66  .
1016# Also adding the new line: "AutoReqProv: no"
1017#####################################################################
1018
1019sub set_revision_in_pkginfo
1020{
1021	my ($file, $filename, $variables, $packagename) = @_;
1022
1023	my $revisionstring = "\,REV\=" . $installer::globals::packagerevision;
1024
1025	# Adding also a time string to the revision. Syntax: VERSION=8.0.0,REV=66.2005.01.24
1026
1027	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
1028
1029	$mday = $mday;
1030	$mon = $mon + 1;
1031	$year = $year + 1900;
1032
1033	if ( $mday < 10 ) { $mday = "0" . $mday; }
1034	if ( $mon < 10 ) { $mon = "0" . $mon; }
1035	$datestring = $year . "." . $mon . "." . $mday;
1036	$revisionstring = $revisionstring . "." . $datestring;
1037
1038	for ( my $i = 0; $i <= $#{$file}; $i++ )
1039	{
1040		if ( ${$file}[$i] =~ /^\s*(VERSION\=.*?)\s*$/ )
1041		{
1042			my $oldstring = $1;
1043			my $newstring = $oldstring . $revisionstring;	# also adding the date string
1044			${$file}[$i] =~ s/$oldstring/$newstring/;
1045            $installer::logger::Lang->printf("Info: Changed in %s file: \"%s\" to \"\"!\n",
1046                $filename,
1047                $oldstring,
1048                $newstring);
1049			last;
1050		}
1051	}
1052
1053	# For Update and Patch reasons, this string can also be kept constant
1054
1055	my $pkgversion = "SOLSPARCPKGVERSION";
1056	if ( $installer::globals::issolarisx86build ) { $pkgversion = "SOLIAPKGVERSION"; }
1057
1058	if (( $variables->{$pkgversion} ) && ( $variables->{$pkgversion} ne "" ))
1059	{
1060		if ( $variables->{$pkgversion} ne "FINALVERSION" )
1061		{
1062			# In OOo 3.x timeframe, this string is no longer unique for all packages, because of the three layer.
1063			# In the string: "3.0.0,REV=9.2008.09.30" only the part "REV=9.2008.09.30" can be unique for all packages
1064			# and therefore be set as $pkgversion.
1065			# The first part "3.0.0" has to be derived from the
1066
1067			my $version = $installer::globals::packageversion;
1068			if ( $version =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ )
1069			{
1070				my $major = $1;
1071				my $minor = $2;
1072				my $micro = $3;
1073
1074				my $finalmajor = $major;
1075				my $finalminor = $minor;
1076				my $finalmicro = 0;
1077
1078				# if (( $packagename =~ /-ure\s*$/ ) && ( $finalmajor == 1 )) { $finalminor = 4; }
1079
1080				$version = "$finalmajor.$finalminor.$finalmicro";
1081			}
1082
1083			my $datestring = $variables->{$pkgversion};
1084
1085			# Allowing some packages to have another date of creation.
1086			# They can be defined in product definition using a key like "SOLSPARCPKGVERSION_$packagename"
1087
1088			my $additionalkey = $pkgversion . "_" . $packagename;
1089			if (( $variables->{$additionalkey} ) && ( $variables->{$additionalkey} ne "" )) { $datestring = $variables->{$additionalkey}; }
1090
1091			my $versionstring = "$version,$datestring";
1092
1093			for ( my $i = 0; $i <= $#{$file}; $i++ )
1094			{
1095				if ( ${$file}[$i] =~ /^\s*(VERSION\=).*?\s*$/ )
1096				{
1097					my $start = $1;
1098					my $newstring = $start . $versionstring . "\n";	# setting the complete new string
1099					my $oldstring = ${$file}[$i];
1100					${$file}[$i] = $newstring;
1101					$oldstring =~ s/\s*$//;
1102					$newstring =~ s/\s*$//;
1103                    $installer::logger::Lang->printf("Info: Changed in %s file: \"%s\" to \"\"!\n", $filename, $oldstring, $newstring);
1104					last;
1105				}
1106			}
1107		}
1108	}
1109}
1110
1111########################################################
1112# Setting Patch information for Respin versions
1113# into pkginfo file. This prevents Respin versions
1114# from patching.
1115########################################################
1116
1117sub set_patchlist_in_pkginfo_for_respin
1118{
1119	my ($changefile, $filename, $allvariables, $packagename) = @_;
1120
1121	my $patchlistname = "SOLSPARCPATCHLISTFORRESPIN";
1122	if ( $installer::globals::issolarisx86build ) { $patchlistname = "SOLIAPATCHLISTFORRESPIN"; }
1123
1124	if ( $allvariables->{$patchlistname} )
1125	{
1126		# patchlist separator is a blank
1127		my $allpatchesstring = $allvariables->{$patchlistname};
1128		my @usedpatches = ();
1129
1130		# Analyzing the patchlist
1131		# Syntax: 120186-10 126411-01(+core-01) -> use 126411-01 only for core-01
1132		# Syntax: 120186-10 126411-01(-core-01) -> use 126411-01 for all packages except for core-01
1133		my $allpatches = installer::converter::convert_whitespace_stringlist_into_array(\$allpatchesstring);
1134
1135		for ( my $i = 0; $i <= $#{$allpatches}; $i++ )
1136		{
1137			my $patchdefinition = ${$allpatches}[$i];
1138
1139			my $patchid = "";
1140			my $symbol = "";
1141			my $constraint = "";
1142			my $isusedpatch = 0;
1143
1144			if ( $patchdefinition =~ /^\s*(.+)\(([+-])(.+)\)\s*$/ )
1145			{
1146				$patchid = $1;
1147				$symbol = $2;
1148				$constraint = $3;
1149			}
1150			elsif (( $patchdefinition =~ /\(/ ) || ( $patchdefinition =~ /\)/ ))	# small syntax check
1151			{
1152				# if there is a bracket in the $patchdefinition, but it does not
1153				# match the if-condition, this is an erroneous definition.
1154				installer::exiter::exit_program("ERROR: Unknown patch string: $patchdefinition", "set_patchlist_in_pkginfo_for_respin");
1155			}
1156			else
1157			{
1158				$patchid = $patchdefinition;
1159				$isusedpatch = 1; # patches without constraint are always included
1160			}
1161
1162			if ( $symbol ne "" )
1163			{
1164				if ( $symbol eq "+" )
1165				{
1166					if ( $packagename =~ /^.*\Q$constraint\E\s*$/ ) { $isusedpatch = 1; }
1167				}
1168
1169				if ( $symbol eq "-" )
1170				{
1171					if ( ! ( $packagename =~ /^.*\Q$constraint\E\s*$/ )) { $isusedpatch = 1; }
1172				}
1173			}
1174
1175			if ( $isusedpatch ) { push(@usedpatches, $patchid); }
1176		}
1177
1178		if ( $#usedpatches > -1 )
1179		{
1180			my $patchstring = installer::converter::convert_array_to_space_separated_string(\@usedpatches);
1181
1182			my $newline = "PATCHLIST=" . $patchstring . "\n";
1183			add_one_line_into_file($changefile, $newline, $filename);
1184
1185			# Adding patch info for each used patch in the patchlist
1186
1187			for ( my $i = 0; $i <= $#usedpatches; $i++ )
1188			{
1189				my $patchid = $usedpatches[$i];
1190				my $key = "PATCH_INFO_" . $patchid;
1191				$key =~ s/\s*$//;
1192
1193				if ( ! $allvariables->{$key} ) { installer::exiter::exit_program("ERROR: No Patch info available in zip list file for $key", "set_patchlist_in_pkginfo"); }
1194				my $value = set_timestamp_in_patchinfo($allvariables->{$key});
1195				$newline = $key . "=" . $value . "\n";
1196
1197				add_one_line_into_file($changefile, $newline, $filename);
1198			}
1199		}
1200	}
1201}
1202
1203########################################################
1204# Solaris requires, that the time of patch installation
1205# must not be empty.
1206# Format: Mon Mar 24 11:20:56 PDT 2008
1207# Log file: Tue Apr 29 23:26:19 2008 (04:31 min.)
1208# Replace string: ${TIMESTAMP}
1209########################################################
1210
1211sub set_timestamp_in_patchinfo
1212{
1213	my ($value) = @_;
1214
1215	my $currenttime = localtime();
1216
1217	if ( $currenttime =~ /^\s*(.+?)(\d\d\d\d)\s*$/ )
1218	{
1219		my $start = $1;
1220		my $year = $2;
1221		$currenttime = $start . "CET " . $year;
1222	}
1223
1224	$value =~ s/\$\{TIMESTAMP\}/$currenttime/;
1225
1226	return $value;
1227}
1228
1229########################################################
1230# Setting MAXINST=1000 into the pkginfo file.
1231########################################################
1232
1233sub set_maxinst_in_pkginfo
1234{
1235	my ($changefile, $filename) = @_;
1236
1237	my $newline = "MAXINST\=1000\n";
1238
1239	add_one_line_into_file($changefile, $newline, $filename);
1240}
1241
1242#############################################################
1243# Setting several Solaris variables into the pkginfo file.
1244#############################################################
1245
1246sub set_solaris_parameter_in_pkginfo
1247{
1248	my ($changefile, $filename, $allvariables) = @_;
1249
1250	my $newline = "";
1251
1252	# SUNW_PRODNAME
1253	# SUNW_PRODVERS
1254	# SUNW_PKGVERS
1255	# Not: SUNW_PKGTYPE
1256	# HOTLINE
1257	# EMAIL
1258
1259	my $productname = $allvariables->{'PRODUCTNAME'};
1260	$newline = "SUNW_PRODNAME=$productname\n";
1261	add_one_line_into_file($changefile, $newline, $filename);
1262
1263	my $productversion = "";
1264	if ( $allvariables->{'PRODUCTVERSION'} )
1265	{
1266		$productversion = $allvariables->{'PRODUCTVERSION'};
1267		if ( $allvariables->{'PRODUCTEXTENSION'} ) { $productversion = $productversion . "/" . $allvariables->{'PRODUCTEXTENSION'}; }
1268	}
1269	$newline = "SUNW_PRODVERS=$productversion\n";
1270	add_one_line_into_file($changefile, $newline, $filename);
1271
1272	$newline = "SUNW_PKGVERS=1\.0\n";
1273	add_one_line_into_file($changefile, $newline, $filename);
1274
1275	if ( $allvariables->{'SUNW_PKGTYPE'} )
1276	{
1277		$newline = "SUNW_PKGTYPE=$allvariables->{'SUNW_PKGTYPE'}\n";
1278		add_one_line_into_file($changefile, $newline, $filename);
1279	}
1280    else
1281    {
1282        $newline = "SUNW_PKGTYPE=\n";
1283        add_one_line_into_file($changefile, $newline, $filename);
1284    }
1285
1286	$newline = "HOTLINE=Please contact your local service provider\n";
1287	add_one_line_into_file($changefile, $newline, $filename);
1288
1289	$newline = "EMAIL=\n";
1290	add_one_line_into_file($changefile, $newline, $filename);
1291
1292}
1293
1294#####################################################################
1295# epm uses as archtecture for Solaris x86 "i86pc". This has to be
1296# changed to "i386".
1297#####################################################################
1298
1299sub fix_architecture_setting
1300{
1301	my ($changefile) = @_;
1302
1303	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1304	{
1305		if ( ${$changefile}[$i] =~ /^\s*ARCH=i86pc\s*$/ )
1306		{
1307			${$changefile}[$i] =~ s/i86pc/i386/;
1308			last;
1309		}
1310
1311	}
1312}
1313
1314#####################################################################
1315# Adding a new line for topdir into specfile, removing old
1316# topdir if set.
1317#####################################################################
1318
1319sub set_topdir_in_specfile
1320{
1321	my ($changefile, $filename, $newepmdir) = @_;
1322
1323	# $newepmdir =~ s/^\s*\.//;	# removing leading "."
1324	$newepmdir = cwd() . $installer::globals::separator . $newepmdir; # only absolute path allowed
1325
1326	# removing "%define _topdir", if existing
1327
1328	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1329	{
1330		if ( ${$changefile}[$i] =~ /^\s*\%define _topdir\s+/ )
1331		{
1332			my $removeline = ${$changefile}[$i];
1333			$removeline =~ s/\s*$//;
1334			splice(@{$changefile},$i,1);
1335            $installer::logger::Lang->printf("Info: Removed line \"%s\" from file %s!\n", $removeline, $filename);
1336			last;
1337		}
1338	}
1339
1340	# Adding "topdir" behind the line beginning with: Group:
1341
1342	my $inserted_line = 0;
1343
1344	my $topdirline = "\%define _topdir $newepmdir\n";
1345
1346	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1347	{
1348		if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ )
1349		{
1350			splice(@{$changefile},$i+1,0,$topdirline);
1351			$inserted_line = 1;
1352			$topdirline =~ s/\s*$//;
1353            $installer::logger::Lang->printf("Success: Added line %s into file %s!\n", $topdirline, $filename);
1354		}
1355	}
1356
1357	if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "set_topdir_in_specfile"); }
1358
1359}
1360
1361#####################################################################
1362# Setting the packager in the spec file
1363# Syntax: Packager: abc@def
1364#####################################################################
1365
1366sub set_packager_in_specfile
1367{
1368	my ($changefile) = @_;
1369
1370	my $packager = $installer::globals::longmanufacturer;
1371
1372	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1373	{
1374		if ( ${$changefile}[$i] =~ /^\s*Packager\s*:\s*(.+?)\s*$/ )
1375		{
1376			my $oldstring = $1;
1377			${$changefile}[$i] =~ s/\Q$oldstring\E/$packager/;
1378            $installer::logger::Lang->printf("Info: Changed Packager in spec file from %s to %s!\n",
1379                $oldstring,
1380                $packager);
1381			last;
1382		}
1383	}
1384}
1385
1386#####################################################################
1387# Setting the requirements in the spec file (i81494)
1388# Syntax: PreReq: "requirements" (only for shared extensions)
1389#####################################################################
1390
1391sub set_prereq_in_specfile
1392{
1393	my ($changefile) = @_;
1394
1395	my $prereq = "PreReq:";
1396
1397	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1398	{
1399		if ( ${$changefile}[$i] =~ /^\s*Requires:\s*(.+?)\s*$/ )
1400		{
1401			my $oldstring = ${$changefile}[$i];
1402			${$changefile}[$i] =~ s/Requires:/$prereq/;
1403            $installer::logger::Lang->printf("Info: Changed requirements in spec file from %s to %s!\n",
1404                $oldstring,
1405                ${$changefile}[$i]);
1406		}
1407	}
1408}
1409
1410#####################################################################
1411# Setting the Auto[Req]Prov line and __find_requires
1412#####################################################################
1413
1414sub set_autoprovreq_in_specfile
1415{
1416    my ($changefile, $findrequires, $bindir) = @_;
1417
1418	my $autoreqprovline;
1419
1420    if ( $findrequires )
1421    {
1422        $autoreqprovline = "AutoProv\: no\n%define __find_requires $bindir/$findrequires\n";
1423    }
1424    else
1425    {
1426        $autoreqprovline = "AutoReqProv\: no\n";
1427    }
1428
1429    $autoreqprovline .= "%define _binary_filedigest_algorithm 1\n%define _binary_payload w9.gzdio\n";
1430
1431	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1432	{
1433        # Adding "autoreqprov" behind the line beginning with: Group:
1434		if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ )
1435		{
1436			splice(@{$changefile},$i+1,0,$autoreqprovline);
1437			$autoreqprovline =~ s/\s*$//;
1438            $installer::logger::Lang->printf("Success: Added line %s into spec file!\n", $autoreqprovline);
1439			last;
1440        }
1441    }
1442}
1443
1444#####################################################################
1445# Replacing Copyright with License in the spec file
1446# Syntax: License: ALv2 (older usages were LGPL, SISSL)
1447#####################################################################
1448
1449sub set_license_in_specfile
1450{
1451	my ($changefile, $variableshashref) = @_;
1452
1453	my $license = $variableshashref->{'LICENSENAME'};
1454
1455	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1456	{
1457		if ( ${$changefile}[$i] =~ /^\s*Copyright\s*:\s*(.+?)\s*$/ )
1458		{
1459			${$changefile}[$i] = "License: $license\n";
1460            $installer::logger::Lang->printf("Info: Replaced Copyright with License: %s !\n", $license);
1461			last;
1462		}
1463	}
1464}
1465
1466#########################################################
1467# Building relocatable Solaris packages means:
1468# 1. Add "BASEDIR=/opt" into pkginfo
1469# 2. Remove "/opt/" from all objects in prototype file
1470# For step2 this function exists
1471# Sample: d none /opt/openofficeorg20/help 0755 root other
1472# -> d none openofficeorg20/help 0755 root other
1473#########################################################
1474
1475sub make_prototypefile_relocatable
1476{
1477	my ($prototypefile, $relocatablepath) = @_;
1478
1479	for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
1480	{
1481		if ( ${$prototypefile}[$i] =~ /^\s*\w\s+\w+\s+\/\w+/ )	# this is an object line
1482		{
1483			${$prototypefile}[$i] =~ s/$relocatablepath//;	# Important: $relocatablepath has a "/" at the end. Example "/opt/"
1484		}
1485	}
1486
1487	# If the $relocatablepath is "/opt/openoffice20/" the line "d none /opt/openoffice20" was not changed.
1488	# This line has to be removed now
1489
1490	if ( $relocatablepath ne "/" ) { $relocatablepath =~ s/\/\s*$//; }		# removing the ending slash
1491
1492	for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
1493	{
1494		if ( ${$prototypefile}[$i] =~ /^\s*d\s+\w+\s+\Q$relocatablepath\E/ )
1495		{
1496			my $line = ${$prototypefile}[$i];
1497			splice(@{$prototypefile},$i,1);	# removing the line
1498			$line =~ s/\s*$//;
1499            $installer::logger::Lang->printf("Info: Removed line \"%s\" from prototype file!\n", $line);
1500			last;
1501		}
1502	}
1503
1504	# Making "\$" to "$" in prototype file. "\$" was created by epm.
1505
1506	for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
1507	{
1508		if ( ${$prototypefile}[$i] =~ /\\\$/ )
1509		{
1510			${$prototypefile}[$i] =~ s/\\\$/\$/g;
1511            $installer::logger::Lang->printf("Info: Changed line in prototype file: %s !\n", ${$prototypefile}[$i]);
1512		}
1513	}
1514}
1515
1516
1517#########################################################################
1518# In scp the flag VOLATEFILE can be used. This shall lead to style "v"
1519# in Solaris prototype file. This is not supported by epm and has
1520# therefore to be included in prototypefile, not in epm list file.
1521#########################################################################
1522
1523sub set_volatilefile_into_prototypefile
1524{
1525	my ($prototypefile, $filesref) = @_;
1526
1527	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
1528	{
1529		my $onefile = ${$filesref}[$i];
1530
1531		my $styles = "";
1532		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1533
1534		if ( $styles =~ /\bVOLATILEFILE\b/ )
1535		{
1536			my $sourcepath = $onefile->{'sourcepath'};
1537
1538			for ( my $j = 0; $j <= $#{$prototypefile}; $j++ )
1539			{
1540				if (( ${$prototypefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$prototypefile}[$j] =~ /\=\Q$sourcepath\E\s+/ ))
1541				{
1542					my $oldline = ${$prototypefile}[$j];
1543					${$prototypefile}[$j] =~ s/^\s*f/v/;
1544					my $newline = ${$prototypefile}[$j];
1545					$oldline =~ s/\s*$//;
1546					$newline =~ s/\s*$//;
1547                    $installer::logger::Lang->printf(
1548                        "Volatile file: Changing content from \"%s\" to \"%s\" .\n",
1549                        $oldline,
1550                        $newline);
1551					last;
1552				}
1553			}
1554		}
1555	}
1556}
1557
1558#########################################################################
1559# Replacing the variables in the Solaris patch shell scripts.
1560# Taking care, that multiple slashes are not always removed.
1561#########################################################################
1562
1563sub replace_variables_in_shellscripts_for_patch
1564{
1565	my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_;
1566
1567	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
1568	{
1569		if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ )
1570		{
1571			my $oldline = ${$scriptfile}[$i];
1572			if (( $oldstring eq "PRODUCTDIRECTORYNAME" ) && ( $newstring eq "" )) { $oldstring = $oldstring . "/"; }
1573			${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g;
1574            $installer::logger::Lang->printf("Info: Substituting in %s %s by %s\n",
1575                $scriptfilename, $oldstring, $newstring);
1576		}
1577	}
1578}
1579
1580#########################################################################
1581# Replacing the variables in the shell scripts or in the epm list file
1582# Linux: spec file
1583# Solaris: preinstall, postinstall, preremove, postremove
1584# If epm is used in the original version (not relocatable)
1585# the variables have to be exchanged in the list file,
1586# created for epm.
1587#########################################################################
1588
1589sub replace_variables_in_shellscripts
1590{
1591	my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_;
1592
1593	my $debug = 0;
1594	if ( $oldstring eq "PRODUCTDIRECTORYNAME" ) { $debug = 1; }
1595
1596	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
1597	{
1598		if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ )
1599		{
1600			my $oldline = ${$scriptfile}[$i];
1601			${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g;
1602			${$scriptfile}[$i] =~ s/\/\//\//g;	# replacing "//" by "/" , if path $newstring is empty!
1603            $installer::logger::Lang->printf("Info: Substituting in %s %s by %s\n",
1604                $scriptfilename,
1605                $oldstring,
1606                $newstring);
1607			if ( $debug )
1608			{
1609                $installer::logger::Lang->printf("Old Line: %s", $oldline);
1610                $installer::logger::Lang->printf("New Line: %s", ${$scriptfile}[$i]);
1611			}
1612		}
1613	}
1614}
1615
1616############################################################
1617# Determinig the directory created by epm, in which the
1618# RPMS or Solaris packages are created.
1619############################################################
1620
1621sub determine_installdir_ooo
1622{
1623	# A simple "ls" command returns the directory name
1624
1625	my $dirname = "";
1626
1627	my $systemcall = "ls |";
1628	open (LS, "$systemcall");
1629	$dirname = <LS>;
1630	close (LS);
1631
1632	$dirname =~ s/\s*$//;
1633
1634    $installer::logger::Lang->printf("Info: Directory created by epm: %s\n", $dirname);
1635
1636	return $dirname;
1637}
1638
1639############################################################
1640# Setting the tab content into the file container
1641############################################################
1642
1643sub set_tab_into_datafile
1644{
1645	my ($changefile, $filesref) = @_;
1646
1647	my @newclasses = ();
1648	my $newclassesstring = "";
1649
1650	if ( $installer::globals::issolarispkgbuild )
1651	{
1652		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
1653		{
1654			my $onefile = ${$filesref}[$i];
1655
1656			if ( $onefile->{'SolarisClass'} )
1657			{
1658				my $sourcepath = $onefile->{'sourcepath'};
1659
1660				for ( my $j = 0; $j <= $#{$changefile}; $j++ )
1661				{
1662					if (( ${$changefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$changefile}[$j] =~ /\=\Q$sourcepath\E\s+/ ))
1663					{
1664						my $oldline = ${$changefile}[$j];
1665						${$changefile}[$j] =~ s/f\s+none/e $onefile->{'SolarisClass'}/;
1666						my $newline = ${$changefile}[$j];
1667						$oldline =~ s/\s*$//;
1668						$newline =~ s/\s*$//;
1669
1670                        $installer::logger::Lang->printf("TAB: Changing content from \"%s\" to \"%s\" .\n",
1671                            $oldline, $newline);
1672
1673						# collecting all new classes
1674						if (! installer::existence::exists_in_array($onefile->{'SolarisClass'}, \@newclasses))
1675						{
1676							push(@newclasses, $onefile->{'SolarisClass'});
1677						}
1678
1679						last;
1680					}
1681				}
1682			}
1683		}
1684
1685		$newclassesstring = installer::converter::convert_array_to_space_separated_string(\@newclasses);
1686	}
1687
1688	if ( $installer::globals::islinuxrpmbuild )
1689	{
1690		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
1691		{
1692			my $onefile = ${$filesref}[$i];
1693
1694			if ( $onefile->{'SpecFileContent'} )
1695			{
1696				my $destination = $onefile->{'destination'};
1697
1698				for ( my $j = 0; $j <= $#{$changefile}; $j++ )
1699				{
1700					if ( ${$changefile}[$j] =~ /^\s*(\%attr\(.*\))\s+(\".*?\Q$destination\E\"\s*)$/ )
1701					{
1702						my $begin = $1;
1703						my $end = $2;
1704
1705						my $oldline = ${$changefile}[$j];
1706						${$changefile}[$j] = $begin . " " . $onefile->{'SpecFileContent'} . " " . $end;
1707						my $newline = ${$changefile}[$j];
1708
1709						$oldline =~ s/\s*$//;
1710						$newline =~ s/\s*$//;
1711
1712                        $installer::logger::Lang->printf(
1713                            "TAB: Changing content from \"%s\" to \"%s\" .\n", $oldline, $newline);
1714
1715						last;
1716					}
1717				}
1718			}
1719		}
1720	}
1721
1722	return $newclassesstring;
1723}
1724
1725############################################################
1726# Including additional classes into the pkginfo file
1727############################################################
1728
1729sub include_classes_into_pkginfo
1730{
1731	my ($changefile, $classesstring) = @_;
1732
1733	for ( my $i = 0; $i <= $#{$changefile}; $i++ )
1734	{
1735		if ( ${$changefile}[$i] =~ /^\s*CLASSES\=none/ )
1736		{
1737			${$changefile}[$i] =~ s/\s*$//;
1738			my $oldline = ${$changefile}[$i];
1739			${$changefile}[$i] = ${$changefile}[$i] . " " . $classesstring . "\n";
1740			my $newline = ${$changefile}[$i];
1741			$newline =~ s/\s*$//;
1742
1743            $installer::logger::Lang->printf("pkginfo file: Changing content from \"%s\" to \"%s\" .\n",
1744                $oldline, $newline);
1745		}
1746	}
1747}
1748
1749##########################################################################################
1750# Checking, if an extension is included into the package (Linux).
1751# All extension files have to be installed into directory
1752# share/extension/install
1753# %attr(0444,root,root) "/opt/staroffice8/share/extension/install/SunSearchToolbar.oxt"
1754##########################################################################################
1755
1756sub is_extension_package
1757{
1758	my ($specfile) = @_;
1759
1760	my $is_extension_package = 0;
1761
1762	for ( my $i = 0; $i <= $#{$specfile}; $i++ )
1763	{
1764		my $line = ${$specfile}[$i];
1765		if ( $line =~ /share\/extension\/install\/.*?\.oxt\"\s*$/ )
1766		{
1767			$is_extension_package = 1;
1768			last;
1769		}
1770	}
1771
1772	return $is_extension_package;
1773}
1774
1775######################################################################
1776# Checking, if an extension is included into the package (Solaris).
1777# All extension files have to be installed into directory
1778# share/extension/install
1779######################################################################
1780
1781sub contains_extension_dir
1782{
1783	my ($prototypefile) = @_;
1784
1785	my $contains_extension_dir = 0;
1786
1787	# d none opt/openoffice.org3/share/extensions/
1788
1789	for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
1790	{
1791		my $line = ${$prototypefile}[$i];
1792		if ( $line =~ /^\s*d\s+none\s.*\/share\/extensions\// )
1793		{
1794			$contains_extension_dir = 1;
1795			last;
1796		}
1797	}
1798
1799	return $contains_extension_dir;
1800}
1801
1802############################################################
1803# A Solaris patch contains 7 specific scripts
1804############################################################
1805
1806sub add_scripts_into_prototypefile
1807{
1808	my ($prototypefile, $prototypefilename, $languagestringref, $staticpath) = @_;
1809
1810	# The files are stored in the directory $installer::globals::patchincludepath
1811	# The file names are available via @installer::globals::solarispatchscripts
1812
1813	my $path = $installer::globals::patchincludepath;
1814	$path =~ s/\/\s*$//;
1815	$path = $path . $installer::globals::separator;
1816
1817	my @newlines = ();
1818	my $is_extension_package = contains_extension_dir($prototypefile);
1819
1820	if ( $is_extension_package )
1821	{
1822		for ( my $i = 0; $i <= $#installer::globals::solarispatchscriptsforextensions; $i++ )
1823		{
1824			my $sourcefilename = $path . $installer::globals::solarispatchscriptsforextensions[$i];
1825			my $destfile = $installer::globals::solarispatchscriptsforextensions[$i];
1826
1827			# If the sourcepath has "_extension" in its name, this has to be removed
1828			$destfile =~ s/_extensions\s*$//;  # hard coded renaming of script name
1829
1830			# Creating unique directory name with $prototypefilename
1831			my $extensiondir = installer::systemactions::create_directories("extensionscripts", $languagestringref);
1832
1833			if ( $prototypefilename =~ /\/(\S*?)\s*$/ ) { $prototypefilename = $1; }
1834			$prototypefilename =~ s/\./_/g;
1835			my $destdir = $extensiondir . $installer::globals::separator . $prototypefilename;
1836			if ( ! -d $destdir ) { installer::systemactions::create_directory($destdir); }
1837			my $destpath = $destdir . $installer::globals::separator . $destfile;
1838			if ( -f $destpath ) { unlink($destpath); }
1839
1840			# Reading file
1841			my $scriptfile = installer::files::read_file($sourcefilename);
1842
1843			# Replacing variables
1844			my $oldstring = "PRODUCTDIRECTORYNAME";
1845			replace_variables_in_shellscripts_for_patch($scriptfile, $destpath, $oldstring, $staticpath);
1846
1847			# Saving file
1848			installer::files::save_file($destpath, $scriptfile);
1849
1850			# Writing file destination into prototype file
1851			my $line = "i $destfile=" . $destpath . "\n";
1852			push(@newlines, $line);
1853		}
1854	}
1855	else
1856	{
1857		for ( my $i = 0; $i <= $#installer::globals::solarispatchscripts; $i++ )
1858		{
1859			my $line = "i $installer::globals::solarispatchscripts[$i]=" . $path . $installer::globals::solarispatchscripts[$i] . "\n";
1860			push(@newlines, $line);
1861		}
1862	}
1863
1864	# Including the new lines after the last line starting with "i"
1865
1866	for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
1867	{
1868		if ( ${$prototypefile}[$i] =~ /^\s*i\s+copyright/ )
1869		{
1870			splice(@{$prototypefile}, $i, 1);	# ignoring old copyright text, using patch standard
1871			next;
1872		}
1873		if ( ${$prototypefile}[$i] =~ /^\s*i\s+/ ) { next; }
1874		splice(@{$prototypefile}, $i, 0, @newlines);
1875		last;
1876	}
1877}
1878
1879############################################################
1880# Adding patch infos in pkginfo file
1881############################################################
1882
1883sub include_patchinfos_into_pkginfo
1884{
1885	my ( $changefile, $filename, $variableshashref ) = @_;
1886
1887	# SUNW_PATCHID=101998-10
1888	# SUNW_OBSOLETES=114999-01 113999-01
1889	# SUNW_PKGTYPE=usr
1890	# SUNW_PKGVERS=1.0
1891	# SUNW_REQUIRES=126411-01
1892
1893	my $patchidname = "SOLSPARCPATCHID";
1894	if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; }
1895
1896	if ( ! $variableshashref->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "include_patchinfos_into_pkginfo"); }
1897
1898	my $newline = "SUNW_PATCHID=" . $variableshashref->{$patchidname} . "\n";
1899	add_one_line_into_file($changefile, $newline, $filename);
1900
1901	my $patchobsoletesname = "SOLSPARCPATCHOBSOLETES";
1902	if ( $installer::globals::issolarisx86build ) { $patchobsoletesname = "SOLIAPATCHOBSOLETES"; }
1903
1904	my $obsoletes = "";
1905	if ( $variableshashref->{$patchobsoletesname} ) { $obsoletes = $variableshashref->{$patchobsoletesname}; }
1906	$newline = "SUNW_OBSOLETES=" . $obsoletes . "\n";
1907	add_one_line_into_file($changefile, $newline, $filename);
1908
1909	my $patchrequiresname = "SOLSPARCPATCHREQUIRES";
1910	if ( $installer::globals::issolarisx86build ) { $patchrequiresname = "SOLIAPATCHREQUIRES"; }
1911
1912	if ( $variableshashref->{$patchrequiresname} )
1913	{
1914		my $requires = $variableshashref->{$patchrequiresname};
1915		$newline = "SUNW_REQUIRES=" . $requires . "\n";
1916		add_one_line_into_file($changefile, $newline, $filename);
1917	}
1918	$newline = "SUNW_PATCH_PROPERTIES=\n";
1919	add_one_line_into_file($changefile, $newline, $filename);
1920	# $newline = "SUNW_PKGTYPE=usr\n";
1921	# add_one_line_into_file($changefile, $newline, $filename);
1922
1923	# $newline = "SUNW_PKGVERS=1.0\n";
1924	# add_one_line_into_file($changefile, $newline, $filename);
1925}
1926
1927############################################################
1928# Setting the correct Solaris locales
1929############################################################
1930
1931sub get_solaris_language_for_langpack
1932{
1933	my ( $onelanguage ) = @_;
1934
1935	my $sollanguage = $onelanguage;
1936	$sollanguage =~ s/\-/\_/;
1937
1938	if ( $sollanguage eq "de" ) { $sollanguage = "de"; }
1939	elsif ( $sollanguage eq "en_US" ) { $sollanguage = "en_AU,en_CA,en_GB,en_IE,en_MT,en_NZ,en_US,en_US.UTF-8"; }
1940	elsif ( $sollanguage eq "es" ) { $sollanguage = "es"; }
1941	elsif ( $sollanguage eq "fr" ) { $sollanguage = "fr"; }
1942	elsif ( $sollanguage eq "hu" ) { $sollanguage = "hu_HU"; }
1943	elsif ( $sollanguage eq "it" ) { $sollanguage = "it"; }
1944	elsif ( $sollanguage eq "nl" ) { $sollanguage = "nl_BE,nl_NL"; }
1945	elsif ( $sollanguage eq "pl" ) { $sollanguage = "pl_PL"; }
1946	elsif ( $sollanguage eq "sv" ) { $sollanguage = "sv"; }
1947	elsif ( $sollanguage eq "pt" ) { $sollanguage = "pt_PT"; }
1948	elsif ( $sollanguage eq "pt_BR" ) { $sollanguage = "pt_BR"; }
1949	elsif ( $sollanguage eq "ru" ) { $sollanguage = "ru_RU"; }
1950	elsif ( $sollanguage eq "ja" ) { $sollanguage = "ja,ja_JP,ja_JP.PCK,ja_JP.UTF-8"; }
1951	elsif ( $sollanguage eq "ko" ) { $sollanguage = "ko,ko.UTF-8"; }
1952	elsif ( $sollanguage eq "zh_CN" ) { $sollanguage = "zh,zh.GBK,zh_CN.GB18030,zh.UTF-8"; }
1953	elsif ( $sollanguage eq "zh_TW" ) { $sollanguage = "zh_TW,zh_TW.BIG5,zh_TW.UTF-8,zh_HK.BIG5HK,zh_HK.UTF-8"; }
1954
1955	return $sollanguage;
1956}
1957
1958############################################################
1959# Adding language infos in pkginfo file
1960############################################################
1961
1962sub include_languageinfos_into_pkginfo
1963{
1964	my ( $changefile, $filename, $languagestringref, $onepackage, $variableshashref ) = @_;
1965
1966	# SUNWPKG_LIST=core01
1967	# SUNW_LOC=de
1968
1969	my $locallang = $onepackage->{'language'};
1970	my $solarislanguage = get_solaris_language_for_langpack($locallang);
1971
1972	my $newline = "SUNW_LOC=" . $solarislanguage . "\n";
1973	add_one_line_into_file($changefile, $newline, $filename);
1974
1975	# SUNW_PKGLIST is required, if SUNW_LOC is defined.
1976	if ( $onepackage->{'pkg_list_entry'} )
1977	{
1978		my $packagelistentry = $onepackage->{'pkg_list_entry'};
1979		installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1);
1980		$newline = "SUNW_PKGLIST=" . $packagelistentry . "\n";
1981		add_one_line_into_file($changefile, $newline, $filename);
1982	}
1983	else
1984	{
1985		# Using default package ooobasis30-core01.
1986		my $packagelistentry = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01";
1987		installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1);
1988		$newline = "SUNW_PKGLIST=" . $packagelistentry . "\n";
1989		add_one_line_into_file($changefile, $newline, $filename);
1990	}
1991}
1992
1993############################################################
1994# Collecting all files included in patch in
1995# @installer::globals::patchfilecollector
1996############################################################
1997
1998sub collect_patch_files
1999{
2000	my ($file, $packagename, $prefix) = @_;
2001
2002	# $file is the spec file or the prototypefile
2003
2004	$prefix = $prefix . "/";
2005	my $packagenamestring = "Package " . $packagename . " \:\n";
2006	push(@installer::globals::patchfilecollector, $packagenamestring);
2007
2008	for ( my $i = 0; $i <= $#{$file}; $i++ )
2009	{
2010		my $line = ${$file}[$i];
2011
2012		if ( $installer::globals::islinuxrpmbuild )
2013		{
2014			# %attr(0444,root,root) "/opt/openofficeorg20/program/about.bmp"
2015
2016			if ( $line =~ /^\s*\%attr\(.*\)\s*\"(.*?)\"\s*$/ )
2017			{
2018				my $filename = $1 . "\n";
2019				$filename =~ s/^\s*\Q$prefix\E//;
2020				push(@installer::globals::patchfilecollector, $filename);
2021			}
2022		}
2023
2024		if ( $installer::globals::issolarispkgbuild )
2025		{
2026			# f none program/msomrl.rdb=/ab/SRC680/unxsols4.pro/bin/msomrl.rdb 0444 root bin
2027
2028			if ( $line =~ /^\s*f\s+\w+\s+(.*?)\=/ )
2029			{
2030				my $filename = $1 . "\n";
2031				push(@installer::globals::patchfilecollector, $filename);
2032			}
2033		}
2034	}
2035
2036	push(@installer::globals::patchfilecollector, "\n");
2037
2038}
2039
2040############################################################
2041# Including package names into the depend files.
2042# The package names have to be included into
2043# packagelist. They are already saved in
2044# %installer::globals::dependfilenames.
2045############################################################
2046
2047sub put_packagenames_into_dependfile
2048{
2049	my ( $file ) = @_;
2050
2051	for ( my $i = 0; $i <= $#{$file}; $i++ )
2052	{
2053		my $line = ${$file}[$i];
2054		if ( $line =~ /^\s*\w\s+(.*?)\s*$/ )
2055		{
2056			my $abbreviation = $1;
2057
2058            if ( $abbreviation =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package abbreviation \"$abbreviation\"!", "read_packagemap"); }
2059
2060			if ( exists($installer::globals::dependfilenames{$abbreviation}) )
2061			{
2062                my $packagename = $installer::globals::dependfilenames{$abbreviation};
2063                if ( $packagename =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package name \"$packagename\"!", "read_packagemap"); }
2064
2065				$line =~ s/\s*$//;
2066				${$file}[$i] = $line . "\t" . $packagename . "\n";
2067			}
2068			else
2069			{
2070				installer::exiter::exit_program("ERROR: Missing packagename for Solaris package \"$abbreviation\"!", "put_packagenames_into_dependfile");
2071			}
2072		}
2073	}
2074}
2075
2076############################################################
2077# Including the relocatable directory into
2078# spec file and pkginfo file
2079# Linux: set topdir in specfile
2080# Solaris: remove $relocatablepath (/opt/)
2081# for all objects in prototype file
2082# and changing "topdir" for Linux
2083############################################################
2084
2085sub prepare_packages
2086{
2087	my ($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $variableshashref, $filesref, $languagestringref) = @_;
2088
2089	my $filename = "";
2090	my $newline = "";
2091	my $newepmdir = $installer::globals::epmoutpath . $installer::globals::separator;
2092
2093	my $localrelocatablepath = $relocatablepath;
2094	if ( $localrelocatablepath ne "/" ) { $localrelocatablepath =~ s/\/\s*$//; }
2095
2096	if ( $installer::globals::issolarispkgbuild )
2097	{
2098		$filename = $packagename . ".pkginfo";
2099		$newline = "BASEDIR\=" . $localrelocatablepath . "\n";
2100	}
2101
2102	if ( $installer::globals::islinuxrpmbuild )
2103	{
2104		# if ( $localrelocatablepath =~ /^\s*$/ ) { $localrelocatablepath = "/"; }; # at least the "/"
2105		$filename =  $packagename . ".spec";
2106		$newline = "Prefix\:\ " . $localrelocatablepath . "\n";
2107	}
2108
2109	my $completefilename = $newepmdir . $filename;
2110
2111	if ( ! -f $completefilename) { installer::exiter::exit_program("ERROR: Did not find file: $completefilename", "prepare_packages"); }
2112	my $changefile = installer::files::read_file($completefilename);
2113	if ( $newline ne "" )
2114	{
2115		add_one_line_into_file($changefile, $newline, $filename);
2116		installer::files::save_file($completefilename, $changefile);
2117	}
2118
2119	# my $newepmdir = $completefilename;
2120	# installer::pathanalyzer::get_path_from_fullqualifiedname(\$newepmdir);
2121
2122	# adding new "topdir" and removing old "topdir" in specfile
2123
2124	if ( $installer::globals::islinuxrpmbuild )
2125	{
2126		set_topdir_in_specfile($changefile, $filename, $newepmdir);
2127		set_autoprovreq_in_specfile($changefile, $onepackage->{'findrequires'}, "$installer::globals::unpackpath" . "/bin");
2128		set_packager_in_specfile($changefile);
2129		if ( is_extension_package($changefile) ) { set_prereq_in_specfile($changefile); }
2130		set_license_in_specfile($changefile, $variableshashref);
2131		set_tab_into_datafile($changefile, $filesref);
2132		# check_requirements_in_specfile($changefile);
2133		installer::files::save_file($completefilename, $changefile);
2134		if ( $installer::globals::patch ) { collect_patch_files($changefile, $packagename, $localrelocatablepath); }
2135	}
2136
2137	# removing the relocatable path in prototype file
2138
2139	if ( $installer::globals::issolarispkgbuild )
2140	{
2141		set_revision_in_pkginfo($changefile, $filename, $variableshashref, $packagename);
2142		set_maxinst_in_pkginfo($changefile, $filename);
2143		set_solaris_parameter_in_pkginfo($changefile, $filename, $variableshashref);
2144		if ( $installer::globals::issolarisx86build ) { fix_architecture_setting($changefile); }
2145		if ( ! $installer::globals::patch ) { set_patchlist_in_pkginfo_for_respin($changefile, $filename, $variableshashref, $packagename); }
2146		if ( $installer::globals::patch ) { include_patchinfos_into_pkginfo($changefile, $filename, $variableshashref); }
2147		if (( $onepackage->{'language'} ) && ( $onepackage->{'language'} ne "" ) && ( $onepackage->{'language'} ne "en-US" )) { include_languageinfos_into_pkginfo($changefile, $filename, $languagestringref, $onepackage, $variableshashref); }
2148		installer::files::save_file($completefilename, $changefile);
2149
2150		my $prototypefilename = $packagename . ".prototype";
2151		$prototypefilename = $newepmdir . $prototypefilename;
2152		if (! -f $prototypefilename) { installer::exiter::exit_program("ERROR: Did not find prototype file: $prototypefilename", "prepare_packages"); }
2153
2154		my $prototypefile = installer::files::read_file($prototypefilename);
2155		make_prototypefile_relocatable($prototypefile, $relocatablepath);
2156		set_volatilefile_into_prototypefile($prototypefile, $filesref);
2157		my $classesstring = set_tab_into_datafile($prototypefile, $filesref);
2158		if ($classesstring)
2159		{
2160			include_classes_into_pkginfo($changefile, $classesstring);
2161			installer::files::save_file($completefilename, $changefile);
2162		}
2163
2164		if ( $installer::globals::patch ) { add_scripts_into_prototypefile($prototypefile, $prototypefilename, $languagestringref, $staticpath); }
2165
2166		installer::files::save_file($prototypefilename, $prototypefile);
2167		if ( $installer::globals::patch ) { collect_patch_files($prototypefile, $packagename, ""); }
2168
2169		# Adding package names into depend files for Solaris (not supported by epm)
2170		my $dependfilename = $packagename . ".depend";
2171		$dependfilename = $newepmdir . $dependfilename;
2172		if ( -f $dependfilename)
2173		{
2174			my $dependfile = installer::files::read_file($dependfilename);
2175			put_packagenames_into_dependfile($dependfile);
2176			installer::files::save_file($dependfilename, $dependfile);
2177		}
2178	}
2179
2180	return $newepmdir;
2181}
2182
2183############################################################
2184# Linux requirement for perl is changed by epm from
2185# /usr/bin/perl to perl .
2186# Requires: perl
2187############################################################
2188
2189sub check_requirements_in_specfile
2190{
2191	my ( $specfile ) = @_;
2192
2193	for ( my $i = 0; $i <= $#{$specfile}; $i++ )
2194	{
2195		if (( ${$specfile}[$i] =~ /^\s*Requires/ ) && ( ${$specfile}[$i] =~ /\bperl\b/ ) && ( ! (  ${$specfile}[$i] =~ /\/usr\/bin\/perl\b/ )))
2196		{
2197			my $oldline = ${$specfile}[$i];
2198			${$specfile}[$i] =~ s/perl/\/usr\/bin\/perl/;
2199			my $newline = ${$specfile}[$i];
2200
2201			$oldline =~ s/\s*$//;
2202			$newline =~ s/\s*$//;
2203            $installer::logger::Lang->printf("Spec File: Changing content from \"%s\" to \"%s\".\n",
2204                $oldline, $newline);
2205		}
2206	}
2207}
2208
2209###############################################################################
2210# Replacement of PRODUCTINSTALLLOCATION and PRODUCTDIRECTORYNAME in the
2211# epm list file.
2212# The complete rootpath is stored in $installer::globals::rootpath
2213# or for each package in $onepackage->{'destpath'}
2214# The static rootpath is stored in $staticpath
2215# The relocatable path is stored in $relocatablepath
2216# PRODUCTINSTALLLOCATION is the relocatable part ("/opt") and
2217# PRODUCTDIRECTORYNAME the static path ("openofficeorg20").
2218# In standard epm process:
2219# No usage of package specific variables like $BASEDIR, because
2220# 1. These variables would be replaced in epm process
2221# 2. epm version 3.7 does not support relocatable packages
2222###############################################################################
2223
2224sub resolve_path_in_epm_list_before_packaging
2225{
2226	my ($listfile, $listfilename, $variable, $path) = @_;
2227
2228	installer::logger::include_header_into_logfile("Replacing variables in epm list file:");
2229
2230	$path =~ s/\/\s*$//;
2231	replace_variables_in_shellscripts($listfile, $listfilename, $variable, $path);
2232
2233}
2234
2235#################################################################
2236# Determining the rpm version. Beginning with rpm version 4.0
2237# the tool to create RPMs is "rpmbuild" and no longer "rpm"
2238#################################################################
2239
2240sub determine_rpm_version
2241{
2242	my $rpmversion = 0;
2243	my $rpmout = "";
2244	my $systemcall = "";
2245
2246	# my $systemcall = "rpm --version |";
2247	# "rpm --version" has problems since LD_LIBRARY_PATH was removed. Therefore the content of $RPM has to be called.
2248	# "rpm --version" and "rpmbuild --version" have the same output. Therefore $RPM can be used. Its value
2249	# is saved in $installer::globals::rpm
2250
2251	if ( $installer::globals::rpm ne "" )
2252	{
2253		$systemcall = "$installer::globals::rpm --version |";
2254	}
2255	else
2256	{
2257		$systemcall = "rpm --version |";
2258	}
2259
2260	open (RPM, "$systemcall");
2261	$rpmout = <RPM>;
2262	close (RPM);
2263
2264	if ( $rpmout ne "" )
2265	{
2266		$rpmout =~ s/\s*$//g;
2267
2268        $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2269
2270		if ( $rpmout eq "" )
2271        {
2272            $installer::logger::Lang->printf("ERROR: Could not find file \"rpm\" !\n");
2273        }
2274		else
2275        {
2276            $installer::logger::Lang->printf("Success: rpm version: %s\n", $rpmout);
2277        }
2278
2279		if ( $rpmout =~ /(\d+)\.(\d+)\.(\d+)/ ) { $rpmversion = $1; }
2280		elsif ( $rpmout =~ /(\d+)\.(\d+)/ ) { $rpmversion = $1; }
2281		elsif ( $rpmout =~ /(\d+)/ ) { $rpmversion = $1; }
2282		else { installer::exiter::exit_program("ERROR: Unknown format: $rpmout ! Expected: \"a.b.c\", or \"a.b\", or \"a\"", "determine_rpm_version"); }
2283	}
2284
2285	return $rpmversion;
2286}
2287
2288####################################################
2289# Writing some info about rpm into the log file
2290####################################################
2291
2292sub log_rpm_info
2293{
2294	my $systemcall = "";
2295	my $infoline = "";
2296
2297    $installer::logger::Lang->printf("\n");
2298    $installer::logger::Lang->printf("Logging rpmrc content using --showrc\n");
2299    $installer::logger::Lang->printf("\n");
2300
2301	if ( $installer::globals::rpm ne "" )
2302	{
2303		$systemcall = "$installer::globals::rpm --showrc |";
2304	}
2305	else
2306	{
2307		$systemcall = "rpm --showrc |";
2308	}
2309
2310	my @fullrpmout = ();
2311
2312	open (RPM, "$systemcall");
2313	while (<RPM>) {push(@fullrpmout, $_); }
2314	close (RPM);
2315
2316	if ( $#fullrpmout > -1 )
2317	{
2318		for ( my $i = 0; $i <= $#fullrpmout; $i++ )
2319		{
2320			my $rpmout = $fullrpmout[$i];
2321			$rpmout =~ s/\s*$//g;
2322
2323			$infoline = "$rpmout\n";
2324			$infoline =~ s/error/e_r_r_o_r/gi;  # avoiding log problems
2325            $installer::logger::Lang->print($infoline);
2326		}
2327	}
2328	else
2329	{
2330        $installer::logger::Lang->printf("Problem in systemcall: %s : No return value\n", $systemcall);
2331	}
2332
2333    $installer::logger::Lang->printf("End of logging rpmrc\n");
2334    $installer::logger::Lang->print("\n");
2335}
2336
2337#################################################
2338# Systemcall to start the packaging process
2339#################################################
2340
2341sub create_packages_without_epm
2342{
2343	my ($epmdir, $packagename, $includepatharrayref, $allvariables, $languagestringref) = @_;
2344
2345	# Solaris: pkgmk -o -f solaris-2.8-sparc/SUNWso8m34.prototype -d solaris-2.8-sparc
2346	# Solaris: pkgtrans solaris-2.8-sparc SUNWso8m34.pkg SUNWso8m34
2347	# Solaris: tar -cf - SUNWso8m34 | gzip > SUNWso8m34.tar.gz
2348
2349	if ( $installer::globals::issolarispkgbuild )
2350	{
2351		my $prototypefile = $epmdir . $packagename . ".prototype";
2352		if (! -f $prototypefile) { installer::exiter::exit_program("ERROR: Did not find file: $prototypefile", "create_packages_without_epm"); }
2353
2354		my $destinationdir = $prototypefile;
2355		installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationdir);
2356		$destinationdir =~ s/\/\s*$//;	# removing ending slashes
2357
2358		# my $systemcall = "pkgmk -o -f $prototypefile -d $destinationdir \> /dev/null 2\>\&1";
2359		my $systemcall = "pkgmk -l 1073741824 -o -f $prototypefile -d $destinationdir 2\>\&1 |";
2360        $installer::logger::Info->printf("... %s ...\n", $systemcall);
2361
2362		my $maxpkgmkcalls = 3;
2363
2364		for ( my $i = 1; $i <= $maxpkgmkcalls; $i++ )
2365		{
2366			my @pkgmkoutput = ();
2367
2368			open (PKGMK, "$systemcall");
2369			while (<PKGMK>) {push(@pkgmkoutput, $_); }
2370			close (PKGMK);
2371
2372			my $returnvalue = $?;	# $? contains the return value of the systemcall
2373
2374            $installer::logger::Lang->printf("Systemcall (Try %d): %s\n", $i, $systemcall);
2375
2376			for ( my $j = 0; $j <= $#pkgmkoutput; $j++ )
2377			{
2378				if ( $i < $maxpkgmkcalls ) { $pkgmkoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; }
2379                $installer::logger::Lang->print($pkgmkoutput[$j]);
2380			}
2381
2382			if ($returnvalue)
2383			{
2384                $installer::logger::Lang->printf("Try %s : Could not execute \"%s\"!\n",
2385                    $i, $systemcall);
2386				if ( $i == $maxpkgmkcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); }
2387			}
2388			else
2389			{
2390                $installer::logger::Info->printf("Success: (Try %d): Executed \"%s\" successfully\n",
2391                    $i, $systemcall);
2392                $installer::logger::Lang->printf("Success: (Try %d): Executed \"%s\" successfully\n",
2393                    $i, $systemcall);
2394				last;
2395			}
2396		}
2397
2398		# It might be necessary to save uncompressed Solaris packages
2399
2400		if ( $allvariables->{'JDSBUILD'} )
2401		{
2402			if ( ! $installer::globals::jds_language_controlled )
2403			{
2404				my $correct_language = installer::worker::check_jds_language($allvariables, $languagestringref);
2405				$installer::globals::correct_jds_language = $correct_language;
2406				$installer::globals::jds_language_controlled = 1;
2407			}
2408
2409			if ( $installer::globals::correct_jds_language )
2410			{
2411				if ( $installer::globals::saved_packages_path eq "" )
2412				{
2413					$packagestempdir = installer::systemactions::create_directories("jds", $languagestringref);
2414					$installer::globals::saved_packages_path = $packagestempdir;
2415					push(@installer::globals::jdsremovedirs, $packagestempdir);
2416				}
2417
2418				$systemcall = "cd $destinationdir; cp -p -R $packagename $installer::globals::saved_packages_path;";
2419			 	make_systemcall($systemcall);
2420                $installer::logger::Info->printf("... %s ...\n", $systemcall);
2421
2422				# Setting unix rights to "775" for all created directories inside the package,
2423				# that is saved in temp directory
2424
2425				$systemcall = "cd $packagestempdir; find $packagename -type d -exec chmod 775 \{\} \\\;";
2426                $installer::logger::Info->printf("... %s ...\n", $systemcall);
2427
2428				$returnvalue = system($systemcall);
2429
2430                $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2431
2432				if ($returnvalue)
2433				{
2434                    $installer::logger::Lang->printf("ERROR: Could not execute \"%s\"!\n", $systemcall);
2435				}
2436				else
2437				{
2438                    $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $systemcall);
2439				}
2440			}
2441		}
2442
2443		# compressing packages
2444
2445		if ( ! $installer::globals::solarisdontcompress )
2446		{
2447			my $faspac = "faspac-so.sh";
2448
2449			my $compressorref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$faspac, $includepatharrayref, 0);
2450			if ($$compressorref ne "")
2451			{
2452				# Saving original pkginfo, to set time stamp later
2453				my $pkginfoorig = "$destinationdir/$packagename/pkginfo";
2454				my $pkginfotmp = "$destinationdir/$packagename" . ".pkginfo.tmp";
2455				$systemcall = "cp -p $pkginfoorig $pkginfotmp";
2456			 	make_systemcall($systemcall);
2457
2458				$faspac = $$compressorref;
2459                $installer::logger::Lang->printf("Found compressor: %s\n", $faspac);
2460
2461                $installer::logger::Info->printf("... %s ...\n", $faspac);
2462				$installer::logger::Lang->add_timestamp("Starting $faspac");
2463
2464			 	$systemcall = "/bin/sh $faspac -a -q -d $destinationdir $packagename";	 # $faspac has to be the absolute path!
2465			 	make_systemcall($systemcall);
2466
2467			 	# Setting time stamp for pkginfo, because faspac-so.sh changed the pkginfo file,
2468			 	# updated the size and checksum, but not the time stamp.
2469			 	$systemcall = "touch -r $pkginfotmp $pkginfoorig";
2470			 	make_systemcall($systemcall);
2471				if ( -f $pkginfotmp ) { unlink($pkginfotmp); }
2472
2473				$installer::logger::Lang->add_timestamp("End of $faspac");
2474			}
2475			else
2476			{
2477                $installer::logger::Lang->printf("Not found: %s\n", $faspac);
2478			}
2479		}
2480
2481		# Setting unix rights to "775" for all created directories inside the package
2482
2483		$systemcall = "cd $destinationdir; find $packagename -type d -exec chmod 775 \{\} \\\;";
2484        $installer::logger::Info->printf("... %s ...\n", $systemcall);
2485
2486		$returnvalue = system($systemcall);
2487
2488        $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2489
2490		if ($returnvalue)
2491		{
2492            $installer::logger::Lang->printf("ERROR: Could not execute \"%s\"!\n", $systemcall);
2493		}
2494		else
2495		{
2496            $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $systemcall);
2497		}
2498	}
2499
2500	# Linux: rpm -bb so8m35.spec	( -> dependency check abklemmen? )
2501
2502	if ( $installer::globals::islinuxrpmbuild )
2503	{
2504		my $specfilename = $epmdir . $packagename . ".spec";
2505		if (! -f $specfilename) { installer::exiter::exit_program("ERROR: Did not find file: $specfilename", "create_packages_without_epm"); }
2506
2507		# my $rpmcommand = "rpm";
2508		my $rpmcommand = $installer::globals::rpm;
2509		my $rpmversion = determine_rpm_version();
2510
2511		# if ( $rpmversion >= 4 ) { $rpmcommand = "rpmbuild"; }
2512
2513		# saving globally for later usage
2514		$installer::globals::rpmcommand = $rpmcommand;
2515		$installer::globals::rpmquerycommand = "rpm";
2516
2517		my $target = "";
2518		if ( $installer::globals::compiler =~ /unxlngi/) { $target = "i586"; }
2519		elsif ( $installer::globals::compiler =~ /unxlng/) {$target = (POSIX::uname())[4]; }
2520
2521		# rpm 4.6 ignores buildroot tag in spec file
2522
2523		my $buildrootstring = "";
2524
2525		if ( $rpmversion >= 4 )
2526		{
2527			my $dir = getcwd;
2528			my $buildroot = $dir . "/" . $epmdir . "buildroot/";
2529			$buildrootstring = "--buildroot=$buildroot";
2530			mkdir($buildroot = $dir . "/" . $epmdir . "BUILD/");
2531		}
2532
2533		if ( ! $installer::globals::rpminfologged )
2534		{
2535			log_rpm_info();
2536			$installer::globals::rpminfologged = 1;
2537		}
2538
2539		my $systemcall = "$rpmcommand -bb --define \"_unpackaged_files_terminate_build  0\" $specfilename --target $target $buildrootstring 2\>\&1 |";
2540
2541        $installer::logger::Info->printf("... %s ...\n", $systemcall);
2542
2543		my $maxrpmcalls = 3;
2544		my $rpm_failed = 0;
2545
2546		for ( my $i = 1; $i <= $maxrpmcalls; $i++ )
2547		{
2548			my @rpmoutput = ();
2549
2550			open (RPM, "$systemcall");
2551			while (<RPM>) {push(@rpmoutput, $_); }
2552			close (RPM);
2553
2554			my $returnvalue = $?;	# $? contains the return value of the systemcall
2555
2556            $installer::logger::Lang->printf("Systemcall (Try %d): %s\n", $i, $systemcall);
2557
2558			for ( my $j = 0; $j <= $#rpmoutput; $j++ )
2559			{
2560				# if ( $i < $maxrpmcalls ) { $rpmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; }
2561				$rpmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig;
2562                $installer::logger::Lang->print($rpmoutput[$j]);
2563			}
2564
2565			if ($returnvalue)
2566			{
2567                $installer::logger::Lang->printf("Try %d : Could not execute \"%s\"!\n", $i, $systemcall);
2568				$rpm_failed = 1;
2569			}
2570			else
2571			{
2572                $installer::logger::Info->printf("Success (Try %d): Executed \"%s\" successfully!\n", $i, $systemcall);
2573                $installer::logger::Lang->printf("Success (Try %d): Executed \"%s\" successfully!\n", $i, $systemcall);
2574				$rpm_failed = 0;
2575				last;
2576			}
2577		}
2578
2579		if ( $rpm_failed )
2580		{
2581			# Because of the problems with LD_LIBARY_PATH, a direct call of local "rpm" or "rpmbuild" might be successful
2582			my $rpmprog = "";
2583			if ( -f "/usr/bin/rpmbuild" ) { $rpmprog = "/usr/bin/rpmbuild"; }
2584			elsif ( -f "/usr/bin/rpm" ) { $rpmprog = "/usr/bin/rpm"; }
2585
2586			if ( $rpmprog ne "" )
2587			{
2588                $installer::logger::Info->printf("... %s ...\n", $rpmprog);
2589
2590				my $helpersystemcall = "$rpmprog -bb $specfilename --target $target $buildrootstring 2\>\&1 |";
2591
2592				my @helperrpmoutput = ();
2593
2594				open (RPM, "$helpersystemcall");
2595				while (<RPM>) {push(@helperrpmoutput, $_); }
2596				close (RPM);
2597
2598				my $helperreturnvalue = $?;	# $? contains the return value of the systemcall
2599
2600                $installer::logger::Lang->printf("\n");
2601                $installer::logger::Lang->printf("Last try: Using %s directly (problem with LD_LIBARY_PATH)\n",
2602                    $rpmprog);
2603
2604                $installer::logger::Lang->printf("\n");
2605                $installer::logger::Lang->printf("Systemcall: %s\n", $helpersystemcall);
2606
2607                foreach my $line (@helperrpmoutput)
2608                {
2609                    $installer::logger::Lang->print($helperrpmoutput[$j]);
2610                }
2611
2612				if ($helperreturnvalue)
2613				{
2614                    $installer::logger::Lang->printf("Could not execute \"%s\"!\n", $helpersystemcall);
2615				}
2616				else
2617				{
2618                    $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $helpersystemcall);
2619                    $installer::logger::Info->printf("Success: Executed \"%s\" successfully!\n", $helpersystemcall);
2620					$rpm_failed = 0;
2621				}
2622			}
2623
2624			# Now it is really time to exit this packaging process, if the error still occurs
2625			if ( $rpm_failed ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); }
2626		}
2627	}
2628}
2629
2630#################################################
2631# Removing all temporary files created by epm
2632#################################################
2633
2634sub remove_temporary_epm_files
2635{
2636	my ($epmdir, $loggingdir, $packagename) = @_;
2637
2638	# saving the files into the loggingdir
2639
2640	if ( $installer::globals::issolarispkgbuild )
2641	{
2642		my @extensions = ();
2643		push(@extensions, ".pkginfo");
2644		push(@extensions, ".prototype");
2645		push(@extensions, ".postinstall");
2646		push(@extensions, ".postremove");
2647		push(@extensions, ".preinstall");
2648		push(@extensions, ".preremove");
2649		push(@extensions, ".depend");
2650
2651		for ( my $i = 0; $i <= $#extensions; $i++ )
2652		{
2653			my $removefile = $epmdir . $packagename . $extensions[$i];
2654			my $destfile = $loggingdir . $packagename . $extensions[$i] . ".log";
2655
2656			if (! -f $removefile) { next; }
2657
2658			my $systemcall = "mv -f $removefile $destfile";
2659			system($systemcall);	 # ignoring the return value
2660            $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2661		}
2662	}
2663
2664	if ( $installer::globals::islinuxrpmbuild )
2665	{
2666		my $removefile = $epmdir . $packagename . ".spec";
2667		my $destfile = $loggingdir . $packagename . ".spec.log";
2668
2669		 # if (! -f $removefile) { next; }
2670
2671		my $systemcall = "mv -f $removefile $destfile";
2672		system($systemcall);	 # ignoring the return value
2673        $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2674
2675		# removing the directory "buildroot"
2676
2677		my $removedir = $epmdir . "buildroot";
2678
2679		$systemcall = "rm -rf $removedir";
2680
2681        $installer::logger::Info->printf("... %s ...\n", $systemcall);
2682
2683		my $returnvalue = system($systemcall);
2684
2685		$removedir = $epmdir . "BUILD";
2686
2687		$systemcall = "rm -rf $removedir";
2688
2689        $installer::logger::Info->printf("... %s ...\n", $systemcall);
2690
2691		$returnvalue = system($systemcall);
2692
2693        $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2694
2695        if ($returnvalue)
2696        {
2697            $installer::logger::Lang->printf("ERROR: Could not execute \"%s\"!\n", $systemcall);
2698        }
2699        else
2700        {
2701            $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $systemcall);
2702        }
2703	}
2704}
2705
2706######################################################
2707# Making the systemcall
2708######################################################
2709
2710sub make_systemcall
2711{
2712	my ($systemcall) = @_;
2713
2714	my $returnvalue = system($systemcall);
2715
2716    $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2717
2718	if ($returnvalue)
2719	{
2720        $installer::logger::Lang->printf("ERROR: Could not execute \"%s\"!\n", $systemcall);
2721	}
2722	else
2723	{
2724        $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $systemcall);
2725	}
2726}
2727
2728###########################################################
2729# Creating a better directory structure in the solver.
2730###########################################################
2731
2732sub create_new_directory_structure
2733{
2734	my ($newepmdir) = @_;
2735
2736	my $newdir = $installer::globals::epmoutpath;
2737
2738	if ( $installer::globals::islinuxrpmbuild )
2739	{
2740		my $rpmdir;
2741                my $machine = "";
2742		if ( $installer::globals::compiler =~ /unxlngi/) {
2743                    $rpmdir = "$installer::globals::epmoutpath/RPMS/i586";
2744                }
2745		elsif ( $installer::globals::compiler =~ /unxlng/) {
2746                    $machine = (POSIX::uname())[4];
2747                    $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine";
2748                }
2749                else { installer::exiter::exit_program("ERROR: rpmdir undefined !", "create_new_directory_structure"); }
2750
2751		my $systemcall = "mv $rpmdir/* $newdir";	# moving the rpms into the directory "RPMS"
2752
2753		my $returnvalue = system($systemcall);
2754
2755        $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
2756
2757		if ($returnvalue)
2758		{
2759            $installer::logger::Lang->printf("ERROR: Could not move content of \"%s\" to \"%s\"!\n",
2760                $rpmdir,$newdir);
2761		}
2762		else
2763		{
2764            $installer::logger::Lang->printf("Success: Moved content of \"%s\" to \"%s\"!\n",
2765                $rpmdir, $newdir);
2766		}
2767
2768		# and removing the empty directory
2769
2770		if ( $machine ne "" )
2771		{
2772			installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/$machine");
2773		}
2774		installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/x86_64");
2775		installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i586");
2776		installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i386");
2777		installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS");
2778
2779	}
2780
2781	# Setting unix rights to "775" for $newdir ("RPMS" or "packages")
2782
2783	my $localcall = "chmod 775 $newdir \>\/dev\/null 2\>\&1";
2784	my $callreturnvalue = system($localcall);
2785
2786    $installer::logger::Lang->printf("Systemcall: %s\n", $localcall);
2787
2788	if ($callreturnvalue)
2789	{
2790        $installer::logger::Lang->printf("ERROR: Could not execute \"%s\"!\n", $localcall);
2791	}
2792	else
2793	{
2794        $installer::logger::Lang->printf("Success: Executed \"%s\" successfully!\n", $localcall);
2795	}
2796}
2797
2798######################################################
2799# Collect modules with product specific styles.
2800######################################################
2801
2802sub collect_modules_with_style
2803{
2804	my ($style, $modulesarrayref) = @_;
2805
2806	my @allmodules = ();
2807
2808	for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
2809	{
2810		my $onemodule = ${$modulesarrayref}[$i];
2811		my $styles = "";
2812		if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; }
2813		if ( $styles =~ /\b\Q$style\E\b/ )
2814		{
2815			push(@allmodules, $onemodule);
2816		}
2817	}
2818
2819	return \@allmodules;
2820}
2821
2822######################################################
2823# Remove modules without packagecontent.
2824######################################################
2825
2826sub remove_modules_without_package
2827{
2828	my ($allmodules) = @_;
2829
2830	my @allmodules = ();
2831
2832	for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
2833	{
2834		my $onemodule = ${$allmodules}[$i];
2835		my $packagename = "";
2836		if ( $onemodule->{'PackageName'} ) { $packagename = $onemodule->{'PackageName'}; }
2837		if ( $packagename ne "" )
2838		{
2839			push(@allmodules, $onemodule);
2840		}
2841	}
2842
2843	return \@allmodules;
2844}
2845
2846######################################################
2847# Unpacking tar.gz file and setting new packagename.
2848######################################################
2849
2850sub unpack_tar_gz_file
2851{
2852	my ($packagename, $destdir) = @_;
2853
2854	my $newpackagename = "";
2855
2856	if ( $packagename =~ /\.tar\.gz\s*$/ )
2857	{
2858		# Collecting all packages in directory "packages"
2859		my $oldcontent = installer::systemactions::read_directory($destdir);
2860
2861		# unpacking gunzip
2862		my $systemcall = "cd $destdir; cat $packagename | gunzip | tar -xf -";
2863		make_systemcall($systemcall);
2864
2865		# deleting the tar.gz files
2866		$systemcall = "cd $destdir; rm -f $packagename";
2867		make_systemcall($systemcall);
2868
2869		# Finding new content -> that is the package name
2870		my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent);
2871		$newpackagename = ${$newcontent}[0];
2872		installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newpackagename);
2873	}
2874
2875	if ( $newpackagename ne "" ) { $packagename = $newpackagename; }
2876
2877	return $packagename;
2878}
2879
2880######################################################
2881# Copying files of child projects.
2882######################################################
2883
2884sub copy_childproject_files
2885{
2886	my ($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, $subdir, $includepatharrayref, $use_sopackpath) = @_;
2887
2888	for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
2889	{
2890		my $localdestdir = $destdir;
2891		my $onemodule = ${$allmodules}[$i];
2892		my $packagename = $onemodule->{'PackageName'};
2893		my $sourcefile = "";
2894		if ( $use_sopackpath )
2895		{
2896			$sourcefile = $sopackpath . $installer::globals::separator . $installer::globals::compiler . $installer::globals::separator . $subdir . $installer::globals::separator . $packagename;
2897		}
2898		else
2899		{
2900			my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagename, $includepatharrayref, 1);
2901			$sourcefile = $$sourcepathref;
2902		}
2903
2904		if ( ! -f $sourcefile ) { installer::exiter::exit_program("ERROR: File not found: $sourcefile ($packagename) !", "copy_childproject_files"); }
2905		if ( $onemodule->{'Subdir'} )
2906		{
2907			$localdestdir = $localdestdir . $installer::globals::separator . $onemodule->{'Subdir'};
2908			if ( ! -d $localdestdir ) { installer::systemactions::create_directory($localdestdir); }
2909		}
2910		installer::systemactions::copy_one_file($sourcefile, $localdestdir);
2911		# Solaris: unpacking tar.gz files and setting new packagename
2912		if ( $installer::globals::issolarispkgbuild ) { $packagename = unpack_tar_gz_file($packagename, $localdestdir); }
2913
2914		if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} ))
2915		{
2916			installer::xpdinstaller::create_xpd_file_for_childproject($onemodule, $localdestdir, $packagename, $allvariableshashref, $modulesarrayref);
2917		}
2918	}
2919
2920}
2921
2922######################################################
2923# Copying files for system integration.
2924######################################################
2925
2926sub copy_and_unpack_tar_gz_files
2927{
2928	my ($sourcefile, $destdir) = @_;
2929
2930	my $systemcall = "cd $destdir; cat $sourcefile | gunzip | tar -xf -";
2931	make_systemcall($systemcall);
2932}
2933
2934######################################################
2935# Including child packages into the
2936# installation set.
2937######################################################
2938
2939sub put_childprojects_into_installset
2940{
2941	my ($newdir, $allvariables, $modulesarrayref, $includepatharrayref) = @_;
2942
2943	my $infoline = "";
2944
2945	my $sopackpath = "";
2946	if ( $ENV{'SO_PACK'} ) { $sopackpath  = $ENV{'SO_PACK'}; }
2947	else { installer::exiter::exit_program("ERROR: Environment variable SO_PACK not set!", "put_childprojects_into_installset"); }
2948
2949	my $destdir = "$newdir";
2950
2951	# adding Java
2952
2953	my $sourcefile = "";
2954
2955	# Finding the modules defined in scp (with flag JAVAMODULE, ADAMODULE, ...)
2956	# Getting name of package from scp-Module
2957	# Copy file into installation set
2958	# Create xpd file and put it into xpd directory
2959	# xpd file has to be created completely from module and package itself (-> no packagelist!)
2960
2961	if ( $allvariables->{'JAVAPRODUCT'} )
2962	{
2963		# Collect all modules with flag "JAVAMODULE"
2964		my $allmodules = collect_modules_with_style("JAVAMODULE", $modulesarrayref);
2965		$allmodules = remove_modules_without_package($allmodules);
2966		copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "jre", $includepatharrayref, 1);
2967	}
2968
2969	# Adding additional required packages (freetype).
2970	# This package names are stored in global array @installer::globals::requiredpackages
2971
2972	if ( $allvariables->{'ADDREQUIREDPACKAGES'} )
2973	{
2974		# Collect all modules with flag "REQUIREDPACKAGEMODULE"
2975		my $allmodules = collect_modules_with_style("REQUIREDPACKAGEMODULE", $modulesarrayref);
2976		$allmodules = remove_modules_without_package($allmodules);
2977		copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "requiredpackages", $includepatharrayref, 1);
2978	}
2979
2980	# Collect all modules with flag "USERLANDMODULE"
2981	my $alluserlandmodules = collect_modules_with_style("USERLANDMODULE", $modulesarrayref);
2982	$alluserlandmodules = remove_modules_without_package($alluserlandmodules);
2983	copy_childproject_files($alluserlandmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "", $includepatharrayref, 0);
2984
2985}
2986
2987######################################################
2988# Checking whether the new content is a directory and
2989# not a package. If it is a directory, the complete
2990# content of the directory has to be added to the
2991# array newcontent.
2992######################################################
2993
2994sub control_subdirectories
2995{
2996	my ($content, $subdir) = @_;
2997
2998	my @newcontent = ();
2999
3000	for ( my $i = 0; $i <= $#{$content}; $i++ )
3001	{
3002		if ( -d ${$content}[$i] )
3003		{
3004			$subdir = ${$content}[$i];
3005			installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$subdir);
3006			my $allpackages = installer::systemactions::read_directory(${$content}[$i]);
3007			for ( my $j = 0; $j <= $#{$allpackages}; $j++ )
3008			{
3009				# Currently only Linux rpm is supported, debian packages cannot be installed via xpd installer
3010				if (( $installer::globals::islinuxbuild ) && ( ! ( ${$allpackages}[$j] =~ /\.rpm\s*$/ ))) { next; }
3011				push(@newcontent, ${$allpackages}[$j]);
3012			}
3013		}
3014		else
3015		{
3016			push(@newcontent, ${$content}[$i]);
3017		}
3018	}
3019
3020	return (\@newcontent, $subdir);
3021}
3022
3023######################################################
3024# Including the system integration files into the
3025# installation sets.
3026######################################################
3027
3028sub put_systemintegration_into_installset
3029{
3030	my ($newdir, $includepatharrayref, $allvariables, $modulesarrayref) = @_;
3031
3032	my $destdir = $newdir;
3033
3034	# adding System integration files
3035
3036	my $sourcefile = "";
3037
3038	# Finding the modules defined in scp (with flag SYSTEMMODULE)
3039	# Getting name of package from scp-Module
3040	# Search package in list off all include files
3041	# Copy file into installation set and unpack it (always tar.gz)
3042	# Create xpd file and put it into xpd directory
3043	# tar.gz can contain a different number of packages -> automatically create hidden sub modules
3044	# xpd file has to be created completely from module and package itself (-> no packagelist!)
3045
3046	# Collect all modules with flag "SYSTEMMODULE"
3047	my $allmodules = collect_modules_with_style("SYSTEMMODULE", $modulesarrayref);
3048	$allmodules = remove_modules_without_package($allmodules);
3049
3050	for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
3051	{
3052		my $onemodule = ${$allmodules}[$i];
3053		my $packagetarfilename = $onemodule->{'PackageName'};
3054
3055        $installer::logger::Lang->printf("Including into installation set: %s\n", $packagetarfilename);
3056
3057		my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagetarfilename, $includepatharrayref, 1);
3058		if ( $$sourcepathref eq "" ) { installer::exiter::exit_program("ERROR: Source path not found for $packagetarfilename!", "copy_systemintegration_files"); }
3059
3060		# Collecting all packages in directory "packages" or "RPMS"
3061		my $oldcontent = installer::systemactions::read_directory($destdir);
3062
3063		copy_and_unpack_tar_gz_files($$sourcepathref, $destdir);
3064
3065		# Finding new content -> that is the package name
3066		my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent);
3067
3068		# special handling, if new content is a directory
3069		my $subdir = "";
3070		if ( ! $installer::globals::issolarispkgbuild ) { ($newcontent, $subdir) = control_subdirectories($newcontent); }
3071
3072		# Adding license content into Solaris packages
3073		if (( $installer::globals::issolarispkgbuild ) && ( $installer::globals::englishlicenseset ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) { installer::worker::add_license_into_systemintegrationpackages($destdir, $newcontent); }
3074
3075		if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} ))
3076		{
3077			installer::xpdinstaller::create_xpd_file_for_systemintegration($onemodule, $newcontent, $modulesarrayref, $subdir);
3078		}
3079	}
3080}
3081
3082######################################################
3083# Analyzing the Unix installation path.
3084# From the installation path /opt/openofficeorg20
3085# is the part /opt relocatable and the part
3086# openofficeorg20 static.
3087######################################################
3088
3089sub analyze_rootpath
3090{
3091	my ($rootpath, $staticpathref, $relocatablepathref, $allvariables) = @_;
3092
3093	$rootpath =~ s/\/\s*$//;	# removing ending slash
3094
3095	##############################################################
3096	# Version 1: "/opt" is variable and "openofficeorg20" fixed
3097	##############################################################
3098
3099	# my $staticpath = $rootpath;
3100	# installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$staticpath);
3101	# $$staticpathref = $staticpath;				# will be "openofficeorg20"
3102
3103	# my $relocatablepath = $rootpath;
3104	# installer::pathanalyzer::get_path_from_fullqualifiedname(\$relocatablepath);
3105	# $$relocatablepathref = $relocatablepath;		# will be "/opt/"
3106
3107	##############################################################
3108	# Version 2: "/opt/openofficeorg20" is variable and "" fixed
3109	##############################################################
3110
3111	# if ( $$relocatablepathref eq "" )	# relocatablepath is not defined in package list
3112	# {
3113	#	$$staticpathref = "";	# will be ""
3114	#	$$relocatablepathref = $rootpath . "\/"; # relocatable path must end with "/", will be "/opt/openofficeorg20/"
3115	#	# setting the static path to the hostname of the directory with style OFFICEDIRECTORY
3116	#	if ( $allvariables->{'SETSTATICPATH'} ) { $$staticpathref = $installer::globals::officedirhostname; }
3117	#
3118	# }
3119	# else	# relocatablepath is defined in package list
3120	# {
3121	#	$$relocatablepathref =~ s/\/\s*$//;			# removing ending slash
3122	#	$$relocatablepathref = $$relocatablepathref . "\/";	# relocatable path must end with "/"
3123	#	my $staticpath = $rootpath;
3124	#	$staticpath =~ s/\Q$$relocatablepathref\E//;
3125	#	$staticpath =~ s/\/\s*$//;
3126	#	$$staticpathref = $staticpath;
3127	# }
3128
3129	##############################################################
3130	# Version 3: "/" is variable and "/opt/openofficeorg20" fixed
3131	##############################################################
3132
3133	$$relocatablepathref = "/";
3134	# Static path has to contain the office directory name. This is replaced in shellscripts.
3135	$$staticpathref = $rootpath . $installer::globals::separator . $installer::globals::officedirhostname;
3136	# For RPM version 3.x it is required, that Prefix is not "/" in spec file. In this case --relocate will not work,
3137	# because RPM 3.x says, that the package is not relocatable. Therefore we have to use Prefix=/opt and for
3138	# all usages of --relocate this path has to be on both sides of the "=": --relocate /opt=<myselectdir>/opt .
3139	if ( $installer::globals::islinuxrpmbuild )
3140	{
3141		$$relocatablepathref = $rootpath . "\/"; # relocatable path must end with "/", will be "/opt/"
3142		$$staticpathref = $installer::globals::officedirhostname; # to be used as replacement in shell scripts
3143	}
3144
3145	if ( $installer::globals::islinuxdebbuild )
3146	{
3147		$$relocatablepathref = "";
3148		# $$staticpathref is already "/opt/openoffice.org3", no additional $rootpath required.
3149		# $$staticpathref = $rootpath . $installer::globals::separator . $$staticpathref;  # no relocatibility for Debian
3150	}
3151
3152}
3153
3154######################################################
3155# Including license and readme into
3156# Unix installation sets.
3157######################################################
3158
3159sub put_installsetfiles_into_installset
3160{
3161	my ($destdir) = @_;
3162
3163	# All files for the installation set are saved in the global
3164	# array @installer::globals::installsetfiles
3165
3166	for ( my $i = 0; $i <= $#installer::globals::installsetfiles; $i++ )
3167	{
3168		my $onefile = $installer::globals::installsetfiles[$i];
3169		my $sourcefile = $onefile->{'sourcepath'};
3170		my $destfile = "";
3171		if ( $installer::globals::addjavainstaller ) { $destfile = $onefile->{'Name'}; }
3172		else { $destfile = $destdir . $installer::globals::separator . $onefile->{'Name'}; }
3173		installer::systemactions::copy_one_file($sourcefile, $destfile);
3174
3175        $installer::logger::Lang->printf("Adding to installation set \"%s\" from source \"%s\".\n",
3176            $destfile, $sourcefile);
3177	}
3178}
3179
3180######################################################
3181# Replacing one variable in patchinfo file
3182######################################################
3183
3184sub replace_one_variable_in_file
3185{
3186	my ( $file, $placeholder, $value ) = @_;
3187
3188	for ( my $i = 0; $i <= $#{$file}; $i++ )
3189	{
3190		${$file}[$i] =~ s/$placeholder/$value/g;
3191	}
3192}
3193
3194######################################################
3195# Setting variables in the patchinfo file
3196######################################################
3197
3198sub set_patchinfo
3199{
3200	my ( $patchinfofile, $patchid, $allvariables ) = @_;
3201
3202	# Setting: PATCHIDPLACEHOLDER and ARCHITECTUREPLACEHOLDER and PATCHCORRECTSPLACEHOLDER
3203
3204	replace_one_variable_in_file($patchinfofile, "PATCHIDPLACEHOLDER", $patchid);
3205
3206	my $architecture = "";
3207	if ( $installer::globals::issolarissparcbuild ) { $architecture = "sparc"; }
3208	if ( $installer::globals::issolarisx86build ) { $architecture = "i386"; }
3209
3210	replace_one_variable_in_file($patchinfofile, "ARCHITECTUREPLACEHOLDER", $architecture);
3211
3212	if ( ! $allvariables->{'SOLARISPATCHCORRECTS'} ) { installer::exiter::exit_program("ERROR: No setting for PATCH_CORRECTS in zip list file!", "set_patchinfo"); }
3213	my $patchcorrects = $allvariables->{'SOLARISPATCHCORRECTS'};
3214
3215	replace_one_variable_in_file($patchinfofile, "PATCHCORRECTSPLACEHOLDER", $patchcorrects);
3216
3217	# Setting also PATCH_REQUIRES in patch info file, if entry in zip list file exists
3218	my $requiresstring = "";
3219	if ( $installer::globals::issolarissparcbuild ) { $requiresstring = "SOLSPARCPATCHREQUIRES"; }
3220	if ( $installer::globals::issolarisx86build ) { $requiresstring = "SOLIAPATCHREQUIRES"; }
3221
3222	if ( $allvariables->{$requiresstring} )
3223	{
3224		my $newline = "PATCH_REQUIRES=\"" . $allvariables->{$requiresstring} . "\"" . "\n";
3225		push(@{$patchinfofile}, $newline);
3226	}
3227}
3228
3229######################################################
3230# Finalizing patch: Renaming directory and
3231# including additional patch files.
3232######################################################
3233
3234sub finalize_patch
3235{
3236	my ( $newepmdir, $allvariables ) = @_;
3237
3238	my $patchidname = "SOLSPARCPATCHID";
3239	if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; }
3240
3241	if ( ! $allvariables->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "finalize_patch"); }
3242	my $patchid = $allvariables->{$patchidname};
3243	installer::systemactions::rename_directory($newepmdir, $patchid);
3244
3245	# Copying all typical patch files into the patch directory
3246	# All patch file names are stored in @installer::globals::solarispatchfiles
3247	# Location of the file is $installer::globals::patchincludepath
3248
3249	my $sourcepath = $installer::globals::patchincludepath;
3250	$sourcepath =~ s/\/\s*$//;
3251
3252	for ( my $i = 0; $i <= $#installer::globals::solarispatchfiles; $i++ )
3253	{
3254		my $sourcefile = $sourcepath . $installer::globals::separator . $installer::globals::solarispatchfiles[$i];
3255		my $destfile = $patchid . $installer::globals::separator . $installer::globals::solarispatchfiles[$i];
3256		installer::systemactions::copy_one_file($sourcefile, $destfile);
3257	}
3258
3259	# And editing the patchinfo file
3260
3261	my $patchinfofilename = $patchid . $installer::globals::separator . "patchinfo";
3262	my $patchinfofile = installer::files::read_file($patchinfofilename);
3263	set_patchinfo($patchinfofile, $patchid, $allvariables);
3264	installer::files::save_file($patchinfofilename, $patchinfofile);
3265}
3266
3267######################################################
3268# Finalizing Linux patch: Renaming directory and
3269# including additional patch files.
3270######################################################
3271
3272sub finalize_linux_patch
3273{
3274	my ( $newepmdir, $allvariables, $includepatharrayref ) = @_;
3275
3276	# Copying the setup into the patch directory
3277	# and including the list of RPMs into it
3278
3279	print "... creating patch setup ...\n";
3280
3281	installer::logger::include_header_into_logfile("Creating Linux patch setup:");
3282
3283	# find and read setup script template
3284
3285	my $scriptfilename = "linuxpatchscript.sh";
3286	my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0);
3287	if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find patch script template $scriptfilename!", "finalize_linux_patch"); }
3288	my $scriptfile = installer::files::read_file($$scriptref);
3289
3290    $installer::logger::Lang->printf("Found  script file %s: %s \n", $scriptfilename, $$scriptref);
3291
3292	# Collecting all RPMs in the patch directory
3293
3294	my $fileextension = "rpm";
3295	my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $newepmdir);
3296	if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find rpm in directory $newepmdir!", "finalize_linux_patch"); }
3297	for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); }
3298
3299#	my $installline = "";
3300#
3301#	for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ )
3302#	{
3303#		$installline = $installline . "  rpm --prefix \$PRODUCTINSTALLLOCATION -U $newepmdir/${$rpmfiles}[$i]\n";
3304#	}
3305#
3306#	$installline =~ s/\s*$//;
3307#
3308#	for ( my $j = 0; $j <= $#{$scriptfile}; $j++ )
3309#	{
3310#		${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/;
3311#	}
3312
3313	# Searching packagename containing -core01
3314	my $found_package = 0;
3315	my $searchpackagename = "";
3316	for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ )
3317	{
3318		if ( ${$rpmfiles}[$i] =~ /-core01-/ )
3319		{
3320			$searchpackagename = ${$rpmfiles}[$i];
3321			$found_package = 1;
3322			if ( $searchpackagename =~ /^\s*(.*?-core01)-.*/ ) { $searchpackagename = $1; }
3323			last;
3324		}
3325	}
3326
3327	if ( ! $found_package ) { installer::exiter::exit_program("ERROR: No package containing \"-core01\" found in directory \"$newepmdir\"", "finalize_linux_patch"); }
3328
3329	# Replacing the searchpackagename
3330	for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/SEARCHPACKAGENAMEPLACEHOLDER/$searchpackagename/; }
3331
3332	# Setting the PRODUCTDIRECTORYNAME to $installer::globals::officedirhostname
3333	for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTDIRECTORYNAME/$installer::globals::officedirhostname/; }
3334
3335	# Replacing the productname
3336	my $productname = $allvariables->{'PRODUCTNAME'};
3337	$productname = lc($productname);
3338	$productname =~ s/ /_/g;	# abc office -> abc_office
3339
3340    $installer::logger::Lang->printf("Adding productname %s into Linux patch script\n", $productname);
3341
3342	for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; }
3343
3344	# Saving the file
3345
3346	my $newscriptfilename = "setup"; # $newepmdir . $installer::globals::separator . "setup";
3347	installer::files::save_file($newscriptfilename, $scriptfile);
3348
3349    $installer::logger::Lang->printf("Saved Linux patch setup %s\n", $newscriptfilename);
3350
3351	# Setting unix rights 755
3352	my $localcall = "chmod 775 $newscriptfilename \>\/dev\/null 2\>\&1";
3353	system($localcall);
3354}
3355
33561;
3357