From patchwork Thu Jun 24 23:30:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Robin Roevens X-Patchwork-Id: 4466 Return-Path: Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by web04.haj.ipfire.org (Postfix) with ESMTPS id 4G9xG82B7fz3wYx for ; Thu, 24 Jun 2021 23:30:56 +0000 (UTC) Received: from mail02.haj.ipfire.org (mail02.haj.ipfire.org [172.28.1.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail02.haj.ipfire.org", Issuer "R3" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 4G9xG7676Dz1MG; Thu, 24 Jun 2021 23:30:55 +0000 (UTC) Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4G9xG75cBxz2xjs; Thu, 24 Jun 2021 23:30:55 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4G9xG65Xbgz2xb4 for ; Thu, 24 Jun 2021 23:30:54 +0000 (UTC) Received: from knopi.disroot.org (knopi.disroot.org [178.21.23.139]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail01.ipfire.org (Postfix) with ESMTPS id 4G9xG63MSQzDt for ; Thu, 24 Jun 2021 23:30:54 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by disroot.org (Postfix) with ESMTP id A904F5C889 for ; Fri, 25 Jun 2021 01:30:52 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at disroot.org Received: from knopi.disroot.org ([127.0.0.1]) by localhost (disroot.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1fFleIlxjOag for ; Fri, 25 Jun 2021 01:30:51 +0200 (CEST) Received: from amaterasu.sicho.home ([192.168.0.1] helo=chojin.sicho.home) by filekeeper.sicho.home with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1lwYnQ-0001Ht-LV; Fri, 25 Jun 2021 01:30:08 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=disroot.org; s=mail; t=1624577450; bh=CfZFxXgwBVj4CFr5V5UeEmb3oPdpIfDNgrPtWBaWBkU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=lVYSy4mJlxZMKWDyElBoMijci4CrLAWhXnQXQEXEbCNJSTUgY4XQRItaNfmsMywFQ Fme/Mvu4w4UX6tF2OQFpanBXGbItdECD3XHLNEWLjcaTO3KsJl57lqkA20P1O1ajmu TfaAtzcFKml3HEqCGJWRBfV25TZb3HTWooNdFY24h0sDo6Jfl4C/SI/8Jlti4CxG9L MRg48uwzXPovH9kY78qEALiyIlYILeQcNGY957Rpkfe6BIVb0m0BN2/+3YcgWb7KOM R5mbltU/c0mZh+pPKwe0jZvXZY+x9d7uWfq3fZEPINkSbPhrJdaShbxeOEvScDtNNJ T752LAWtT5bGQ== From: Robin Roevens To: development@lists.ipfire.org Subject: [PATCH] pakfire: implement function to parse meta files Date: Fri, 25 Jun 2021 01:30:05 +0200 Message-Id: <20210624233005.32149-2-robin.roevens@disroot.org> In-Reply-To: <20210624233005.32149-1-robin.roevens@disroot.org> References: <20210624233005.32149-1-robin.roevens@disroot.org> Mime-Version: 1.0 X-filekeeper-MailScanner-ID: 1lwYnQ-0001Ht-LV X-filekeeper-MailScanner: Found to be clean X-filekeeper-MailScanner-From: robin.roevens@disroot.org X-filekeeper-MailScanner-Watermark: 1625182221.93812@q/7Gl5NqI5Qfjm/GxY969Q ARC-Authentication-Results: i=1; mail01.ipfire.org; dkim=pass header.d=disroot.org header.s=mail header.b=lVYSy4mJ; dmarc=pass (policy=quarantine) header.from=disroot.org; spf=pass (mail01.ipfire.org: domain of robin.roevens@disroot.org designates 178.21.23.139 as permitted sender) smtp.mailfrom=robin.roevens@disroot.org ARC-Seal: i=1; s=202003rsa; d=lists.ipfire.org; t=1624577454; a=rsa-sha256; cv=none; b=WphF33gv2bnRqqy2kpj94mITwjGZ0CJ2WnN8Dj8nWjjXdhCpitRKQMzYEWK1g8Z+in6NzX dqkgjBxGrnuAZoyLax4vwX5yKAcWRqSrO7kcUZUlooLvzHD8JE7d0NiRiG/0+y/lBYoX8Q H/qdRhM9v0gZxcgWOMNiOsGb8EvtANPdw9qMoFQqFDWHj9geT4ZUULe0UZAFsHpSFIQTBG 2QFLGIWBrJYYy94T496w+hDBSC8M5YFoSrqpDXgXBmvTARgvZWaRZNaQhjBNt7ivtph6PR tKi9x/QJG/qCAuI7nK3PNhzHWDc/VpVRYkguxHdT4OOmOKa3Ikr1zBb8qAT4jw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=lists.ipfire.org; s=202003rsa; t=1624577454; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=MCWKSbGGwGVzGoLAMiRNkD1YTSIOhX6/w7kiV3gjh+Y=; b=aNJcQBPsGU6iyG8Br8prl+cVKLQklP/GajlPiAORwPiHk88AkNebNBsHjrU087Z8hLLM7s GsXyHMUKkuscuFmP+IaqGenhhJ3yiXJI3bdNUQC3572hHKyykp2BNj5L6ctaNwCTMzNaCZ YLzjm39cxVDe+thtTc5i4YdqYV/CPQw8etqIYeWZH4jUWXWKA54rrhJcLekNJiFwV6DqrN DTWSUg6yavMtgKDaDqVAc3SOLfQkZpig469qpi1pf5/O6MvznbF/nZzJdegzZ00QocpQ1c iCeOPgdmFoFxlbWBKpkjjUsk3pAiEMqYbyCDYBpX1Q7/u+8UvdtqFh46npyySA== X-Rspamd-Queue-Id: 4G9xG63MSQzDt Authentication-Results: mail01.ipfire.org; dkim=pass header.d=disroot.org header.s=mail header.b=lVYSy4mJ; dmarc=pass (policy=quarantine) header.from=disroot.org; spf=pass (mail01.ipfire.org: domain of robin.roevens@disroot.org designates 178.21.23.139 as permitted sender) smtp.mailfrom=robin.roevens@disroot.org X-Rspamd-Server: mail01.haj.ipfire.org X-Spamd-Result: default: False [-2.52 / 11.00]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[disroot.org:s=mail]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+a:c]; MV_CASE(0.50)[]; MIME_GOOD(-0.10)[text/plain]; PREVIOUSLY_DELIVERED(0.00)[development@lists.ipfire.org]; REPLY(-4.00)[]; BROKEN_CONTENT_TYPE(1.50)[]; R_MISSING_CHARSET(2.50)[]; RCVD_COUNT_THREE(0.00)[4]; TO_MATCH_ENVRCPT_SOME(0.00)[]; IP_REPUTATION_HAM(-0.01)[asn: 50673(0.00), country: NL(-0.01), ip: 178.21.23.139(0.00)]; DKIM_TRACE(0.00)[disroot.org:+]; RCPT_COUNT_TWO(0.00)[2]; MID_CONTAINS_FROM(1.00)[]; MX_GOOD(-0.01)[]; DMARC_POLICY_ALLOW(-0.50)[disroot.org,quarantine]; ARC_SIGNED(0.00)[lists.ipfire.org:s=202003rsa:i=1]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:50673, ipnet:178.21.23.0/24, country:NL]; BAYES_HAM(-3.00)[99.99%] X-BeenThere: development@lists.ipfire.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: IPFire development talk List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: development-bounces@lists.ipfire.org Sender: "Development" Removing a lot of duplicate code parsing meta files, now replaced by simple function calls, resulting in all metadata in one hash. Signed-off-by: Robin Roevens Reviewed-by: Peter Müller --- src/pakfire/lib/functions.pl | 129 +++++++++++++---------------------- 1 file changed, 49 insertions(+), 80 deletions(-) diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl index f9a19b60d..79ef7a12d 100644 --- a/src/pakfire/lib/functions.pl +++ b/src/pakfire/lib/functions.pl @@ -2,7 +2,7 @@ ############################################################################### # # # IPFire.org - A linux based firewall # -# Copyright (C) 2007-2015 IPFire Team # +# Copyright (C) 2007-2021 IPFire Team # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # @@ -376,11 +376,10 @@ sub dbgetlist { } # 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 %metadata; my @templine; open(FILE, "<$Conf::dbdir/lists/packages_list.db"); @@ -395,28 +394,14 @@ sub dbgetlist { next if ( $file eq ".." ); next if ( $file eq "meta-" ); next if ( $file =~ /^old/ ); - open(FILE, "<$Conf::dbdir/meta/$file"); - @meta = ; - 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); - } - } + %metadata = parsemetafile("$Conf::dbdir/meta/$file"); + 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"); + 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'}"); + fetchfile("meta/meta-$metadata{'Name'}", ""); + move("$Conf::cachedir/meta-$metadata{'Name'}", "$Conf::dbdir/meta/meta-$metadata{'Name'}"); } } } @@ -429,12 +414,11 @@ sub dblist { # filter may be: all, notinstalled, installed my $filter = shift; my $forweb = shift; - my @meta; my @updatepaks; my $file; my $line; my $prog; - my ($name, $version, $release); + my %metadata; my @templine; ### Make sure that the list is not outdated. @@ -470,30 +454,16 @@ sub dblist { next if ( $file eq "." ); next if ( $file eq ".." ); next if ( $file =~ /^old/ ); - open(FILE, "<$Conf::dbdir/installed/$file"); - @meta = ; - 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); - } - } + %metadata = parsemetafile("$Conf::dbdir/installed/$file"); + foreach $prog (@db) { @templine = split(/\;/,$prog); - if (("$name" eq "$templine[0]") && ("$release" < "$templine[2]" && "$forweb" ne "notice")) { - push(@updatepaks,$name); + if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" < "$templine[2]" && "$forweb" ne "notice")) { + push(@updatepaks,$metadata{'Name'}); if ("$forweb" eq "forweb") { - print "\n"; + print "\n"; } else { - my $command = "Update: $name\nVersion: $version -> $templine[1]\nRelease: $release -> $templine[2]\n"; + 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 { @@ -548,18 +518,9 @@ sub resolvedeps_one { message("PAKFIRE RESV: $pak: Resolving dependencies..."); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = ; - close(FILE); - - my $line; - my (@templine, @deps, @all); - foreach $line (@file) { - @templine = split(/\: /,$line); - if ("$templine[0]" eq "Dependencies") { - @deps = split(/ /, $templine[1]); - } - } + my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak"); + my @all; + my @deps = split(/ /, $metadata{'Dependencies'}); chomp (@deps); foreach (@deps) { if ($_) { @@ -679,20 +640,40 @@ sub getsize { getmetafile("$pak"); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = ; + if (my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak")) { + return $metadata{'Size'}; + } + return 0; +} + +sub parsemetafile { + ### This subroutine returns a hash with the contents of a meta- file + # Pass path to metafile as argument: Pakfire::parsemetafile("$Conf::dbdir/meta/meta-$pak") + # Usage is always with an argument. + my $metafile = shift; + + my %metadata = (); + + my @templine; + my @file; + + if (! -e $metafile ) { + return 0; + } + + open(FILE, "<$metafile"); + @file = ; close(FILE); - my $line; - my @templine; - foreach $line (@file) { - @templine = split(/\: /,$line); - if ("$templine[0]" eq "Size") { + foreach (@file) { + @templine = split(/\: /,$_); + if ($templine[1]) { chomp($templine[1]); - return $templine[1]; + $metadata{"$templine[0]"} = $templine[1]; } } - return 0; + + return %metadata; } sub decryptpak { @@ -715,20 +696,8 @@ sub getpak { getmetafile("$pak"); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = ; - close(FILE); - - my $line; - my $file; - my @templine; - foreach $line (@file) { - @templine = split(/\: /,$line); - if ("$templine[0]" eq "File") { - chomp($templine[1]); - $file = $templine[1]; - } - } + my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak"); + my $file = $metadata{'File'}; unless ($file) { message("No filename given in meta-file.");