]> git.proxmox.com Git - pve-access-control.git/blobdiff - PVE/RPCEnvironment.pm
cleanup code to get/set result_attributes
[pve-access-control.git] / PVE / RPCEnvironment.pm
index 55b82e3500c36c15106bbe0e7fb3f8a60eb78589..f65a776134b271a8d6b0c8e3fd5c1e8280997280 100644 (file)
@@ -13,6 +13,7 @@ use PVE::INotify;
 use PVE::Cluster;
 use PVE::ProcFSTools;
 use PVE::AccessControl;
+use CGI;
 
 # we use this singleton class to pass RPC related environment values
 
@@ -179,7 +180,7 @@ sub init {
 
     die "already initialized" if $pve_env;
 
-    die "unknown environment type" if !$type || $type !~ m/^(cli|pub|priv)$/;
+    die "unknown environment type" if !$type || $type !~ m/^(cli|pub|priv|ha)$/;
 
     $SIG{CHLD} = $worker_reaper;
 
@@ -187,6 +188,7 @@ sub init {
     # cli  ... command started fron command line
     # pub  ... access from public server (apache)
     # priv ... access from private server (pvedaemon)
+    # ha   ... access from HA resource manager agent (rgmanager)
     
     my $self = {
        user_cfg => {},
@@ -224,16 +226,68 @@ sub get {
     return $pve_env;
 }
 
+sub parse_params {
+    my ($self, $enable_upload) = @_;
+
+    if ($self->{request_rec}) {
+       my $cgi;
+       if ($enable_upload) {
+           $cgi = CGI->new($self->{request_rec});
+       } else {
+           # disable upload using empty upload_hook
+           $cgi = CGI->new($self->{request_rec}, sub {}, undef, 0);
+       }
+       $self->{cgi} = $cgi;
+       my $params = $cgi->Vars();
+       return $params;
+    } elsif ($self->{params}) {
+       return $self->{params};
+    } else {
+       die "no parameters registered";
+    }
+}
+
+sub get_upload_info {
+    my ($self, $param) = @_;
+
+    my $cgi = $self->{cgi};
+    die "CGI not initialized" if !$cgi;
+
+    my $pd = $cgi->param($param);
+    die "unable to get cgi parameter info\n" if !$pd;
+    my $info = $cgi->uploadInfo($pd);
+    die "unable to get cgi upload info\n" if !$info;
+
+    my $res = { %$info };
+
+    my $tmpfilename = $cgi->tmpFileName($pd);
+    die "unable to get cgi upload file name\n" if !$tmpfilename;
+    $res->{tmpfilename} = $tmpfilename;
+
+    #my $hndl = $cgi->upload($param);
+    #die "unable to get cgi upload handle\n" if !$hndl;
+    #$res->{handle} = $hndl->handle;
+
+    return $res;
+}
+
 # init_request - must be called before each RPC request
 sub init_request {
     my ($self, %params) = @_;
 
     PVE::Cluster::cfs_update();
 
+    $self->{result_attributes} = {};
+
     my $userconfig; # we use this for regression tests
     foreach my $p (keys %params) {
        if ($p eq 'userconfig') {
            $userconfig = $params{$p};
+       } elsif ($p eq 'request_rec') {
+           # pass Apache2::RequestRec
+           $self->{request_rec} = $params{$p};
+       } elsif ($p eq 'params') {
+           $self->{params} = $params{$p};
        } else {
            die "unknown parameter '$p'";
        }
@@ -273,16 +327,16 @@ sub get_client_ip {
     return $self->{client_ip};
 }
 
-sub set_result_count {
-    my ($self, $count) = @_;
+sub set_result_attrib {
+    my ($self, $key, $value) = @_;
 
-    $self->{result_count} = $count;
+    $self->{result_attributes}->{$key} = $value;
 }
 
-sub get_result_count {
-    my ($self) = @_;
+sub get_result_attrib {
+    my ($self, $key) = @_;
 
-    return $self->{result_count};
+    return $self->{result_attributes}->{$key};
 }
 
 sub set_language {
@@ -586,6 +640,9 @@ sub fork_worker {
        POSIX::read($csync[0], $readbuf, 4096);
        die "parent setup error\n" if $readbuf ne 'OK';
 
+       if ($self->{type} eq 'ha') {
+           print "task started by HA resource agent\n";
+       }
        eval { &$function($upid); };
        my $err = $@;
        if ($err) {