From 3824765e6411c2417e39a094d9bf8b42f0f6743f Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 26 Jun 2018 14:15:43 +0200 Subject: [PATCH] add Agent helper package Signed-off-by: Dominik Csapak --- PVE/API2/Qemu/Agent.pm | 5 ++-- PVE/QemuServer/Agent.pm | 65 +++++++++++++++++++++++++++++++++++++++++ PVE/QemuServer/Makefile | 1 + 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 PVE/QemuServer/Agent.pm diff --git a/PVE/API2/Qemu/Agent.pm b/PVE/API2/Qemu/Agent.pm index 5141b4e2..f50fde5e 100644 --- a/PVE/API2/Qemu/Agent.pm +++ b/PVE/API2/Qemu/Agent.pm @@ -6,6 +6,7 @@ use warnings; use PVE::RESTHandler; use PVE::JSONSchema qw(get_standard_option); use PVE::QemuServer; +use PVE::QemuServer::Agent qw(agent_available); use base qw(PVE::RESTHandler); @@ -172,9 +173,7 @@ sub register_command { my $conf = PVE::QemuConfig->load_config ($vmid); # check if VM exists - die "No Qemu Guest Agent\n" if !defined($conf->{agent}); - die "VM $vmid is not running\n" if !PVE::QemuServer::check_running($vmid); - die "Qemu Guest Agent is not running\n" if !PVE::QemuServer::qga_check_running($vmid, 1); + agent_available($vmid, $conf); my $cmd = $param->{command} // $command; my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd"); diff --git a/PVE/QemuServer/Agent.pm b/PVE/QemuServer/Agent.pm new file mode 100644 index 00000000..8fad1091 --- /dev/null +++ b/PVE/QemuServer/Agent.pm @@ -0,0 +1,65 @@ +package PVE::QemuServer::Agent; + +use strict; +use warnings; +use PVE::QemuServer; +use base 'Exporter'; + +our @EXPORT_OK = qw( +check_agent_error +agent_available +agent_cmd +); + +sub check_agent_error { + my ($result, $errmsg, $noerr) = @_; + + $errmsg //= ''; + my $error = ''; + if (ref($result) eq 'HASH' && $result->{error} && $result->{error}->{desc}) { + $error = "Agent Error: $result->{error}->{desc}\n"; + } elsif (!defined($result)) { + $error = "Agent Error: $errmsg\n"; + } + + if ($error) { + die $error if !$noerr; + + warn $error; + return undef; + } + + return 1; +} + +sub agent_available { + my ($vmid, $conf, $noerr) = @_; + + eval { + die "No Qemu Guest Agent\n" if !defined($conf->{agent}); + die "VM $vmid is not running\n" if !PVE::QemuServer::check_running($vmid); + die "Qemu Guest Agent is not running\n" if !PVE::QemuServer::qga_check_running($vmid, 1); + }; + + if (my $err = $@) { + die $err if !$noerr; + return undef; + } + + return 1; +} + +# loads config, checks if available, executes command, checks for errors +sub agent_cmd { + my ($vmid, $cmd, $params, $errormsg, $noerr) = @_; + + my $conf = PVE::QemuConfig->load_config($vmid); # also checks if VM exists + agent_available($vmid, $conf, $noerr); + + my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd", %$params); + check_agent_error($res, $errormsg, $noerr); + + return $res; +} + +1; diff --git a/PVE/QemuServer/Makefile b/PVE/QemuServer/Makefile index 0d783240..afc39a38 100644 --- a/PVE/QemuServer/Makefile +++ b/PVE/QemuServer/Makefile @@ -4,6 +4,7 @@ SOURCES=PCI.pm \ ImportDisk.pm \ OVF.pm \ Cloudinit.pm \ + Agent.pm \ .PHONY: install install: ${SOURCES}