qm/pct listsnapshot lack feature parity w.r.t. showing snapshots in a tree ordered by the date. by moving this code into GuestHelpers, it can be shared.
Signed-off-by: Oguz Bektas <o.bek...@proxmox.com> --- PVE/GuestHelpers.pm | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/PVE/GuestHelpers.pm b/PVE/GuestHelpers.pm index ebe2781..64e26c9 100644 --- a/PVE/GuestHelpers.pm +++ b/PVE/GuestHelpers.pm @@ -6,6 +6,8 @@ use warnings; use PVE::Tools; use PVE::Storage; +use POSIX qw(strftime); + # We use a separate lock to block migration while a replication job # is running. @@ -60,4 +62,56 @@ sub exec_hookscript { } } +sub snapshot_tree { + my ($res) = @_; + + my $snapshots = { map { $_->{name} => $_ } @$res }; + + my @roots; + foreach my $e (@$res) { + my $parent; + if (($parent = $e->{parent}) && defined $snapshots->{$parent}) { + push @{$snapshots->{$parent}->{children}}, $e->{name}; + } else { + push @roots, $e->{name}; + } + } + + # sort the elements by snaptime - with "current" (no snaptime) highest + my $snaptimesort = sub { + return +1 if !defined $snapshots->{$a}->{snaptime}; + return -1 if !defined $snapshots->{$b}->{snaptime}; + return $snapshots->{$a}->{snaptime} <=> $snapshots->{$b}->{snaptime}; + }; + + # recursion function for displaying the tree + my $snapshottree; + $snapshottree = sub { + my ($prefix, $root, $snapshots) = @_; + my $e = $snapshots->{$root}; + + my $description = $e->{description} || 'no-description'; + ($description) = $description =~ m/(.*)$/m; + + my $timestring = ""; + if (defined $e->{snaptime}) { + $timestring = strftime("%F %H:%M:%S", localtime($e->{snaptime})); + } + + my $len = 30 - length($prefix); # for aligning the description + printf("%s %-${len}s %-23s %s\n", $prefix, $root, $timestring, $description); + + if ($e->{children}) { + $prefix = " $prefix"; + foreach my $child (sort $snaptimesort @{$e->{children}}) { + $snapshottree->($prefix, $child, $snapshots); + } + } + }; + + foreach my $root (sort $snaptimesort @roots) { + $snapshottree->('`->', $root, $snapshots); + } +} + 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel