X-Git-Url: https://git.proxmox.com/?p=pve-client.git;a=blobdiff_plain;f=pveclient;h=c87b2cc8eabb7b220d8c392eb43dae96fca5dfe6;hp=8ef37a94b467ff7aae1601bf10a69cec3460c0f2;hb=6f6263a7ddefe1e686b7787c908b40477c48a93e;hpb=2f964a751cc71d669bc03df031a147eebc8ebe35 diff --git a/pveclient b/pveclient index 8ef37a9..c87b2cc 100755 --- a/pveclient +++ b/pveclient @@ -5,36 +5,56 @@ package PVE::CLI::pveclient; use strict; use warnings; use Cwd 'abs_path'; -use lib '/usr/share/pve-client'; -use lib '.'; use Data::Dumper; -use PVE::JSONSchema qw(register_standard_option get_standard_option); -use PVE::CLIHandler; +use PVE::APIClient::JSONSchema qw(register_standard_option get_standard_option); +use PVE::APIClient::CLIFormatter; +use PVE::APIClient::CLIHandler; +use PVE::APIClient::PTY; use PVE::APIClient::LWP; use PVE::APIClient::Helpers; +use PVE::APIClient::Config; use PVE::APIClient::Commands::config; use PVE::APIClient::Commands::remote; use PVE::APIClient::Commands::list; use PVE::APIClient::Commands::lxc; -use PVE::APIClient::Commands::help; -use PVE::APIClient::Commands::start; +use PVE::APIClient::Commands::GuestStatus; use JSON; -sub call_method { - my ($remote, $path, $method, $params) = @_; +sub call_api_method { + my ($method, $param) = @_; + my $path = PVE::APIClient::Tools::extract_param($param, 'api_path'); die "missing API path\n" if !defined($path); - my $info = PVE::APIClient::Helpers::lookup_api_method($path, $method); - print Dumper($params); + my $remote = PVE::APIClient::Tools::extract_param($param, 'remote'); + die "missing remote\n" if !defined($remote); - die "implement me"; + my $format = PVE::APIClient::Tools::extract_param($param, 'format'); + PVE::APIClient::Helpers::set_output_format($format); + + my $config = PVE::APIClient::Config->load(); + + my $uri_param = {}; + my $info = PVE::APIClient::Helpers::find_method_info($path, $method, $uri_param); + + my $conn = PVE::APIClient::Config->remote_conn($config, $remote); + + my $res = $conn->call($method, "api2/json/$path", $param); + die "undefined result" if !defined($res); + die "undefined result data" if !exists($res->{data}); + + return $res->{data}; +} + +use base qw(PVE::APIClient::CLIHandler); + +sub read_password { + return PVE::APIClient::PTY::read_password("Remote password: ") } -use base qw(PVE::CLIHandler); my $cmd = $ARGV[0]; @@ -65,11 +85,16 @@ my $path_returns = { type => 'null' }; # dynamically update schema definition for direct API call # like: pveclient api -if (my $info = PVE::APIClient::Helpers::extract_path_info()) { - $path_properties = $info->{parameters}->{properties}; +my $uri_param = {}; +if (my $info = PVE::APIClient::Helpers::extract_path_info($uri_param)) { + foreach my $key (keys %{$info->{parameters}->{properties}}) { + next if defined($uri_param->{$key}); + $path_properties->{$key} = $info->{parameters}->{properties}->{$key}; + } $path_returns = $info->{returns}; } +$path_properties->{format} = get_standard_option('pveclient-output-format'), $path_properties->{remote} = get_standard_option('pveclient-remote-name'); $path_properties->{api_path} = { description => "API path.", @@ -80,11 +105,22 @@ $path_properties->{api_path} = { }, }; + +my $format_result = sub { + my ($data) = @_; + + my $format = PVE::APIClient::Helpers::get_output_format(); + + my $options = PVE::APIClient::CLIFormatter::query_terminal_options({}); + + PVE::APIClient::CLIFormatter::print_api_result($format, $data, $path_returns, undef, $options); +}; + __PACKAGE__->register_method ({ name => 'pveclient_get', path => 'pveclient_get', method => 'GET', - description => "call API GET on .", + description => "Call API GET on .", parameters => { additionalProperties => 0, properties => $path_properties, @@ -93,17 +129,14 @@ __PACKAGE__->register_method ({ code => sub { my ($param) = @_; - my $path = PVE::Tools::extract_param($param, 'api_path'); - my $remote = PVE::Tools::extract_param($param, 'remote'); - - return call_method($remote, $path, 'GET', $param); + return call_api_method('GET', $param); }}); __PACKAGE__->register_method ({ name => 'pveclient_set', path => 'pveclient_set', method => 'PUT', - description => "call API PUT on .", + description => "Call API PUT on .", parameters => { additionalProperties => 0, properties => $path_properties, @@ -112,17 +145,14 @@ __PACKAGE__->register_method ({ code => sub { my ($param) = @_; - print Dumper($param); - - die "implement me"; - + return call_api_method('PUT', $param); }}); __PACKAGE__->register_method ({ name => 'pveclient_create', path => 'pveclient_create', method => 'PUSH', - description => "call API PUSH on .", + description => "Call API PUSH on .", parameters => { additionalProperties => 0, properties => $path_properties, @@ -131,17 +161,14 @@ __PACKAGE__->register_method ({ code => sub { my ($param) = @_; - print Dumper($param); - - die "implement me"; - + return call_api_method('PUSH', $param); }}); __PACKAGE__->register_method ({ name => 'pveclient_delete', path => 'pveclient_delete', method => 'DELETE', - description => "call API DELETE on .", + description => "Call API DELETE on .", parameters => { additionalProperties => 0, properties => $path_properties, @@ -150,10 +177,7 @@ __PACKAGE__->register_method ({ code => sub { my ($param) = @_; - print Dumper($param); - - die "implement me"; - + return call_api_method('DELETE', $param); }}); @@ -162,16 +186,28 @@ our $cmddef = { list => $PVE::APIClient::Commands::list::cmddef, lxc => $PVE::APIClient::Commands::lxc::cmddef, remote => $PVE::APIClient::Commands::remote::cmddef, - - start => $PVE::APIClient::Commands::start::cmddef, + + resume => [ 'PVE::APIClient::Commands::GuestStatus', 'resume', ['remote', 'vmid']], + shutdown => [ 'PVE::APIClient::Commands::GuestStatus', 'shutdown', ['remote', 'vmid']], + spice => [ 'PVE::APIClient::Commands::GuestStatus', 'spice', ['remote', 'vmid']], + start => [ 'PVE::APIClient::Commands::GuestStatus', 'start', ['remote', 'vmid']], + stop => [ 'PVE::APIClient::Commands::GuestStatus', 'stop', ['remote', 'vmid']], + suspend => [ 'PVE::APIClient::Commands::GuestStatus', 'suspend', ['remote', 'vmid']], api => { - get => [ __PACKAGE__, 'pveclient_get', ['remote', 'api_path']], - set => [ __PACKAGE__, 'pveclient_set', ['remote', 'api_path']], - create => [ __PACKAGE__, 'pveclient_create', ['remote', 'api_path']], - delete => [ __PACKAGE__, 'pveclient_delete', ['remote', 'api_path']], - } + get => [ __PACKAGE__, 'pveclient_get', ['remote', 'api_path'], {}, $format_result ], + set => [ __PACKAGE__, 'pveclient_set', ['remote', 'api_path'], {}, $format_result ], + create => [ __PACKAGE__, 'pveclient_create', ['remote', 'api_path'], {}, $format_result ], + delete => [ __PACKAGE__, 'pveclient_delete', ['remote', 'api_path'], {}, $format_result ], + }, }; +if ($cmd && $cmd eq 'printsynopsis') { + + print __PACKAGE__->generate_asciidoc_synopsis(); + + exit(0); +} + __PACKAGE__->run_cli_handler();