#!/usr/bin/perl #UPI-SRC -An Automatized Program installer including dependencies and necessary libraries, COMPATIBLE WITH DEB-SRC REPOSITORY #Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/2.5/it/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. # Copyright 2008 Ettore Di Giacinto use strict; use URI; use LWP::UserAgent; use LWP::Simple; use Getopt::Long; my $sources_file = "/etc/upi-src/repos.list"; my $install_directory = '/etc/upi-src/'; my $temp_directory = '/tmp/'; my $VERSION = "0.1-kid_alpha_31072008"; my $repository_file = $install_directory . "source"; my $lang="it"; #disponibile it ed en my %text; my $scelta; my @install; my @get_install; my @local_install; my @search; my $info; my $remove; my $version; my $update; my $force=0; my $reinstall=0; my $proceed=0; my $configure_options; my $make_options; my $PATH=$ENV{PATH}; #Definisco le PATH dove sono depositati gli executables my @BIN_PATH=split(/\:/,$PATH); my @DEFAULT_LD_PATH=("/usr/lib","/usr/lib/internal","/lib","/lib/cmplrs/cc","/usr/lib/cmplrs/cc","/opt/lib","/usr/lib32","/usr/lib32/internal","/lib32","/opt/lib32","/usr/lib64","/usr/lib64/internal","/lib64","/opt/lib64"); my @paths; my @PATH=("/usr/bin","/usr/sbin","/bin","/sbin","/usr/share"); push (@paths, @BIN_PATH, @PATH); push (@paths, @DEFAULT_LD_PATH); ##GetOPT GetOptions( "force-yes" => \$force, "force-yes-proceed" => \$proceed, "force-yes-reinstall" => \$reinstall, "configure=s{,}" => \$configure_options, "make=s{,}" => \$make_options, "install=s{,}" => \@install, "get-install=s{,}" => \@get_install, "local-install=s{,}" => \@local_install, "search=s{,}" => \@search, "info=s" => \$info, "remove=s" => \$remove, "version" => \$version, "update" => \$update, ); my $configure_command = "./configure $configure_options"; my $make_command = "make $make_options && make install"; my $upi_src_release="http://www.upi-src.org/release/upi-src"; ############### #Language File# ############### #IT $text{'it'}{'YES'}="s"; $text{'it'}{'NO'}="n"; $text{'it'}{'PROCEED'}="p"; $text{'it'}{'REINSTALL'}="r"; $text{'it'}{'EXIT'}="e"; $text{'it'}{'ALERT'}="Solo l'utente root puo' usare questo programma!"; $text{'it'}{'CREDIT'}="Upi-SRC $VERSION Scritto da Ettore Di Giacinto - http://www.upi-src.org/"; $text{'it'}{'INSTALL_PACKAGE'}="install package=> installa il pacchetto indicato"; $text{'it'}{'GET-INSTALL_PACKAGE'}="get-install url.tar.gz -> Scarica ed installa il pacchetto indicato"; $text{'it'}{'LOCAL-INSTALL_PACKAGE'}="local-install cartella/file.tar.gz -> Installa un pacchetto locale"; $text{'it'}{'SEARCH_PACKAGE'}="search package -> Cerca il pacchetto nel database"; $text{'it'}{'UPDATE_PACKAGE_LIST'}="update -> Aggiorna il database attraverso le repository"; $text{'it'}{'REMOVE_PACKAGE'}="remove package -> Cancella completamente un pacchetto"; $text{'it'}{'INFO_USE'}="info package -> Mostra informazioni su di un pacchetto\n"; $text{'it'}{'OPTIONS'}="[OPZIONI]: --force-yes, --force-yes-proceed, --force-yes-reinstall, --configure options --make options.\n"; $text{'it'}{'EXTRA_INFO'}="[VER]: puoi installare una versione particolare del pacchetto indicandolo nel momento dell'installazione, esempio: upi-src --install automakever1.10.\n"; $text{'it'}{'INSTALLATION'}="Installo "; $text{'it'}{'DOWNLOAD_ERROR'}="Errore nel download del file"; $text{'it'}{'COMMAND'}="Eseguo il comando: "; $text{'it'}{'ERROR'}="Si e' verificato un errore durante l'esecuzione del comando, controlla il file di errore error.log!"; $text{'it'}{'INSTALLED'}="Installato "; $text{'it'}{'NOT_INSTALLED'}="Non e' stato installato "; $text{'it'}{'FILE_DOESNT_EXIST'}="File inesistente"; $text{'it'}{'UPDATE_LIST'}="Aggiornamento file repository"; $text{'it'}{'UPDATE_FOUND'}="Trovato "; $text{'it'}{'UPDATE_GET'}="Scarico "; $text{'it'}{'UPDATE_DONE'}=" Repository Aggiornata!"; $text{'it'}{'UPDATE_FAILED'}="Repository non disponibile! "; $text{'it'}{'UPDATE_DEB_START'}="Repository debian: "; $text{'it'}{'UPDATE_DEB_SOURCES'}="Sources scaricato correttamente"; $text{'it'}{'UPDATE_DEB_SOURCES_FAILED'}="Download del sources fallito!"; $text{'it'}{'UPDATE_OK'}="Aggiornamento della lista dei file completato!"; $text{'it'}{'INSTALL_VERIFY'}="Verifico se e' installato: "; $text{'it'}{'INSTALL_NOT_INSTALLED'}="Non installato: "; $text{'it'}{'INSTALL_INSTALLED'}=" gia' installato! [".$text{'it'}{'PROCEED'}."]rocedo/[".$text{'it'}{'REINSTALL'}."]einstallo/[".$text{'it'}{'EXIT'}."]sco? "; $text{'it'}{'INSTALL_PROCEED'}="Pacchetto trovato nella repository, procedo con l'installazione di "; $text{'it'}{'INSTALL_VERSION'}="Installazione di"; $text{'it'}{'INSTALL_CHECK_DEPENDENCIES'}="Controllo se le dipendenze sono soddisfatte"; $text{'it'}{'INSTALL_NEEDED_DEPENDENCIES'}="Dipendenze richieste per "; $text{'it'}{'INSTALL_CONTINUE_DEPENDENCIES'}="Continuare con l'installazione delle dipendenze? [".$text{'it'}{'YES'}."/".$text{'it'}{'NO'}."]"; $text{'it'}{'INSTALL_PROCEED_INSTALLATION'}="Procedo con l'installazione di"; $text{'it'}{'DOWNLOAD_ERROR'}="Errore nello scaricamento del pacchetto"; $text{'it'}{'TYPE_NOT_SUPPORTED'}="Formato file non supportato"; $text{'it'}{'NOT_IN_REPOSITORY'}="Non e' presente nelle repository: "; $text{'it'}{'RESOLVING_DEPENDENCIES'}="Ora risolvo le dipendenze"; $text{'it'}{'INFO'}="Informazioni su:"; $text{'it'}{'DELETE'}="Sei sicuro di voler cancellare questi files?[".$text{'it'}{'YES'}."/".$text{'it'}{'NO'}."]"; $text{'it'}{'CANNOT_CREATE'}="Non posso creare"; $text{'it'}{'DOWNLOADING'}="Scaricando"; $text{'it'}{'DOWNLOADED'}="Scaricato"; $text{'it'}{'CONTINUE'}="Sicuro di voler continuare?[".$text{'it'}{'YES'}."/".$text{'it'}{'NO'}."]"; $text{'it'}{'BUG'}="Automaticamente segnalato sul sito di UPI-SRC l'installazione mancata del pacchetto, riprova tra qualche giorno a reinstallare il pacchetto, dacci giusto il tempo di sistemare il problema nella repository =), scusaci del disagio, ma la repository e' in costruzione"; $text{'it'}{'DATABASE_UPDATE'}="Aggiornamento database, attendere prego."; $text{'it'}{'VERSION'}="version --> Mostra la versione installata."; $text{'it'}{'NEW_RELEASE'}="E' stata rilasciata una nuova release di upi-src, proseguo con l'aggiornamento."; #EN $text{'en'}{'YES'}="y"; $text{'en'}{'NO'}="n"; $text{'en'}{'PROCEED'}="p"; $text{'en'}{'REINSTALL'}="r"; $text{'en'}{'EXIT'}="e"; $text{'en'}{'ALERT'}="Only root can use this program!"; $text{'en'}{'CREDIT'}="Upi-SRC $VERSION Written by Ettore Di Giacinto - http://www.upi-src.org/"; $text{'en'}{'INSTALL_PACKAGE'}="install package=> Install the selected package"; $text{'en'}{'GET-INSTALL_PACKAGE'}="get-install url.tar.gz -> Download and install the specified package"; $text{'en'}{'LOCAL-INSTALL_PACKAGE'}="local-install Directory/file.tar.gz -> Install a local package"; $text{'en'}{'SEARCH_PACKAGE'}="search package -> Search package in the database"; $text{'en'}{'UPDATE_PACKAGE_LIST'}="update -> Update the database using repositories"; $text{'en'}{'REMOVE_PACKAGE'}="remove package -> Delete completely the package specified"; $text{'en'}{'INFO_USE'}="info package -> Sows infos about a package\n"; $text{'en'}{'OPTIONS'}="[OPTIONS]: --force-yes, --force-yes-proceed, --force-yes-reinstall, --configure options, --make options.\n"; $text{'en'}{'EXTRA_INFO'}="[VER]: you can install a particular versione of the package during the installation, e.g.: upi-src --install automakever1.10.\n"; $text{'en'}{'INSTALLATION'}="Installing "; $text{'en'}{'DOWNLOAD_ERROR'}="An error is occurred during the dowload of file"; $text{'en'}{'COMMAND'}="Running command: "; $text{'en'}{'ERROR'}="An error occurred during the executing of command, check the error log file error.log!"; $text{'en'}{'INSTALLED'}="Installation successful "; $text{'en'}{'NOT_INSTALLED'}="The package wasn't installed by UPI "; $text{'en'}{'FILE_DOESNT_EXIST'}="File not found"; $text{'en'}{'UPDATE_LIST'}="Updating repository file"; $text{'en'}{'UPDATE_FOUND'}="File Found "; $text{'en'}{'UPDATE_GET'}="Downloading file "; $text{'en'}{'UPDATE_DONE'}=" Repository updated!"; $text{'en'}{'UPDATE_FAILED'}="Repository unavailable! "; $text{'en'}{'UPDATE_DEB_START'}="Repository debian: "; $text{'en'}{'UPDATE_DEB_SOURCES'}="Sources downloaded correctly"; $text{'en'}{'UPDATE_DEB_SOURCES_FAILED'}="Download sources failed!"; $text{'en'}{'UPDATE_OK'}="File list Updated !"; $text{'en'}{'INSTALL_VERIFY'}="Check if it is installed: "; $text{'en'}{'INSTALL_NOT_INSTALLED'}="Not installed: "; $text{'en'}{'INSTALL_INSTALLED'}=" Alredy installed! [".$text{'en'}{'PROCEED'}."]roceed/[".$text{'en'}{'REINSTALL'}."]einstall/[".$text{'en'}{'EXIT'}."]xit? "; $text{'en'}{'INSTALL_PROCEED'}="Package found in the repository, proceed with installation of "; $text{'en'}{'INSTALL_VERSION'}="Installation of"; $text{'en'}{'INSTALL_CHECK_DEPENDENCIES'}="Check if the state of dependencies are good"; $text{'en'}{'INSTALL_NEEDED_DEPENDENCIES'}="Dependencies required for "; $text{'en'}{'INSTALL_CONTINUE_DEPENDENCIES'}="Continue with the installation of dependencies? [".$text{'en'}{'YES'}."/".$text{'en'}{'NO'}."]"; $text{'en'}{'INSTALL_PROCEED_INSTALLATION'}="Proceed of installation of"; $text{'en'}{'DOWNLOAD_ERROR'}="An error occurred during donwloading package"; $text{'en'}{'TYPE_NOT_SUPPORTED'}="The archive type is not supported"; $text{'en'}{'NOT_IN_REPOSITORY'}="The package isn't in the repository: "; $text{'en'}{'RESOLVING_DEPENDENCIES'}="Now resolving dependencies"; $text{'en'}{'INFO'}="Information about:"; $text{'en'}{'DELETE'}="Are you sure that you want to delete this file?[".$text{'en'}{'YES'}."/".$text{'en'}{'NO'}."]"; $text{'en'}{'CANNOT_CREATE'}="I cannot create"; $text{'en'}{'DOWNLOADING'}="Downloading"; $text{'en'}{'DOWNLOADED'}="Downloaded"; $text{'en'}{'CONTINUE'}="Sure you want to proceed?[".$text{'en'}{'YES'}."/".$text{'en'}{'NO'}."]"; $text{'en'}{'BUG'}="Auto report in the website of UPI-SRC project done, try to install the package again in two days, give us just time for solving the problem in the repository =), sorry for the inconvenience, but repository is still under construction"; $text{'en'}{'DATABASE_UPDATE'}="Building up Database, please wait."; $text{'en'}{'NEW_RELEASE'}="New version of UPI-SRC is avaible, we will update upi-src."; $text{'en'}{'VERSION'}="version -->Show upi-src current version."; #################### #End Language File # #################### my $result=`id`; if($result=~/root/){} else { print $text{$lang}{'ALERT'}."\n"; exit;} ##Controllo eventuali aggiornamenti, se ci sono aggiornamenti li scarico. my $upi_release = get($upi_src_release="http://www.upi-src.org/release/upi-src"); if ($upi_release!~/$VERSION/i){ message($text{$lang}{'NEW_RELEASE'},3); $reinstall=1; $force=1; update(); install("upi-src"); $force=0; $reinstall=0;} if(-e "$install_directory\/installed"){ } else { &aggiornadb(); } if($proceed==1 or $reinstall==1){ $force=1; } if($update==1){ update(); } elsif(scalar(@install)>0){ install(@install); } elsif(scalar(@get_install)>0){ getinstall(@get_install); } elsif(scalar(@local_install)>0){ manualinstall(@local_install); } elsif(scalar(@search)>0){ search(@search); } elsif($info){ info($info); } elsif($remove){ remove($remove); } elsif($version){ print $text{$lang}{'CREDIT'}."\n"; } else { ##Print dell'info in caso di errore print "upi-src $VERSION:\n"; print "upi-src "; print " --".$text{$lang}{'INSTALL_PACKAGE'}."\n"; print "upi-src "; print " --".$text{$lang}{'GET-INSTALL_PACKAGE'}."\n"; print "upi-src "; print " --".$text{$lang}{'LOCAL-INSTALL_PACKAGE'}."\n"; print "upi-src "; print " --".$text{$lang}{'SEARCH_PACKAGE'}."\n"; print "upi-src "; print " --".$text{$lang}{'UPDATE_PACKAGE_LIST'}."\n"; print "upi-src "; print " --".$text{$lang}{'REMOVE_PACKAGE'}."\n"; print "upi-src "; print " --".$text{$lang}{'INFO_USE'}."\n"; print "upi-src "; print " ".$text{$lang}{'OPTIONS'}."\n"; print "upi-src "; print " ".$text{$lang}{'EXTRA_INFO'}."\n"; print "upi-src "; print " --".$text{$lang}{'VERSION'}."\n"; } ##Funzione GetINSTALL -> Viene passato come argomento l'url del file ovvero: www.example.com/file.tar.gz ##Diciamo che è una funzione per i pigri =) sub getinstall{ my @install = @_; foreach my $pacchetto(@install){ message($text{$lang}{'INSTALLATION'}.$pacchetto,1); my$apkk=0; #message("Download $pacchetto",2); my $file = "temp.tar.gz"; download($pacchetto, $temp_directory.$file); # Scarico il pacchetto if(!-e $temp_directory.$file){ message($text{$lang}{'FILE_DOESNT_EXIST'},3); exit;} #non è stato scaricato? esco! my @result = `cd $temp_directory;tar xvf $file`; #scompatto my @dir = split(/\//,$result[0]); my $directory = $dir[0]; #in che cartella è stato decompresso? if(-e "$temp_directory/$directory/configure"){ #esiste configure? sì, allora lo eseguo! message($text{$lang}{'COMMAND'}.$configure_command,2); my $result = `cd $temp_directory;cd $directory;$configure_command;echo RISULTATO:\$(echo \$\?)`;print $result."\n"; } else { $result="RISULTATO:0"; } if($result!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); $apkk=0; errore($pacchetto,"$configure_command: $result");&continue();} #Diamine.. il configure ha dato un errore? message($text{$lang}{'COMMAND'}.$configure_command,2); my $result2 = `cd $temp_directory;cd $directory;$make_command;echo RISULTATO:\$(echo \$\?)`; print $result2."\n"; if($result2!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); $apkk=0; errore($pacchetto,"$make_command: $result");&continue();}#Diamine.. il make ha dato un errore? if($file){ #ripuliamo 1 pò tutto quanto... unlink($temp_directory.$file);system("rm -rf $temp_directory"."$file");} if($directory){ rmdir($temp_directory.$directory);system("rm -rf $temp_directory"."$directory");} if($apkk==0){ message($text{$lang}{'INSTALLED'}.$pacchetto,3); &aggiornadb; } else { message($text{$lang}{'NOT_INSTALLED'}.$pacchetto,1); } } } #Simile a Get-Install, soltanto al posto di un url gli viene passato come argomento un file locale.. non necessita di commenti =) sub manualinstall{ my @install = @_; foreach my $pacchetto(@install){ message($text{$lang}{'INSTALLATION'}.$pacchetto,1); my $file = $pacchetto; if($pacchetto=~/\/.*$/i){ my $file = $1; } my $apkk=1; system("cp $pacchetto ".$temp_directory.$file); if(!-e $temp_directory.$file){ message($text{$lang}{'FILE_DOESNT_EXIST'},3); exit;} my @result = `cd $temp_directory;tar xvf $file`; my @dir = split(/\//,$result[0]); my $directory = $dir[0]; if(-e "$temp_directory/$directory/configure"){ message($text{$lang}{'COMMAND'}.$configure_command,2); my $result = `cd $temp_directory;cd $directory;$configure_command;echo RISULTATO:\$(echo \$\?)`;print $result."\n"; } else { $result="RISULTATO:0"; } if($result!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); errore($pacchetto,"$configure_command: $result");$apkk=0; &continue();} message($text{$lang}{'COMMAND'}.$make_command,2); my $result2 = `cd $temp_directory;cd $directory;$make_command;echo RISULTATO:\$(echo \$\?)`; print $result2."\n"; if($result2!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); errore($pacchetto,"$make_command: $result");$apkk=0; &continue();} if($file){ unlink($temp_directory.$file);system("rm -rf $temp_directory"."$file");} if($directory){ rmdir($temp_directory.$directory);system("rm -rf $temp_directory"."$directory");} if($apkk==0){ message($text{'it'}{'NOT_INSTALLED'}.$pacchetto,3); } else { message($text{'it'}{'INSTALLED'}.$pacchetto,1); &aggiornadb; } } } ##La funzione update: legge il file repos.list dentro /etc/upi-src/repos.list, e a seconda dei dati lì dentro distingue se ci siano scritte repository debian oppure upi-src #Guarda il file repos.list per avere una panoramica di come funziona (è molto intuitivo) #Per ora non gestisce come apt se ci sono differenze o meno (ed evita di scaricare gli aggiornamenti) sub update { message($text{$lang}{'CREDIT'},1); # display credits :P message($text{$lang}{'UPDATE_LIST'},1); open FILE, "<$sources_file"; my @sources = ; close FILE; unlink($repository_file); #Elimino il vecchio database dei pacchetti open REPOS, ">>$repository_file"; my $contatore_sources=0; foreach my $resource (@sources){ if($resource=~/^\#/){ next; } #se la prima riga inizia per # vuol dire che è commentata.. chomp ($resource); $contatore_sources++; my @repository=split(/\|/,$resource); #classifico ora le repository my $repos_type= $repository[0]; my $repos_url = $repository[1]; message($text{$lang}{'UPDATE_FOUND'}.$repos_type.": ".$repos_url,3); message($text{$lang}{'UPDATE_GET'}.$repos_type.": ".$repos_url,2); if ($repos_type eq "upi-src"){ #se é upi-src la copio senza interpretare.. download("$repos_url/repos",$temp_directory."repos"); if (-e $temp_directory."repos"){ open REPOS, ">>$repository_file"; my $so=$temp_directory."/"."repos"; open sources,"<$so"; my @su = ; close sources; unlink($so); print REPOS @su; close REPOS; message ($repos_url.$text{$lang}{'UPDATE_DONE'},1); } else { message($text{$lang}{'UPDATE_FAILED'},3); } } elsif ($repos_type eq "deb"){ #se è debian, invece devo interpretarla e trasformarla in formato upi-src... my $repos_distro = $repository[2]; shift(@repository); shift(@repository); shift(@repository); open REPOS, ">>$repository_file"; message($text{$lang}{'UPDATE_DEB_START'}." $repos_url",2); foreach my $directory (@repository){ chomp($directory); download("$repos_url/dists/$repos_distro/$directory/source/Sources.gz",$temp_directory."Sources.gz"); if (-e $temp_directory."Sources.gz"){ message($text{$lang}{'UPDATE_DEB_SOURCES'},2); my $result=`cd $temp_directory;gunzip Sources.gz`; unlink($temp_directory."Sources.gz"); my $so=$temp_directory."/"."Sources"; open sources,"<$so"; my @su = ; close sources; unlink($so); my $dir; foreach my $sou (@su){ if($sou=~/^Package\:\s+(.*)\b/i){ print REPOS "Package:$1\n"; }elsif ($sou=~/^Version\:\s+(.*)\b/i){ print REPOS "Version:$1\n"; }elsif ($sou=~/^Build-Depends\:\s+(.*)\b/i){ my $dep=$1; $dep=~s/\s+\(.*\)//g; $dep=~s/\s+\[.*\]//g; $dep=~s/\s+\(.+//g; print REPOS "Depends:$dep\n"; #}elsif ($sou=~/^Build-Depends-Indep\:(.*)\b/i){ # print REPOS " $1\n"; }elsif ($sou=~/^Directory\:\s+(.*)\b/i){ $dir=$1; }elsif ($sou=~/(.*).tar.gz\b/i){ my $file = file_find($1); print REPOS "File:$repos_url/$dir/$file.tar.gz\n"; } } #system("mv ".$temp_directory."Sources ".$install_directory."Sources_".$contatore_sources."_".$directory); } else { #message("Sources.gz not avaible, i try to download the bz2",3); download("$repos_url/dists/$repos_distro/$directory/source/Sources.bz2",$temp_directory."Sources.bz2"); if (-e $temp_directory."Sources.bz2"){ message($text{$lang}{'UPDATE_DEB_SOURCES'},2); my $result=`cd $temp_directory;bzip2 Sources.bz2`; unlink($temp_directory."Sources.bz2"); my $so=$temp_directory."/"."Sources"; open sources,"<$so"; my @su = ; close sources; unlink($so); my $dir; foreach my $sou (@su){ if($sou=~/^Package\:\s+(.*)\b/i){ print REPOS "Package:$1\n"; }elsif ($sou=~/^Version\:\s+(.*)\b/i){ print REPOS "Version:$1\n"; }elsif ($sou=~/^Build-Depends\:\s+(.*)\b/i){ my $dep=$1; $dep=~s/\s+\(.*\)//g; $dep=~s/\s+\[.*\]//g; $dep=~s/\s+\(.+//g; print REPOS "Depends:$dep\n"; #}elsif ($sou=~/^Build-Depends-Indep\:(.*)\b/i){ # print REPOS " $1\n"; }elsif ($sou=~/^Directory\:\s+(.*)\b/i){ $dir=$1; }elsif ($sou=~/(.*).tar.gz\b/i){ my $file = file_find($1); print REPOS "File:$repos_url/$dir/$file.tar.gz\n"; } } #system("mv ".$temp_directory."Sources ".$install_directory."Sources_".$contatore_sources."_".$directory); } else { message($text{$lang}{'UPDATE_DEB_SOURCES_FAILED'},3); } } } } } close REPOS; message($text{$lang}{'UPDATE_OK'},1); } sub search { #Cerco il pacchetto nel database (il file sources) message($text{$lang}{'CREDIT'},1); my @search = @_; foreach my $pacchetto (@search){ chdir($install_directory); open FILE, "<", $repository_file; my @file= ; close FILE; foreach my $file(@file){ if($file=~/$pacchetto/i && $file=~/Package\:(.*)\b/i ){ chomp ($file); message("$file",1); } } } } sub install {#ed ora la vera e propria funzione install..... un vero massacro :) message($text{$lang}{'CREDIT'},1); my @install = exceptions(@_); #Gestiamo le eccezioni per sistemi debian my %installed; my $found=0; foreach my $pack (@install){ $found=0; next if $pack eq ''; my $checke=$pack; #$pack=~s/\+/\\\+/g; #$pack=~s/\\//g; #$pack=~s/\-/\\\-/g; $pack=~s/\ver.*//g; message($text{$lang}{'INSTALL_VERIFY'}.$pack,1); #qui controlliamo se il pacchetto richiesto è stato già installato, in caso positivo chiediamo se si vuole reinstallare, passare all'installazione del pacchetto precedente o semplicemente uscire my $exist=check($pack); if($exist==0){ message($text{$lang}{'INSTALL_NOT_INSTALLED'}.$pack,2); } else { if($proceed==1){ next;} elsif ($reinstall==1){ } else { message($pack.$text{$lang}{'INSTALL_INSTALLED'},3); my $response=; chop $response; if ($response eq $text{$lang}{'REINSTALL'}){ } elsif ($response eq $text{$lang}{'PROCEED'}){ next; } else { exit; } } } chdir($install_directory); open FILE, "<",$repository_file; #apriamo il file della repository my @FILE= ; close FILE; my $contatore=0; foreach my $riga(@FILE){ if($riga=~/$pack/i && $riga=~/Package\:(.*)\b/i ){ #il pacchetto è nel database? si?! allora installiamo! #if($riga eq "Package:$pack\n" ){ $contatore++; my $package=$pack; if ($installed{$package}){ $contatore=0; next; } $found=1; my %pacchetto = parse ($package,$contatore); #prendiamo i dati del pacchetto if ($checke=~/ver(.*)\b/i){ #se sono richieste delle versioni particolari... my $po=$1; if($po!~/\>\=|\<\=|\<|\>/){if($pacchetto{'Version'} ne $po) { next;}} if($po=~/\>\=/){ $po=~s/\>\=//g; if($pacchetto{'Version'} <= $po) { next; } } if($po=~/\<\=/){ $po=~s/\<\=//g; if($pacchetto{'Version'} >= $po) { next; } } if($po=~/\ $po) { next; } } if($po=~/\>/){ $po=~s/\>//g; if($pacchetto{'Version'} < $po) { next; } } } message($text{$lang}{'INSTALL_PROCEED'}.$package,2); message($text{$lang}{'INSTALL_VERSION'}." $package $pacchetto{'Version'} -> $pacchetto{'File'}",1);#installiamo allora! ma cosa mancano?!?! le dipendenze... message($text{$lang}{'INSTALL_CHECK_DEPENDENCIES'},2); my $depends = $pacchetto{'Depends'}; my @dependencies = exceptions(split (/,\s/,$depends)); my @dependences_to_install; foreach my $dependence (@dependencies){ $dependence=~s/\[//g; $dependence=~s/\]//g; next if $dependence eq ''; my $depend=check($dependence); if($depend==0){ #print "Dipendenza $dependence non soddisfatta\n"; push (@dependences_to_install,$dependence); if($dependence=~/dev/){ $dependence=~s/\-dev//g; push (@dependences_to_install,$dependence); } } else { #message("Dipendenza: $dependence OK",2); #print "Dipendenza $dependence soddisfatta\n"; } } if(scalar(@dependences_to_install)!=0){ @dependences_to_install=exceptions(@dependences_to_install); #message("Sono richieste le seguenti dipendenze per $package",3); message($text{$lang}{'INSTALL_NEEDED_DEPENDENCIES'}."$package: @dependences_to_install",3); push(@dependences_to_install,$package); my @resolved_dep; if($force==0){ message($text{$lang}{'INSTALL_CONTINUE_DEPENDENCIES'},3); my $response=; chop $response; if ($response eq $text{$lang}{'YES'}){ @resolved_dep=risolvi_dipendenze(@dependences_to_install); } } else { @resolved_dep=risolvi_dipendenze(@dependences_to_install); #Mandiamo a risolvere le dipendenze nella funzione risolvi_dipendenze ! } foreach my $dp(@resolved_dep){ $installed{$dp}="yes"; } }#bene... abbiamo finito di installare le dipendenze finalmente.. iniziamo con il pacchetto vero e proprio... Questo procedimento è molto simile a get-install $found=1; message($text{$lang}{'INSTALL_PROCEED_INSTALLATION'}." $package",2); if($force==0){ &continue(); } my $file = "temp.tar.gz"; if($pacchetto{'File'}=~/\.tar\.gz/){ $file = "temp.tar.gz"; } elsif ($pacchetto{'File'}=~/\.tar\.bz2/){ $file = "temp.tar.bz2"; } #message("Download di $pacchetto{'File'} in corso..",2); download($pacchetto{'File'}, $temp_directory.$file); if(!-e $temp_directory.$file){ message($text{$lang}{'DOWNLOAD_ERROR'},3); exit;} my @result; if($pacchetto{'File'}=~/\.tar\.gz/){ @result = `cd $temp_directory;tar xvf $file`; } elsif ($pacchetto{'File'}=~/\.tar\.bz2/){ @result = `cd $temp_directory;tar xvjf $file`; } else { message($text{$lang}{'TYPE_NOT_SUPPORTED'},3);exit; } my @dir = split(/\//,$result[0]); my $directory = $dir[0]; my $result; my $result2; my $apkk=1; if($directory=~/\n/){chop($directory);} if($pacchetto{'Configure'}){ message($text{$lang}{'COMMAND'}.$pacchetto{'Configure'},2); $result = `cd $temp_directory;cd $directory;$pacchetto{'Configure'};echo RISULTATO:\$(echo \$\?)`; } else { if(-e "$temp_directory/$directory/configure"){ message($text{$lang}{'COMMAND'}.$configure_command,2); $result = `cd $temp_directory;cd $directory;$configure_command;echo RISULTATO:\$(echo \$\?)`; } else { $result="RISULTATO:0"; } } print $result."\n"; if($result!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3);$apkk=0; print "\n";errore($package,"$configure_command: $result"); &continue();} if($pacchetto{'Make'}){ message($text{$lang}{'COMMAND'}.$pacchetto{'Make'},2); $result2 = `cd $temp_directory;cd $directory;$pacchetto{'Make'};echo RISULTATO:\$(echo \$\?)`; } else { message($text{$lang}{'COMMAND'}.$make_command,2); $result2 = `cd $temp_directory;cd $directory;$make_command;echo RISULTATO:\$(echo \$\?)`; } print $result2."\n"; if($result2!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); errore($package,"$make_command: $result2");$apkk=0; &continue();} if($file){ unlink($temp_directory.$file);system("rm -rf $temp_directory"."$file");} if($directory){ rmdir($temp_directory.$directory);system("rm -rf $temp_directory"."$directory");} if($apkk==0){ message($text{$lang}{'NOT_INSTALLED'}.$package,3);segnala($package); $installed{$package}="yes"; } else { message($text{$lang}{'INSTALLED'}.$package,1); $installed{$package}="yes"; &aggiornadb; } #last; } } if($found==0) { message($text{$lang}{'NOT_IN_REPOSITORY'}.$pack,3); print "\n"; } } } sub risolvi_dipendenze {#la funzione per risolvere le dipendenze è molto simile all'install, ma come differenza gestisce la fuoriuscita di un loop continuo my @install = exceptions(@_); my %installed; my $pacchetto_main = pop(@install); my $found=0; message($text{$lang}{'RESOLVING_DEPENDENCIES'}." @install",3); foreach my $pack(@install){ $found=0; next if $pack eq ''; my $checke=$pack; #$pack=~s/\+/\\\+/g; #$pack=~s/\\//g; #$pack=~s/\-/\\\-/g; $pack=~s/\ver.*//g; message($text{$lang}{'INSTALL_VERIFY'}.$pack,1); my $exist=check($pack); if($exist==0){ message($text{$lang}{'INSTALL_NOT_INSTALLED'}.$pack,2); } else { if($proceed==1){ next;} elsif ($reinstall==1){ } else { message($pack.$text{$lang}{'INSTALL_INSTALLED'},3); my $response=; chop $response; if ($response eq $text{$lang}{'REINSTALL'}){ } elsif ($response eq $text{$lang}{'PROCEED'}){ next; } else { exit; } } } chdir($install_directory); open FILE, "<",$repository_file; my @FILE= ; close FILE; my $contatore=0; foreach my $riga(@FILE){ #if($riga=~/$pack/i && $riga=~/Package\:(.*)\b/i ){ #if($riga eq "Package:$pack\n" ){ if($riga=~/Package\:$pack/i ){ $contatore++; my $package=$pack; if ($installed{$package}){ $contatore=0; next; } $found=1; my %pacchetto = parse ($package,$contatore); if ($checke=~/ver(.*)\b/i){ my $po=$1; if($po!~/\>\=|\<\=|\<|\>/){if($pacchetto{'Version'} ne $po) { next;}} if($po=~/\>\=/){ $po=~s/\>\=//g; if($pacchetto{'Version'} <= $po) { next; } } if($po=~/\<\=/){ $po=~s/\<\=//g; if($pacchetto{'Version'} >= $po) { next; } } if($po=~/\ $po) { next; } } if($po=~/\>/){ $po=~s/\>//g; if($pacchetto{'Version'} < $po) { next; } } } message($text{$lang}{'INSTALL_PROCEED'}.$package,2); message($text{$lang}{'INSTALL_VERSION'}." $package $pacchetto{'Version'} -> $pacchetto{'File'}",1); message($text{$lang}{'INSTALL_CHECK_DEPENDENCIES'},2); my $depends = $pacchetto{'Depends'}; my @dependencies = split (/,\s/,$depends); my @dependences_to_install; foreach my $dependence (@dependencies){ if($dependence eq $pacchetto_main){next;} my $depend=check($dependence); if($depend==0){ #print "Dipendenza $dependence non soddisfatta\n"; push (@dependences_to_install,$dependence); if($dependence=~/dev/){ $dependence=~s/\-dev//g; push (@dependences_to_install,$dependence); } } else { #print "Dipendenza $dependence soddisfatta\n"; } } if(scalar(@dependences_to_install)!=0){ @dependences_to_install=exceptions(@dependences_to_install); message($text{$lang}{'INSTALL_NEEDED_DEPENDENCIES'}."$package: @dependences_to_install",3); my @resolved_dep; push(@dependences_to_install,$pack); if($force==0){ &continue(); @resolved_dep=risolvi_dipendenze(@dependences_to_install); } else { @resolved_dep=risolvi_dipendenze(@dependences_to_install); } foreach my $dp(@resolved_dep){ $installed{$dp}="yes"; } } $found=1; message($text{$lang}{'INSTALL_PROCEED_INSTALLATION'}." $package",2); if($force==0){ &continue(); } my $file = "temp.tar.gz"; if($pacchetto{'File'}=~/\.tar\.gz/){ $file = "temp.tar.gz"; } elsif ($pacchetto{'File'}=~/\.tar\.bz2/){ $file = "temp.tar.bz2"; } download($pacchetto{'File'}, $temp_directory.$file); if(!-e $temp_directory.$file){ message($text{$lang}{'DOWNLOAD_ERROR'},3); exit; } my @result; if($pacchetto{'File'}=~/\.tar\.gz/){ @result = `cd $temp_directory;tar xvf $file`; } elsif ($pacchetto{'File'}=~/\.tar\.bz2/){ @result = `cd $temp_directory;tar xvjf $file`; } else { message($text{$lang}{'TYPE_NOT_SUPPORTED'},3);exit; } my @dir = split(/\//,$result[0]); my $directory = $dir[0]; my $apkk=1; my $result; my $result2; if($directory=~/\n/){chop($directory);} if($pacchetto{'Configure'}){ message($text{$lang}{'COMMAND'}.$pacchetto{'Configure'},2); $result = `cd $temp_directory;cd $directory;$pacchetto{'Configure'};echo RISULTATO:\$(echo \$\?)`; } else { if(-e "$temp_directory/$directory/configure"){ message($text{$lang}{'COMMAND'}.$configure_command,2); $result = `cd $temp_directory;cd $directory;$configure_command;echo RISULTATO:\$(echo \$\?)`; } else { $result="RISULTATO:0"; } } print $result."\n"; if($result!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3);$apkk=0; print "\n";errore($package,"$configure_command: $result"); &continue();} if($pacchetto{'Make'}){ message($text{$lang}{'COMMAND'}.$pacchetto{'Make'},2); $result2 = `cd $temp_directory;cd $directory;$pacchetto{'Make'};echo RISULTATO:\$(echo \$\?)`; } else { message($text{$lang}{'COMMAND'}.$make_command,2); $result2 = `cd $temp_directory;cd $directory;$make_command;echo RISULTATO:\$(echo \$\?)`; } print $result2."\n"; if($result2!~/RISULTATO:0/i){ message($text{$lang}{'ERROR'},3); errore($package,"$make_command: $result2");$apkk=0; &continue();} if($file){ unlink($temp_directory.$file);system("rm -rf $temp_directory"."$file");} if( $directory){ rmdir($temp_directory.$directory);system("rm -rf $temp_directory"."$directory");} if($apkk==0){ message($text{$lang}{'NOT_INSTALLED'}.$package,3);segnala($package); $installed{$package}="yes"; } else { message($text{$lang}{'INSTALLED'}.$package,1); $installed{$package}="yes"; &aggiornadb; } #last; } } if($found==0) { message($text{$lang}{'NOT_IN_REPOSITORY'}.$pack,3); print "\n"; } } my @return= keys %installed; return @return; } sub info{#Mostra le informazioni su un pacchetto message($text{$lang}{'CREDIT'},1); my $package = $_[0]; my @info; chdir($install_directory); message($text{$lang}{'INFO'}." $package",1); open FILE,"<",$repository_file; my @file = ; close FILE; my $pacchetto=0; foreach my $riga (@file){ if ($riga eq "Package:$package\n"){ $pacchetto=1; } elsif ($riga =~ /^Package\:/i){ $pacchetto=0; } if($pacchetto==1){ push(@info,$riga); } } foreach my $riga(@info){ chomp($riga); message($riga,1); } } sub parse{ #Questa funzione caccia dal database di file le informazioni su un determinato pacchetto! my $package = $_[0]; my $conta = $_[1]; my @info; my %pacchetto; my $contatore=0; open FILE,"<", $repository_file; my @file = ; close FILE; my $pakk=0; foreach my $riga (@file){ if ($riga =~ /^Package\:$package/i){ $pakk=1; } elsif ($riga =~ /^Package\:/i){ $pakk=0; } if($pakk==1){ push(@info,$riga); } } foreach my $riga(@info){ if($riga=~/^Package\:(.*)\b/i){ $contatore++; if ($contatore eq $conta){ $pacchetto{"Package"}=$1; } #}elsif($riga=~/^Binary\:(.*)\b/i){ # $pacchetto{"Binary"}=$1; }elsif($riga=~/^Version\:(.*)\b/i){ if ($contatore eq $conta){$pacchetto{"Version"}=$1;} }elsif($riga=~/^Depends\:(.*)\b/i){ if ($contatore eq $conta){$pacchetto{"Depends"}=$1;} }elsif($riga=~/^Make\:(.*)\b/i){ if ($contatore eq $conta){$pacchetto{"Make"}=$1;} }elsif($riga=~/^Configure\:(.*)\b/i){ if ($contatore eq $conta){$pacchetto{"Configure"}=$1;} #}elsif($riga=~/^Build-Depends-Indep\: (.*)\b/i){ # $pacchetto{"Build-Depends-Indep"}=$1; #}elsif($riga=~/^Directory\: (.*)\b/i){ # $pacchetto{"Directory"}=$1; #}elsif($riga=~/(.*).tar.gz/i){ # $pacchetto{"File"}=$1.".tar.gz"; }elsif($riga=~/^File\:(.*)\b/i){ if ($contatore eq $conta){$pacchetto{"File"}=$1;} } } return %pacchetto; } sub file_find{ my $file=$_[0]; my @infos=split(/\s/,$file); return $infos[3]; } sub remove_old{ #la funzione remove... si, è da dire, non è niente di speciale... questo purtroppo perché ci poniamo sotto il punto di vista di un sistema X, quindi non sappiamo mai precisamente la locazione di tutti i bin e i file installati da un programma, pure che sia stato precedentemente installato da upi-src... per questo abbiamo dovuto optare per una soluzione un pò brutale.... appena ci verrà un'idea migliore... :), oppure se viene in mente a voi fateci sapere! message($text{$lang}{'CREDIT'},1); my $delete = $_[0]; message($text{$lang}{'DATABASE_UPDATE'},2);`slocate -u`; my @delete = `slocate $delete`; my $contatore=0; foreach my $riga(@delete){ if($riga=~/home/i){ delete $delete[$contatore]; } if($riga=~/portage/i){ delete $delete[$contatore]; } $contatore++; } print "@delete"; if(!@delete) { exit;} print "\n"; if($force==0){ &continue(); } &aggiornadb; foreach my $elimina (@delete){ if (-d $elimina){ rmdir($elimina);system("rm -rf $elimina"); } else { unlink($elimina);system("rm -rf $elimina"); } } } sub check(){ #il file è installato? usiamo il database! :) my $checking=$_[0]; my $checked=0; open INSTALLED, "<$install_directory/installed"; my @INSTALLED=; close INSTALLED; foreach my $test(@INSTALLED){ $checked=1 if $test =~ $checking ; } return $checked; } sub remove(){ #il file è installato? usiamo il database! :) my $checking=$_[0]; my @delete; open INSTALLED, "<$install_directory/installed"; my @INSTALLED=; close INSTALLED; foreach my $test(@INSTALLED){ if ($test =~ $checking){ push(@delete,$test); } } foreach my $del(@delete){ chop $del; message($del,3); } if(@delete){ &continue; } else { exit;} foreach my $del(@delete){ if(-d $del){ rmdir($del); } else { unlink($del); } } &aggiornadb; } sub message() { #Gestione dei messaggi printati su schermo my $message= $_[0]; my $type = $_[1]; if($type == 1){ printf ("[*]"); printf (" $message"); printf (" [*]\n"); } elsif ($type == 2) { printf ("[+]"); printf (" $message"); printf (" [+]\n"); } elsif ($type == 3){ printf ("[!]"); printf (" $message"); printf (" [!]\n"); } } sub exceptions (){ #exceptions per debian! my @except=@_; my $count=0; foreach my $canc(@except){ if ($canc =~ /debhelper/i){ delete $except[$count]; } elsif ($canc =~ /man.+db/i){ delete $except[$count]; } elsif ($canc =~ /autotools/i){ delete $except[$count]; } elsif ($canc =~ /dpatch/i){ delete $except[$count]; } elsif ($canc =~ /dpkg/i){ delete $except[$count]; } elsif ($canc =~ /cdbs/i){ delete $except[$count]; } $count++; } return @except; } sub errore { #Scrivo tutti gli errori di compilazione su error.log my $package=$_[0]; my $err=$_[1]; open ERROR, ">>$install_directory/error.log"; print ERROR $err; close ERROR; &segnala($package); } sub download(){ #Scarico il file richiesto nella path indicata! my $url=$_[0]; my $path=$_[1]; my $ua = LWP::UserAgent->new; my $uri = URI->new($url); open my $outhandle, ">", $path or die $text{$lang}{'CANNOT_CREATE'}."$path: $!"; &message($text{$lang}{'DOWNLOADING'}." $url"); my $output = 0; my $target_is_set = 0; my $next_so_far = 0; $ua->get ($url, ":content_cb" => sub { my ($chunk, $response, $protocol) = @_; unless ($target_is_set) { if (my $cl = $response->content_length) { # $bar->target($cl); $target_is_set = 1; } else { # $bar->target($output + 2 * length $chunk); } } $output += length $chunk; print {$outhandle} $chunk; if ($output >= $next_so_far) { #$next_so_far = &message($output . " bytes",1); # $next_so_far = $bar->update($output); my $mess= $output . " Bytes"; print "\r$mess" . ( " " x ( 75 - length $mess ) ); } }); print "\n"; &message("$url ".$text{$lang}{'DOWNLOADED'},2); } sub continue(){ #sicuro di voler continuare? &message($text{$lang}{'CONTINUE'},3); my $response=; chop $response; if ($response ne $text{$lang}{'YES'}){ exit; } } sub segnala(){ #Ci segnala gli errori della repository... :) my $error=$_[0]; get("http://www.upi-src.org/send.php?error=$error"); &message($text{$lang}{'BUG'},3); } sub aggiornadb(){ &message($text{$lang}{'DATABASE_UPDATE'},2); unlink("$install_directory\/installed"); TROVARE: foreach my $cartella(@paths){ opendir(DIR,$cartella); my @FILES=readdir(DIR); closedir(DIR); TROVARE2: foreach my $FILE (@FILES){ $FILE=pulisci($FILE); open FILE,">>$install_directory/installed"; print FILE "$cartella\/$FILE\n"; close FILE; } } } sub adddb(){ my $aggiungi=$_[0]; open FILE, ">>$install_directory/installed"; print FILE "$aggiungi\n"; close FILE; } sub removedb(){ my $remove=$_[0]; open FILE, "<$install_directory/installed"; my @delete=; close FILE; my $contatore=0; foreach my $riga(@delete){ if($riga=~/$remove/i){ delete $delete[$contatore]; } $contatore++; } } sub pulisci(){ my $var=$_[0]; $var=~s/\+//g; $var=~s/\-//g; $var=~s/\]//g; $var=~s/\.so.*$//g; $var=~s/\.la.*$//g; $var=~s/\.a.*$//g; $var=~s/\.tar.*$//g; $var=~s/\[//g; return $var; } sub unici() { my @unici = (); my %visti = (); foreach my $elemento (@_) { $elemento =~ s/\/+/\//g; next if $visti{$elemento}++; push @unici, $elemento; } return @unici; }