[pve-devel] [PATCH v3 pve-manager 21/23] PVE::API2Tools::resolve_proxyto - new helper

Dietmar Maurer dietmar at proxmox.com
Tue May 30 15:20:18 CEST 2017


Call proxyto_callback if that method is defined.

Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
 PVE/API2Tools.pm  | 18 ++++++++++++++++++
 PVE/HTTPServer.pm |  9 ++++-----
 bin/pvesh         |  8 ++++----
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/PVE/API2Tools.pm b/PVE/API2Tools.pm
index 24947753..9bd4e49d 100644
--- a/PVE/API2Tools.pm
+++ b/PVE/API2Tools.pm
@@ -4,8 +4,10 @@ use strict;
 use warnings;
 use Net::IP;
 
+use PVE::Exception qw(raise_param_exc);
 use PVE::Tools;
 use PVE::INotify;
+use PVE::Cluster;
 use Digest::MD5 qw(md5_hex);
 use URI;
 use URI::Escape;
@@ -239,4 +241,20 @@ sub read_proxy_config {
     return $res;
 }
 
+sub resolve_proxyto {
+    my ($rpcenv, $proxyto_callback, $proxyto, $uri_param) = @_;
+
+    my $node;
+    if ($proxyto_callback) {
+	$node = $proxyto_callback->($rpcenv, $proxyto, $uri_param);
+	die "internal error - proxyto_callback returned nothing\n"
+	    if !$node;
+    } else {
+	$node = $uri_param->{$proxyto};
+	raise_param_exc({ $proxyto =>  "proxyto parameter does not exists"})
+	    if !$node;
+    }
+    return $node;
+}
+
 1;
diff --git a/PVE/HTTPServer.pm b/PVE/HTTPServer.pm
index 0fae3e28..bbea3198 100755
--- a/PVE/HTTPServer.pm
+++ b/PVE/HTTPServer.pm
@@ -12,6 +12,7 @@ use PVE::Exception qw(raise_param_exc);
 use PVE::RPCEnvironment;
 use PVE::AccessControl;
 use PVE::Cluster;
+use PVE::API2Tools;
 
 use Data::Dumper;
 
@@ -135,11 +136,9 @@ sub rest_handler {
 	# check access permissions
 	$rpcenv->check_api2_permissions($info->{permissions}, $auth->{userid}, $uri_param);
 
-	if ($info->{proxyto}) {
-	    my $pn = $info->{proxyto};
-	    my $node = $uri_param->{$pn};
-
-	    raise_param_exc({$pn =>  "proxy parameter '$pn' does not exists"}) if !$node;
+	if ($info->{proxyto} || $info->{proxyto_callback}) {
+	    my $node = PVE::API2Tools::resolve_proxyto(
+		$rpcenv, $info->{proxyto_callback}, $info->{proxyto}, $uri_param);
 
 	    if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
 		die "unable to proxy file uploads" if $auth->{isUpload};
diff --git a/bin/pvesh b/bin/pvesh
index 6f7687ef..936a849b 100755
--- a/bin/pvesh
+++ b/bin/pvesh
@@ -15,6 +15,7 @@ use PVE::SafeSyslog;
 use PVE::Cluster;
 use PVE::INotify;
 use PVE::RPCEnvironment;
+use PVE::API2Tools;
 use PVE::API2;
 use JSON;
 
@@ -239,10 +240,9 @@ sub map_cmd {
 sub check_proxyto {
     my ($info, $uri_param) = @_;
 
-    if ($info->{proxyto}) {
-	my $pn = $info->{proxyto};
-	my $node = $uri_param->{$pn};
-	die "proxy parameter '$pn' does not exists" if !$node;
+    if ($info->{proxyto} || $info->{proxyto_callback}) {
+	my $node = PVE::API2Tools::resolve_proxyto(
+	    $rpcenv, $info->{proxyto_callback}, $info->{proxyto}, $uri_param);
 
 	if ($node ne 'localhost' && ($node ne PVE::INotify::nodename())) {
 	    die "proxy loop detected - aborting\n" if $disable_proxy;
-- 
2.11.0




More information about the pve-devel mailing list