File Coverage

blib/lib/Sys/OsPackage/Driver/Debian.pm
Criterion Covered Total %
statement 12 45 26.6
branch 0 22 0.0
condition n/a
subroutine 4 9 44.4
pod 0 5 0.0
total 16 81 19.7


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