Ubic
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Ubic.pm view on Meta::CPAN
use IO::Handle;
use Storable qw(freeze thaw);
use Try::Tiny;
use Scalar::Util qw(blessed);
use Params::Validate qw(:all);
use Ubic::Result qw(result);
use Ubic::Multiservice::Dir;
use Ubic::AccessGuard;
use Ubic::Credentials;
use Ubic::Persistent;
use Ubic::AtomicFile;
use Ubic::SingletonLock;
use Ubic::Settings;
our $SINGLETON;
my $service_name_re = qr{^[\w-]+(?:\.[\w-]+)*$};
my $validate_service = { type => SCALAR, regex => $service_name_re };
# singleton constructor
sub _obj {
my ($param) = validate_pos(@_, 1);
if (blessed($param)) {
return $param;
}
if ($param eq 'Ubic') {
# method called as a class method => singleton
$SINGLETON ||= Ubic->new({});
return $SINGLETON;
}
die "Unknown argument '$param'";
}
sub new {
my $class = shift;
my $options = validate(@_, {
service_dir => { type => SCALAR, optional => 1 },
data_dir => { type => SCALAR, optional => 1 },
});
if (caller ne 'Ubic') {
warn "Using Ubic->new constructor is discouraged. Just call methods as class methods.";
}
for my $key (qw/ service_dir data_dir /) {
Ubic::Settings->$key($options->{ $key }) if defined $options->{$key};
}
Ubic::Settings->check_settings;
my $self = {};
$self->{data_dir} = Ubic::Settings->data_dir;
$self->{service_dir} = Ubic::Settings->service_dir;
$self->{status_dir} = "$self->{data_dir}/status";
$self->{lock_dir} = "$self->{data_dir}/lock";
$self->{tmp_dir} = "$self->{data_dir}/tmp";
$self->{service_cache} = {};
return bless $self => $class;
}
sub start($$) {
my $self = _obj(shift);
my ($name) = validate_pos(@_, $validate_service);
my $lock = $self->lock($name);
$self->enable($name);
my $result = $self->do_cmd($name, 'start');
$self->set_cached_status($name, $result);
return $result;
}
sub stop($$) {
my $self = _obj(shift);
my ($name) = validate_pos(@_, $validate_service);
my $lock = $self->lock($name);
$self->disable($name);
# FIXME - 'stop' command can fail, in this case daemon will keep running.
# This is bad.
# We probably need to implement the same logic as when starting:
# retry stop attempts until actual status matches desired status.
my $result = $self->do_cmd($name, 'stop');
return $result;
}
sub restart($$) {
my $self = _obj(shift);
my ($name) = validate_pos(@_, $validate_service);
my $lock = $self->lock($name);
$self->enable($name);
my $result = $self->do_cmd($name, 'stop');
$result = $self->do_cmd($name, 'start');
$self->set_cached_status($name, $result);
return result('restarted'); # FIXME - should return original status
}
sub try_restart($$) {
my $self = _obj(shift);
my ($name) = validate_pos(@_, $validate_service);
my $lock = $self->lock($name);
unless ($self->is_enabled($name)) {
return result('down');
}
$self->do_cmd($name, 'stop');
$self->do_cmd($name, 'start');
return result('restarted');
}
sub reload($$) {
my $self = _obj(shift);
my ($name) = validate_pos(@_, $validate_service);
my $lock = $self->lock($name);
unless ($self->is_enabled($name)) {
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.521 second using v1.00-cache-2.02-grep-82fe00e-cpan-48ebf85a1963 )