]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/pakfire/lib/functions.pl
Pakfire: Update also the meta db at package list update.
[people/pmueller/ipfire-2.x.git] / src / pakfire / lib / functions.pl
index b53e917294f9d2083aac266d471da25682866d30..8d4a7da7db52b5a47a617fb3819bbaf67453cf18 100644 (file)
@@ -93,8 +93,8 @@ sub message {
 sub logger {
        my $log = shift;
        if ($log) {
-               system("echo \"`date`: $log\" >> /var/log/pakfire.log");
-               #system("logger -t pakfire \"$log\"");
+               #system("echo \"`date`: $log\" >> /var/log/pakfire.log");
+               system("logger -t pakfire \"$log\"");
        }
 }
 
@@ -118,7 +118,7 @@ sub pinghost {
        
        $p = Net::Ping->new();
   if ($p->ping($host)) {
-       logger("PING INFO: $host is alive");
+        logger("PING INFO: $host is alive");
        return 1;
   } else {
                logger("PING INFO: $host is unreachable");
@@ -160,7 +160,7 @@ sub fetchfile {
 
                my $ua = LWP::UserAgent->new;
                $ua->agent("Pakfire/$Conf::version");
-               $ua->timeout(5);
+               $ua->timeout(20);
                
                my %proxysettings=();
                &General::readhash("${General::swroot}/proxy/advanced/settings", \%proxysettings);
@@ -211,6 +211,9 @@ sub fetchfile {
                                                move("$Conf::tmpdir/$bfile","$Conf::cachedir/$bfile");
                                        } else {
                                                message("DOWNLOAD ERROR: The downloaded file ($file) wasn't verified by IPFire.org. Sorry - Exiting...");
+                                               my $ntp = `ntpdate -q -t 10 pool.ntp.org 2>/dev/null | tail -1`;
+                                               if ( $ntp !~ /time\ server(.*)offset(.*)/ ){message("TIME ERROR: Unable to get the nettime, this may lead to the verification error.");}
+                                               else { $ntp =~ /time\ server(.*)offset(.*)/; message("TIME INFO: Time Server$1has$2 offset to localtime.");}
                                                exit 1;
                                        }
                                        logger("DOWNLOAD FINISHED: $file");
@@ -308,6 +311,7 @@ sub selectmirror {
        #   This will never give up.
        my $found = 0;
        my $servers = 0;
+       my $pingdelay = 1;
        while ($found == 0) {
                $server = int(rand($scount) + 1);
                $servers = 0;
@@ -320,10 +324,22 @@ sub selectmirror {
                                $proto = $templine[0];
                                $host = $templine[1];
                                $path = $templine[2];
-                               if (pinghost("$host")) {
+                               if ($pakfiresettings{'HEALTHCHECK'} eq "off") {
+                                       logger("PING INFO: Healthcheck is disabled");
                                        $found = 1;
                                        return ($proto, $host, $path);
                                }
+                               elsif (pinghost("$host")) {
+                                       $found = 1;
+                                       return ($proto, $host, $path);
+                               }
+                               if ($found == 0) {
+                                       sleep($pingdelay);
+                                       $pingdelay=$pingdelay*2;
+                                       if ($pingdelay>1200) {
+                                               $pingdelay=1200;
+                                       }
+                               }
                        }
                }
        }
@@ -353,6 +369,51 @@ sub dbgetlist {
                fetchfile("lists/packages_list.db", "");
                move("$Conf::cachedir/packages_list.db", "$Conf::dbdir/lists/packages_list.db");
        }
+
+       # Update the meta database if new packages was in the package list
+       my @meta;
+       my $file;
+       my $line;
+       my $prog;
+       my ($name, $version, $release);
+       my @templine;
+
+       open(FILE, "<$Conf::dbdir/lists/packages_list.db");
+       my @db = <FILE>;
+       close(FILE);
+
+       opendir(DIR,"$Conf::dbdir/meta");
+       my @files = readdir(DIR);
+       closedir(DIR);
+       foreach $file (@files) {
+               next if ( $file eq "." );
+               next if ( $file eq ".." );
+               next if ( $file =~ /^old/ );
+               open(FILE, "<$Conf::dbdir/meta/$file");
+               @meta = <FILE>;
+               close(FILE);
+               foreach $line (@meta) {
+                       @templine = split(/\: /,$line);
+                       if ("$templine[0]" eq "Name") {
+                               $name = $templine[1];
+                               chomp($name);
+                       } elsif ("$templine[0]" eq "ProgVersion") {
+                               $version = $templine[1];
+                               chomp($version);
+                       } elsif ("$templine[0]" eq "Release") {
+                               $release = $templine[1];
+                               chomp($release);
+                       }
+               }
+               foreach $prog (@db) {
+                       @templine = split(/\;/,$prog);
+                       if (("$name" eq "$templine[0]") && ("$release" ne "$templine[2]")) {
+                               move("$Conf::dbdir/meta/meta-$name","$Conf::dbdir/meta/old_meta-$name");
+                               fetchfile("meta/meta-$name", "");
+                               move("$Conf::cachedir/meta-$name", "$Conf::dbdir/meta/meta-$name");
+                       }
+               }
+       }
 }
 
 sub dblist {
@@ -378,11 +439,14 @@ sub dblist {
        close(FILE);
 
        if ("$filter" eq "upgrade") {
-               getcoredb("noforce");
+               if ("$forweb" ne "forweb" && "$forweb" ne "notice" ) {getcoredb("noforce");}
                eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
-               if ("$core_release" gt "$Conf::core_mine") {
+               if ("$core_release" > "$Conf::core_mine") {
                        if ("$forweb" eq "forweb") {
                                print "<option value=\"core\">Core-Update -- $Conf::version -- Release: $Conf::core_mine -> $core_release</option>\n";
+                       }
+                       elsif ("$forweb" eq "notice") {
+                               print "<br /><br /><br /><a href='pakfire.cgi'>$Lang::tr{'core notice 1'} $Conf::core_mine $Lang::tr{'core notice 2'} $core_release $Lang::tr{'core notice 3'}</a>";
                        } else {
                                my $command = "Core-Update $Conf::version\nRelease: $Conf::core_mine -> $core_release\n";
                                if ("$Pakfire::enable_colors" eq "1") {
@@ -393,13 +457,14 @@ sub dblist {
                        }
                }
        
-               opendir(DIR,"$Conf::dbdir/meta");
+               opendir(DIR,"$Conf::dbdir/installed");
                my @files = readdir(DIR);
                closedir(DIR);
                foreach $file (@files) {
                        next if ( $file eq "." );
                        next if ( $file eq ".." );
-                       open(FILE, "<$Conf::dbdir/meta/$file");
+                       next if ( $file =~ /^old/ );
+                       open(FILE, "<$Conf::dbdir/installed/$file");
                        @meta = <FILE>;
                        close(FILE);
                        foreach $line (@meta) {
@@ -417,7 +482,7 @@ sub dblist {
                        }
                        foreach $prog (@db) {
                                @templine = split(/\;/,$prog);
-                               if (("$name" eq "$templine[0]") && ("$release" < "$templine[2]" )) {
+                               if (("$name" eq "$templine[0]") && ("$release" < "$templine[2]" && "$forweb" ne "notice")) {
                                        push(@updatepaks,$name);
                                        if ("$forweb" eq "forweb") {
                                                print "<option value=\"$name\">Update: $name -- Version: $version -> $templine[1] -- Release: $release -> $templine[2]</option>\n";
@@ -544,7 +609,12 @@ sub cleanup {
 sub getmetafile {
        my $pak = shift;
        
-       unless ( -e "$Conf::dbdir/meta/meta-$pak") {
+       unless ( -e "$Conf::dbdir/meta/meta-$pak" ) {
+               fetchfile("meta/meta-$pak", "");
+               move("$Conf::cachedir/meta-$pak", "$Conf::dbdir/meta/meta-$pak");
+       }
+       
+       if ( -z "$Conf::dbdir/meta/meta-$pak" ) {
                fetchfile("meta/meta-$pak", "");
                move("$Conf::cachedir/meta-$pak", "$Conf::dbdir/meta/meta-$pak");
        }
@@ -662,7 +732,7 @@ sub setuppak {
 sub upgradecore {
        getcoredb("noforce");
        eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
-       if ("$core_release" gt "$Conf::core_mine") {
+       if ("$core_release" > "$Conf::core_mine") {
                message("CORE UPGR: Upgrading from release $Conf::core_mine to $core_release");
                
                my @seq = `seq $Conf::core_mine $core_release`;
@@ -733,15 +803,6 @@ sub removepak {
                fetchfile("counter.py?ver=$Conf::version&uuid=$Conf::uuid&dpak=$pak&return=$return", "$Conf::mainserver");
        }
        if ($return == 0) {
-         open(FILE, "<$Conf::dbdir/rootfiles/$pak");
-               my @file = <FILE>;
-               close(FILE);
-               foreach (@file) {
-                 my $line = $_;
-                 chomp($line);
-                       system("echo \"Removing: $line\" >> $Conf::logdir/uninstall-$pak.log 2>&1");
-                       system("cd / && rm -rf $line >> $Conf::logdir/uninstall-$pak.log 2>&1");
-               }
          unlink("$Conf::dbdir/rootfiles/$pak");
          unlink("$Conf::dbdir/installed/meta-$pak");
          cleanup("tmp");