1
0
Fork 0
libreoffice/solenv/bin/modules/installer/download.pm
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

666 lines
19 KiB
Perl

#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This file incorporates work covered by the following license notice:
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed
# with this work for additional information regarding copyright
# ownership. The ASF licenses this file to you under the Apache
# License, Version 2.0 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.apache.org/licenses/LICENSE-2.0 .
#
package installer::download;
use strict;
use warnings;
use File::Spec;
use installer::exiter;
use installer::files;
use installer::globals;
use installer::logger;
use installer::pathanalyzer;
use installer::remover;
use installer::systemactions;
BEGIN { # This is needed so that cygwin's perl evaluates ACLs
# (needed for correctly evaluating the -x test.)
if( $^O =~ /cygwin/i ) {
require filetest; import filetest "access";
}
}
##################################################################
# Including the lowercase product name into the script template
##################################################################
sub put_productname_into_script
{
my ($scriptfile, $variableshashref) = @_;
my $productname = $variableshashref->{'PRODUCTNAME'};
$productname = lc($productname);
$productname =~ s/\.//g; # openoffice.org -> openofficeorg
$productname =~ s/\s*//g;
my $infoline = "Adding productname $productname into download shell script\n";
push( @installer::globals::logfileinfo, $infoline);
for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
{
${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
}
}
#########################################################
# Including the linenumber into the script template
#########################################################
sub put_linenumber_into_script
{
my ( $scriptfile ) = @_;
my $linenumber = $#{$scriptfile} + 2;
my $infoline = "Adding linenumber $linenumber into download shell script\n";
push( @installer::globals::logfileinfo, $infoline);
for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
{
${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
}
}
#########################################################
# Determining the name of the new scriptfile
#########################################################
sub determine_scriptfile_name
{
my ( $filename ) = @_;
$installer::globals::downloadfileextension = ".sh";
$filename = $filename . $installer::globals::downloadfileextension;
$installer::globals::downloadfilename = $filename;
my $infoline = "Setting download shell script file name to $filename\n";
push( @installer::globals::logfileinfo, $infoline);
return $filename;
}
#########################################################
# Saving the script file in the installation directory
#########################################################
sub save_script_file
{
my ($directory, $newscriptfilename, $scriptfile) = @_;
$newscriptfilename = $directory . $installer::globals::separator . $newscriptfilename;
installer::files::save_file($newscriptfilename, $scriptfile);
my $infoline = "Saving script file $newscriptfilename\n";
push( @installer::globals::logfileinfo, $infoline);
if ( ! $installer::globals::iswindowsbuild )
{
chmod 0775, $newscriptfilename;
}
return $newscriptfilename;
}
#########################################################
# Including checksum and size into script file
#########################################################
sub put_checksum_and_size_into_script
{
my ($scriptfile, $sumout) = @_;
my $checksum = "";
my $size = "";
if ( $sumout =~ /^\s*(\d+)\s+(\d+)\s*$/ )
{
$checksum = $1;
$size = $2;
}
else
{
installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/sum: $sumout", "put_checksum_and_size_into_script");
}
my $infoline = "Adding checksum $checksum and size $size into download shell script\n";
push( @installer::globals::logfileinfo, $infoline);
for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
{
${$scriptfile}[$i] =~ s/CHECKSUMPLACEHOLDER/$checksum/;
${$scriptfile}[$i] =~ s/DISCSPACEPLACEHOLDER/$size/;
}
}
#########################################################
# Determining checksum and size of tar file
#########################################################
sub call_sum
{
my ($filename) = @_;
my $systemcall = "/usr/bin/sum $filename |";
my $sumoutput = "";
open (SUM, "$systemcall");
$sumoutput = <SUM>;
close (SUM);
my $returnvalue = $?; # $? contains the return value of the systemcall
my $infoline = "Systemcall: $systemcall\n";
push( @installer::globals::logfileinfo, $infoline);
if ($returnvalue)
{
$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
push( @installer::globals::logfileinfo, $infoline);
}
else
{
$infoline = "Success: Executed \"$systemcall\" successfully!\n";
push( @installer::globals::logfileinfo, $infoline);
}
$sumoutput =~ s/\s+$filename\s$//;
return $sumoutput;
}
#########################################################
# Include the tar file into the script
#########################################################
sub include_tar_into_script
{
my ($scriptfile, $temporary_tarfile) = @_;
my $systemcall = "cat $temporary_tarfile >> $scriptfile && rm $temporary_tarfile";
my $returnvalue = system($systemcall);
my $infoline = "Systemcall: $systemcall\n";
push( @installer::globals::logfileinfo, $infoline);
if ($returnvalue)
{
$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
push( @installer::globals::logfileinfo, $infoline);
}
else
{
$infoline = "Success: Executed \"$systemcall\" successfully!\n";
push( @installer::globals::logfileinfo, $infoline);
}
return $returnvalue;
}
#########################################################
# Create a tar file from the binary package
#########################################################
sub tar_package
{
my ( $installdir, $tarfilename, $usefakeroot) = @_;
my $fakerootstring = "";
if ( $usefakeroot ) { $fakerootstring = "fakeroot"; }
my $systemcall = "cd $installdir; $fakerootstring tar -cf - * > $tarfilename";
my $returnvalue = system($systemcall);
my $infoline = "Systemcall: $systemcall\n";
push( @installer::globals::logfileinfo, $infoline);
if ($returnvalue)
{
$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
push( @installer::globals::logfileinfo, $infoline);
}
else
{
$infoline = "Success: Executed \"$systemcall\" successfully!\n";
push( @installer::globals::logfileinfo, $infoline);
}
chmod 0775, $tarfilename;
return ( -s $tarfilename );
}
#########################################################
# Setting installation languages
#########################################################
sub get_downloadname_language
{
my ($languagestringref) = @_;
my $languages = $$languagestringref;
if ( $installer::globals::added_english )
{
$languages =~ s/en-US_//;
$languages =~ s/_en-US//;
}
# do not list languages if there are too many
if ( length ($languages) > $installer::globals::max_lang_length )
{
$languages = '';
}
# do not list pure en-US, except for helppack and langpack
if ( ( $languages eq "en-US" ) &&
( ! $installer::globals::languagepack ) &&
( ! $installer::globals::helppack ) )
{
$languages = '';
}
return $languages;
}
#########################################################
# Setting download name
#########################################################
sub get_downloadname_productname
{
my ($allvariables) = @_;
my $start = "";
$start = $allvariables->{'PRODUCTNAME'};
return $start;
}
#########################################################
# Setting download version
#########################################################
sub get_download_version
{
my ($allvariables) = @_;
my $version = "";
$version = $allvariables->{'PRODUCTVERSION'};
if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} ne "" )) { $version = $version . $allvariables->{'PRODUCTEXTENSION'}; }
return $version;
}
#################################################################
# Setting the platform name for download
#################################################################
sub get_download_platformname
{
my $platformname = "";
if ( $installer::globals::islinuxbuild )
{
$platformname = "Linux";
}
elsif ( $installer::globals::issolarisbuild )
{
$platformname = "Solaris";
}
elsif ( $installer::globals::iswindowsbuild )
{
$platformname = "Win";
}
elsif ( $installer::globals::isfreebsdbuild )
{
$platformname = "FreeBSD";
}
elsif ( $installer::globals::ismacbuild )
{
$platformname = "MacOS";
}
else
{
$platformname = $installer::globals::os;
}
return $platformname;
}
#########################################################
# Setting the architecture for the download name
#########################################################
sub get_download_architecture
{
my $arch = "";
if ( $installer::globals::issolarissparcbuild )
{
$arch = "Sparc";
}
elsif ( $installer::globals::issolarisx86build )
{
$arch = "x86";
}
elsif ( $installer::globals::cpuname eq 'INTEL' )
{
$arch = "x86";
}
elsif ( $installer::globals::cpuname eq 'POWERPC' )
{
$arch = "PPC";
}
elsif ( $installer::globals::cpuname eq 'POWERPC64' )
{
$arch = "PPC";
}
elsif ( $installer::globals::cpuname eq 'X86_64' )
{
$arch = 'x86-64';
}
elsif ( $installer::globals::cpuname eq 'AARCH64' )
{
$arch = "aarch64";
}
return $arch;
}
#########################################################
# Setting the content type for the download name
#########################################################
sub get_download_content
{
my ($allvariables) = @_;
my $content = "";
# content type included in the installer
if ( $installer::globals::isrpmbuild )
{
$content = "rpm";
}
elsif ( $installer::globals::isdebbuild )
{
$content = "deb";
}
elsif ( $installer::globals::packageformat eq "archive" )
{
$content = "archive";
}
return $content;
}
#########################################################
# Setting the functionality type for the download name
#########################################################
sub get_download_functionality
{
my ($allvariables) = @_;
my $functionality = "";
if ( $installer::globals::languagepack )
{
$functionality = "langpack";
}
elsif ( $installer::globals::helppack )
{
$functionality = "helppack";
}
elsif ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )
{
$functionality = "sdk";
}
elsif ( $allvariables->{'POSTVERSIONEXTENSION'} eq "TEST" )
{
$functionality = "test";
}
elsif ( $allvariables->{'PRODUCTNAME'} eq "URE" )
{
$functionality = "ure";
}
return $functionality;
}
###############################################################################################
# Setting the download file name
# Syntax:
# (PRODUCTNAME)_(VERSION)_(OS)_(ARCH)_(INSTALLTYPE)_(LANGUAGE).(FILEEXTENSION)
###############################################################################################
sub set_download_filename
{
my ($languagestringref, $allvariables) = @_;
my $start = get_downloadname_productname($allvariables);
my $versionstring = get_download_version($allvariables);
my $platform = get_download_platformname();
my $architecture = get_download_architecture();
my $content = get_download_content($allvariables);
my $functionality = get_download_functionality($allvariables);
my $language = get_downloadname_language($languagestringref);
# Setting the extension happens automatically
my $filename = $start . "_" . $versionstring . "_" . $platform . "_" . $architecture . "_" . $content . "_" . $functionality . "_" . $language;
# get rid of duplicit "_" delimiters when some strings are empty
$filename =~ s/\_\_\_/\_/g;
$filename =~ s/\_\_/\_/g;
$filename =~ s/\_\s*$//;
$installer::globals::ooodownloadfilename = $filename;
return $filename;
}
#########################################################
# Creating a tar.gz file
#########################################################
sub create_tar_gz_file_from_directory
{
my ($installdir, $usefakeroot, $downloaddir, $downloadfilename) = @_;
my $infoline = "";
my $packdir = $installdir;
installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packdir);
my $changedir = $installdir;
installer::pathanalyzer::get_path_from_fullqualifiedname(\$changedir);
my $fakerootstring = "";
if ( $usefakeroot ) { $fakerootstring = "fakeroot"; }
$installer::globals::downloadfileextension = ".tar.gz";
$installer::globals::downloadfilename = $downloadfilename . $installer::globals::downloadfileextension;
my $targzname = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename;
# fdo#67060 - install script is for RPM only
if ( -e "$installdir/install" && !$installer::globals::isrpmbuild )
{
unlink("$installdir/install");
}
my $systemcall = "cd $changedir; $fakerootstring tar -cf - $packdir | $installer::globals::packertool > $targzname";
my $returnvalue = system($systemcall);
$infoline = "Systemcall: $systemcall\n";
push( @installer::globals::logfileinfo, $infoline);
if ($returnvalue)
{
$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
push( @installer::globals::logfileinfo, $infoline);
}
else
{
$infoline = "Success: Executed \"$systemcall\" successfully!\n";
push( @installer::globals::logfileinfo, $infoline);
}
return $targzname;
}
##############################################################
# Returning the complete block in all languages
# for a specified string
##############################################################
sub get_language_block_from_language_file
{
my ($searchstring, $languagefile) = @_;
my @language_block = ();
for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
{
if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
{
my $counter = $i;
push(@language_block, ${$languagefile}[$counter]);
$counter++;
while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
{
push(@language_block, ${$languagefile}[$counter]);
$counter++;
}
last;
}
}
return \@language_block;
}
##############################################################
# Returning a specific language string from the block
# of all translations
##############################################################
sub get_language_string_from_language_block
{
my ($language_block, $language) = @_;
my $newstring = "";
for ( my $i = 0; $i <= $#{$language_block}; $i++ )
{
if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
{
$newstring = $1;
last;
}
}
if ( $newstring eq "" )
{
$language = "en-US"; # defaulting to english
for ( my $i = 0; $i <= $#{$language_block}; $i++ )
{
if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
{
$newstring = $1;
last;
}
}
}
return $newstring;
}
####################################################
# Creating download installation sets
####################################################
sub create_download_sets
{
my ($installationdir, $includepatharrayref, $allvariableshashref, $downloadname, $languagestringref, $languagesarrayref) = @_;
my $infoline = "";
my $force = 1; # print this message even in 'quiet' mode
installer::logger::print_message( "\n******************************************\n" );
installer::logger::print_message( "... creating download installation set ...\n", $force );
installer::logger::print_message( "******************************************\n" );
installer::logger::include_header_into_logfile("Creating download installation sets:");
my $firstdir = $installationdir;
installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir);
my $lastdir = $installationdir;
installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir);
if ( $installer::globals::iswindowsbuild && $lastdir =~ /\./ ) { $lastdir =~ s/\./_download_inprogress\./ }
else { $lastdir = $lastdir . "_download_inprogress"; }
# removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed"
my $downloaddir = $firstdir . $lastdir;
if ( -d $downloaddir ) { installer::systemactions::remove_complete_directory($downloaddir); }
my $olddir = $downloaddir;
$olddir =~ s/_inprogress/_witherror/;
if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
$olddir = $downloaddir;
$olddir =~ s/_inprogress//;
if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
# creating the new directory
installer::systemactions::create_directory($downloaddir);
$installer::globals::saveinstalldir = $downloaddir;
# evaluating the name of the download file
$downloadname = set_download_filename($languagestringref, $allvariableshashref);
if ( ! $installer::globals::iswindowsbuild ) # Unix specific part
{
# whether to use fakeroot (only required for Solaris and Linux)
my $usefakeroot = 0;
if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) { $usefakeroot = 1; }
my $downloadfile = create_tar_gz_file_from_directory($installationdir, $usefakeroot, $downloaddir, $downloadname);
}
return $downloaddir;
}
1;