diff --git a/bin/Makefile b/bin/Makefile index 5c548aa0..fb7ab9ed 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -46,6 +46,9 @@ all: ${MANS} pvemailforward pvestatd.1.pod: pvestatd perl -I.. ./pvestatd printmanpod >$@ +pvedaemon.1.pod: pvedaemon + perl -I.. -T ./pvedaemon printmanpod >$@ + pveproxy.1.pod: pveproxy perl -I.. -T ./pveproxy printmanpod >$@ diff --git a/bin/init.d/pvedaemon b/bin/init.d/pvedaemon index e6b11df8..196f88f0 100755 --- a/bin/init.d/pvedaemon +++ b/bin/init.d/pvedaemon @@ -25,33 +25,23 @@ export LC_ALL="C" case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON + $DAEMON start log_end_msg $? ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" - start-stop-daemon --stop --quiet --retry TERM/2/TERM/15/KILL/2 --pidfile $PIDFILE + $DAEMON stop log_end_msg $? ;; - reload) - log_daemon_msg "Reloading $DESC" "$NAME" - if ( [ -e $PIDFILE ] && kill -0 `cat $PIDFILE`) then - start-stop-daemon --stop --signal HUP --pidfile $PIDFILE - else - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON - fi - log_end_msg $? - ;; - restart|force-reload) + restart|reload|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" - start-stop-daemon --stop --quiet --retry TERM/2/TERM/15/KILL/2 --pidfile $PIDFILE - sleep 2 - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON - log_end_msg $? + $DAEMON restart + + log_end_msg $? ;; *) N=/etc/init.d/$NAME - echo "Usage: $N {start|stop|restart|force-reload}" + echo "Usage: $N {start|stop|restart|reload|force-reload}" exit 1 ;; esac diff --git a/bin/pvedaemon b/bin/pvedaemon index 276292c9..66f5e6c5 100755 --- a/bin/pvedaemon +++ b/bin/pvedaemon @@ -6,109 +6,83 @@ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; use strict; use warnings; -use Getopt::Long; -use POSIX ":sys_wait_h"; -use Socket; + use PVE::SafeSyslog; -use PVE::APIDaemon; +use PVE::Daemon; use PVE::API2; use PVE::API2::Formatter::Standard; use PVE::API2::Formatter::HTML; -my $pidfile = "/var/run/pvedaemon.pid"; -my $lockfile = "/var/lock/pvedaemon.lck"; - -my $opt_debug; - -initlog ('pvedaemon'); - -if (!GetOptions ('debug' => \$opt_debug)) { - die "usage: $0 [--debug]\n"; -} +use base qw(PVE::Daemon); $SIG{'__WARN__'} = sub { my $err = $@; my $t = $_[0]; chomp $t; - syslog('warning', "WARNING: %s", $t); + print STDERR "$t\n"; + syslog('warning', "%s", $t); $@ = $err; }; -$0 = "pvedaemon"; +my $cmdline = [$0, @ARGV]; + +my %daemon_options = ( + max_workers => 3, + restart_on_error => 5, + stop_wait_time => 15, + leave_children_open_on_reload => 1, +); # create dir for dtach sockets mkdir "/var/run/dtach"; -my $cpid; -my $daemon; -eval { - $daemon = PVE::APIDaemon->new( +my $daemon = __PACKAGE__->new('pvedaemon', $cmdline, %daemon_options); + +sub init { + my ($self) = @_; + + my $accept_lock_fn = "/var/lock/pvedaemon.lck"; + + my $lockfh = IO::File->new(">>${accept_lock_fn}") || + die "unable to open lock file '${accept_lock_fn}' - $!\n"; + + my $socket = $self->create_reusable_socket(85, '127.0.0.1'); + + $self->{server_config} = { base_handler_class => 'PVE::API2', - host => "127.0.0.1", - port => 85, - trusted_env => 1, # partly trusted, because only local programs can connect - lockfile => $lockfile, - debug => $opt_debug, keep_alive => 100, max_conn => 500, - max_requests => 1000); + max_requests => 1000, + lockfile => $accept_lock_fn, + socket => $socket, + lockfh => $lockfh, + debug => $self->{debug}, + trusted_env => 1, + }; +} + +sub run { + my ($self) = @_; + + my $server = PVE::HTTPServer->new(%{$self->{server_config}}); + $server->run(); +} + +$daemon->register_start_command(); +$daemon->register_restart_command(1); +$daemon->register_stop_command(); +$daemon->register_status_command(); + +my $cmddef = { + start => [ __PACKAGE__, 'start', []], + restart => [ __PACKAGE__, 'restart', []], + stop => [ __PACKAGE__, 'stop', []], + status => [ __PACKAGE__, 'status', [], undef, sub { print shift . "\n";} ], }; -my $err = $@; +my $cmd = shift; -if ($err) { - syslog ('err' , "unable to start server: $err"); - print STDERR $err; - exit (-1); -} - -if ($opt_debug || !($cpid = fork ())) { - - $SIG{PIPE} = 'IGNORE'; - $SIG{INT} = 'IGNORE' if !$opt_debug; - - $SIG{TERM} = $SIG{QUIT} = sub { - syslog ('info' , "server closing"); - - $SIG{INT} = 'DEFAULT'; - - unlink "$pidfile"; - - exit (0); - }; - - syslog ('info' , "starting server"); - - if (!$opt_debug) { - # redirect STDIN/STDOUT/SDTERR to /dev/null - open STDIN, '/dev/null' || die "can't write /dev/null [$!]"; - open STDERR, '>&STDOUT' || die "can't open STDERR to STDOUT [$!]"; - } - - POSIX::setsid(); - - system ("echo > /var/lib/pve-manager/vmops"); # init vmops file - - eval { - $daemon->start_server(); - }; - my $err = $@; - - if ($err) { - syslog ('err' , "unexpected server error: $err"); - print STDERR $err if $opt_debug; - exit (-1); - } - -} else { - - open (PIDFILE, ">$pidfile") || - die "cant write '$pidfile' - $! :ERROR"; - print PIDFILE "$cpid\n"; - close (PIDFILE) || - die "cant write '$pidfile' - $! :ERROR"; -} +PVE::CLIHandler::handle_cmd($cmddef, $0, $cmd, \@ARGV, undef, $0); exit (0); @@ -118,9 +92,7 @@ __END__ pvedaemon - the PVE configuration server -=head1 SYNOPSIS - -pvedaemon [--debug] +=include synopsis =head1 DESCRIPTION @@ -128,21 +100,4 @@ All configuration is done using this Server. The Server only listens to a local address 127.0.0.1 port 85 for security reasons. -=head1 COPYRIGHT AND DISCLAIMER - - Copyright (C) 2007-2013 Proxmox Server Solutions GmbH - - This program is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public - License along with this program. If not, see - . - +=include pve_copyright