X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FCLIHandler.pm;h=736e5ecb880fea8397ea50e6759487d5e20cb553;hp=1af9987c56c65d6b12a239df14177ae29627d632;hb=b01af86160823b8cc00c2500f6e123c424d82f3c;hpb=6627ae09a03b4898c519de50ea5d26effad7cd15 diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm index 1af9987..736e5ec 100644 --- a/src/PVE/CLIHandler.pm +++ b/src/PVE/CLIHandler.pm @@ -10,6 +10,29 @@ use PVE::INotify; use base qw(PVE::RESTHandler); +# $cmddef defines which (sub)commands are available in a specific CLI class. +# A real command is always an array consisting of its class, name, array of +# position fixed (required) parameters and hash of predefined parameters when +# mapping a CLI command t o an API call. Optionally an output method can be +# passed at the end, e.g., for formatting or transformation purpose. +# +# [class, name, fixed_params, API_pre-set params, output_sub ] +# +# In case of so called 'simple commands', the $cmddef can be also just an +# array. +# +# Examples: +# $cmddef = { +# command => [ 'PVE::API2::Class', 'command', [ 'arg1', 'arg2' ], { node => $nodename } ], +# do => { +# this => [ 'PVE::API2::OtherClass', 'method', [ 'arg1' ], undef, sub { +# my ($res) = @_; +# print "$res\n"; +# }], +# that => [ 'PVE::API2::OtherClass', 'subroutine' [] ], +# }, +# dothat => { alias => 'do that' }, +# } my $cmddef; my $exename; my $cli_handler_class; @@ -434,7 +457,7 @@ sub setup_environment { } my $handle_cmd = sub { - my ($args, $pwcallback, $preparefunc, $stringfilemap) = @_; + my ($args, $pwcallback, $preparefunc, $param_mapping_func) = @_; $cmddef->{help} = [ __PACKAGE__, 'help', ['extra-args'] ]; @@ -462,17 +485,17 @@ my $handle_cmd = sub { &$preparefunc() if $preparefunc; - my ($class, $name, $arg_param, $uri_param, $outsub) = @{$cmddef->{$cmd} || []}; + my ($class, $name, $arg_param, $uri_param, $outsub) = @{$def || []}; $abort->("unknown command '$cmd_str'") if !$class; my $prefix = "$exename $cmd_str"; - my $res = $class->cli_handler($prefix, $name, $cmd_args, $arg_param, $uri_param, $pwcallback, $stringfilemap); + my $res = $class->cli_handler($prefix, $name, $cmd_args, $arg_param, $uri_param, $pwcallback, $param_mapping_func); &$outsub($res) if $outsub; }; my $handle_simple_cmd = sub { - my ($args, $pwcallback, $preparefunc, $stringfilemap) = @_; + my ($args, $pwcallback, $preparefunc, $param_mapping_func) = @_; my ($class, $name, $arg_param, $uri_param, $outsub) = @{$cmddef}; die "no class specified" if !$class; @@ -501,7 +524,7 @@ my $handle_simple_cmd = sub { &$preparefunc() if $preparefunc; - my $res = $class->cli_handler($name, $name, \@ARGV, $arg_param, $uri_param, $pwcallback, $stringfilemap); + my $res = $class->cli_handler($name, $name, \@ARGV, $arg_param, $uri_param, $pwcallback, $param_mapping_func); &$outsub($res) if $outsub; }; @@ -523,7 +546,7 @@ sub run_cli_handler { my $preparefunc = $params{prepare}; my $pwcallback = $class->can('read_password'); - my $stringfilemap = $class->can('string_param_file_mapping'); + my $param_mapping_func = $class->can('string_param_file_mapping'); $exename = &$get_exe_name($class); @@ -533,9 +556,9 @@ sub run_cli_handler { $cmddef = ${"${class}::cmddef"}; if (ref($cmddef) eq 'ARRAY') { - &$handle_simple_cmd(\@ARGV, $pwcallback, $preparefunc, $stringfilemap); + &$handle_simple_cmd(\@ARGV, $pwcallback, $preparefunc, $param_mapping_func); } else { - &$handle_cmd(\@ARGV, $pwcallback, $preparefunc, $stringfilemap); + &$handle_cmd(\@ARGV, $pwcallback, $preparefunc, $param_mapping_func); } exit 0;