File Coverage

lib/Rex/Service.pm
Criterion Covered Total %
statement 23 57 40.3
branch 0 32 0.0
condition 0 29 0.0
subroutine 8 10 80.0
pod 0 2 0.0
total 31 130 23.8


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::Service;
6              
7 32     32   566 use v5.12.5;
  32         144  
8 32     32   243 use warnings;
  32         102  
  32         1537  
9              
10             our $VERSION = '1.14.2.3'; # TRIAL VERSION
11              
12 32     32   216 use Rex::Config;
  32         99  
  32         252  
13 32     32   280 use Rex::Commands::Gather;
  32         129  
  32         380  
14 32     32   316 use Rex::Hardware;
  32         127  
  32         297  
15 32     32   1074 use Rex::Hardware::Host;
  32         127  
  32         310  
16 32     32   1021 use Rex::Helper::Run;
  32         145  
  32         2313  
17 32     32   290 use Rex::Logger;
  32         100  
  32         374  
18              
19             my %SERVICE_PROVIDER;
20              
21             sub register_service_provider {
22 0     0 0   my ( $class, $service_name, $service_class ) = @_;
23 0           $SERVICE_PROVIDER{"\L$service_name"} = $service_class;
24 0           return 1;
25             }
26              
27             sub get {
28              
29 0     0 0   my $operatingsystem = Rex::Hardware::Host->get_operating_system();
30              
31 0           i_run "systemctl --no-pager > /dev/null", fail_ok => 1;
32 0 0         my $can_run_systemctl = $? == 0 ? 1 : 0;
33              
34 0           i_run "initctl version | grep upstart", fail_ok => 1;
35 0 0         my $running_upstart = $? == 0 ? 1 : 0;
36              
37 0           my $class;
38              
39 0           $class = "Rex::Service::" . $operatingsystem;
40 0 0 0       if ( is_redhat($operatingsystem) && $can_run_systemctl ) {
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0          
    0          
    0          
41 0           $class = "Rex::Service::Redhat::systemd";
42             }
43             elsif ( is_redhat($operatingsystem) ) {
44              
45             # this also counts for fedora, centos, ...
46 0           $class = "Rex::Service::Redhat";
47             }
48             elsif ( is_suse($operatingsystem) && $can_run_systemctl ) {
49 0           $class = "Rex::Service::SuSE::systemd";
50             }
51             elsif ( is_alt($operatingsystem) && $can_run_systemctl ) {
52 0           $class = "Rex::Service::ALT::systemd";
53             }
54             elsif ( is_gentoo($operatingsystem) && $can_run_systemctl ) {
55 0           $class = "Rex::Service::Gentoo::systemd";
56             }
57             elsif ( is_gentoo($operatingsystem) ) {
58 0           $class = "Rex::Service::Gentoo";
59             }
60             elsif ( is_mageia($operatingsystem) && $can_run_systemctl ) {
61 0           $class = "Rex::Service::Mageia::systemd";
62             }
63             elsif ( is_debian($operatingsystem) && $can_run_systemctl ) {
64              
65             # this also counts for Ubuntu and LinuxMint
66 0           $class = "Rex::Service::Debian::systemd";
67             }
68             elsif ( is_debian($operatingsystem) && $running_upstart ) {
69              
70             # this is mainly Ubuntu with upstart
71 0           $class = "Rex::Service::Ubuntu";
72             }
73             elsif ( is_debian($operatingsystem) ) {
74 0           $class = "Rex::Service::Debian";
75             }
76             elsif ( is_arch($operatingsystem) && $can_run_systemctl ) {
77 0           $class = "Rex::Service::Arch::systemd";
78             }
79              
80 0   0       my $provider_for = Rex::Config->get("service_provider") || {};
81 0           my $provider;
82              
83 0 0 0       if ( ref($provider_for) && exists $provider_for->{$operatingsystem} ) {
    0          
84 0           $provider = $provider_for->{$operatingsystem};
85 0           $class .= "::\L$provider";
86             }
87             elsif ( exists $SERVICE_PROVIDER{$provider_for} ) {
88 0           $class = $SERVICE_PROVIDER{$provider_for};
89             }
90              
91 0           Rex::Logger::debug("service using class: $class");
92 0           eval "use $class";
93              
94 0 0         if ($@) {
95              
96 0           Rex::Logger::info("OS ($operatingsystem) not supported");
97 0           exit 1;
98              
99             }
100              
101 0           return $class->new;
102              
103             }
104              
105             1;