Skip to content

Commit

Permalink
removed -g and -u options from daemon command
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 25, 2015
1 parent 6faad94 commit 3bb278d
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 75 deletions.
5 changes: 5 additions & 0 deletions Changes
@@ -1,5 +1,10 @@

5.75 2015-01-26
- Removed -g and -u options from daemon command.
- Moved group and user attributes from Mojo::Server to
Mojo::Server::Prefork.
- Moved daemonize and setuidgid methods from Mojo::Server to
Mojo::Server::Prefork.
- Fixed race condition in Mojo::Server::Prefork.

5.74 2015-01-25
Expand Down
66 changes: 1 addition & 65 deletions lib/Mojo/Server.pm
Expand Up @@ -5,11 +5,9 @@ use Carp 'croak';
use Cwd 'abs_path';
use Mojo::Loader;
use Mojo::Util 'md5_sum';
use POSIX;
use Scalar::Util 'blessed';

has app => sub { shift->build_app('Mojo::HelloWorld') };
has [qw(group user)];
has app => sub { shift->build_app('Mojo::HelloWorld') };
has reverse_proxy => sub { $ENV{MOJO_REVERSE_PROXY} };

sub build_app {
Expand All @@ -26,19 +24,6 @@ sub build_tx {
return $tx;
}

sub daemonize {

# Fork and kill parent
die "Can't fork: $!" unless defined(my $pid = fork);
exit 0 if $pid;
POSIX::setsid or die "Can't start a new session: $!";

# Close filehandles
open STDIN, '</dev/null';
open STDOUT, '>/dev/null';
open STDERR, '>&STDOUT';
}

sub load_app {
my ($self, $path) = @_;

Expand Down Expand Up @@ -71,29 +56,6 @@ sub new {

sub run { croak 'Method "run" not implemented by subclass' }

sub setuidgid {
my $self = shift;

# Group (make sure secondary groups are reassigned too)
if (my $group = $self->group) {
return $self->_log(qq{Group "$group" does not exist.})
unless defined(my $gid = getgrnam $group);
return $self->_log(qq{Can't switch to group "$group": $!})
unless ($( = $) = "$gid $gid") && $) eq "$gid $gid" && $( eq "$gid $gid";
}

# User
return $self unless my $user = $self->user;
return $self->_log(qq{User "$user" does not exist.})
unless defined(my $uid = getpwnam $user);
return $self->_log(qq{Can't switch to user "$user": $!})
unless POSIX::setuid($uid);

return $self;
}

sub _log { $_[0]->app->log->error($_[1]) and return $_[0] }

1;

=encoding utf8
Expand Down Expand Up @@ -155,13 +117,6 @@ L<Mojo::Server> implements the following attributes.
Application this server handles, defaults to a L<Mojo::HelloWorld> object.
=head2 group
my $group = $server->group;
$server = $server->group('users');
Group for server process.
=head2 reverse_proxy
my $bool = $server->reverse_proxy;
Expand All @@ -170,13 +125,6 @@ Group for server process.
This server operates behind a reverse proxy, defaults to the value of the
C<MOJO_REVERSE_PROXY> environment variable.
=head2 user
my $user = $server->user;
$server = $server->user('web');
User for the server process.
=head1 METHODS
L<Mojo::Server> inherits all methods from L<Mojo::EventEmitter> and implements
Expand All @@ -194,12 +142,6 @@ Build application from class.
Let application build a transaction.
=head2 daemonize
$server->daemonize;
Daemonize server process.
=head2 load_app
my $app = $server->load_app('/home/sri/myapp.pl');
Expand All @@ -221,12 +163,6 @@ with default request handling.
Run server. Meant to be overloaded in a subclass.
=head2 setuidgid
$server = $server->setuidgid;
Set L</"user"> and L</"group"> for process.
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicio.us>.
Expand Down
2 changes: 1 addition & 1 deletion lib/Mojo/Server/Daemon.pm
Expand Up @@ -25,7 +25,7 @@ sub DESTROY {
sub run {
my $self = shift;
local $SIG{INT} = local $SIG{TERM} = sub { $self->ioloop->stop };
$self->start->setuidgid->ioloop->start;
$self->start->ioloop->start;
}

sub start {
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojo/Server/Hypnotoad.pm
Expand Up @@ -287,7 +287,7 @@ L<Mojo::Server::Prefork/"graceful_timeout">.
group => 'staff'
Group name for worker processes, defaults to the value of
L<Mojo::Server/"group">.
L<Mojo::Server::Prefork/"group">.
=head2 heartbeat_interval
Expand Down Expand Up @@ -377,7 +377,7 @@ before getting canceled, defaults to the value of L</"upgrade_timeout">.
user => 'sri'
Username for worker processes, defaults to the value of
L<Mojo::Server/"user">.
L<Mojo::Server::Prefork/"user">.
=head2 workers
Expand Down
66 changes: 64 additions & 2 deletions lib/Mojo/Server/Prefork.pm
Expand Up @@ -11,7 +11,7 @@ use Scalar::Util 'weaken';
use Time::HiRes ();

has accepts => 1000;
has [qw(accept_interval multi_accept)];
has [qw(accept_interval group multi_accept user)];
has [qw(cleanup lock_timeout)] => 1;
has [qw(graceful_timeout heartbeat_timeout)] => 20;
has heartbeat_interval => 5;
Expand Down Expand Up @@ -44,6 +44,19 @@ sub check_pid {
return undef;
}

sub daemonize {

# Fork and kill parent
die "Can't fork: $!" unless defined(my $pid = fork);
exit 0 if $pid;
POSIX::setsid or die "Can't start a new session: $!";

# Close filehandles
open STDIN, '</dev/null';
open STDOUT, '>/dev/null';
open STDERR, '>&STDOUT';
}

sub ensure_pid_file {
my $self = shift;

Expand Down Expand Up @@ -96,6 +109,29 @@ sub run {
$self->_manage while $self->{running};
}

sub setuidgid {
my $self = shift;

# Group (make sure secondary groups are reassigned too)
if (my $group = $self->group) {
return $self->_error(qq{Group "$group" does not exist.})
unless defined(my $gid = getgrnam $group);
return $self->_error(qq{Can't switch to group "$group": $!})
unless ($( = $) = "$gid $gid") && $) eq "$gid $gid" && $( eq "$gid $gid";
}

# User
return $self unless my $user = $self->user;
return $self->_error(qq{User "$user" does not exist.})
unless defined(my $uid = getpwnam $user);
return $self->_error(qq{Can't switch to user "$user": $!})
unless POSIX::setuid($uid);

return $self;
}

sub _error { $_[0]->app->log->error($_[1]) and return $_[0] }

sub _heartbeat {
my $self = shift;

Expand Down Expand Up @@ -171,7 +207,7 @@ sub _spawn {
unless open my $handle, '>', $file;

# Change user/group
$self->setuidgid->cleanup(0);
$self->cleanup(0)->setuidgid;

# Accept mutex
my $loop = $self->ioloop->lock(
Expand Down Expand Up @@ -422,6 +458,20 @@ needed anymore, defaults to a true value.
Maximum amount of time in seconds stopping a worker gracefully may take before
being forced, defaults to C<20>.
=head2 group
my $group = $prefork->group;
$prefork = $prefork->group('users');
Group for worker process.
=head2 user
my $user = $prefork->user;
$prefork = $prefork->user('web');
User for the worker process.
=head2 heartbeat_interval
my $interval = $prefork->heartbeat_intrval;
Expand Down Expand Up @@ -494,6 +544,12 @@ is not running.
say 'Server is not running' unless $prefork->check_pid;
=head2 daemonize
$prefork->daemonize;
Daemonize server process.
=head2 ensure_pid_file
$prefork->ensure_pid_file;
Expand All @@ -506,6 +562,12 @@ Ensure L</"pid_file"> exists.
Run server.
=head2 setuidgid
$prefork->setuidgid;
Set L</"user"> and L</"group"> for process.
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicio.us>.
Expand Down
6 changes: 1 addition & 5 deletions lib/Mojolicious/Command/daemon.pm
Expand Up @@ -14,12 +14,10 @@ sub run {
GetOptionsFromArray \@args,
'b|backlog=i' => sub { $daemon->backlog($_[1]) },
'c|clients=i' => sub { $daemon->max_clients($_[1]) },
'g|group=s' => sub { $daemon->group($_[1]) },
'i|inactivity=i' => sub { $daemon->inactivity_timeout($_[1]) },
'l|listen=s' => \my @listen,
'p|proxy' => sub { $daemon->reverse_proxy(1) },
'r|requests=i' => sub { $daemon->max_requests($_[1]) },
'u|user=s' => sub { $daemon->user($_[1]) };
'r|requests=i' => sub { $daemon->max_requests($_[1]) };

$daemon->listen(\@listen) if @listen;
$daemon->run;
Expand All @@ -46,7 +44,6 @@ Mojolicious::Command::daemon - Daemon command
-b, --backlog <size> Listen backlog size, defaults to SOMAXCONN.
-c, --clients <number> Maximum number of concurrent clients,
defaults to 1000.
-g, --group <name> Group name for process.
-i, --inactivity <seconds> Inactivity timeout, defaults to the value of
MOJO_INACTIVITY_TIMEOUT or 15.
-l, --listen <location> One or more locations you want to listen on,
Expand All @@ -56,7 +53,6 @@ Mojolicious::Command::daemon - Daemon command
the value of MOJO_REVERSE_PROXY.
-r, --requests <number> Maximum number of requests per keep-alive
connection, defaults to 25.
-u, --user <name> Username for process.
=head1 DESCRIPTION
Expand Down

0 comments on commit 3bb278d

Please sign in to comment.