Michael Tremer schreef op ma 21-03-2022 om 16:32 [+0000]:
Hello,
On 9 Mar 2022, at 22:56, Robin Roevens robin.roevens@disroot.org wrote:
- Added new getmetadata function for easy access to all available
metadata of a pak without knowledge about or need to parse pakfire internal db files.
- Added new 'pakfire info' functionality for displaying all
available metadata of (a) pak(s) to the user, using the new getmetadata.
- Use getmetadata function in services.cgi to determine installed
addon services to display. Removing code duplication and intel that should only be known by pakfire itself.
Signed-off-by: Robin Roevens robin.roevens@disroot.org
html/cgi-bin/services.cgi | 81 ++++++++++++++++++---------------
src/pakfire/lib/functions.pl | 55 ++++++++++++++++++++++++ src/pakfire/pakfire | 58 ++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 40 deletions(-)
diff --git a/html/cgi-bin/services.cgi b/html/cgi-bin/services.cgi index 237475735..896c95ec3 100644 --- a/html/cgi-bin/services.cgi +++ b/html/cgi-bin/services.cgi @@ -29,6 +29,7 @@ require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; require "${General::swroot}/graphs.pl"; +require "/opt/pakfire/lib/functions.pl";
my %color = (); my %mainsettings = (); @@ -160,51 +161,51 @@ END
my $lines=0; # Used to count the outputlines to make different bgcolor
- # Generate list of installed addon pak's - opendir (DIR, "/opt/pakfire/db/installed") || die "Cannot opendir /opt/pakfire/db/installed/: $!"; - my @pak = sort readdir DIR; - closedir(DIR);
- foreach (@pak){ - chomp($_); - next unless (m/^meta-/); - s/^meta-//;
- # Check which of the paks are services - if (-e "/etc/init.d/$_") { - # blacklist some packages - # - # alsa has trouble with the volume saving and was not really stopped - # mdadm should not stopped with webif because this could crash the system - # - if ( $_ eq 'squid' ) { - next; - } - if ( ($_ ne "alsa") && ($_ ne "mdadm") ) { - $lines++; - if ($lines % 2){ - print "<tr>";
$col="bgcolor='$color{'color2 2'}'"; - }else{ - print "<tr>";
$col="bgcolor='$color{'color2 0'}'"; - } + my @paks; + my @addon_services;
- print "<td align='left' $col width='31%'>$_</td> "; - my $status = isautorun($_,$col); - print "$status "; - print "<td align='center' $col width='8%'><a href='services.cgi?$_!start'><img alt='$Lang::tr{'start'}' title='$Lang::tr{'start'}' src='/images/go-up.png' border='0' /></a></td>"; - print "<td align='center' $col width='8%'><a href='services.cgi?$_!stop'><img alt='$Lang::tr{'stop'}' title='$Lang::tr{'stop'}' src='/images/go- down.png' border='0' /></a></td> "; - my $status = &isrunningaddon($_,$col); - $status =~ s/\[[0-1];[0-9]+m//g;
- chomp($status); - print "$status"; - print "</tr>"; + # Generate list of installed addon pak services + my %paklist = &Pakfire::dblist("installed");
+ foreach my $pak (keys %paklist) { + my %metadata = &Pakfire::getmetadata($pak, "installed"); + + if ("$metadata{'Services'}") { + foreach my $service (split(/ /, "$metadata{'Services'}")) { + push(@addon_services, $service); } } }
+ foreach (@addon_services) { + $lines++; + if ($lines % 2){ + print "<tr>"; + $col="bgcolor='$color{'color22'}'"; + }else{ + print "<tr>"; + $col="bgcolor='$color{'color20'}'"; + } + print "<td align='left' $col width='31%'>$_</td> "; + my $status = isautorun($_,$col); + print "$status "; + # Don't allow user to start/stop folowing services from webui: + # - alsa has trouble with the volume saving and was not really stopped + if ($_ eq "alsa") { + print "<td align='center' $col width='8%'></td>"; + print "<td align='center' $col width='8%'></td> ";
Is this still a problem? Why do we even catch this here?
Not sure.. Never tested it. I will try to set up a test env with a sound card .. not sure if I will succeed. never started a vm with sound here before .. So if someone else can test this more easily ?
+ } else { + print "<td align='center' $col width='8%'><a href='services.cgi?$_!start'><img alt='$Lang::tr{'start'}' title='$Lang::tr{'start'}' src='/images/go-up.png' border='0' /></a></td>"; + print "<td align='center' $col width='8%'><a href='services.cgi?$_!stop'><img alt='$Lang::tr{'stop'}' title='$Lang::tr{'stop'}' src='/images/go- down.png' border='0' /></a></td> "; + } + my $status = isrunningaddon($_,$col); + $status =~ s/\[[0-1];[0-9]+m//g;
+ chomp($status); + print "$status"; + print "</tr>"; + }
print "</table></div>\n"; &Header::closebox();
diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl index 028a0277e..6dda8d688 100644 --- a/src/pakfire/lib/functions.pl +++ b/src/pakfire/lib/functions.pl @@ -115,6 +115,7 @@ sub usage { &Pakfire::message(" <update> - Contacts the servers for new lists of paks."); &Pakfire::message(" <upgrade> - Installs the latest version of all paks."); &Pakfire::message(" <list> [installed/notinstalled/upgrade] - Outputs a list with all, installed, available or upgradeable paks."); + &Pakfire::message(" <info> <pak> [<pak> ...] - Output pak metadata."); &Pakfire::message(" <status> - Outputs a summary about available core upgrades, updates and a required reboot"); &Pakfire::message(""); &Pakfire::message(" Global options:"); @@ -674,6 +675,60 @@ sub parsemetafile { return %metadata; }
+sub getmetadata { + ### This subroutine returns a hash of available info for a package + # Pass package name and type of info as argument: Pakfire::getmetadata(package, type_of_info) + # Type_of_info can be "latest" or "installed" + # Usage is always with two argument. + my ($pak, $type) = @_;
+ my %metadata = ( + Name => $pak, + Installed => "no", + Available => "no"); + my %installed_metadata = ();
+ my @templine; + my @file;
+ ### Get available version information + if ("$type" eq "latest") { + ### Check if package is in packages_list and get latest available version + my %db = Pakfire::dblist("all"); + + if (defined $db{$pak}) { + ### Get and parse latest available metadata + if (getmetafile("$pak")) { + %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak");
+ $metadata{'Available'} = "yes"; + ### Rename version info fields + $metadata{'AvailableProgVersion'} = delete $metadata{'ProgVersion'}; + $metadata{'AvailableRelease'} = delete $metadata{'Release'};
Why is the delete necessary?
This is actually a rename of the key from 'ProgVersion' to 'AvailableProgVersion'; delete removes the key from the hash, and returns its value, which is added to the hash as the new key 'Available...'. If I would remove the delete, the same info would be in the hash, once in 'ProgVersion' and once in 'AvailableProgVersion'. And in case the pak is not installed, it would be returned as such from this function; while existence of 'ProgVersion'/'Release' sort of implicates that the pak is installed. (Checks should be based on 'Installed' = yes/no but it could lead to confusion to keep them)
+ } + } + } + + ### Parse installed pak metadata + if (&isinstalled($pak) == 0) { + %installed_metadata = parsemetafile("$Conf::dbdir/installed/meta-$pak");
+ if ("$type" eq "latest" && exists($metadata{'AvailableProgVersion'})) { + ### Add installed version info to latest metadata + $metadata{'ProgVersion'} = $installed_metadata{'ProgVersion'}; + $metadata{'Release'} = $installed_metadata{'Release'}; + } else { + ### Use metadata of installed pak + %metadata = %installed_metadata; + } + $metadata{'Installed'} = 'yes'; + } else { + $metadata{'Installed'} = 'no'; + }
+ return %metadata; +}
sub decryptpak { my $pak = shift;
diff --git a/src/pakfire/pakfire b/src/pakfire/pakfire index 0ed8aacd4..9935481a5 100644 --- a/src/pakfire/pakfire +++ b/src/pakfire/pakfire @@ -387,6 +387,64 @@ } else { &Pakfire::message("PAKFIRE WARN: No packages where found using filter $filter."); } + } elsif ("$ARGV[0]" eq "info") { + shift;
+ my @paks; + my $pak; + foreach $pak (@ARGV) { + unless ("$pak" =~ "^-") { + push(@paks,$pak); + } + }
+ unless ("@paks") { + Pakfire::message("PAKFIRE ERROR: missing package name"); + Pakfire::usage; + exit 1; + }
+ foreach $pak (@paks) { + my %metadata = Pakfire::getmetadata($pak, "latest");
+ ### Check if pakfile was actually found + if ($metadata{'Installed'} eq "no" && $metadata{'Available'} eq "no") { + Pakfire::message("PAKFIRE WARN: Pak '$pak' not found."); + last; + }
+ unless (defined $metadata{'Available'}) { + Pakfire::message("PAKFIRE WARN: Unable to retrieve latest metadata for $pak. Information may be outdated.") + }
+ ### Printout metadata in a user friendly format + print "Name: $metadata{'Name'}\n"; + print "Summary: $metadata{'Summary'}\n"; + if ($metadata{'Available'} eq "yes") { + print "Version: $metadata{'AvailableProgVersion'}-$metadata{'AvailableRelease'}\n"; + } else { + print "Version: $metadata{'ProgVersion'}-$metadata{'Release'}\n"; + } + print "Size: " . Pakfire::beautifysize("$metadata{'Size'}") . "\n"; + print "Dependencies: $metadata{'Dependencies'}\n"; + print "Pakfile: $metadata{'File'}\n"; + print "Service InitScripts: $metadata{'Services'}\n"; + print "Installed: $metadata{'Installed'}\n"; + ### Generate a pak status message + if (! defined $metadata{'Available'}) { + print "Status: unknown (an error occured retrieving latest pak metadata)"; + } elsif ($metadata{'Available'} eq "no") { + print "Status: obsolete (version $metadata{'ProgVersion'}-$metadata{'Release'} is installed)\n"; + } elsif ($metadata{'Installed'} eq "yes" && "$metadata{'Release'}" < "$metadata{'AvailableRelease'}") { + print "Status: outdated (version $metadata{'ProgVersion'}-$metadata{'Release'} is installed)\n"; + } elsif ($metadata{'Installed'} eq "yes") { + print "Status: up-to-date\n"; + } else { + print "Status: not installed\n"; + } + print "\n"; + }
} elsif ("$ARGV[0]" eq "resolvedeps") { foreach (@ARGV) { next if ("$_" eq "resolvedeps");
This looks very good.
-- 2.34.1
-- Dit bericht is gescanned op virussen en andere gevaarlijke inhoud door MailScanner en lijkt schoon te zijn.