[pve-devel] [PATCH qemu-server 3/8] implement set-user-password guest agent api call

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Jun 11 10:37:20 CEST 2018


On 6/7/18 1:16 PM, Dominik Csapak wrote:
> this executes the guest agent command 'set-user-password'
> with which one can change the password of an existing user in the vm
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  PVE/API2/Qemu/Agent.pm | 68 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 66 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/API2/Qemu/Agent.pm b/PVE/API2/Qemu/Agent.pm
> index b965faf..be6ef15 100644
> --- a/PVE/API2/Qemu/Agent.pm
> +++ b/PVE/API2/Qemu/Agent.pm
> @@ -6,7 +6,9 @@ use warnings;
>  use PVE::RESTHandler;
>  use PVE::JSONSchema qw(get_standard_option);
>  use PVE::QemuServer;
> -use PVE::QemuServer::Agent qw(check_agent_available);
> +use PVE::QemuServer::Agent qw(raise_agent_error check_agent_available);

you add 'raise_agent_error' to imports but never use it
anywhere here?

> +use MIME::Base64 qw(encode_base64 decode_base64);
> +use JSON;
>  
>  use base qw(PVE::RESTHandler);
>  
> @@ -108,7 +110,12 @@ __PACKAGE__->register_method({
>  
>  	my $result = [];
>  
> -	for my $cmd (sort keys %$guest_agent_commands) {
> +	my $cmds = [keys %$guest_agent_commands];
> +	push @$cmds, qw(
> +	    set-user-password
> +	);
> +
> +	for my $cmd ( sort @$cmds) {

whitespace error    ^^^

looks OK besides that

>  	    push @$result, { name => $cmd };
>  	}
>  
> @@ -190,4 +197,61 @@ for my $cmd (sort keys %$guest_agent_commands) {
>      __PACKAGE__->register_command($cmd, $props->{method}, $props->{perms});
>  }
>  
> +# commands with parameters are complicated and we want to register them manually
> +__PACKAGE__->register_method({
> +    name => 'set-user-password',
> +    path => 'set-user-password',
> +    method => 'POST',
> +    protected => 1,
> +    proxyto => 'node',
> +    description => "Sets the password for the given user to the given password",
> +    permissions => { check => [ 'perm', '/vms/{vmid}', [ 'VM.Monitor' ]]},
> +    parameters => {
> +	additionalProperties => 0,
> +	properties => {
> +	    node => get_standard_option('pve-node'),
> +	    vmid => get_standard_option('pve-vmid', {
> +		    completion => \&PVE::QemuServer::complete_vmid_running }),
> +	    username => {
> +		type => 'string',
> +		description => 'The user to set the password for.'
> +	    },
> +	    password => {
> +		type => 'string',
> +		description => 'The new password.',
> +		minLength => 5,
> +		maxLength => 64,
> +	    },
> +	    crypted => {
> +		type => 'boolean',
> +		description => 'set to 1 if the password has already been passed through crypt()',
> +		optional => 1,
> +		default => 0,
> +	    },
> +	},
> +    },
> +    returns => {
> +	type => 'object',
> +	description => "Returns an object with a single `result` property.",
> +    },
> +    code => sub {
> +	my ($param) = @_;
> +
> +	my $vmid = $param->{vmid};
> +
> +	my $conf = PVE::QemuConfig->load_config ($vmid); # check if VM exists
> +
> +	check_agent_available($vmid, $conf);
> +
> +	my $crypted = $param->{crypted} // 0;
> +	my $args = {
> +	    username => $param->{username},
> +	    password => encode_base64($param->{password}),
> +	    crypted => $crypted ? JSON::true : JSON::false,
> +	};
> +	my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-set-user-password", %$args);
> +
> +	return { result => $res };
> +    }});
> +
>  1;
> 





More information about the pve-devel mailing list