File Coverage

blib/lib/Solaris/SMF/Service.pm
Criterion Covered Total %
statement 15 105 14.2
branch 0 54 0.0
condition n/a
subroutine 5 21 23.8
pod 13 13 100.0
total 33 193 17.1


line stmt bran cond sub pod time code
1 3     3   16 use strict;
  3         3  
  3         194  
2 3     3   19 use warnings;
  3         7  
  3         204  
3              
4             package Solaris::SMF::Service;
5             $Solaris::SMF::Service::VERSION = '1.0.1';
6             # ABSTRACT: Encapsulate Solaris 10 services in Perl
7              
8 3     3   17 use Params::Validate qw( validate validate_pos :types );
  3         4  
  3         447  
9 3     3   1339 use Log::Any qw($log);
  3         4382  
  3         12  
10 3     3   188 use Carp;
  3         5  
  3         3610  
11              
12              
13             sub _svcs {
14 0     0     my $self = shift;
15 0           local $ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';
16 0 0         open my $svc_list, '-|', " svcs -aH '$self->{FMRI}' 2>/dev/null"
17             or croak 'Unable to query SMF services';
18 0           while ( my $svc_line = <$svc_list> ) {
19 0           my ( $state, $date, $FMRI ) = (
20             $svc_line =~ m/
21             ^
22             ([^\s]+) # Current state
23             [\s]+
24             ([^\s]+) # Date this state was set
25             [\s]+
26             ( (?: svc: | lrc: ) [^\s]+ ) # FMRI
27             \n?
28             $
29             /xms
30             );
31 0 0         if ($FMRI) {
32 0           close $svc_list;
33 0           return ( $state, $date );
34             }
35             }
36 0           croak "Unable to determine status of $self->{FMRI}";
37             }
38              
39             sub _svcprop {
40 0 0   0     $log->is_trace && $log->trace( '_svcprop ' . join( ',', @_ ) );
41 0           my $self = shift;
42 0           local $ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';
43 0 0         open my $svcprop_list, '-|', " svcprop '$self->{FMRI}' 2>/dev/null"
44             or croak 'Unable to query SMF service properties';
45 0           my %properties;
46 0           while ( my $svcprop_line = <$svcprop_list> ) {
47 0           my ( $name, $type, $value ) = (
48             $svcprop_line =~ m/
49             ^
50             ([^\s]+) # Property name
51             [\s]+
52             ([^\s]+) # Type of property
53             [\s]+
54             ([^\s]*[^\n]*) # Value of property
55             $
56             /xms
57             );
58 0 0         if ($name) {
59 0           $properties{$name}{type} = $type;
60 0           $properties{$name}{value} = $value;
61             }
62 0 0         $log->is_trace && $log->tracef( '$name: %s $type: %s $value: %s',
63             $name, $type, $value );
64             }
65 0 0         $log->is_trace && $log->tracef( '$properties: %s', \%properties );
66 0           return \%properties;
67             }
68              
69             sub _svcadm {
70 0 0   0     $log->is_trace && $log->trace( '_svcadm ' . join( ',', @_ ) );
71 0           my $self = shift;
72 0           my $svcadm_action = shift;
73 0           local $ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';
74 0 0         open my $svc_adm, '-|', " svcadm $svcadm_action '$self->{FMRI}' 2>&1"
75             or croak 'Unable to administer SMF services';
76 0           close $svc_adm;
77             }
78              
79              
80             sub new {
81 0     0 1   my $class = shift;
82 0           my $FMRI = shift;
83 0 0         $log->is_trace && $log->trace("$class -> new( '$FMRI' )");
84 0           my $service = bless {}, __PACKAGE__;
85 0           $service->{FMRI} = $FMRI;
86 0           return $service;
87             }
88              
89              
90             sub status {
91 0 0   0 1   $log->is_trace && $log->trace( 'status ' . join( ',', @_ ) );
92 0           my $self = shift;
93 0           my ( $status, $date ) = $self->_svcs();
94 0 0         $log->is_trace && $log->tracef( '$status: %s $date: %s', $status, $date );
95 0           return $status;
96             }
97              
98              
99             sub FMRI {
100 0 0   0 1   $log->is_trace && $log->trace( 'FMRI ' . join( ',', @_ ) );
101 0           my $self = shift;
102 0           return $self->{FMRI};
103             }
104              
105              
106             sub properties {
107 0 0   0 1   $log->is_trace && $log->trace( 'properties ' . join( ',', @_ ) );
108 0           my $self = shift;
109 0           my $properties = $self->_svcprop();
110 0           return %{$properties};
  0            
111             }
112              
113              
114             sub property {
115 0 0   0 1   $log->is_trace && $log->trace( 'property ' . join( ',', @_ ) );
116 0           my $self = shift;
117 0           my $p = validate_pos( @_, { type => SCALAR } );
118 0           my ($property_name) = @{$p};
  0            
119              
120 0           my $properties = $self->_svcprop();
121 0 0         $log->is_trace && $log->tracef( '$properties: %s', $properties );
122 0 0         if ( defined $properties->{$property_name} ) {
123 0           return $properties->{$property_name}{value};
124             }
125             else {
126 0           carp "Unable to find property '$property_name' for " . $self->{FMRI};
127 0           undef;
128             }
129             }
130              
131              
132             sub property_type {
133 0 0   0 1   $log->is_trace && $log->trace( 'property_type ' . join( ',', @_ ) );
134 0           my $self = shift;
135 0           my $p = validate_pos( @_, { type => SCALAR } );
136 0           my ($property_name) = @{$p};
  0            
137              
138 0           my $properties = $self->_svcprop();
139 0 0         $log->is_trace && $log->tracef( '$properties: %s', $properties );
140 0 0         if ( defined $properties->{$property_name} ) {
141 0           return $properties->{$property_name}{type};
142             }
143             else {
144 0           carp "Unable to find property '$property_name' for " . $self->{FMRI};
145 0           undef;
146             }
147             }
148              
149              
150             sub disable {
151 0 0   0 1   $log->is_trace && $log->trace( 'disable ' . join( ',', @_ ) );
152 0           my $self = shift;
153 0           return $self->_svcadm('disable');
154             }
155              
156              
157             sub stop {
158 0 0   0 1   $log->is_trace && $log->trace( 'stop ' . join( ',', @_ ) );
159 0           my $self = shift;
160 0           return $self->_svcadm('disable -t');
161             }
162              
163              
164             sub enable {
165 0 0   0 1   $log->is_trace && $log->trace( 'enable ' . join( ',', @_ ) );
166 0           my $self = shift;
167 0           return $self->_svcadm('enable');
168             }
169              
170              
171             sub start {
172 0 0   0 1   $log->is_trace && $log->trace( 'start ' . join( ',', @_ ) );
173 0           my $self = shift;
174 0           return $self->_svcadm('enable -t');
175             }
176              
177              
178             sub refresh {
179 0 0   0 1   $log->is_trace && $log->trace( 'refresh ' . join( ',', @_ ) );
180 0           my $self = shift;
181 0           return $self->_svcadm('refresh');
182             }
183              
184              
185             sub clear {
186 0 0   0 1   $log->is_trace && $log->trace( 'clear ' . join( ',', @_ ) );
187 0           my $self = shift;
188 0           return $self->_svcadm('clear');
189             }
190              
191              
192             sub mark {
193 0 0   0 1   $log->is_trace && $log->trace( 'mark ' . join( ',', @_ ) );
194 0           my $self = shift;
195 0           return $self->_svcadm('mark');
196             }
197              
198             1; # End of Solaris::SMF::Service
199              
200             __END__