]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/pakfire/lib/functions.pl
pakfire: Refactor status seperating UI and logic
[ipfire-2.x.git] / src / pakfire / lib / functions.pl
index 505988af9016cf10492338889d08b5d6ffa914fd..f87589bc447e14999670efd1a746b9e95adc253c 100644 (file)
@@ -44,7 +44,7 @@ my @VALID_KEY_FINGERPRINTS = (
 );
 
 # A small color-hash :D
-my %color;
+our %color;
        $color{'normal'}      = "\033[0m";
        $color{'black'}       = "\033[0;30m";
        $color{'darkgrey'}    = "\033[1;30m";
@@ -114,7 +114,7 @@ sub usage {
   &Pakfire::message("Usage: pakfire <install|remove> [options] <pak(s)>");
   &Pakfire::message("               <update> - Contacts the servers for new lists of paks.");
   &Pakfire::message("               <upgrade> - Installs the latest version of all paks.");
-  &Pakfire::message("               <list> - Outputs a short list with all available paks.");
+  &Pakfire::message("               <list> [installed/notinstalled/upgrade] - Outputs a list with all, installed, available or upgradeable paks.");
   &Pakfire::message("               <status> - Outputs a summary about available core upgrades, updates and a required reboot");
   &Pakfire::message("");
   &Pakfire::message("       Global options:");
@@ -410,9 +410,7 @@ sub dbgetlist {
        my %metadata;
        my @templine;
 
-       open(FILE, "<$Conf::dbdir/lists/packages_list.db");
-       my @db = <FILE>;
-       close(FILE);
+    my %paklist = &Pakfire::dblist("all");
 
        opendir(DIR,"$Conf::dbdir/meta");
        my @files = readdir(DIR);
@@ -424,118 +422,123 @@ sub dbgetlist {
                next if ( $file =~ /^old/ );
                %metadata = parsemetafile("$Conf::dbdir/meta/$file");
 
-               foreach $prog (@db) {
-                       @templine = split(/\;/,$prog);
-                       if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" ne "$templine[2]")) {
-                               move("$Conf::dbdir/meta/meta-$metadata{'Name'}","$Conf::dbdir/meta/old_meta-$metadata{'Name'}");
-                               getmetafile($metadata{'Name'});
-                       }
+               if ((defined $paklist{"$metadata{'Name'}"}) && (
+                       ("$paklist{\"$metadata{'Name'}\"}{'Release'}" ne "$metadata{'Release'}") ||
+                       (defined $paklist{"$metadata{'Name'}"}{'AvailableRelease'}))
+                  ) {
+                       move("$Conf::dbdir/meta/meta-$metadata{'Name'}","$Conf::dbdir/meta/old_meta-$metadata{'Name'}");
+                       getmetafile($metadata{'Name'});
                }
        }
 }
 
+sub coredbinfo {
+       ### This subroutine returns core db version information in a hash.
+       # Usage is without arguments
+
+       eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
+
+       my %coredb = (
+               CoreVersion => $Conf::version,
+               Release => $Conf::core_mine,
+       );
+
+       $coredb{'AvailableRelease'} = $core_release if ("$Conf::core_mine" < "$core_release");
+
+       return %coredb;
+}
+
 sub dblist {
-       ### This subroutine lists the packages.
-       #   You may also pass a filter: &Pakfire::dblist(filter)
-       #   Usage is always with two arguments.
-       #   filter may be: all, notinstalled, installed
+       ### This subroutine returns the packages from the packages_list db in a hash.
+       #   It uses the currently cached version of packages_list. To ensure latest 
+       #   data, run Pakfire::dbgetlist first.
+       #   You may also pass a filter: &Pakfire::dblist(filter) 
+       #   Usage is always with one argument.
+       #   filter may be: 
+       #               - "all": list all known paks,
+       #               - "notinstalled": list only not installed paks,
+       #               - "installed": list only installed paks
+       #               - "upgrade": list only upgradable paks
+       #
+       #   Returned hash format:
+    #   ( "<pak name>" => (
+       #       "Installed" => "Yes" or "No" wether the pak is installed,
+       #       "ProgVersion" => Installed program version when "Installed" => "Yes" or
+    #                        Available version when "Installed" => No,
+       #       "Release" => Installed pak release number when "Installed" => "Yes" or
+    #                    Available pak release number when "Installed" => No,
+       #       "AvailableProgVersion" => Available program version. 
+       #                                 Only defined if an upgrade to a higher version is available,
+       #       "AvailableRelease" => Available pak release version. 
+       #                             Only defined if an upgrade to a higher version is available
+       #         ),
+       #         ...   
+       #   )
+       
        my $filter = shift;
-       my $forweb = shift;
-       my @updatepaks;
+       my %paklist = ();
        my $file;
        my $line;
-       my $prog;
        my %metadata;
        my @templine;
-
-       ### Make sure that the list is not outdated.
-       #dbgetlist("noforce");
-
+       
        open(FILE, "<$Conf::dbdir/lists/packages_list.db");
        my @db = <FILE>;
        close(FILE);
 
-       if ("$filter" eq "upgrade") {
-               if ("$forweb" ne "forweb" && "$forweb" ne "notice" ) {getcoredb("noforce");}
-               eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
-               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") {
-                                       print "$color{'lila'}$command$color{'normal'}\n";
-                               } else {
-                                       print "$command\n";
-                               }
-                       }
-               }
-
+       if ("$filter" ne "notinstalled") {
                opendir(DIR,"$Conf::dbdir/installed");
                my @files = readdir(DIR);
                closedir(DIR);
+
                foreach $file (@files) {
                        next if ( $file eq "." );
                        next if ( $file eq ".." );
                        next if ( $file =~ /^old/ );
                        %metadata = parsemetafile("$Conf::dbdir/installed/$file");
 
-                       foreach $prog (@db) {
-                               @templine = split(/\;/,$prog);
-                               if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" < "$templine[2]" && "$forweb" ne "notice")) {
-                                       push(@updatepaks,$metadata{'Name'});
-                                       if ("$forweb" eq "forweb") {
-                                               print "<option value=\"$metadata{'Name'}\">Update: $metadata{'Name'} -- Version: $metadata{'ProgVersion'} -> $templine[1] -- Release: $metadata{'Release'} -> $templine[2]</option>\n";
-                                       } else {
-                                               my $command = "Update: $metadata{'Name'}\nVersion: $metadata{'ProgVersion'} -> $templine[1]\nRelease: $metadata{'Release'} -> $templine[2]\n";
-                                               if ("$Pakfire::enable_colors" eq "1") {
-                                                       print "$color{'lila'}$command$color{'normal'}\n";
-                                               } else {
-                                                       print "$command\n";
-                                               }
-                                       }
+                       foreach $line (@db) {
+                               next unless ($line =~ /.*;.*;.*;/ );
+                               @templine = split(/\;/,$line);
+                               if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" < "$templine[2]")) {
+                                       # Add all upgradable paks to list
+                                       $paklist{"$metadata{'Name'}"} = {
+                                               ProgVersion => $metadata{'ProgVersion'},
+                                               Release => $metadata{'Release'},
+                                               AvailableProgVersion => $templine[1],
+                                               AvailableRelease => $templine[2],
+                                               Installed => "yes"
+                                       };
+                                       last;
+                               } elsif (("$metadata{'Name'}" eq "$templine[0]") && ("$filter" ne "upgrade")) {
+                                       # Add installed paks without an upgrade available to list
+                                       $paklist{"$metadata{'Name'}"} = {
+                                               ProgVersion => $metadata{'ProgVersion'},
+                                               Release => $metadata{'Release'},
+                                               Installed => "yes"
+                                       };
+                                       last;
                                }
                        }
                }
-               return @updatepaks;
-       } else {
-               my $line;
-               my $use_color;
-               my @templine;
-               my $count;
-               foreach $line (sort @db) {
+       }
+
+       # Add all not installed paks to list
+       if (("$filter" ne "upgrade") && ("$filter" ne "installed")) {
+               foreach $line (@db) {
                        next unless ($line =~ /.*;.*;.*;/ );
-                       $use_color = "";
                        @templine = split(/\;/,$line);
-                       if ("$filter" eq "notinstalled") {
-                               next if ( -e "$Conf::dbdir/installed/meta-$templine[0]" );
-                       } elsif ("$filter" eq "installed") {
-                               next unless ( -e "$Conf::dbdir/installed/meta-$templine[0]" );
-                       }
-                       $count++;
-                       if ("$forweb" eq "forweb")
-                        {
-                               if ("$filter" eq "notinstalled") {
-                                       print "<option value=\"$templine[0]\">$templine[0]-$templine[1]-$templine[2]</option>\n";
-                               } else {
-                                       print "<option value=\"$templine[0]\">$templine[0]</option>\n";
-                               }
-                       } else {
-                               if ("$Pakfire::enable_colors" eq "1") {
-                                       if (&isinstalled("$templine[0]")) {
-                                               $use_color = "$color{'red'}"
-                                       } else {
-                                               $use_color = "$color{'green'}"
-                                       }
-                               }
-                               print "${use_color}Name: $templine[0]\nProgVersion: $templine[1]\nRelease: $templine[2]$color{'normal'}\n\n";
-                       }
+                       next if ((defined $paklist{"$templine[0]"}) || (&isinstalled($templine[0]) == 0));
+
+                       $paklist{"$templine[0]"} = {
+                               ProgVersion => "$templine[1]",
+                               Release => "$templine[2]",
+                               Installed => "no"
+                       };
                }
-               print "$count packages total.\n" unless ("$forweb" eq "forweb");
        }
+
+       return %paklist;
 }
 
 sub resolvedeps_one {
@@ -770,35 +773,28 @@ sub setuppak {
 }
 
 sub upgradecore {
-       getcoredb("noforce");
-       eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
-       if ("$core_release" > "$Conf::core_mine") {
-               # Safety check for lazy testers:
-               # Before we upgrade to the latest release, we re-install the previous release
-               # to make sure that the tester has always been on the latest version.
-               my $tree = &get_tree();
-               $Conf::core_mine-- if ($tree eq "testing" || $tree eq "unstable");
-
-               message("CORE UPGR: Upgrading from release $Conf::core_mine to $core_release");
-
-               my @seq = `seq $Conf::core_mine $core_release`;
-               shift @seq;
-               my $release;
-               foreach $release (@seq) {
-                       chomp($release);
-                       getpak("core-upgrade-$release");
-               }
-
-               foreach $release (@seq) {
-                       chomp($release);
-                       upgradepak("core-upgrade-$release");
-               }
-
-               system("echo $core_release > $Conf::coredir/mine");
+       # Safety check for lazy testers:
+       # Before we upgrade to the latest release, we re-install the previous release
+       # to make sure that the tester has always been on the latest version.
+       my $tree = &get_tree();
+       $Conf::core_mine-- if ($tree eq "testing" || $tree eq "unstable");
 
-       } else {
-               message("CORE INFO: No new upgrades available. You are on release $Conf::core_mine.");
+       message("CORE UPGR: Upgrading from release $Conf::core_mine to $core_release");
+       
+       my @seq = ($Conf::core_mine .. $core_release);
+       shift @seq;
+       my $release;
+       foreach $release (@seq) {
+               chomp($release);
+               getpak("core-upgrade-$release");
        }
+       
+       foreach $release (@seq) {
+               chomp($release);
+               upgradepak("core-upgrade-$release");
+       }
+       
+       system("echo $core_release > $Conf::coredir/mine");
 }
 
 sub isinstalled {
@@ -910,24 +906,14 @@ sub progress_bar {
 
 sub updates_available {
        # Get packets with updates available
-       my @upgradepaks = &Pakfire::dblist("upgrade", "noweb");
+       my %upgradepaks = &Pakfire::dblist("upgrade");
 
-       # Get the length of the returned array
-       my $updatecount = scalar @upgradepaks;
+       # Get the length of the returned hash
+       my $updatecount = keys %upgradepaks;
 
        return "$updatecount";
 }
 
-sub coreupdate_available {
-       eval(`grep "core_" $Conf::dbdir/lists/core-list.db`);
-       if ("$core_release" > "$Conf::core_mine") {
-               return "yes ($core_release)";
-       }
-       else {
-               return "no";
-       }
-}
-
 sub reboot_required {
        if ( -e "/var/run/need_reboot" ) {
                return "yes";
@@ -938,26 +924,26 @@ sub reboot_required {
 }
 
 sub status {
-       # General info
-       my $return = "Core-Version: $Conf::version\n";
-       $return .= "Core-Update-Level: $Conf::core_mine\n";
-       $return .= "Last update: " . &General::age("/opt/pakfire/db/core/mine") . " ago\n";
-       $return .= "Last core-list update: " . &General::age("/opt/pakfire/db/lists/core-list.db") . " ago\n";
-       $return .= "Last server-list update: " . &General::age("/opt/pakfire/db/lists/server-list.db") . " ago\n";
-       $return .= "Last packages-list update: " . &General::age("/opt/pakfire/db/lists/packages_list.db") . " ago\n";
-
-       # Get availability of core updates
-       $return .= "Core-Update available: " . &Pakfire::coreupdate_available() . "\n";
-
-       # Get availability of package updates
-       $return .= "Package-Updates available: " . &Pakfire::updates_available() . "\n";
-
-       # Test if reboot is required
-       $return .= "Reboot required: " . &Pakfire::reboot_required() . "\n";
-
-       # Return status text
-       print "$return";
-       exit 1;
+       ### This subroutine returns pakfire status information in a hash.
+       # Usage is without arguments
+
+       # Add core version info
+       my %status = &Pakfire::coredbinfo();
+
+       # Add last update info
+       $status{'LastUpdate'} = &General::age("/opt/pakfire/db/core/mine");
+       $status{'LastCoreListUpdate'} = &General::age("/opt/pakfire/db/lists/core-list.db");
+       $status{'LastServerListUpdate'} = &General::age("/opt/pakfire/db/lists/server-list.db");
+       $status{'LastPakListUpdate'} = &General::age("/opt/pakfire/db/lists/packages_list.db");
+
+       # Add number of available package updates
+       $status{'CoreUpdateAvailable'} = (defined $status{'AvailableRelease'}) ? "yes" : "no";
+       $status{'PakUpdatesAvailable'} = &Pakfire::updates_available();
+
+       # Add if reboot is required
+       $status{'RebootRequired'} = &Pakfire::reboot_required();
+
+       return %status;
 }
 
 sub get_arch() {