[pve-devel] [PATCH] improve pveupdate with random start time

Wolfgang Link w.link at proxmox.com
Tue Sep 1 12:47:34 CEST 2015


this is important to avoid that all PVE nodes start the update procedure at the same time
---
 bin/Makefile            |   5 ++-
 bin/cron/Makefile       |   6 ---
 bin/cron/daily/Makefile |  15 -------
 bin/cron/daily/pve      | 101 ------------------------------------------------
 bin/pveupdate           | 101 ++++++++++++++++++++++++++++++++++++++++++++++++
 debian/conffiles        |   1 -
 debian/postinst         |  15 +++++++
 7 files changed, 119 insertions(+), 125 deletions(-)
 delete mode 100644 bin/cron/Makefile
 delete mode 100644 bin/cron/daily/Makefile
 delete mode 100644 bin/cron/daily/pve
 create mode 100644 bin/pveupdate

diff --git a/bin/Makefile b/bin/Makefile
index fb8e89a..7782738 100644
--- a/bin/Makefile
+++ b/bin/Makefile
@@ -1,6 +1,6 @@
 include ../defines.mk
 
-SUBDIRS = init.d cron ocf test
+SUBDIRS = init.d ocf test
 
 SCRIPTS =  			\
 	pveceph			\
@@ -16,7 +16,8 @@ SCRIPTS =  			\
 	pvesubscription		\
 	pvemailforward.pl	\
 	pveupgrade		\
-	pveperf
+	pveperf			\
+	pveupdate
 
 MANS = 				\
 	pveceph.1		\
diff --git a/bin/cron/Makefile b/bin/cron/Makefile
deleted file mode 100644
index 937df58..0000000
--- a/bin/cron/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-SUBDIRS = daily
-
-all: ${SUBDIRS}
-
-%:
-	set -e && for i in ${SUBDIRS}; do ${MAKE} -C $$i $@; done
diff --git a/bin/cron/daily/Makefile b/bin/cron/daily/Makefile
deleted file mode 100644
index f4bfb40..0000000
--- a/bin/cron/daily/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-include ../../../defines.mk
-
-all:
-
-.PHONY: install 
-install: pve
-	install -d ${CRONDAILYDIR}
-	install -m 0755 pve ${CRONDAILYDIR}
-
-.PHONY: distclean
-distclean: clean
-
-.PHONY: clean
-clean:
-	rm -rf *~
diff --git a/bin/cron/daily/pve b/bin/cron/daily/pve
deleted file mode 100644
index 47f15a2..0000000
--- a/bin/cron/daily/pve
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use IO::File;
-use File::Find;
-use File::stat;
-
-use PVE::INotify;
-use PVE::Cluster;
-use PVE::APLInfo;
-use PVE::SafeSyslog;
-use PVE::RPCEnvironment;
-use PVE::API2::Subscription;
-use PVE::API2::APT;
-
-initlog ('pvedailycron', 'daemon');
-
-die "please run as root\n" if $> != 0;
-
-$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
-
-PVE::INotify::inotify_init();
-
-my $rpcenv = PVE::RPCEnvironment->init('cli');
-
-$rpcenv->init_request();
-$rpcenv->set_language($ENV{LANG});
-$rpcenv->set_user('root at pam'); 
-
-my $nodename = PVE::INotify::nodename();
-
-eval { PVE::API2::Subscription->update({ node => $nodename }); };
-if (my $err = $@) {
-    syslog ('err', "update subscription info failed: $err");
-}
-
-my $dccfg = PVE::Cluster::cfs_read_file('datacenter.cfg');
-eval { PVE::APLInfo::update($dccfg->{http_proxy}); };
-if (my $err = $@) {
-    syslog ('err', "update appliance info failed - see /var/log/pveam.log for details");
-}
-
-if (my $info = PVE::INotify::read_file('subscription')) {
-    # We assume that users with subscriptions want informations
-    # about new packages.
-    if ($info->{status} eq 'Active') {
-	eval { PVE::API2::APT->update_database({ node => $nodename, notify => 1, quiet => 1 }); };
-	if (my $err = $@) {
-	    syslog ('err', "update apt database failed: $err");
-	}
-    }
-}
-
-sub cleanup_tasks {
-
-    my $taskdir = "/var/log/pve/tasks";
-    my $filename = "$taskdir/index.1";
-
-    my $fh = IO::File->new($filename, O_RDONLY);
-    return if !$fh;
-
-    my $endtime = 0;
-    while (defined(my $line = <$fh>)) {
-	if ($line =~ m/^(\S+)(\s([0-9A-Za-z]{8})(\s(\S.*))?)?$/) {
-	    $endtime = hex($3);
-	    last;
-	}
-    }
-    close($fh);
-
-    return if !$endtime;
-
-    # print "delete task older that $endtime\n" . localtime($endtime) . "\n";
-
-    my $count = 0;
-
-    my $wanted = sub {
-	my $filename = $_;
-
-	return if $filename !~ m/^UPID:/;
-
-	my $st;
-	if (($st = stat($filename)) && ($st->mtime < $endtime)) {
-	    unlink($filename);
-	    $count++;
-	}
-    };
-
-    foreach my $subdir (qw(0 1 2 3 4 5 6 7 8 9 A B C D E F)) {
-	my $path = "$taskdir/$subdir";
-	find($wanted, $path);
-    }
-
-    if ($count) {
-	syslog('info', "cleanup removed $count task logs");
-    }
-}
-
-cleanup_tasks();
-
-exit (0);
diff --git a/bin/pveupdate b/bin/pveupdate
new file mode 100644
index 0000000..e9a2305
--- /dev/null
+++ b/bin/pveupdate
@@ -0,0 +1,101 @@
+#!/usr/bin/perl -w
+
+use strict;
+use IO::File;
+use File::Find;
+use File::stat;
+
+use PVE::INotify;
+use PVE::Cluster;
+use PVE::APLInfo;
+use PVE::SafeSyslog;
+use PVE::RPCEnvironment;
+use PVE::API2::Subscription;
+use PVE::API2::APT;
+
+initlog ('pvedailycron', 'daemon');
+
+die "please run as root\n" if $> != 0;
+
+$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
+
+PVE::INotify::inotify_init();
+
+my $rpcenv = PVE::RPCEnvironment->init('cli');
+
+$rpcenv->init_request();
+$rpcenv->set_language($ENV{LANG});
+$rpcenv->set_user('root at pam');
+
+my $nodename = PVE::INotify::nodename();
+
+eval { PVE::API2::Subscription->update({ node => $nodename }); };
+if (my $err = $@) {
+    syslog ('err', "update subscription info failed: $err");
+}
+
+my $dccfg = PVE::Cluster::cfs_read_file('datacenter.cfg');
+eval { PVE::APLInfo::update($dccfg->{http_proxy}); };
+if (my $err = $@) {
+    syslog ('err', "update appliance info failed - see /var/log/pveam.log for details");
+}
+
+if (my $info = PVE::INotify::read_file('subscription')) {
+    # We assume that users with subscriptions want informations
+    # about new packages.
+    if ($info->{status} eq 'Active') {
+	eval { PVE::API2::APT->update_database({ node => $nodename, notify => 1, quiet => 1 }); };
+	if (my $err = $@) {
+	    syslog ('err', "update apt database failed: $err");
+	}
+    }
+}
+
+sub cleanup_tasks {
+
+    my $taskdir = "/var/log/pve/tasks";
+    my $filename = "$taskdir/index.1";
+
+    my $fh = IO::File->new($filename, O_RDONLY);
+    return if !$fh;
+
+    my $endtime = 0;
+    while (defined(my $line = <$fh>)) {
+	if ($line =~ m/^(\S+)(\s([0-9A-Za-z]{8})(\s(\S.*))?)?$/) {
+	    $endtime = hex($3);
+	    last;
+	}
+    }
+    close($fh);
+
+    return if !$endtime;
+
+    # print "delete task older that $endtime\n" . localtime($endtime) . "\n";
+
+    my $count = 0;
+
+    my $wanted = sub {
+	my $filename = $_;
+
+	return if $filename !~ m/^UPID:/;
+
+	my $st;
+	if (($st = stat($filename)) && ($st->mtime < $endtime)) {
+	    unlink($filename);
+	    $count++;
+	}
+    };
+
+    foreach my $subdir (qw(0 1 2 3 4 5 6 7 8 9 A B C D E F)) {
+	my $path = "$taskdir/$subdir";
+	find($wanted, $path);
+    }
+
+    if ($count) {
+	syslog('info', "cleanup removed $count task logs");
+    }
+}
+
+cleanup_tasks();
+
+exit (0);
diff --git a/debian/conffiles b/debian/conffiles
index 2bb0027..0acb6aa 100644
--- a/debian/conffiles
+++ b/debian/conffiles
@@ -3,7 +3,6 @@
 /etc/init.d/pveproxy
 /etc/init.d/spiceproxy
 /etc/init.d/pvestatd
-/etc/cron.daily/pve
 /etc/vz/vznet.conf
 /etc/vzdump.conf
 /etc/logrotate.d/pve
diff --git a/debian/postinst b/debian/postinst
index bd17b0f..9498fab 100755
--- a/debian/postinst
+++ b/debian/postinst
@@ -43,6 +43,21 @@ case "$1" in
     # remove old APL dir
     rm -rf /var/lib/pve-manager/apl-available
 
+    # remove old cron.daily update job to randomize it
+    if test -e /etc/cron.daily/pve; then
+	echo "Remove old update script from cron.daily"
+	rm /etc/cron.daily/pve
+    fi
+
+    # create new daily randomize update cronjob if not exist
+    if !(test -e /etc/cron.d/pveupdate); then
+	MIN="$(shuf -i 0-59 -n 1)"
+
+	HOUR="$(shuf -i 6-10 -n 1)"
+	echo "Create cron job for daily update"
+	printf " ${MIN} ${HOUR} * * * root /usr/bin/pveupdate\n\n" > /etc/cron.d/pveupdate
+    fi
+
     if test ! -e /var/lib/pve-manager/apl-info/download.proxmox.com; then
 	mkdir -p /var/lib/pve-manager/apl-info
 	cp /usr/share/doc/pve-manager/aplinfo.dat /var/lib/pve-manager/apl-info/download.proxmox.com
-- 
2.1.4




More information about the pve-devel mailing list