[pve-devel] [pve-manager] pvesr set_state

Thomas Lamprecht t.lamprecht at proxmox.com
Fri Jun 9 11:05:29 CEST 2017


On 06/09/2017 09:59 AM, Thomas Lamprecht wrote:
>
>
> On 06/09/2017 08:19 AM, Wolfgang Link wrote:
>> ---
>>   PVE/CLI/pvesr.pm | 33 +++++++++++++++++++++++++++++++++
>>   1 file changed, 33 insertions(+)
>>
>> diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm
>> index f64a3103..ca8cd59c 100644
>> --- a/PVE/CLI/pvesr.pm
>> +++ b/PVE/CLI/pvesr.pm
>> @@ -288,6 +288,38 @@ __PACKAGE__->register_method ({
>>       return PVE::API2::ReplicationConfig->update($param);
>>       }});
>>   +__PACKAGE__->register_method ({
>> +    name => 'set_state',
>> +    path => '',
>> +    protected => 1,
>> +    method => 'POST',
>> +    description => "Set the job replication state on migration. This 
>> call is for internal use. It will accept the job state as ja JSON obj.",
>> +    permissions => {
>> +    check => ['perm', '/storage', ['Datastore.Allocate']],
>> +    },
>> +    parameters => {
>> +    additionalProperties => 0,
>> +    properties => {
>> +        vmid => get_standard_option('pve-vmid', { completion => 
>> \&PVE::Cluster::complete_vmid }),
>> +        state => {
>> +        description => "Job state as JSON decoded string.",
>> +        type => 'string',
>> +        },
>> +    },
>> +    },
>> +    returns => { type => 'null' },
>> +    code => sub {
>> +    my ($param) = @_;
>> +
>> +    my $vmid = extract_param($param, 'vmid');
>> +    my $json_string = extract_param($param, 'state');
>> +    my $remote_job_state= decode_json $json_string;
>
> That looks all in all quite unsafe?! state can be an arbitrary string,
> if it's not valid json 'decode_json' catches it, but the error 
> messages isn't quite nice, e.g.:
> # malformed JSON string, neither tag, array, object, number, string or 
> atom, at character offset 0 (before "foo") at -e line 1.
>
>
> Even if valid JSON it isn't ensured that it's a valid replication 
> state JSON object
> (you do not input check $state in the set_remote_statemethod from the 
> other patch)
> Isn't there a schematic definition about how a state could look like, 
> i.e. which entries are valid?
>
> Further it's isn't checked if vmid exists or if there is even a job 
> for that VMID where such a state could be altered, is this OK?
> set_remote_state doesn't check for this either...
>


Dietmar told my that this is an internal API only exposed over CLI, so 
my comments can be somewhat disregarded.
Although I'd still do some input/error checks, imo this is always good 
and helps to prevent bugs or unwanted API misuse.


>> +
>> +    PVE::ReplicationState::set_remote_state($remote_job_state, $vmid);
>> +    return undef;
>> +    }});
>> +
>> +
>>   my $print_job_list = sub {
>>       my ($list) = @_;
>>   @@ -359,6 +391,7 @@ our $cmddef = {
>>       'finalize-local-job' => [ __PACKAGE__, 'finalize_local_job', 
>> ['id', 'extra-args'], {} ],
>>         run => [ __PACKAGE__ , 'run'],
>> +    'set-state' => [ __PACKAGE__ , 'set_state', ['vmid', 'state']],
>>   };
>>     1;
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel





More information about the pve-devel mailing list