#! /usr/bin/perl -w ###################################################################################################################### # # Linux Installations Script # # $Id: linuxinstall-mainpart.pl,v 1.8 2010-12-14 09:42:52 jgelhaus Exp $ # ###################################################################################################################### use strict; use File::Path; use File::Basename; use File::Copy; use Getopt::Long; ###################################################################################################################### # Einige Konfigurationskonstanten ###################################################################################################################### my $FILE_EULA = 'EULA.txt'; my $DOWNLOAD_SERVER = "http://dls.photoprintit.eu"; my $KEYACCID = '1119'; my $CLIENTID = '38'; my $HPS_VER = '4.6.7'; my $VENDOR_NAME = 'SCHLECKER'; my $APPLICATION_NAME = 'SCHLECKER Foto Digital Service'; my $HAS_PHOTOFUN = 'false'; my $HAS_CANVAS = 'false'; my $HAS_POSTER = 'false'; my $HAS_PREMIUMFOTO = 'false'; my $HAS_BUDGETFOTO = 'false'; my $HAS_CALENDARS = 'false'; my $HAS_FOTOBOOKS = 'false'; my $HAS_THEME_DESIGN = 'true'; my $HAS_THEME_DMBABY = 'false'; my $HAS_THEME_ALB = 'true'; my $PROGRAM_NAME_FOTOSHOW = 'CEWE FOTOSCHAU'; ###################################################################################################################### # Einige Konstanten ###################################################################################################################### my $DESKTOP_ICON_NAME = $APPLICATION_NAME.'_'.$HPS_VER.'.desktop'; my $DESKTOP_ICON_PATH = '/Resources/keyaccount/32.xpm'; my $SERVICES_XML_PATH = '/Resources/services.xml'; my $AFFILIATE_ID = ''; ###################################################################################################################### # Texte ###################################################################################################################### my @TRANSLATABLE; my @TRANSLATABLE_ERRORS; $TRANSLATABLE[0] = "ja"; $TRANSLATABLE[1] = "j"; $TRANSLATABLE[2] = "nein"; $TRANSLATABLE[3] = "n"; $TRANSLATABLE[4] = "Dieses Script ist Ihnen bei der Installation von '\033[1m%1\$s\033[0m' auf Ihrem Rechner behilflich und leitet Sie Schritt für Schritt durch den Installationsprozess.\n\n\n"; $TRANSLATABLE[5] = "Bitte lesen Sie die EULA (End User License Agreement) sorgfältig durch. Im Anschluss daran müssen Sie die EULA akzeptieren.\n\tInnerhalb der EULA können Sie mit den Pfeiltasten navigieren. Durch drücken der Taste '\033[1mq\033[0m' verlassen Sie die EULA.\n\tWeiter mit ."; $TRANSLATABLE[6] = "\tAkzeptieren Sie die EULA? [%1\$s/\033[1m%2\$s\033[0m] "; $TRANSLATABLE[7] = "\033[0m\033[1m'%1\$s'\033[0m kann leider nicht auf Ihrem Rechner installiert werden.\n\n\n"; $TRANSLATABLE[8] = "Wo soll '\033[1m%1\$s\033[0m' installiert werden? [\033[1m%2\$s\033[0m] "; $TRANSLATABLE[9] = "\tWollen Sie die Installation fortsetzen und die benötigten Daten aus dem Internet herunter laden? [\033[1m%1\$s\033[0m/%2\$s] "; $TRANSLATABLE[10] = "\tDownloading: '%1\$s'\n"; $TRANSLATABLE[11] = "Die benötigten Dateien werden nun in das Installationsverzeichnis entpackt.\n"; $TRANSLATABLE[12] = "\nHerzlichen Glückwunsch!\nSie haben erfolgreich \033[1m'%1\$s'\033[0m auf Ihrem Rechner installiert.\nZum Starten führen Sie bitte die Datei '%2\$s' aus.\n\nViel Spaß!\n"; $TRANSLATABLE[13] = "Soll erneut versucht werden die Datei herunter zu laden? [%1\$s/\033[1m%2\$s\033[0m] "; $TRANSLATABLE[14] = "\t %1\$-18s %2\$20s %3\$9s (%4\$5s)\n"; $TRANSLATABLE[15] = "\tEs müssen noch insgesamt %1\$.2fMB Daten aus dem Internet heruntergeladen werden.\n"; $TRANSLATABLE[16] = "Für eine erfolgreiche Installation müssen noch die folgenden Pakete aus dem Internet herunter geladen werden.\n"; $TRANSLATABLE[17] = "Die herunter geladenen Installationspakete wurden nach der Installation nicht gelöscht und befinden sich im aktuellen Verzeichnis."; $TRANSLATABLE[18] = "Die herunter geladenen Installationspakete wurden nach der Installation nicht gelöscht und wurden zusammen mit diesem Installationsscript nach %1\$s kopiert."; $TRANSLATABLE[19] = "Das angegebene Verzeichnis existiert nicht. Soll es angelegt werden? [\033[1m%1\$s\033[0m/%2\$s] "; $TRANSLATABLE[20] = "Kommandozeilenoptionen:\n -h; --help\n -i; --installDir=\tDas Verzeichnis in das '%1\$s' installiert werden soll.\n -k; --keepPackages\t\tDie heruntergeladenen Pakete werden nicht gelöscht und können für eine weitere Installation benutzt werden.\n -w; --workingDir=\tDas Verzeichnis in dem temporäre Dateien abgelegt werden können.\n -v; --verbose\t\tGibt Informationen beim Download aus.\n\nDas Script sucht im aktuellen Verzeichnis nach den Installationspaketen. Werden die Pakete dort nicht gefunden\nso werden sie aus dem Internet heruntergeladen\nTemporäre Dateien werden in das aktuelle oder das mit --workingDir angegebene Verzeichnis gespeichert. Ist das, wegen fehlender Berechtigungen, nicht möglich werden die temporären Dateien nach /tmp gespeichert.\n"; $TRANSLATABLE_ERRORS[0] = "Für die Kommandozeilenoptionen '--installDir' und '--workingDir' ist die Angabe eines Verzeichnisses zwingend erforderlich!\n"; $TRANSLATABLE_ERRORS[1] = "Bei einem Update ist die Angabe des Installationsverzeichnisses mit '--installDir' zwingend erforderlich!\n"; $TRANSLATABLE_ERRORS[2] = "Das angegebene Arbeitsverzeichnis '%1\$s' existiert nicht!\n"; $TRANSLATABLE_ERRORS[3] = "Das Arbeitsverzeichnis konnte nicht ermittelt werden!\n"; $TRANSLATABLE_ERRORS[4] = "Für die korrekte Ausführung des Scriptes wird das Programm '%1\$s' benötigt!\n"; $TRANSLATABLE_ERRORS[5] = "Die Datei '%1\$s' kann nicht gefunden werden!\n"; $TRANSLATABLE_ERRORS[6] = "\tSie haben die EULA nicht akzeptiert!\n\t%1\$s"; $TRANSLATABLE_ERRORS[7] = "Im angegebenen Verzeichnis können keine symbolischen Links angelegt werden. Dies ist aber für die Installation von '%1\$s' zwingend erforderlich!\n"; $TRANSLATABLE_ERRORS[8] = "Das Herunterladen der Datei '%1\$s' ist fehlgeschlagen!\n"; $TRANSLATABLE_ERRORS[9] = "Die Datei '%1\$s' kann nicht geöffnet werden!\n"; $TRANSLATABLE_ERRORS[10] = "Die Plattform konnte nicht ermittelt werden! 'uname -m' liefert weder 'i686' noch 'x86_64' sondern '%1\$s'.\n"; $TRANSLATABLE_ERRORS[11] = "Die Datei '%1\$s' konnte nicht heruntergeladen werden!\n"; $TRANSLATABLE_ERRORS[12] = "Das Verzeichnis '%1\$s' konnte nicht angelegt werden.\n"; $TRANSLATABLE_ERRORS[13] = "Die Datei '%1\$s' kann nicht entpackt werden!\n"; $TRANSLATABLE_ERRORS[14] = "Die Datei '%1\$s' konnte nicht nach '%2\$s' kopiert werden!\n"; $TRANSLATABLE_ERRORS[15] = "Die Prüfsumme der heruntergeladenen Datei '%1\$s' stimmt nicht!\n"; $TRANSLATABLE_ERRORS[16] = "Die Datei '%1\$s' konnte nicht nach '%2\$s' herunter geladen werden!\n"; $TRANSLATABLE_ERRORS[17] = "Die benötigten Pakete konnten nicht ermittelt werden!\n"; my @ANSWER_YES_LIST = ($TRANSLATABLE[0], $TRANSLATABLE[1]); my @ANSWER_NO_LIST = ($TRANSLATABLE[2], $TRANSLATABLE[3]); ###################################################################################################################### # AB HIER SOLLTE NICHTS MEHR GEAENDERT WERDEN ###################################################################################################################### my $INSTALL_DIR_DEV = "$VENDOR_NAME/$APPLICATION_NAME"; my $INDEX_FILE_PATH_ON_SERVER = "/download/Data/$KEYACCID/hps/$CLIENTID-index-$HPS_VER.txt"; my $LOG_FILE_DIR = '.log'; my @REQUIRED_PROGRAMMS = ("unzip", "md5sum", "less", "wget", "uname"); my $DESKTOP_ICON_FORMAT = "[Desktop Entry]\n". "Comment=\n". "Comment[de]=\n". "Encoding=UTF-8\n". "Exec=\"%s/$APPLICATION_NAME\"\n". "Icon=%s$DESKTOP_ICON_PATH\n". "Path=%s\n". "Name=$APPLICATION_NAME\n". "Name[de]=$APPLICATION_NAME\n". "StartupNotify=true\n". "Terminal=false\n". "TerminalOptions=\n". "Type=Application\n"; my $SERVICES_XML_FORMAT = " t856EvnDTL56xD5fHQnWrzqVk6Xj3we4xGYHfShPmkqXtCzbI21eqJ57eIHVViAg SNCxjcl5y86nasXrdmtwTWWbBmFs3j21rZOVvoZT9HleOfGJR7FGgZiXsS623ctV 7iIwPfB9c6TIRuf9SPd7I1j25Pex9atTL9TDepMD6nkAyDliZhvIlJOC2tm9pcyQ %s EQBuKJf7pzVIbNXzz19PlwkVpERC5KfsWJbG4cazpn3PFC5Rtz4O3V87KcWfMgxK 8ksOkroMJFn1Es3zVJyzxJggNaXiMuLKBfPLBtCyek1bZBcTy29gaU7nm75ZYIxz xHuXMWCLmtrwNIBvqVB9BAyPjNpEa9gNuybXU51bKsryDqc2UJxSQXM8yIhbIarq sKTtqevc5EdBSwi3bZkngwl4NSolB8vFc7kPWeAEB4Y1ySgUIgcjJGxKlOll8c8e \n"; my $DOWNLOAD_START_URL="http://dls.photoprintit.eu/api/feedback/$KEYACCID/hps/downloadstart.$AFFILIATE_ID/linux"; my $DOWNLOAD_COMPLETE_URL="http://dls.photoprintit.eu/api/feedback/$KEYACCID/hps/downloadcomplete.$AFFILIATE_ID/linux"; my $INSTALLATION_COMPLETE_URL="http://dls.photoprintit.eu/api/feedback/$KEYACCID/hps/installationcomplete.$AFFILIATE_ID/linux"; ###################################################################################################################### # Variablen ###################################################################################################################### my $indexContent; # Enthält den Inhalt der Index-Datei my @filesToDownload; # Enthält die Dateinamen die heruntergeladen werden müssen my @downloadedFiles; # Enthält die Dateinamen der heruntergeladenen Dateien my @filesToRemove; # Enthält die Dateinamen der Dateien die am Ende des Scriptes gelöscht werden müssen. my $fileName; # Enthält den Namen der aktuell zu bearbeitenden Datei my $update; my $upgrade; my $installDir=""; my $sourceDir=""; my $changeInstallDir=1; my $verbose; my $keepPackages=0; my $workingDir=""; ###################################################################################################################### # Zeige einen kleinen Hilfetext an ###################################################################################################################### sub showHelp { printf ($TRANSLATABLE[4], $APPLICATION_NAME); printf ($TRANSLATABLE[20], $APPLICATION_NAME); exit(0); } ###################################################################################################################### # Parse Kommandozeilen Parameter ###################################################################################################################### sub getOptions { $update = 0; $upgrade = 0; $verbose = 0; $installDir = ""; $workingDir = ""; my $showHelp = 0; GetOptions("installdir=s" => \$installDir, "update" => \$update, "upgrade" => \$upgrade, "verbose" => \$verbose, "help" => \$showHelp, "keepPackages" => \$keepPackages, "workingdir=s" => \$workingDir) || abort($TRANSLATABLE_ERRORS[0]); if($showHelp == 1) { showHelp(); } if($upgrade == 1) { $update = 1; } if($update == 1 && $installDir eq "") { abort($TRANSLATABLE_ERRORS[1]); } if($installDir ne "") { $changeInstallDir=0; } } ###################################################################################################################### # Prüft das Arbeitsverzeichnis ###################################################################################################################### sub checkWorkingDir { my $testFileName = "test"; my $testFilePath = $testFileName; if($workingDir ne "") { if(!opendir(DIR, $workingDir)) { abort($TRANSLATABLE_ERRORS[2], $workingDir); } else { closedir(DIR); } $testFilePath = $workingDir."/".$testFileName; } if(!open(TEST_FILE, ">", $testFilePath)) { $workingDir = "/tmp"; $testFilePath = $workingDir."/".$testFileName; if(!open(TEST_FILE, ">", $testFilePath)) { abort($TRANSLATABLE_ERRORS[3]); } else { close(TEST_FILE); unlink($testFilePath); } } else { close(TEST_FILE); unlink($testFilePath); } } ###################################################################################################################### # Prüfe ob benötigte Programme da sind ###################################################################################################################### sub checkProgramms { foreach (@REQUIRED_PROGRAMMS) { my $status=system("which $_ > /dev/null 2>&1"); if(0!=$status) { abort($TRANSLATABLE_ERRORS[4], $_); } } } ###################################################################################################################### # Zeigt die EULA an ###################################################################################################################### sub showEula { if($FILE_EULA ne "" && $update==0) { if(!open(EULA, "<", $FILE_EULA)) { abort($TRANSLATABLE_ERRORS[5], $FILE_EULA); } close EULA; printf($TRANSLATABLE[5]); my $answer = ; system("less $FILE_EULA"); printf($TRANSLATABLE[6], $TRANSLATABLE[0], uc($TRANSLATABLE[2])); chomp($answer = ); $answer=lc($answer); my $found=0; foreach(@ANSWER_YES_LIST) { if($answer eq $_) { $found=1; last; } } if(0==$found) { abort($TRANSLATABLE_ERRORS[6], sprintf($TRANSLATABLE[7], $APPLICATION_NAME)); } } } ###################################################################################################################### # Installationsverzeichniss erfragen ###################################################################################################################### sub getInstallDir { if($update == 0 && $changeInstallDir == 1) { while(1) { if($> == 0) { # Root User $installDir="/opt/".$INSTALL_DIR_DEV; } else { # Normaler Benutzer $installDir=$ENV{"HOME"}."/".$INSTALL_DIR_DEV; } printf($TRANSLATABLE[8], $APPLICATION_NAME, $installDir); my $answer = ; chomp($answer); if("" ne $answer) { $installDir=$answer; } # vorne und hinten Leerzeichen abschneiden $installDir =~ s/^\s+//; $installDir =~ s/\s+$//; # Jetzt ersetzen wir noch die Tilde durch das Home-Verzeichnis $installDir =~ s/^~/$ENV{"HOME"}/; # einen relativen Pfad um den aktuellen Pfad erweitern if($installDir =~ m/^[^\/]/) { $installDir = $ENV{"PWD"}."/".$installDir; } my $dirCreated = 0; if(! -e $installDir) { printf($TRANSLATABLE[19], uc($TRANSLATABLE[0]), $TRANSLATABLE[2]); my $createAnswer = ; chomp($createAnswer); my $found=1; foreach(@ANSWER_NO_LIST) { if($createAnswer eq $_) { $found=0; last; } } if(1==$found) { # Installationsverzeichniss anlegen eval { mkpath($installDir."/".$LOG_FILE_DIR) }; $dirCreated = 1; if($@) { printf(red($TRANSLATABLE_ERRORS[12]), $installDir); next; } } else { next; } } my $symlinkTestFile = $installDir."/symlinks_possible"; my $symlinks_possible = symlink($symlinkTestFile, $symlinkTestFile); if($symlinks_possible) { unlink $symlinkTestFile; last; } else { if($dirCreated == 1) { rmtree($installDir); } abort($TRANSLATABLE_ERRORS[7], $APPLICATION_NAME); } } } } ###################################################################################################################### # Holt die Index-Datei ###################################################################################################################### sub getIndexFile { my $downloaded = 0; my $answer = 1; $fileName = basename($INDEX_FILE_PATH_ON_SERVER); if(! -e $fileName || -s $fileName == 0) { # Hole Indexdatei aus dem Netz. # Wenn wir ein Arbeitsverzeichnis haben schreiben wir dahin. if($workingDir ne "") { $fileName = $workingDir."/".$fileName; } if(0==$verbose) { $answer = system("wget -T 60 -t 1 -q $DOWNLOAD_SERVER$INDEX_FILE_PATH_ON_SERVER -O $fileName"); } else { $answer = system("wget -T 60 -t 1 $DOWNLOAD_SERVER$INDEX_FILE_PATH_ON_SERVER -O $fileName"); } if($answer!=0 || -s $fileName == 0) { unlink($fileName); abort($TRANSLATABLE_ERRORS[8], $DOWNLOAD_SERVER.$INDEX_FILE_PATH_ON_SERVER); } $downloaded=1; } if(!open(INDEX, "<", $fileName)) { abort($TRANSLATABLE_ERRORS[9], $fileName); } else { while() { $indexContent.=$_; } close(INDEX); if($downloaded==1 && $keepPackages==0) { unlink($fileName); } } } ###################################################################################################################### # Checkt Index-Datei und sucht die herunter zu ladenden Dateien zusammen ###################################################################################################################### sub checkIndexFile { my $totalSize = 0; my $packageString = ""; my $machineType = `uname -m`; chomp($machineType); if($machineType eq "i686") { $machineType = "l"; } elsif($machineType eq "x86_64") { # Für 64Bit Systeme hier evtl. anderes Kürzel eintragen. $machineType = "l"; } else { abort($TRANSLATABLE_ERRORS[10], $machineType); } if(length($indexContent) == 0) { abort($TRANSLATABLE_ERRORS[17]); } foreach (split(/[\r\n]+/, $indexContent)) { chomp; if(/^(.*);(.*);(.*);(.*)$/) { my $filePath = $1; my $required = $2; my $what = $3; my $system = $4; if($system eq $machineType || $system eq "a") { $fileName = basename($filePath); if(! -e $installDir."/".$LOG_FILE_DIR."/".$fileName.".log") { # Die Datei ist noch nicht installiert. if( -e $fileName ) { # Die Datei liegt lokal vor, also brauchen wir sie nicht herunter zu laden push(@downloadedFiles, $fileName); } else { my $file2get; if($filePath =~ m/^http:/) { $file2get = $filePath; } else { $file2get = $DOWNLOAD_SERVER."/".$filePath; } # Die Datei muss aus dem Netz gezogen werden. Schreiben wir mal raus wie viel da herunter geladen werden muss. my $spider = `export LANG=C;wget --spider $file2get 2>&1`; my ($size, $dummy, $mb, $mime) = $spider=~/Length:\s+([\d\.,]+)\s+(\(([\d\.,]+[MK]?)\))?\s*(\[.*\])/; my $string = sprintf($TRANSLATABLE[14], $what, $mime, $size, $mb); $packageString .= $string; push(@filesToDownload, $_); $size=~s/[\.,]//g; $totalSize+=$size; } } } } } if(0!=(scalar @filesToDownload)) { printf($TRANSLATABLE[16]); printf($packageString); printf($TRANSLATABLE[15], $totalSize/(1024*1024)); } } ###################################################################################################################### # Roleback ###################################################################################################################### sub roleback { my ($fileName) = @_; $fileName =~ /^3\d-(.*)_.*$/; my $packageName=$1; if(opendir(LOG_FILE_DIR, $installDir."/".$LOG_FILE_DIR)) { my @allFiles=readdir(LOG_FILE_DIR); @allFiles=grep(!/^\./, @allFiles); close(LOG_FILE_DIR); foreach(@allFiles) { $_ =~ /^3\d-(.*)_.*$/; if($1 eq $packageName) { removePackage($_); } } } } ###################################################################################################################### # Lösche Dateien aus einem Logfile und das Logfile selbst ###################################################################################################################### sub removePackage { my ($logFile) = @_; my @files; my @dirs; if(open(LOG_FILE, "<", $installDir."/".$LOG_FILE_DIR."/".$logFile)) { while() { if(/^\s*inflating:\s+(.*)/) { my $file=$1; $file =~ s/^\s+|\s+$//; push(@files, $file); } if(/^\s*creating:\s+(.*)\s*$/) { push(@dirs, $1); } } close LOG_FILE; } # Füge das Logfile zur Liste der zu löschenden Dateien hinzu. push (@files, $installDir."/".$LOG_FILE_DIR."/".$logFile); unlink(@files); @dirs = reverse @dirs; foreach(@dirs) { rmdir $_; } } ###################################################################################################################### # Lädt alle Dateien aus der Index-Datei herunter ###################################################################################################################### sub downloadFiles { if(0!=(scalar @filesToDownload)) { if($update == 0) { my $answer; printf($TRANSLATABLE[9], uc($TRANSLATABLE[0]), $TRANSLATABLE[2]); chomp($answer = ); $answer=lc($answer); foreach(@ANSWER_NO_LIST) { if($answer eq $_) { exit 1; last; } } } triggerCountPixel($DOWNLOAD_START_URL); # Herunterladen der Dateien foreach (@filesToDownload) { chomp; $_ =~ /^(.*);.*;(.*);.*$/; my $filePath = $1; my $what = $2; my $error = 0; my $retry = 1; $fileName = basename($filePath); if($workingDir ne "") { $fileName = $workingDir."/".$fileName; } printf($TRANSLATABLE[10], $what); while(1==$retry) { my $result=1; my $file2get; if( $filePath =~ m/^http:/) { $file2get=$filePath; } else { $file2get = $DOWNLOAD_SERVER."/".$filePath; } if(0==$verbose) { $result=system("wget -q $file2get -O $fileName"); } else { $result=system("wget $file2get -O $fileName"); } if(0==$result) { # Extrahiere MD5 Summe $fileName =~ /^.*_(.*).zip$/; my $md5sum=$1; # Berechne MD5 Summe der Datei $result=`md5sum $fileName`; $result =~ /^(\w*)\s+.*$/; my $fileMd5sum=$1; if($md5sum ne $fileMd5sum) { printf(red($TRANSLATABLE_ERRORS[15]), $fileName); $error=1; } else { push(@downloadedFiles, $fileName); push(@filesToRemove, $fileName); $retry=0; } } else { printf(red($TRANSLATABLE_ERRORS[16]), $file2get, $fileName); $error=1; } if(0==$update && 1==$error) { my $answer; printf($TRANSLATABLE[13], $TRANSLATABLE[0], uc($TRANSLATABLE[2])); chomp($answer = ); $answer=lc($answer); $retry=0; foreach(@ANSWER_YES_LIST) { if($answer eq $_) { $retry=1; $error=0; last; } } } elsif(1==$update && 1==$error) { # Wir haben keine Konsole und können keine Eingabe entgegen nehmen. # Deshalb brechen wir ab. $retry=0; } } if(1==$error) { unlink $fileName; abort($TRANSLATABLE_ERRORS[11], $fileName); } } triggerCountPixel($DOWNLOAD_COMPLETE_URL); } } ###################################################################################################################### # Prüfen und entpacken der Dateien ###################################################################################################################### sub unpackFiles { if(0!=(scalar @downloadedFiles)) { printf($TRANSLATABLE[11]); # Installationsverzeichniss anlegen eval { mkpath($installDir."/".$LOG_FILE_DIR) }; if($@) { abort($TRANSLATABLE_ERRORS[12], $installDir); } # Entpacken der Dateien foreach (@downloadedFiles) { $fileName = $_; my $fileBaseName = basename($fileName); # Hier können wir eine evtl. installierte Vorgängerversion löschen. # Die md5 Summen aller Downloads stimmen, also sollten sich alle Pakete entpaken lassen roleback($fileBaseName); my $result=0; my @unzipReturn; @unzipReturn=`unzip -o -d '$installDir' $fileName 2>&1`; foreach(@unzipReturn) { if(/^\s*error:/) { $result=1; } elsif(/cannot find/) { $result=1; } } if(open(OUT, ">", $installDir."/".$LOG_FILE_DIR."/".$fileBaseName.".log")) { print OUT @unzipReturn; close(OUT); } if(0!=$result) { abort($TRANSLATABLE_ERRORS[13], $fileName); } } } } ###################################################################################################################### # Desktop Icons erzeugen ###################################################################################################################### sub createDesktopIcons { if($>==0) { #Root User my $homeDir="/home/"; if(opendir(HOME_DIR, $homeDir)) { my @allFiles=readdir(HOME_DIR); # Werfe alle Einträge mit einem Punkt am Anfang weg @allFiles=grep(!/^\./, @allFiles); foreach(@allFiles) { # Test ob es ein Verzeichnis ist if(opendir(SUB_DIR, $homeDir.$_)) { closedir(SUB_DIR); createDesktopIcon($homeDir.$_, $_); } } closedir(HOME_DIR); } } else { # Normaler Benutzer createDesktopIcon($ENV{"HOME"}, $ENV{"USER"}); } } ###################################################################################################################### # Desktop Icon erzeugen ###################################################################################################################### sub createDesktopIcon { my ($dir, $user) = @_; $dir.="/Desktop/"; if(my ($login, $pass, $uid, $gid) = getpwnam($user)) { if(opendir(DIR, $dir)) { closedir(DIR); if(!open(ICON, ">", $dir.$DESKTOP_ICON_NAME)) { abort($TRANSLATABLE_ERRORS[9], $dir.$DESKTOP_ICON_NAME); } else { printf(ICON $DESKTOP_ICON_FORMAT, $installDir, $installDir, $installDir); close(ICON); } chown $uid, $gid, $dir.$DESKTOP_ICON_NAME; # Gnome will das Icon ausführbar haben. chmod 0755, $dir.$DESKTOP_ICON_NAME; } } } ###################################################################################################################### # Aufräumen + Abschließende Arbeiten ###################################################################################################################### sub cleanup { # Entferne Installationspakete if($keepPackages==0) { unlink(@filesToRemove); } else { if($workingDir ne "") { # Script und EULA auch dahin kopieren. my @installerFiles; push(@installerFiles, "install.pl"); push(@installerFiles, $FILE_EULA); push(@installerFiles, basename($INDEX_FILE_PATH_ON_SERVER)); foreach(@installerFiles) { if(!copy($_, $workingDir."/".$_)) { printf($TRANSLATABLE_ERRORS[14], $_, $workingDir."/".$_); } } printf($TRANSLATABLE[18], $workingDir); } else { printf($TRANSLATABLE[17]); } } # Erzeuge Symlinks für Libs if(opendir(INSTALL_DIR, $installDir)) { chdir($installDir); my @allFiles=readdir(INSTALL_DIR); # Werfe alle Einträge mit einem Punkt am Anfang weg @allFiles=grep(!/^\./, @allFiles); my @libFiles=grep(/.+\.so\.\w*/, @allFiles); foreach(@libFiles) { my $fileName=$_; $fileName =~ /(.+\.so)\.(.*)/; my $baseFileName=$1; my $version=$2; my @v = split(/\./, $version); unlink($baseFileName); symlink($fileName, $baseFileName); foreach(@v) { $baseFileName.=".".$_; if($baseFileName ne $fileName) { unlink($baseFileName); symlink($fileName, $baseFileName); } } } # Ändere Dateirechte my @binarys; push(@binarys, $APPLICATION_NAME); push(@binarys, $PROGRAM_NAME_FOTOSHOW); push(@binarys, "assistant"); push(@binarys, "facedetection"); chmod 0755, @binarys; closedir(INSTALL_DIR); } if($AFFILIATE_ID ne '') { if(open(SERVICESXML, ">", $installDir.$SERVICES_XML_PATH)) { printf SERVICESXML $SERVICES_XML_FORMAT, $AFFILIATE_ID; close(SERVICESXML); } } } ###################################################################################################################### # Zählpixel URL aufrufen und die dabei heruntergeladene Datei löschen. ###################################################################################################################### sub triggerCountPixel { my $pixelFile = "pixel"; if($upgrade == 1) { $_[0] =~ s//genericupgrade/; } elsif($update == 1) { $_[0] =~ s//update/; } else { $_[0] =~ s///; } if($workingDir ne "") { $pixelFile = $workingDir."/".$pixelFile; } system("wget -q $_[0] -O $pixelFile"); unlink $pixelFile } ###################################################################################################################### # Fehlermeldung ausgeben ###################################################################################################################### #sub printErrorMessage { # my ($message) = @_; # # print "\033[31m".$message."\033[0m"; #} ###################################################################################################################### # Meldung in rot. ###################################################################################################################### sub red { my $message = $_[0]; my $retVal = sprintf("\033[31m%s\033[0m", $message); return $retVal; } ###################################################################################################################### # Fehlermeldung ausgeben und abbrechen ###################################################################################################################### sub abort { my $message = shift(@_); printf(red($message), @_); exit 1; } ###################################################################################################################### # Übersetzungen laden ###################################################################################################################### sub loadTranslations { if(open(TRANSLATIONS, "<", "install-linux-translations.pl")) { my $translationCode; while() { $translationCode.=$_; } close(TRANSLATIONS); eval($translationCode); @ANSWER_YES_LIST = ($TRANSLATABLE[0], $TRANSLATABLE[1]); @ANSWER_NO_LIST = ($TRANSLATABLE[2], $TRANSLATABLE[3]); } } ###################################################################################################################### # Übersetzen ###################################################################################################################### #sub translate { # my message = $_[0]; # # return message; #} ###################################################################################################################### # MAIN ###################################################################################################################### # Erzwinge eine Leerung der Puffer nach jeder print()-Operation $| = 1; system("clear"); loadTranslations(); getOptions(); printf($TRANSLATABLE[4], $APPLICATION_NAME); checkWorkingDir(); checkProgramms(); showEula(); getInstallDir(); getIndexFile(); checkIndexFile(); downloadFiles(); unpackFiles(); cleanup(); createDesktopIcons(); triggerCountPixel($INSTALLATION_COMPLETE_URL); printf($TRANSLATABLE[12], $APPLICATION_NAME, $installDir."/".$APPLICATION_NAME);