2 # This file is part of the LibreOffice project.
4 # This Source Code Form is subject to the terms of the Mozilla Public
5 # License, v. 2.0. If a copy of the MPL was not distributed with this
6 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 # This file incorporates work covered by the following license notice:
10 # Licensed to the Apache Software Foundation (ASF) under one or more
11 # contributor license agreements. See the NOTICE file distributed
12 # with this work for additional information regarding copyright
13 # ownership. The ASF licenses this file to you under the Apache
14 # License, Version 2.0 (the "License"); you may not use this file
15 # except in compliance with the License. You may obtain a copy of
16 # the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 package installer
::systemactions
;
23 use installer
::converter
;
24 use installer
::exiter
;
25 use installer
::globals
;
26 use installer
::pathanalyzer
;
27 use installer
::remover
;
28 use installer
::windows
::msiglobal
;
30 ######################################################
31 # Creating a new direcotory
32 ######################################################
38 create_directory_with_privileges
( $directory, "755" );
41 ######################################################
42 # Creating a new direcotory with defined privileges
43 ######################################################
45 sub create_directory_with_privileges
47 my ($directory, $privileges) = @_;
51 my $localprivileges = oct("0".$privileges); # changes "777" to 0777
55 $returnvalue = mkdir($directory, $localprivileges);
59 $infoline = "\nCreated directory: $directory\n";
60 push(@installer::globals
::logfileinfo
, $infoline);
62 chmod $localprivileges, $directory;
66 # New solution in parallel packing: It is possible, that the directory now exists, although it
67 # was not created in this process. There is only an important error, if the directory does not
70 $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n";
71 push(@installer::globals
::logfileinfo
, $infoline);
75 # Problem with parallel packaging? -> Try a little harder, before exiting.
76 # Did someone else remove the parent directory in the meantime?
77 my $parentdir = $directory;
78 installer
::pathanalyzer
::get_path_from_fullqualifiedname
(\
$parentdir);
81 $returnvalue = mkdir($directory, $localprivileges);
85 $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n";
86 push(@installer::globals
::logfileinfo
, $infoline);
88 chmod $localprivileges, $parentdir;
92 $infoline = "\nError: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n";
93 push(@installer::globals
::logfileinfo
, $infoline);
96 $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n";
97 push(@installer::globals
::logfileinfo
, $infoline);
101 # Now it is time to exit, even the parent could not be created.
102 installer
::exiter
::exit_program
("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges");
107 # At this point we have to assume, that the parent directory exist.
108 # Trying once more to create the desired directory
110 $returnvalue = mkdir($directory, $localprivileges);
114 $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n";
115 push(@installer::globals
::logfileinfo
, $infoline);
117 chmod $localprivileges, $directory;
123 $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n";
124 push(@installer::globals
::logfileinfo
, $infoline);
128 # It is time to exit, even the second try failed.
129 installer
::exiter
::exit_program
("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges");
135 $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n";
136 push(@installer::globals
::logfileinfo
, $infoline);
142 $infoline = "\nAlready existing directory, did not create: $directory\n";
143 push(@installer::globals
::logfileinfo
, $infoline);
145 chmod $localprivileges, $directory;
149 #######################################################################
150 # Calculating the number of languages in the string
151 #######################################################################
153 sub get_number_of_langs
155 my ($languagestring) = @_;
159 my $workstring = $languagestring;
161 while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ )
170 #######################################################################
171 # Creating the directories, in which files are generated or unzipped
172 #######################################################################
174 sub create_directories
176 my ($newdirectory, $languagesref) =@_;
178 $installer::globals
::unpackpath
=~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes
182 if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons
184 if ( $installer::globals
::temppathdefined
) { $path = $installer::globals
::temppath
; }
185 else { $path = $installer::globals
::unpackpath
; }
186 $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes
187 $path = $path . $installer::globals
::separator
;
191 $path = $installer::globals
::unpackpath
. $installer::globals
::separator
;
193 # special handling, if LOCALINSTALLDIR is set
194 if (( $installer::globals
::localinstalldirset
) && ( $newdirectory eq "install" ))
196 $installer::globals
::localinstalldir
=~ s/\Q$installer::globals::separator\E\s*$//;
197 $path = $installer::globals
::localinstalldir
. $installer::globals
::separator
;
201 $infoline = "create_directories: Using $path for $newdirectory !\n";
202 push( @installer::globals
::logfileinfo
, $infoline);
204 if ($newdirectory eq "unzip" ) # special handling for common directory
209 my $localproductname = $installer::globals
::product
;
210 my $localproductsubdir = "";
212 if ( $installer::globals
::product
=~ /^\s*(.+?)\_\_(.+?)\s*$/ )
214 $localproductname = $1;
215 $localproductsubdir = $2;
218 if ( $installer::globals
::languagepack
) { $path = $path . $localproductname . "_languagepack" . $installer::globals
::separator
; }
219 elsif ( $installer::globals
::helppack
) { $path = $path . $localproductname . "_helppack" . $installer::globals
::separator
; }
220 else { $path = $path . $localproductname . $installer::globals
::separator
; }
222 create_directory
($path);
224 if ( $localproductsubdir )
226 $path = $path . $localproductsubdir . $installer::globals
::separator
;
227 create_directory
($path);
230 $path = $path . $installer::globals
::installertypedir
. $installer::globals
::separator
;
231 create_directory
($path);
233 $path = $path . $newdirectory . $installer::globals
::separator
;
234 create_directory
($path);
236 my $locallanguagesref = "";
238 if ( $$languagesref ) { $locallanguagesref = $$languagesref; }
240 if ($newdirectory eq "install" && $installer::globals
::ooodownloadfilename
ne "" )
242 # put packages into versioned path; needed only on linux (fdo#30837)
243 $path = $path . "$installer::globals::ooodownloadfilename" . $installer::globals
::separator
;
244 create_directory
($path);
248 if ($locallanguagesref ne "") # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files
251 my $languagestring = $$languagesref;
253 if (length($languagestring) > $installer::globals
::max_lang_length
)
255 my $number_of_languages = get_number_of_langs
($languagestring);
256 #replace this in the same it was done in installer/windows/directory.pm
257 #chomp(my $shorter = `echo $languagestring | $ENV{'MD5SUM'} | sed -e "s/ .*//g"`);
258 #my $id = substr($shorter, 0, 8); # taking only the first 8 digits
259 my $id = installer
::windows
::msiglobal
::calculate_id
($languagestring, 8); # taking only the first 8 digits
260 $languagestring = "lang_" . $number_of_languages . "_id_" . $id;
263 $path = $path . $languagestring . $installer::globals
::separator
;
264 create_directory
($path);
269 installer
::remover
::remove_ending_pathseparator
(\
$path);
271 $path = installer
::converter
::make_path_conform
($path);
276 ########################
278 ########################
282 my ($source, $dest) = @_;
284 my ($returnvalue, $infoline, $copyreturn);
287 $copyreturn = symlink(readlink("$source"), "$dest");
290 $copyreturn = copy
($source, $dest);
295 $infoline = "Copy: $source to $dest\n";
300 $infoline = "ERROR: Could not copy $source to $dest $!\n";
304 push(@installer::globals
::logfileinfo
, $infoline);
306 if ( !$returnvalue ) {
310 # taking care of file attributes
311 if ($installer::globals
::iswin
&& -f
$dest) {
312 my $mode = -x
$source ?
0775 : 0664;
313 my $mode_str = sprintf("%o", $mode);
314 my $chmodreturn = chmod($mode, $dest);
317 $infoline = "chmod $mode_str, $dest\n";
322 $infoline = "WARNING: Could not chmod $dest: $!\n";
326 push(@installer::globals
::logfileinfo
, $infoline);
332 ##########################
333 # Hard linking one file
334 ##########################
336 sub hardlink_one_file
338 my ($source, $dest) = @_;
340 my ($returnvalue, $infoline);
342 my $copyreturn = link($source, $dest);
346 $infoline = "Link: $source to $dest\n";
351 $infoline = "ERROR: Could not link $source to $dest\n";
355 push(@installer::globals
::logfileinfo
, $infoline);
360 ##########################
361 # Soft linking one file
362 ##########################
364 sub softlink_one_file
366 my ($source, $dest) = @_;
368 my ($returnvalue, $infoline);
370 my $linkreturn = symlink($source, $dest);
374 $infoline = "Symlink: $source to $dest\n";
379 $infoline = "ERROR: Could not symlink $source to $dest\n";
383 push(@installer::globals
::logfileinfo
, $infoline);
388 ########################
390 ########################
394 my ($source, $dest) = @_;
396 my ($returnvalue, $infoline);
398 my $renamereturn = rename($source, $dest);
402 $infoline = "Rename: $source to $dest\n";
407 $infoline = "ERROR: Could not rename $source to $dest\n";
411 push(@installer::globals
::logfileinfo
, $infoline);
416 ##########################################
417 # Copying all files from one directory
418 # to another directory
419 ##########################################
423 my ($sourcedir, $destdir) = @_;
425 my @sourcefiles = ();
427 $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
428 $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
431 push(@installer::globals
::logfileinfo
, $infoline);
432 $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
433 push(@installer::globals
::logfileinfo
, $infoline);
435 opendir(DIR
, $sourcedir);
436 @sourcefiles = readdir(DIR
);
441 foreach $onefile (@sourcefiles)
443 if ((!($onefile eq ".")) && (!($onefile eq "..")))
445 my $sourcefile = $sourcedir . $installer::globals
::separator
. $onefile;
446 my $destfile = $destdir . $installer::globals
::separator
. $onefile;
447 if ( -f
$sourcefile ) # only files, no directories
449 copy_one_file
($sourcefile, $destfile);
455 ##########################################
456 # Copying all files from one directory
457 # to another directory
458 ##########################################
464 my $directory_is_empty = 1;
465 my @sourcefiles = ();
468 @sourcefiles = readdir(DIR
);
472 my @realcontent = ();
474 foreach $onefile (@sourcefiles)
476 if ((!($onefile eq ".")) && (!($onefile eq "..")))
478 push(@realcontent, $onefile);
482 if ( $#realcontent > -1 ) { $directory_is_empty = 0; }
484 return $directory_is_empty;
487 #####################################################################
488 # Creating hard links to a complete directory with sub directories.
489 #####################################################################
491 sub hardlink_complete_directory
493 my ($sourcedir, $destdir) = @_;
495 my @sourcefiles = ();
497 $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
498 $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
500 if ( ! -d
$destdir ) { create_directory
($destdir); }
503 push(@installer::globals
::logfileinfo
, $infoline);
504 $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n";
505 push(@installer::globals
::logfileinfo
, $infoline);
507 opendir(DIR
, $sourcedir);
508 @sourcefiles = readdir(DIR
);
513 foreach $onefile (@sourcefiles)
515 if ((!($onefile eq ".")) && (!($onefile eq "..")))
517 my $source = $sourcedir . $installer::globals
::separator
. $onefile;
518 my $dest = $destdir . $installer::globals
::separator
. $onefile;
519 if ( -f
$source ) # only files, no directories
521 hardlink_one_file
($source, $dest);
523 if ( -d
$source ) # recursive
525 hardlink_complete_directory
($source, $dest);
531 #####################################################################
532 # Creating hard links to a complete directory with sub directories.
533 #####################################################################
535 sub softlink_complete_directory
537 my ($sourcedir, $destdir, $depth) = @_;
539 my @sourcefiles = ();
541 $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
542 $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
544 if ( ! -d
$destdir ) { create_directory
($destdir); }
547 push(@installer::globals
::logfileinfo
, $infoline);
548 $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n";
549 push(@installer::globals
::logfileinfo
, $infoline);
551 opendir(DIR
, $sourcedir);
552 @sourcefiles = readdir(DIR
);
557 foreach $onefile (@sourcefiles)
559 if ((!($onefile eq ".")) && (!($onefile eq "..")))
561 my $source = $sourcedir . $installer::globals
::separator
. $onefile;
562 my $dest = $destdir . $installer::globals
::separator
. $onefile;
563 if ( -f
$source ) # only files, no directories
565 my $localsource = $source;
566 if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } }
567 softlink_one_file
($localsource, $dest);
569 if ( -d
$source ) # recursive
571 my $newdepth = $depth + 1;
572 softlink_complete_directory
($source, $dest, $newdepth);
578 #####################################################
579 # Copying a complete directory with sub directories.
580 #####################################################
582 sub copy_complete_directory
584 my ($sourcedir, $destdir) = @_;
586 my @sourcefiles = ();
588 $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
589 $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
591 if ( ! -d
$destdir ) { create_directory
($destdir); }
594 push(@installer::globals
::logfileinfo
, $infoline);
595 $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
596 push(@installer::globals
::logfileinfo
, $infoline);
598 opendir(DIR
, $sourcedir);
599 @sourcefiles = readdir(DIR
);
604 foreach $onefile (@sourcefiles)
606 if ((!($onefile eq ".")) && (!($onefile eq "..")))
608 my $source = $sourcedir . $installer::globals
::separator
. $onefile;
609 my $dest = $destdir . $installer::globals
::separator
. $onefile;
610 if ( -f
$source ) # only files, no directories
612 copy_one_file
($source, $dest);
614 if ( -d
$source ) # recursive
616 if ((!( $source =~ /packages\/SUNW
/ )) && (!( $source =~ /packages\
/OOO/ ))) # do not copy complete Solaris packages!
618 copy_complete_directory
($source, $dest);
625 #####################################################
626 # Copying all files with a specified file extension
627 # from one directory to another directory.
628 #####################################################
630 sub copy_directory_with_fileextension
632 my ($sourcedir, $destdir, $extension) = @_;
634 my @sourcefiles = ();
636 $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
637 $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
640 push(@installer::globals
::logfileinfo
, $infoline);
641 $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n";
642 push(@installer::globals
::logfileinfo
, $infoline);
644 opendir(DIR
, $sourcedir);
645 @sourcefiles = readdir(DIR
);
650 foreach $onefile (@sourcefiles)
652 if ((!($onefile eq ".")) && (!($onefile eq "..")))
654 if ( $onefile =~ /\.$extension\s*$/ ) # only copying specified files
656 my $sourcefile = $sourcedir . $installer::globals
::separator
. $onefile;
657 my $destfile = $destdir . $installer::globals
::separator
. $onefile;
658 if ( -f
$sourcefile ) # only files, no directories
660 copy_one_file
($sourcefile, $destfile);
667 ########################################################
668 # Renaming all files with a specified file extension
669 # in a specified directory.
670 # Example: "Feature.idt.01" -> "Feature.idt"
671 ########################################################
673 sub rename_files_with_fileextension
675 my ($dir, $extension) = @_;
677 my @sourcefiles = ();
679 $dir =~ s/\Q$installer::globals::separator\E\s*$//;
682 push(@installer::globals
::logfileinfo
, $infoline);
683 $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n";
684 push(@installer::globals
::logfileinfo
, $infoline);
687 @sourcefiles = readdir(DIR
);
692 foreach $onefile (@sourcefiles)
694 if ((!($onefile eq ".")) && (!($onefile eq "..")))
696 if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) # only renaming specified files
699 my $sourcefile = $dir . $installer::globals
::separator
. $onefile;
700 $destfile = $dir . $installer::globals
::separator
. $destfile;
701 if ( -f
$sourcefile ) # only files, no directories
703 rename_one_file
($sourcefile, $destfile);
710 ########################################################
711 # Finding all files with a specified file extension
712 # in a specified directory.
713 ########################################################
715 sub find_file_with_file_extension
717 my ($extension, $dir) = @_;
721 $dir =~ s/\Q$installer::globals::separator\E\s*$//;
724 push(@installer::globals
::logfileinfo
, $infoline);
725 $infoline = "Searching files with extension \"$extension\" in the directory $dir\n";
726 push(@installer::globals
::logfileinfo
, $infoline);
729 @sourcefiles = sort readdir(DIR
);
734 foreach $onefile (@sourcefiles)
736 if ((!($onefile eq ".")) && (!($onefile eq "..")))
738 if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ )
740 push(@allfiles, $onefile)
748 ##############################################################
749 # Creating a unique directory, for example "01_inprogress_7"
750 # in the install directory.
751 ##############################################################
753 sub make_numbered_dir
755 my ($newstring, $olddir) = @_;
757 my $basedir = $olddir;
758 installer
::pathanalyzer
::get_path_from_fullqualifiedname
(\
$basedir);
760 my $alldirs = get_all_directories
($basedir);
762 # searching for the highest number extension
766 for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
768 if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ )
771 if ( $number > $maxnumber ) { $maxnumber = $number; }
775 my $newnumber = $maxnumber + 1;
777 my $newdir = $olddir . "_" . $newstring . "_" . $newnumber;
781 if ( move
($olddir, $newdir) )
783 $infoline = "\nMoved directory from $olddir to $newdir\n";
784 push(@installer::globals
::logfileinfo
, $infoline);
785 $returndir = $newdir;
789 $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"make_numbered_dir\"\n";
790 push(@installer::globals
::logfileinfo
, $infoline);
791 $returndir = $olddir;
797 #####################################################################################
798 # Renaming a directory by exchanging a string, for example from "01_inprogress_7"
799 # to "01_witherror_7".
800 #####################################################################################
802 sub rename_string_in_directory
804 my ($olddir, $oldstring, $newstring) = @_;
806 my $newdir = $olddir;
809 $newdir =~ s/$oldstring/$newstring/g;
811 if (( -d
$newdir ) && ( $olddir ne $newdir )) { remove_complete_directory
($newdir, 1); }
813 if ( move
($olddir, $newdir) )
815 $infoline = "\nMoved directory from $olddir to $newdir\n";
816 push(@installer::globals
::logfileinfo
, $infoline);
820 $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_string_in_directory\"\n";
821 push(@installer::globals
::logfileinfo
, $infoline);
827 ######################################################
828 # Returning the complete directory name,
829 # input is the first part of the directory name.
830 ######################################################
832 sub get_directoryname
834 my ($searchdir, $startstring) = @_;
840 opendir(DIR
, $searchdir);
842 foreach $direntry (readdir (DIR
))
844 next if $direntry eq ".";
845 next if $direntry eq "..";
847 if (( -d
$direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ ))
849 $dirname = $direntry;
857 if ( ! $founddir ) { installer
::exiter
::exit_program
("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); }
863 ###################################
864 # Renaming a directory
865 ###################################
869 my ($olddir, $newdir) = @_;
873 if ( move
($olddir, $newdir) )
875 $infoline = "\nMoved directory from $olddir to $newdir\n";
876 push(@installer::globals
::logfileinfo
, $infoline);
880 installer
::exiter
::exit_program
("ERROR: Could not move directory from $olddir to $newdir $!", "rename_directory");
886 ##############################################################
887 # Creating a directory next to an existing directory
888 ##############################################################
890 sub create_directory_next_to_directory
892 my ($topdir, $dirname) = @_;
894 my $basedir = $topdir;
895 installer
::pathanalyzer
::get_path_from_fullqualifiedname
(\
$basedir);
897 $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
899 my $newdir = $basedir . $installer::globals
::separator
. $dirname;
901 create_directory
($newdir);
906 ##############################################################
907 # Collecting all directories inside a directory
908 ##############################################################
910 sub get_all_directories
917 $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
919 opendir(DIR
, $basedir);
921 foreach $direntry (readdir (DIR
))
923 next if $direntry eq ".";
924 next if $direntry eq "..";
926 my $completeentry = $basedir . $installer::globals
::separator
. $direntry;
928 if ( -d
$completeentry ) { push(@alldirs, $completeentry); }
936 ##############################################################
937 # Collecting all directories inside a directory
938 # Returning without path
939 ##############################################################
941 sub get_all_directories_without_path
948 $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
950 opendir(DIR
, $basedir);
952 foreach $direntry (readdir (DIR
))
954 next if $direntry eq ".";
955 next if $direntry eq "..";
957 my $completeentry = $basedir . $installer::globals
::separator
. $direntry;
959 if ( -d
$completeentry ) { push(@alldirs, $direntry); }
967 ##############################################################
968 # Collecting all files and directories inside one directory
969 ##############################################################
978 $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
980 opendir(DIR
, $basedir);
982 foreach $direntry (readdir (DIR
))
984 next if $direntry eq ".";
985 next if $direntry eq "..";
987 my $completeentry = $basedir . $installer::globals
::separator
. $direntry;
989 if (( -f
$completeentry ) || ( -d
$completeentry )) { push(@allcontent, $completeentry); }
997 ##############################################################
998 # Finding the new content in a directory
999 ##############################################################
1001 sub find_new_content_in_directory
1003 my ( $basedir, $oldcontent ) = @_;
1005 my @newcontent = ();
1006 my @allcontent = ();
1010 $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1012 opendir(DIR
, $basedir);
1014 foreach $direntry (readdir (DIR
))
1016 next if $direntry eq ".";
1017 next if $direntry eq "..";
1019 my $completeentry = $basedir . $installer::globals
::separator
. $direntry;
1021 if (( -f
$completeentry ) || ( -d
$completeentry ))
1023 push(@allcontent, $completeentry);
1024 if (! grep {$_ eq $completeentry} @
{$oldcontent})
1026 push(@newcontent, $completeentry);
1033 return (\
@newcontent, \
@allcontent);
1036 ##############################################################
1037 # Trying to create a directory, no error if this fails
1038 ##############################################################
1040 sub try_to_create_directory
1042 my ($directory) = @_;
1044 my $returnvalue = 1;
1045 my $created_directory = 0;
1047 if (!(-d
$directory))
1049 $returnvalue = mkdir($directory, 0775);
1053 $created_directory = 1;
1054 $infoline = "\nCreated directory: $directory\n";
1055 push(@installer::globals
::logfileinfo
, $infoline);
1057 chmod 0775, $directory;
1061 $created_directory = 0;
1066 $created_directory = 1;
1069 return $created_directory;
1072 ##############################################################
1073 # Creating a complete directory structure
1074 ##############################################################
1076 sub create_directory_structure
1078 my ($directory) = @_;
1080 if ( ! try_to_create_directory
($directory) )
1082 my $parentdir = $directory;
1083 installer
::pathanalyzer
::get_path_from_fullqualifiedname
(\
$parentdir);
1085 my $infoline = "INFO: Did not create directory $directory\n";
1086 push(@installer::globals
::logfileinfo
, $infoline);
1087 $infoline = "Now trying to create parent directory $parentdir\n";
1088 push(@installer::globals
::logfileinfo
, $infoline);
1090 create_directory_structure
($parentdir); # recursive
1093 create_directory
($directory); # now it has to succeed
1096 ######################################################
1097 # Removing a complete directory with subdirectories
1098 ######################################################
1100 sub remove_complete_directory
1102 my ($directory, $start) = @_;
1107 $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1109 if ( -d
$directory )
1114 push(@installer::globals
::logfileinfo
, $infoline);
1115 $infoline = "Removing directory $directory\n";
1116 push(@installer::globals
::logfileinfo
, $infoline);
1119 opendir(DIR
, $directory);
1120 @content = readdir(DIR
);
1125 foreach $oneitem (@content)
1127 if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
1129 my $item = $directory . $installer::globals
::separator
. $oneitem;
1131 if ( -f
$item || -l
$item ) # deleting files or links
1136 if ( -d
$item ) # recursive
1138 remove_complete_directory
($item, 0);
1143 # try to remove empty directory
1145 my $returnvalue = rmdir $directory;
1147 if ( ! $returnvalue )
1149 $infoline = "Warning: Problem with removing empty dir $directory\n";
1150 push(@installer::globals
::logfileinfo
, $infoline);
1153 # try a little bit harder (sometimes there is a performance problem)
1154 if ( -d
$directory )
1156 for ( my $j = 1; $j <= 3; $j++ )
1158 if ( -d
$directory )
1161 push(@installer::globals
::logfileinfo
, $infoline);
1162 $infoline = "Warning (Try $j): Problems with removing directory $directory\n";
1163 push(@installer::globals
::logfileinfo
, $infoline);
1165 $returnvalue = rmdir $directory;
1169 $infoline = "Successfully removed empty dir $directory\n";
1170 push(@installer::globals
::logfileinfo
, $infoline);
1172 $infoline = "Warning: rmdir $directory failed.\n";
1173 push(@installer::globals
::logfileinfo
, $infoline);
1181 ######################################################
1182 # Creating a unique directory with pid extension
1183 ######################################################
1185 sub create_pid_directory
1187 my ($directory) = @_;
1189 $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1190 my $pid = $$; # process id
1191 my $time = time(); # time
1193 $directory = $directory . "_" . $pid . $time;
1195 if ( ! -d
$directory ) { create_directory
($directory); }
1196 else { installer
::exiter
::exit_program
("ERROR: Directory $directory already exists!", "create_pid_directory"); }
1201 ##############################################################
1202 # Reading all files from a directory and its subdirectories
1203 ##############################################################
1205 sub read_complete_directory
1207 my ($directory, $pathstring, $filecollector) = @_;
1210 opendir(DIR
, $directory);
1211 @content = readdir(DIR
);
1216 foreach $onefile (@content)
1218 if ((!($onefile eq ".")) && (!($onefile eq "..")))
1220 my $completefilename = $directory . $installer::globals
::separator
. $onefile;
1222 if ( $pathstring ne "" ) { $sep = $installer::globals
::separator
; }
1224 if ( ! -d
$completefilename ) # only files, no directories
1226 my $content = $pathstring . $sep . $onefile;
1227 push(@
{$filecollector}, $content);
1229 else # recursive for directories
1231 my $newpathstring = $pathstring . $sep . $onefile;
1232 read_complete_directory
($completefilename, $newpathstring, $filecollector);
1238 ##############################################################
1239 # Reading all files from a directory and its subdirectories
1241 ##############################################################
1243 sub read_full_directory
{
1244 my ( $currentdir, $pathstring, $collector ) = @_;
1249 unless (opendir(DH
, $currentdir))
1253 while (defined ($item = readdir(DH
)))
1255 next if($item eq "." or $item eq "..");
1256 $fullname = $currentdir . $installer::globals
::separator
. $item;
1258 if ( $pathstring ne "" ) { $sep = $installer::globals
::separator
; }
1262 my $newpathstring = $pathstring . $sep . $item;
1263 read_full_directory
($fullname, $newpathstring, $collector) if(-d
$fullname);
1267 my $content = $pathstring . $sep . $item;
1268 push(@
{$collector}, $content);
1275 ##############################################################
1276 # Removing all empty directories below a specified directory
1277 ##############################################################
1279 sub remove_empty_dirs_in_folder
1286 $dir =~ s/\Q$installer::globals::separator\E\s*$//;
1291 @content = readdir(DIR
);
1296 foreach $oneitem (@content)
1298 if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
1300 my $item = $dir . $installer::globals
::separator
. $oneitem;
1302 if ( -d
$item ) # recursive
1304 remove_empty_dirs_in_folder
($item);
1309 # try to remove empty directory
1310 my $returnvalue = rmdir $dir;
1314 $infoline = "Successfully removed empty dir $dir\n";
1315 push(@installer::globals
::logfileinfo
, $infoline);
1322 ######################################################
1324 ######################################################
1328 my ($systemcall) = @_;
1330 my $returnvalue = system($systemcall);
1332 my $infoline = "Systemcall: $systemcall\n";
1333 push( @installer::globals
::logfileinfo
, $infoline);
1337 $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
1338 push( @installer::globals
::logfileinfo
, $infoline);
1342 $infoline = "Success: Executed \"$systemcall\" successfully!\n";
1343 push( @installer::globals
::logfileinfo
, $infoline);