[pve-devel] r6129 - in pve-common/trunk/data: . PVE

svn-commits at proxmox.com svn-commits at proxmox.com
Tue Jun 21 10:37:25 CEST 2011


Author: dietmar
Date: 2011-06-21 10:37:25 +0200 (Tue, 21 Jun 2011)
New Revision: 6129

Modified:
   pve-common/trunk/data/ChangeLog
   pve-common/trunk/data/PVE/RESTHandler.pm
   pve-common/trunk/data/PVE/Tools.pm
Log:


Modified: pve-common/trunk/data/ChangeLog
===================================================================
--- pve-common/trunk/data/ChangeLog	2011-06-21 05:33:51 UTC (rev 6128)
+++ pve-common/trunk/data/ChangeLog	2011-06-21 08:37:25 UTC (rev 6129)
@@ -1,3 +1,9 @@
+2011-06-21  Proxmox Support Team  <support at proxmox.com>
+
+	* PVE/RESTHandler.pm (api_dump): new - used to generate docu
+
+	* PVE/Tools.pm (upid_decode): fix upid parser
+
 2011-05-10  Proxmox Support Team  <support at proxmox.com>
 
 	* PVE/RESTHandler.pm (handle): untaint parameters after validate

Modified: pve-common/trunk/data/PVE/RESTHandler.pm
===================================================================
--- pve-common/trunk/data/PVE/RESTHandler.pm	2011-06-21 05:33:51 UTC (rev 6128)
+++ pve-common/trunk/data/PVE/RESTHandler.pm	2011-06-21 08:37:25 UTC (rev 6129)
@@ -9,6 +9,7 @@
 use PVE::JSONSchema;
 use HTTP::Status qw(:constants :is status_message);
 use Text::Wrap;
+use Storable qw(dclone);
 
 # fixme: use new PVE::Exception
 
@@ -19,6 +20,129 @@
 
 our $AUTOLOAD;  # it's a package global
 
+sub api_clone_schema {
+    my ($schema) = @_;
+
+    my $res = {};
+    my $ref = ref($schema);
+    die "not a HASH reference" if !($ref && $ref eq 'HASH');
+
+    foreach my $k (keys %$schema) {
+	my $d = $schema->{$k};
+	if ($k ne 'properties') {
+	    $res->{$k} = ref($d) ? dclone($d) : $d;
+	    next;
+	}
+	# convert indexed parameters like -net\d+ to -net[n]
+	foreach my $p (keys %$d) {
+	    my $pd = $d->{$p};
+	    if ($p =~ m/^([a-z]+)(\d+)$/) {
+		if ($2 == 0) {
+		    $p = "$1\[n\]";
+		} else {
+		    next;
+		}
+	    }
+	    $res->{$k}->{$p} = ref($pd) ? dclone($pd) : $pd;
+	}
+    }
+
+    return $res;
+}
+
+sub api_dump_full {
+    my ($tree, $index, $class, $prefix) = @_;
+
+    $prefix = '' if !$prefix;
+
+    my $ma = $method_registry->{$class};
+
+    foreach my $info (@$ma) {
+
+	my $path = "$prefix/$info->{path}";
+	$path =~ s/\/+$//;
+
+	if ($info->{subclass}) {
+	    api_dump_full($tree, $index, $info->{subclass}, $path);
+	} else {
+	    next if !$path;
+
+	    # check if method is unique
+	    my $realpath = $path;
+	    $realpath =~ s/\{[^\}]+\}/\{\}/g;
+	    my $fullpath = "$info->{method} $realpath";
+	    die "duplicate path '$realpath'" if $index->{$fullpath};
+	    $index->{$fullpath} = $info;
+
+	    # insert into tree
+	    my $treedir = $tree;
+	    my $res;
+	    my $sp = '';
+	    foreach my $dir (split('/', $path)) {
+		next if !$dir;
+		$sp .= "/$dir";
+		$res = (grep { $_->{text} eq $dir } @$treedir)[0];
+		if ($res) {
+		    $res->{children} = [] if !$res->{children};
+		    $treedir = $res->{children};
+		} else {
+		    $res = {
+			path => $sp,
+			text => $dir,
+			children => [],
+		    };
+		    push @$treedir, $res;
+		    $treedir = $res->{children};
+		}
+	    }
+
+	    if ($res) {
+		my $data = {};
+		foreach my $k (keys %$info) {
+		    next if $k eq 'code' || $k eq "match_name" || $k eq "match_re" ||
+			$k eq "path";
+
+		    my $d = $info->{$k};
+		    
+		    if ($k eq 'parameters') {
+			$data->{$k} = api_clone_schema($d);
+		    } else {
+
+			$data->{$k} = ref($d) ? dclone($d) : $d;
+		    }
+		} 
+		$res->{info}->{$info->{method}} = $data;
+	    };
+	}
+    }
+};
+
+sub api_dump_cleanup_tree {
+    my ($tree) = @_;
+
+    foreach my $rec (@$tree) {
+	delete $rec->{children} if $rec->{children} && !scalar(@{$rec->{children}});
+	if ($rec->{children}) {
+	    $rec->{leaf} = 0;
+	    api_dump_cleanup_tree($rec->{children});
+	} else {
+	    $rec->{leaf} = 1;
+	}
+    }
+
+}
+
+sub api_dump {
+    my ($class, $prefix) = @_;
+
+    my $tree = [];
+
+    my $index = {};
+    api_dump_full($tree, $index, $class);
+    api_dump_cleanup_tree($tree);
+    return $tree;
+};
+
 sub validate_method_schemas {
 
     foreach my $class (keys %$method_registry) {

Modified: pve-common/trunk/data/PVE/Tools.pm
===================================================================
--- pve-common/trunk/data/PVE/Tools.pm	2011-06-21 05:33:51 UTC (rev 6128)
+++ pve-common/trunk/data/PVE/Tools.pm	2011-06-21 08:37:25 UTC (rev 6129)
@@ -537,7 +537,7 @@
     my $filename;
 
     # "UPID:$node:$pid:$pstart:$startime:$dtype:$id:$user"
-    if ($upid =~ m/^UPID:(\w+):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/) {
+    if ($upid =~ m/^UPID:([A-Za-z][[:alnum:]\-]*[[:alnum:]]+):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/) {
 	$res->{node} = $1;
 	$res->{pid} = hex($2);
 	$res->{pstart} = hex($3);



More information about the pve-devel mailing list