From 3acb4e74630934c61abe99aea0f63af347efb899 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Thu, 31 Jan 2019 14:33:38 +0100 Subject: [PATCH] add check/exec_hookscript to GuestHelpers 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 --- 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.39.2