X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FDaemonize.pm;h=0cf7257c30ba36af31ba05610578465283a3666d;hb=18cc5c89142d5f39decc3098fd26077654d05c6d;hp=cb3d2498afa2af761bb20f18b9320a6c1419b47f;hpb=b916501e3239371f7c4b70e9657ccb97c8ff7c03;p=gitmo%2FMooseX-Daemonize.git diff --git a/lib/MooseX/Daemonize.pm b/lib/MooseX/Daemonize.pm index cb3d249..0cf7257 100644 --- a/lib/MooseX/Daemonize.pm +++ b/lib/MooseX/Daemonize.pm @@ -1,15 +1,20 @@ package MooseX::Daemonize; use strict; # because Kwalitee is pedantic use Moose::Role; +use MooseX::Types::Path::Class; +use Moose::Util::TypeConstraints; -our $VERSION = 0.04; -use Carp; -use Proc::Daemon; +our $VERSION = 0.05; -use File::Pid; -use Moose::Util::TypeConstraints; +use Carp 'carp'; +use Proc::Daemon; +use MooseX::Daemonize::PidFile; -with qw(MooseX::Getopt); +with qw[ + MooseX::Daemonize::Core + MooseX::Daemonize::SignalHandling + MooseX::Getopt +]; has progname => ( isa => 'Str', @@ -23,27 +28,29 @@ has progname => ( ); has basedir => ( - isa => 'Str', + isa => 'Path::Class::Dir', is => 'ro', + coerce => 1, required => 1, lazy => 1, - default => sub { return '/' }, + default => sub { Path::Class::Dir->new('/') }, ); has pidbase => ( - isa => 'Str', + isa => 'Path::Class::Dir', is => 'ro', + coerce => 1, + required => 1, lazy => 1, - required => 1, - default => sub { return '/var/run' }, + default => sub { Path::Class::Dir->new('var', 'run') }, ); -subtype 'Pidfile' => as 'Object' => where { $_->isa('File::Pid') }; - -coerce 'Pidfile' => from 'Str' => via { File::Pid->new( { file => $_, } ); }; +coerce 'MooseX::Daemonize::PidFile' + => from 'Str' + => via { MooseX::Daemonize::PidFile->new( file => $_ ) }; has pidfile => ( - isa => 'Pidfile', + isa => 'MooseX::Daemonize::PidFile', is => 'rw', lazy => 1, required => 1, @@ -51,48 +58,37 @@ has pidfile => ( predicate => 'has_pidfile', default => sub { my $file = $_[0]->pidbase . '/' . $_[0]->progname . '.pid'; - die "Cannot write to $file" unless (-e $file ? -w $file : -w $_[0]->pidbase); - File::Pid->new( { file => $file } ); + confess "Cannot write to $file" unless (-e $file ? -w $file : -w $_[0]->pidbase); + MooseX::Daemonize::PidFile->new( file => $file ); }, handles => { check => 'running', save_pid => 'write', remove_pid => 'remove', get_pid => 'pid', - _pidfile => 'file', }, ); has foreground => ( - metaclass => 'MooseX::Getopt::Meta::Attribute', + metaclass => 'Getopt', cmd_aliases => 'f', isa => 'Bool', is => 'ro', default => sub { 0 }, ); -has is_daemon => ( - isa => 'Bool', - is => 'rw', - default => sub { 0 }, -); has stop_timeout => ( isa => 'Int', is => 'rw', - default => 2 + default => sub { 2 } ); -sub daemonize { - my ($self) = @_; - return if Proc::Daemon::Fork; - Proc::Daemon::Init; - $self->is_daemon(1); -} - sub start { my ($self) = @_; + confess "instance already running" if $self->check; + $self->daemonize unless $self->foreground; return unless $self->is_daemon; @@ -131,10 +127,10 @@ sub restart { $self->start(); } -sub setup_signals { - my ($self) = @_; - $SIG{INT} = sub { $self->handle_sigint; }; - $SIG{HUP} = sub { $self->handle_sighup }; +sub handle_signal { + my ($self, $signal) = @_; + return $self->handle_sigint if $signal eq 'INT'; + return $self->handle_sighup if $signal eq 'HUP'; } sub handle_sigint { $_[0]->stop; } @@ -225,17 +221,17 @@ to do that. =over -=item progname Str +=item progname Path::Class::Dir | Str The name of our daemon, defaults to $self->meta->name =~ s/::/_/; -=item pidbase Str +=item pidbase Path::Class::Dir | Str The base for our bid, defaults to /var/run/$progname -=item pidfile Str +=item pidfile MooseX::Daemonize::PidFile | Str -The file we store our PID in, defaults to /var/run/$progname/ +The file we store our PID in, defaults to /var/run/$progname =item foreground Bool @@ -319,7 +315,7 @@ The C method from L the module is part of the standard Perl distribution, part of the module's distribution, or must be installed separately. ] -Obviously L, also L, L, L +Obviously L, and L =head1 INCOMPATIBILITIES @@ -363,6 +359,8 @@ Chris Prather C<< >> Mike Boyko, Matt S. Trout, Stevan Little, Brandon Black, Ash Berlin and the #moose denzians +Some bug fixes sponsored by Takkle Inc. + =head1 LICENCE AND COPYRIGHT Copyright (c) 2007, Chris Prather C<< >>. All rights