Using the json output, as suggested by Thomas, we now die if the decoding
fails and, if not, all return values are set to the corresponding decoded
values. That should prevent any unforeseen null size values, except if
qemu-img info reports it, which we then consider as valid.

Signed-off-by: Tim Marx <t.m...@proxmox.com>
---
 PVE/Storage/Plugin.pm | 43 ++++++++++++++++---------------------------
 1 file changed, 16 insertions(+), 27 deletions(-)

diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index 39622f3..741e889 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -712,38 +712,27 @@ sub file_size_info {
        return wantarray ? (0, 'subvol', 0, undef) : 1;
     }
 
-    my $format;
-    my $parent;
-    my $size = 0;
-    my $used = 0;
-
-    my $parse_qemu_img_info = sub {
-       my $line = shift;
-       if ($line =~ m/^file format:\s+(\S+)\s*$/) {
-           $format = $1;
-       } elsif ($line =~ m/^backing file:\s(\S+)\s/) {
-           $parent = $1;
-       } elsif ($line =~ m/^virtual size:\s\S+\s+\((\d+)\s+bytes\)$/) {
-           $size = int($1);
-       } elsif ($line =~ m/^disk size:\s+(\d+(.\d+)?)([KMGT])\s*$/) {
-           $used = $1;
-           my $u = $3;
-
-           $used *= 1024 if $u eq 'K';
-           $used *= (1024*1024) if $u eq 'M';
-           $used *= (1024*1024*1024) if $u eq 'G';
-           $used *= (1024*1024*1024*1024) if $u eq 'T';
-
-           $used = int($used);
-       }
-    };
+    my $cmd = ['/usr/bin/qemu-img', 'info', '--output=json', $filename];
+    my $json = '';
 
-    my $cmd = ['/usr/bin/qemu-img', 'info', $filename];
     eval {
-       run_command($cmd, timeout => $timeout, outfunc => $parse_qemu_img_info 
);
+       run_command($cmd, timeout => $timeout, outfunc => sub { $json .= shift 
},
+       errfunc => sub {
+           my $line = shift;
+           warn $line;
+       });
+
     };
+
     warn $@ if $@;
 
+    my $decoded = decode_json($json);
+
+    my $format = $decoded->{format};
+    my $parent = $decoded->{'backing-filename'};
+    my $size = $decoded->{'virtual-size'};
+    my $used = $decoded->{'actual-size'};
+
     return wantarray ? ($size, $format, $used, $parent) : $size;
 }
 
-- 
2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to