SysV-Init-Service

 view release on metacpan or  search on metacpan

Service.pm  view on Meta::CPAN

package SysV::Init::Service;

use strict;
use warnings;

use Capture::Tiny qw(capture);
use Class::Utils qw(set_params);
use English qw(-no_match_vars);
use Error::Pure qw(err);
use File::Spec::Functions qw(catfile);

our $VERSION = 0.07;

# Construct.
sub new {
	my ($class, @params) = @_;

	# Create object.
	my $self = bless {}, $class;

	# Service.
	$self->{'service'} = undef;

	# Service directory.
	$self->{'service_dir'} = '/etc/init.d';

	# Process parameters.
	set_params($self, @params);

	# Check for service.
	if (! defined $self->{'service'}) {
		err "Parameter 'service' is required.";
	}
	if ($self->{'service'} =~ m/\.sh$/ms) {
		err "Service with .sh suffix doesn't possible.";
	}
	$self->{'_service_path'} = catfile($self->{'service_dir'},
		$self->{'service'});
	if (! -x $self->{'_service_path'}) {
		err "Service '$self->{'service'}' doesn't present.";
	}

	# Object.
	return $self;
}

# Get service commands.
sub commands {
	my $self = shift;
	my ($stdout, $stderr, $exit_code) = capture {
		system $self->{'_service_path'};
	};
	if ($stderr) {
		$stdout .= $stderr;
	}
	my @commands;
	if ($stdout =~ m/{([\w\|\-]+)}/ms) {
		@commands = split m/\|/ms, $1;
	} elsif ($stdout =~ m/([\w\-]+)\s*$/ms) {
		@commands = $1;
	}
	return sort @commands;
}

# Get service name.
sub name {
	my $self = shift;
	return $self->{'service'};
}

# Start service.
sub start {
	my $self = shift;
	return $self->_service_command('start');
}

# Get status.
sub status {
	my $self = shift;
	return $self->_service_command('status');
}

# Stop service.
sub stop {
	my $self = shift;
	return $self->_service_command('stop');
}

# Common command.
sub _service_command {
	my ($self, $command) = @_;
	my ($stdout, $stderr, $exit_code) = capture {
		system $self->{'_service_path'}.' '.$command;
	};
	my $ret_code = $exit_code >> 8;
	if ($stderr) {
		chomp $stderr;
		err "Problem with service '$self->{'service'}' $command.",
			'STDERR', $stderr,
			'Exit code', $ret_code;
	}
	return $ret_code;
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

SysV::Init::Service - Class for SysV init service manipulation.

=head1 SYNOPSIS



( run in 0.519 second using v1.01-cache-2.11-cpan-71847e10f99 )