File Coverage

blib/lib/Sys/OsPackage/Driver/RPM.pm
Criterion Covered Total %
statement 12 42 28.5
branch 0 28 0.0
condition 0 3 0.0
subroutine 4 9 44.4
pod 0 5 0.0
total 16 87 18.3


line stmt bran cond sub pod time code
1             # Sys::OsPackage::Driver::RPM
2             # ABSTRACT: RedHat/Fedora RPM packaging handler for Sys::OsPackage
3             # Copyright (c) 2022 by Ian Kluft
4             # Open Source license Perl's Artistic License 2.0:
5             # SPDX-License-Identifier: Artistic-2.0
6              
7             # This module is maintained for minimal dependencies so it can build systems/containers from scratch.
8              
9             ## no critic (Modules::RequireExplicitPackage)
10             # This resolves conflicting Perl::Critic rules which want package and strictures each before the other
11 2     2   953 use strict;
  2         5  
  2         60  
12 2     2   9 use warnings;
  2         4  
  2         49  
13 2     2   9 use utf8;
  2         4  
  2         9  
14             ## use critic (Modules::RequireExplicitPackage)
15              
16             package Sys::OsPackage::Driver::RPM;
17             $Sys::OsPackage::Driver::RPM::VERSION = '0.1.7';
18 2     2   111 use base "Sys::OsPackage::Driver";
  2         4  
  2         1545  
19              
20             # check if packager command found (rpm)
21             sub pkgcmd
22             {
23 0     0 0   my ($class, $ospkg) = @_;
24              
25 0 0 0       return ((defined $ospkg->sysenv("dnf") or (defined $ospkg->sysenv("yum") and defined $ospkg->sysenv("repoquery"))) ? 1 : 0);
26             }
27              
28             # find name of package for Perl module (rpm)
29             sub modpkg
30             {
31 0     0 0   my ($class, $ospkg, $args_ref) = @_;
32 0 0         return if not $class->pkgcmd($ospkg);
33              
34             #return join("-", "perl", @{$args_ref->{mod_parts}}); # rpm format for Perl module packages
35 0 0         my @querycmd = ((defined $ospkg->sysenv("dnf"))
36             ? ($ospkg->sysenv("dnf"), "repoquery")
37             : $ospkg->sysenv("repoquery"));
38             my @pkglist = sort $ospkg->capture_cmd({list=>1}, @querycmd, qw(--available --quiet --whatprovides),
39 0           "'perl(".$args_ref->{module}.")'");
40             $ospkg->debug()
41 0 0         and print STDERR "debug(".__PACKAGE__."->modpkg): ".$args_ref->{module}." -> ".join(" ", @pkglist)."\n";
42 0 0         return if not scalar @pkglist; # empty list means nothing found
43 0           return $pkglist[-1]; # last of sorted list should be most recent version
44             }
45              
46             # find named package in repository (rpm)
47             sub find
48             {
49 0     0 0   my ($class, $ospkg, $args_ref) = @_;
50 0 0         return if not $class->pkgcmd($ospkg);
51              
52 0 0         my @querycmd = ((defined $ospkg->sysenv("dnf"))
53             ? ($ospkg->sysenv("dnf"), "repoquery")
54             : $ospkg->sysenv("repoquery"));
55 0           my @pkglist = sort $ospkg->capture_cmd({list=>1}, @querycmd, qw(--quiet --latest-limit=1), $args_ref->{pkg});
56 0 0         return if not scalar @pkglist; # empty list means nothing found
57 0           return $pkglist[-1]; # last of sorted list should be most recent version
58             }
59              
60             # install package (rpm)
61             sub install
62             {
63 0     0 0   my ($class, $ospkg, $args_ref) = @_;
64 0 0         return if not $class->pkgcmd($ospkg);
65              
66             # determine packages to install
67 0           my @packages;
68 0 0         if (exists $args_ref->{pkg}) {
69 0 0         if (ref $args_ref->{pkg} eq "ARRAY") {
70 0           push @packages, @{$args_ref->{pkg}};
  0            
71             } else {
72 0           push @packages, $args_ref->{pkg};
73             }
74             }
75              
76             # install the packages
77 0 0         my $pkgcmd = (defined $ospkg->sysenv("dnf")) ? $ospkg->sysenv("dnf") : $ospkg->sysenv("yum");
78 0           return $ospkg->run_cmd($pkgcmd, qw(install --quiet --assumeyes --setopt=install_weak_deps=false), @packages);
79             }
80              
81             # check if an OS package is installed locally
82             sub is_installed
83             {
84 0     0 0   my ($class, $ospkg, $args_ref) = @_;
85 0 0         return if not $class->pkgcmd($ospkg);
86              
87             # check if package is installed
88 0           my $querycmd = $ospkg->sysenv("rpm");
89 0           my @pkglist = $ospkg->capture_cmd({list=>1}, $querycmd, qw(--query), $args_ref->{pkg});
90 0 0         return (scalar @pkglist > 0) ? 1 : 0;
91             }
92              
93             1;
94              
95             =pod
96              
97             =encoding UTF-8
98              
99             =head1 NAME
100              
101             Sys::OsPackage::Driver::RPM - RedHat/Fedora RPM packaging handler for Sys::OsPackage
102              
103             =head1 VERSION
104              
105             version 0.1.7
106              
107             =head1 SYNOPSIS
108              
109             my $ospkg = Sys::OsPackage->instance();
110              
111             # check if packaging commands exist for this system
112             if (not $ospkg->call_pkg_driver(op => "implemented")) {
113             return 0;
114             }
115              
116             # find OS package name for Perl module
117             my $pkgname = $ospkg->call_pkg_driver(op => "find", module => $module);
118              
119             # install a Perl module as an OS package
120             my $result1 = $ospkg->call_pkg_driver(op => "modpkg", module => $module);
121              
122             # install an OS package
123             my $result2 = $ospkg->call_pkg_driver(op => "install", pkg => $pkgname);
124              
125             =head1 DESCRIPTION
126              
127             ⛔ This is for Sys::OsPackage internal use only.
128              
129             The Sys::OsPackage method call_pkg_driver() will call the correct driver for the running platform.
130             The driver implements these methods: I, I, I, I, I and I.
131              
132             =head1 SEE ALSO
133              
134             Fedora Linux docs: Package management system L
135              
136             GitHub repository for Sys::OsPackage: L
137              
138             =head1 BUGS AND LIMITATIONS
139              
140             Please report bugs via GitHub at L
141              
142             Patches and enhancements may be submitted via a pull request at L
143              
144             =head1 LICENSE INFORMATION
145              
146             Copyright (c) 2022 by Ian Kluft
147              
148             This module is distributed in the hope that it will be useful, but it is provided “as is” and without any express or implied warranties. For details, see the full text of the license in the file LICENSE or at L.
149              
150             =head1 AUTHOR
151              
152             Ian Kluft
153              
154             =head1 COPYRIGHT AND LICENSE
155              
156             This software is Copyright (c) 2022 by Ian Kluft.
157              
158             This is free software, licensed under:
159              
160             The Artistic License 2.0 (GPL Compatible)
161              
162             =cut
163              
164             __END__