X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FCLIHandler.pm;h=e6fd415b3ef4fd237c03db93eb038e835e7d1bed;hp=3ce9eb8baf3ed5fa897d86f49d85852fcafd01a4;hb=2a8ced7bacb7da8ab4143a59720e74a2897cf714;hpb=bb958629be4dee993e08c064f62bfcbe4f89f01a diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm index 3ce9eb8..e6fd415 100644 --- a/src/PVE/CLIHandler.pm +++ b/src/PVE/CLIHandler.pm @@ -34,6 +34,19 @@ my $expand_command_name = sub { return $cmd; }; +my $complete_command_names = sub { + my $res = []; + + return if ref($cmddef) ne 'HASH'; + + foreach my $cmd (keys %$cmddef) { + next if $cmd eq 'help'; + push @$res, $cmd; + } + + return $res; +}; + __PACKAGE__->register_method ({ name => 'help', path => 'help', @@ -46,6 +59,7 @@ __PACKAGE__->register_method ({ description => "Command name", type => 'string', optional => 1, + completion => $complete_command_names, }, verbose => { description => "Verbose output format.", @@ -309,12 +323,16 @@ sub find_cli_class_source { my $filename; my $cpath = "PVE/CLI/${exename}.pm"; + my $spath = "PVE/Service/${exename}.pm"; foreach my $p (@INC) { - my $testfn = "$p/$cpath"; - if (-f $testfn) { - $filename = $testfn; - last; + foreach my $s (($cpath, $spath)) { + my $testfn = "$p/$s"; + if (-f $testfn) { + $filename = $testfn; + last; + } } + last if defined($filename); } return $filename; @@ -337,11 +355,14 @@ sub generate_pod_manpage { print_simple_pod_manpage($podfn, @$def); } else { $cmddef = $def; + + $cmddef->{help} = [ __PACKAGE__, 'help', ['cmd'] ]; + print_pod_manpage($podfn); } } -sub run { +sub run_cli { my ($class, $pwcallback, $podfn, $preparefunc) = @_; $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; @@ -351,14 +372,17 @@ sub run { initlog($exename); - die "please run as root\n" if $> != 0; - PVE::INotify::inotify_init(); + if ($class !~ m/^PVE::Service::/) { + die "please run as root\n" if $> != 0; - my $rpcenv = PVE::RPCEnvironment->init('cli'); - $rpcenv->init_request(); - $rpcenv->set_language($ENV{LANG}); - $rpcenv->set_user('root@pam'); + PVE::INotify::inotify_init(); + + my $rpcenv = PVE::RPCEnvironment->init('cli'); + $rpcenv->init_request(); + $rpcenv->set_language($ENV{LANG}); + $rpcenv->set_user('root@pam'); + } no strict 'refs'; my $def = ${"${class}::cmddef"}; @@ -389,6 +413,7 @@ sub handle_cmd { PVE::RESTHandler::validate_method_schemas(); return; } elsif ($cmd eq 'printmanpod') { + $podfn = find_cli_class_source($exename) if !defined($podfn); print_pod_manpage($podfn); return; } elsif ($cmd eq 'bashcomplete') {