);
# A small color-hash :D
-my %color;
+our %color;
$color{'normal'} = "\033[0m";
$color{'black'} = "\033[0;30m";
$color{'darkgrey'} = "\033[1;30m";
&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:");
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);
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 {
}
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 {
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";
}
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() {