[pve-devel] r5073 - in pve-manager/pve2: . bin

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Aug 27 11:39:18 CEST 2010


Author: dietmar
Date: 2010-08-27 09:39:18 +0000 (Fri, 27 Aug 2010)
New Revision: 5073

Modified:
   pve-manager/pve2/ChangeLog
   pve-manager/pve2/bin/pvesh
Log:
better help 


Modified: pve-manager/pve2/ChangeLog
===================================================================
--- pve-manager/pve2/ChangeLog	2010-08-27 09:38:10 UTC (rev 5072)
+++ pve-manager/pve2/ChangeLog	2010-08-27 09:39:18 UTC (rev 5073)
@@ -2,6 +2,7 @@
 
 	* bin/pvesh (list_dir): do not display all data - instead display
 	some info about available methods.
+	(pve_command): better 'help' implementation
 
 2010-08-26  Proxmox Support Team  <support at proxmox.com>
 

Modified: pve-manager/pve2/bin/pvesh
===================================================================
--- pve-manager/pve2/bin/pvesh	2010-08-27 09:38:10 UTC (rev 5072)
+++ pve-manager/pve2/bin/pvesh	2010-08-27 09:39:18 UTC (rev 5073)
@@ -9,6 +9,7 @@
 use strict;
 use Term::ReadLine;
 use File::Basename;
+use Getopt::Long;
 use HTTP::Status qw(:constants :is status_message);
 use Text::ParseWords;
 use PVE::JSONSchema;
@@ -73,6 +74,23 @@
     return $input;
 };
 
+sub reverse_map_cmd {
+    my $method = shift;
+
+    my $mmap = {
+	GET => 'get',
+	PUT => 'set',
+	POST => 'create',
+	DELETE => 'delete',
+    };
+
+    my $cmd = $mmap->{$method};
+
+    die "got strange value for method ('$method') - internal error" if !$cmd;
+
+    return $cmd;
+}
+
 sub map_cmd {
     my $cmd = shift;
 
@@ -114,20 +132,68 @@
     return $data;
 }
 
+sub find_resource_methods {
+    my ($path, $ihash) = @_;
+
+    for my $method (qw(GET POST PUT DELETE)) {
+	my $uri_param = {};
+	my ($handler, $info, $pm) = PVE::API2->find_handler($method, $path, $uri_param);
+	if ($handler && $info && !$ihash->{$info}) {
+	    $ihash->{$info} = {
+		path => $pm,
+		handler => $handler, 
+		info => $info, 
+		uri_param => $uri_param,
+	    };
+	}
+    }
+}
+
 sub print_help {
-    my ($cmd, $dir) = @_;
+    my ($path, $opts) = @_;
 
-    my $method = map_cmd($cmd);
+    my $ihash = {};
 
+    find_resource_methods($path, $ihash);
+
+    if (!scalar(keys(%$ihash))) {
+	die "no such resource\n";
+    }
+
     my $uri_param = {};
-    my ($handler, $info) = PVE::API2->find_handler($method, $dir, $uri_param);
-    if (!$handler || !$info) {
-	die "no '$cmd' handler for '$dir'\n";
+    my ($handler, $info, $pm) = PVE::API2->find_handler('GET', $path, $uri_param);
+    if ($handler && $info) {
+	# gather info about children	
+	eval {
+	    my $data = $handler->cli_handler2("ls $path", $info->{name}, [], [], $uri_param, $read_password);
+	    my $lnk = PVE::JSONSchema::method_get_child_link($info);
+	    my $children = extract_children($lnk, $data);
+
+	    foreach my $c (@$children) {
+		my $cp = abs_path($path, $c);
+		find_resource_methods($cp, $ihash);
+	    }
+	}
     }
 
-    print $handler->usage_str($info->{name}, "$cmd $dir", [], $uri_param, 'full', 1);
-}
+    foreach my $mi (sort { $a->{path} cmp $b->{path} } values %$ihash) {
+	my $method = $mi->{info}->{method};
 
+	# we skip index methods for now.
+	next if ($method eq 'GET') && PVE::JSONSchema::method_get_child_link($mi->{info});
+
+	my $path = $mi->{path};
+	$path =~ s|/+$||; # remove trailing slash
+
+	my $cmd = reverse_map_cmd($method);
+
+	print $mi->{handler}->usage_str($mi->{info}->{name}, "$cmd $path", [], $mi->{uri_param}, 
+					$opts->{verbose} ? 'full' : 'short', 1);
+	print "\n\n" if $opts->{verbose};
+    }
+ 
+};
+
 sub resource_cap {
     my ($path) = @_;
 
@@ -168,6 +234,27 @@
     return $res;
 }
 
+sub extract_children {
+    my ($lnk, $data) = @_;
+
+    my $res = [];
+
+    return $res if !($lnk && $data);
+
+    my $href = $lnk->{href};
+    if ($href =~ m/^\{(\S+)\}$/) {
+	my $prop = $1;
+
+	foreach my $elem (sort {$a->{$prop} cmp $b->{$prop}} @$data) {
+	    next if !ref($elem);
+	    my $value = $elem->{$prop};
+	    push @$res, $value;
+	}
+    }
+
+    return $res;
+}
+
 sub list_dir {
     my ($dir, $args) = @_;
 
@@ -181,25 +268,13 @@
 	die "resource does not define child links\n";
     }
 
-    my $data = $handler->cli_handler2("ls $dir", $info->{name}, $args, [], $uri_param, $read_password);
- 
+    my $data = $handler->cli_handler2("ls $dir", $info->{name}, $args, [], $uri_param, $read_password); 
     my $lnk = PVE::JSONSchema::method_get_child_link($info);
-    if ($lnk && $data) {
-	my $href = $lnk->{href};
-	if ($href =~ m/^\{(\S+)\}$/) {
-	    my $prop = $1;
+    my $children = extract_children($lnk, $data);
 
-	    foreach my $elem (sort {$a->{$prop} cmp $b->{$prop}} @$data) {
-		next if !ref($elem);
-
-		if (defined(my $value = $elem->{$prop})) {
-		    if ($value ne '') {
-			my $cap = resource_cap(abs_path($dir, $value));
-			print "$cap $value\n";
-		    }
-		}
-	    }
-	}
+    foreach my $c (@$children) {
+	my $cap = resource_cap(abs_path($dir, $c));
+	print "$cap $c\n";
     }
 }
 
@@ -210,9 +285,6 @@
 
     my $cmd = shift @$args;
 
-    #print "CMD: $cmd\n";
-    #print "ARGS: " . join (' ', @$args) . "\n";
-    
     if ($cmd eq 'cd') {
 
 	my $path =  shift @$args;
@@ -231,17 +303,27 @@
 
     } elsif ($cmd eq 'help') {
 
-	my $cmd = shift @$args;
+	my $help_usage_error = sub {
+	    die "usage: help [path] [--verbose]\n";
+	};
 
+	my $opts = {};
+
+	&$help_usage_error() if !Getopt::Long::GetOptionsFromArray($args, $opts, 'verbose');
+
 	my $path;
 	if (scalar(@$args) && $args->[0] !~ m/^\-/)  {
 	    $path = shift @$args;
 	}
 
-	die "usage: help <get|set|create|delete|ls> [path]\n" if !$cmd || scalar(@$args);
+	&$help_usage_error() if scalar(@$args);
 
-	print_help($cmd, abs_path($cdir, $path));
+	print "help [path] [--verbose]\n";
+	print "cd [path]\n";
+	print "ls [path]\n\n";
 
+	print_help(abs_path($cdir, $path), $opts);
+
     } elsif ($cmd eq 'ls') {
 	my $path;
 	if (scalar(@$args) && $args->[0] !~ m/^\-/)  {



More information about the pve-devel mailing list