[pve-devel] [PATCH guest-common v4 1/1] add check/exec_hookscript to GuestHelpers

Dominik Csapak d.csapak at proxmox.com
Thu Jan 31 14:33:38 CET 2019


check_hookscript will be used for the container/vm api to check if the
hookscript volume id is correct

exec_hookscript can be called to execute a hookscript

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v3:
* merged 2 commits
* use check in exec
* rename check
* return path in check
 PVE/GuestHelpers.pm | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/PVE/GuestHelpers.pm b/PVE/GuestHelpers.pm
index c326812..892b6db 100644
--- a/PVE/GuestHelpers.pm
+++ b/PVE/GuestHelpers.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use PVE::Tools;
+use PVE::Storage;
 
 # We use a separate lock to block migration while a replication job
 # is running.
@@ -23,4 +24,50 @@ sub guest_migration_lock {
     return $res;
 }
 
+sub check_hookscript {
+    my ($volid, $storecfg) = @_;
+
+    $storecfg = PVE::Storage::config() if !defined($storecfg);
+    my ($path, undef, $type) = PVE::Storage::path($storecfg, $volid);
+
+    die "'$volid' is not in the snippets directory\n"
+	if $type ne 'snippets';
+
+    die "script '$volid' does not exists\n"
+	if ! -f $path;
+
+    die "script '$volid' is not executable\n"
+	if ! -x $path;
+
+    return $path;
+}
+
+sub exec_hookscript {
+    my ($conf, $vmid, $phase, $stop_on_error) = @_;
+
+    return if !$conf->{hookscript};
+    my $hookscript = eval { check_hookscript($conf->{hookscript}) };
+    if (my $err = $@) {
+	if ($stop_on_error) {
+	    die $err;
+	} else {
+	    warn $err;
+	    return;
+	}
+    }
+
+    eval {
+	PVE::Tools::run_command([$hookscript, $vmid, $phase]);
+    };
+
+    if (my $err = $@) {
+	my $errmsg = "hookscript error for $vmid on $phase: $err\n";
+	if ($stop_on_error) {
+	    die $errmsg;
+	} else {
+	    warn $errmsg;
+	}
+    }
+}
+
 1;
-- 
2.11.0






More information about the pve-devel mailing list