File Coverage

lib/Rex/PkgConf/Debian.pm
Criterion Covered Total %
statement 14 55 25.4
branch 0 18 0.0
condition 0 21 0.0
subroutine 5 8 62.5
pod 0 3 0.0
total 19 105 18.1


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::PkgConf::Debian;
6              
7 1     1   15 use v5.12.5;
  1         5  
8 1     1   6 use warnings;
  1         2  
  1         53  
9              
10             our $VERSION = '1.14.2.2'; # TRIAL VERSION
11              
12 1     1   7 use Rex::Helper::Run;
  1         1  
  1         65  
13              
14 1     1   7 use Rex::PkgConf::Base;
  1         3  
  1         14  
15 1     1   46 use base qw(Rex::PkgConf::Base);
  1         8  
  1         704  
16              
17             sub new {
18 0     0 0   my $that = shift;
19 0   0       my $proto = ref($that) || $that;
20 0           my $self = $proto->SUPER::new(@_);
21              
22 0           bless( $self, $proto );
23              
24 0           return $self;
25             }
26              
27             sub get_options {
28 0     0 0   my ( $self, $pkg, $option ) = @_;
29 0 0         die "Package name required to configure" unless $pkg;
30 0           my $conf_cmd = "debconf-show $pkg";
31              
32 0           Rex::Logger::debug("Running command $conf_cmd");
33 0           my @lines = i_run $conf_cmd;
34              
35 0           my %config;
36 0           for my $line (@lines) {
37              
38             # Example line:
39             # * keyboard-configuration/optionscode: grp:caps_toggle,grp_led:scroll
40 0           Rex::Logger::debug("Parsing line $line");
41 0 0         if ( $line =~ m!^(\*?)\s+([^:]+):\s*(.*)! ) {
42 0           my ( $already_set, $question, $value ) = ( $1, $2, $3, $4 );
43 0           Rex::Logger::debug(
44             "Found configuration question $question with value $value");
45 0 0 0       next if $option && $option ne $question;
46 0 0         $already_set = $already_set ? 1 : 0;
47 0           $config{$question} = {
48             question => $question,
49             value => $value,
50             already_set => $already_set,
51             };
52             }
53             }
54              
55 0           %config;
56             }
57              
58             sub set_options {
59 0     0 0   my ( $self, $pkg, $values, %options ) = @_;
60 0 0 0       die "set_option usage: set_option package, values, options"
61             unless $pkg && $values;
62              
63             # Get existing options first, to see if they need setting
64 0           my %existing = $self->get_options($pkg);
65              
66 0           my @updated;
67 0           for my $line (@$values) {
68              
69             my ( $question, $value, $type ) =
70 0           ( $line->{question}, $line->{value}, $line->{type} );
71              
72 0 0 0       die "Question and type required for each package configuration option"
73             unless $question && $type;
74              
75 0 0 0       if ( $existing{$question} && $existing{$question}->{value} eq $value ) {
76 0           Rex::Logger::debug("Option $question already set to $value, ignoring");
77 0           next;
78             }
79              
80 0 0 0       if ( $options{no_update}
      0        
81             && $existing{$question}
82             && $existing{$question}->{already_set} )
83             {
84 0           Rex::Logger::debug("Option $question already set, not updating");
85 0           next;
86             }
87              
88 0           Rex::Logger::debug("Will set option $question: $value (type $type)");
89 0           push @updated, "$pkg $question $type $value";
90             }
91              
92 0 0         if (@updated) {
93 0           my $settings = join '\n', @updated;
94 0           my $conf_cmd = qq(echo -e "$settings"|debconf-set-selections);
95 0           i_run $conf_cmd;
96             return {
97 0           changed => 1,
98             names => \@updated,
99             };
100             }
101             else {
102 0           return { changed => 0, };
103             }
104             }
105              
106             1;