]> git.proxmox.com Git - pve-guest-common.git/commitdiff
add check/exec_hookscript to GuestHelpers
authorDominik Csapak <d.csapak@proxmox.com>
Thu, 31 Jan 2019 13:33:38 +0000 (14:33 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 1 Feb 2019 09:10:48 +0000 (10:10 +0100)
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@proxmox.com>
PVE/GuestHelpers.pm

index c326812b72b74467d4463c50cdeb2c24c79d9e66..892b6db187f6c36534bc9c69f37755f38554da72 100644 (file)
@@ -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;