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