From 891d124227ddd4ef22f57559de38eebf0a5c7fc4 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 18 Dec 2014 10:42:27 +0100 Subject: [PATCH] pvestatd: use new Daemon class from pve-common --- bin/Makefile | 3 + bin/init.d/pvestatd | 56 ++++++------- bin/pvestatd | 199 ++++++++++++++------------------------------ 3 files changed, 92 insertions(+), 166 deletions(-) diff --git a/bin/Makefile b/bin/Makefile index 127e5ac7..dc575ce7 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -43,6 +43,9 @@ all: ${MANS} pvemailforward %.1.pod: % podselect $*>$@ +pvestatd.1.pod: pvestatd + perl -I.. ./pvestatd printmanpod >$@ + pvectl.1.pod: pvectl perl -I.. ./pvectl printmanpod >$@ diff --git a/bin/init.d/pvestatd b/bin/init.d/pvestatd index 81d2fa80..8f87ae94 100755 --- a/bin/init.d/pvestatd +++ b/bin/init.d/pvestatd @@ -18,38 +18,36 @@ DESC="PVE Status Daemon" PIDFILE=/var/run/pvestatd.pid +# Exit if the package is not installed test -f $DAEMON || exit 0 +[ -e /proxmox_install_mode ] && exit 0 + +# avoid warnings about uninstalled locales +export LC_ALL="C" case "$1" in - start) - log_daemon_msg "Starting $DESC" "$NAME" - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON - log_end_msg $? - ;; - stop) - log_daemon_msg "Stopping $DESC" "$NAME" - start-stop-daemon --stop --quiet --retry TERM/5/TERM/10/KILL/2 --pidfile $PIDFILE - log_end_msg $? - ;; - reload) - log_daemon_msg "Reloading $DESC" "$NAME" - if ( [ -e $PIDFILE ] && kill -0 `cat $PIDFILE`) then - start-stop-daemon --stop --quiet --pidfile $PIDFILE --signal HUP - else - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON - fi - log_end_msg $? - ;; - restart|force-reload) - log_daemon_msg "Restarting $DESC" "$NAME" - start-stop-daemon --stop --quiet --retry TERM/5/TERM/10/KILL/2 --pidfile $PIDFILE - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON - log_end_msg $? - ;; - *) - N=/etc/init.d/$NAME - echo "Usage: $N {start|stop|reload|restart|force-reload}" >&2 - exit 1 + start) + log_daemon_msg "Starting $DESC" "$NAME" + $DAEMON start + log_end_msg $? + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + $DAEMON stop + log_end_msg $? + ;; + status) + $DAEMON status + ;; + reload|restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + $DAEMON restart + log_end_msg $? + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|status|reload|restart|force-reload}" >&2 + exit 1 ;; esac diff --git a/bin/pvestatd b/bin/pvestatd index ff307363..14abf982 100755 --- a/bin/pvestatd +++ b/bin/pvestatd @@ -3,9 +3,8 @@ use strict; use warnings; use PVE::SafeSyslog; -use POSIX ":sys_wait_h"; -use Fcntl ':flock'; -use Getopt::Long; +use PVE::Daemon; + use Time::HiRes qw (gettimeofday); use PVE::Tools qw(dir_glob_foreach file_read_firstline); use PVE::ProcFSTools; @@ -19,119 +18,49 @@ use PVE::RPCEnvironment; use PVE::API2::Subscription; use PVE::AutoBalloon; -$SIG{'__WARN__'} = sub { - my $err = $@; - my $t = $_[0]; - chomp $t; - syslog('warning', "WARNING: %s", $t); - $@ = $err; -}; - -initlog('pvestatd'); - -$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; - -die "please run as root\n" if $> != 0; - -my $nodename = PVE::INotify::nodename(); +use base qw(PVE::Daemon); my $opt_debug; -if (!GetOptions ('debug' => \$opt_debug)) { - die "USAGE: $0 [--debug]\n"; +my $cmdline = [$0, @ARGV]; + +my %daemon_options = (restart_on_error => 5, stop_wait_time => 5); + +my $daemon = __PACKAGE__->new('pvestatd', $cmdline, %daemon_options); + +my $rpcenv = PVE::RPCEnvironment->init('cli'); + +$rpcenv->init_request(); +$rpcenv->set_language($ENV{LANG}); +$rpcenv->set_user('root@pam'); + +my $nodename = PVE::INotify::nodename(); +my $restart_request = 0; + +sub init { + my ($self) = @_; + + PVE::Cluster::cfs_update(); } -my $opt_pidfile = "/var/run/pvestatd.pid"; +sub shutdown { + my ($self) = @_; -sub lockpidfile { - my $pidfile = shift; - my $lkfn = "$pidfile.lock"; - - if (!open (FLCK, ">>$lkfn")) { - my $msg = "can't aquire lock on file '$lkfn' - $!"; - syslog ('err', $msg); - die "ERROR: $msg\n"; - } - - if (!flock (FLCK, LOCK_EX|LOCK_NB)) { - close (FLCK); - my $msg = "can't aquire lock '$lkfn' - $!"; - syslog ('err', $msg); - die "ERROR: $msg\n"; - } -} - -sub writepidfile { - my $pidfile = shift; - - if (!open (PIDFH, ">$pidfile")) { - my $msg = "can't open pid file '$pidfile' - $!"; - syslog ('err', $msg); - die "ERROR: $msg\n"; - } - print PIDFH "$$\n"; - close (PIDFH); -} - -# try to get the lock -lockpidfile($opt_pidfile); - -# run in background -my $spid; - -my $restart = $ENV{RESTART_PVESTATD}; - -if (!$opt_debug) { - open STDIN, '/dev/null' || die "can't write /dev/null"; -} - -if (!$restart && !$opt_debug) { - $spid = fork(); - if (!defined ($spid)) { - my $msg = "can't put server into background - fork failed"; - syslog('err', $msg); - die "ERROR: $msg\n"; - } elsif ($spid) { #parent - exit (0); - } -} - -writepidfile($opt_pidfile); - -open STDERR, '>&STDOUT' || die "can't close STDERR\n"; - -sub cleanup { - unlink "$opt_pidfile.lock"; - unlink "$opt_pidfile"; -} - -$SIG{INT} = $SIG{TERM} = $SIG{QUIT} = sub { syslog('info' , "server closing"); - $SIG{INT} = 'DEFAULT'; - # wait for children 1 while (waitpid(-1, POSIX::WNOHANG()) > 0); - cleanup(); - - exit (0); -}; - -PVE::INotify::inotify_init(); - -my $reload_config; - -if ($restart) { - syslog('info' , "restarting server"); -} else { - syslog('info' , "starting server"); + $self->exit_daemon(0); } -$SIG{HUP} = sub { - $reload_config = 1; -}; +sub hup { + my ($self) = @_; + + syslog('info' , "received signal HUP"); + + $restart_request = 1; +} sub update_node_status { @@ -272,6 +201,7 @@ sub find_vzctl_console_pids { return $res; } + sub remove_stale_openvz_consoles { my $vmstatus = PVE::OpenVZ::vmstatus(); @@ -383,36 +313,18 @@ my $next_update = 0; my $cycle = 0; my $updatetime = 10; -my $commandline = [$0, @ARGV]; - -$0 = "pvestatd"; - -sub restart_server { - my $waittime = shift; - - syslog('info', "server shutdown (restart)"); - - $ENV{RESTART_PVESTATD} = 1; - - sleep($waittime) if $waittime; # avoid high server load due to restarts - - PVE::INotify::inotify_close(); - - exec (@$commandline); - exit (-1); # never reached? -} - my $initial_memory_usage; -for (;;) { # forever +sub run { + my ($self) = @_; - eval { - $next_update = time() + $updatetime; + for (;;) { # forever + + $next_update = time() + $updatetime; if ($cycle) { my ($ccsec, $cusec) = gettimeofday (); eval { - $reload_config = 0; # syslog('info', "start status update"); PVE::Cluster::cfs_update(); update_status(); @@ -441,25 +353,35 @@ for (;;) { # forever if ($diff > 5*1024*1024) { syslog ('info', "restarting server after $cycle cycles to " . "reduce memory usage (free $mem->{resident} ($diff) bytes)"); - restart_server (); + $self->restart_daemon(); } } my $wcount = 0; while ((time() < $next_update) && ($wcount < $updatetime) && # protect against time wrap - !$reload_config) { $wcount++; sleep (1); }; - }; + !$restart_request) { $wcount++; sleep (1); }; - my $err = $@; - - if ($err) { - syslog ('err', "ERROR: $err"); - restart_server(5); - exit (0); + $self->restart_daemon() if $restart_request; } } +$daemon->register_start_command(__PACKAGE__); +$daemon->register_restart_command(__PACKAGE__); +$daemon->register_stop_command(__PACKAGE__); +$daemon->register_status_command(__PACKAGE__); + +my $cmddef = { + start => [ __PACKAGE__, 'start', []], + restart => [ __PACKAGE__, 'restart', []], + stop => [ __PACKAGE__, 'stop', []], + status => [ __PACKAGE__, 'status', [], undef, sub { print shift . "\n";} ], +}; + +my $cmd = shift; + +PVE::CLIHandler::handle_cmd($cmddef, $0, $cmd, \@ARGV, undef, $0); + exit (0); __END__ @@ -470,11 +392,14 @@ pvestatd - PVE Status Daemon =head1 SYNOPSIS -pvestatd +=include synopsis =head1 DESCRIPTION -Documentation is available at www.proxmox.com +This daemom queries the status of VMs, storages and containers at +regular intervals. The result is sent to all nodes in the cluster. + +=include pve_copyright