+}
+my sub duration_to_human {
+ my ($seconds) = @_;
+
+ return sprintf('%2ds', $seconds) if $seconds < 60;
+ my $minutes = $seconds / 60;
+ $seconds = $seconds % 60;
+
+ return sprintf('%2dm %2ds', $minutes, $seconds) if $minutes < 60;
+ my $hours = $minutes / 60;
+ $minutes = $minutes % 60;
+
+ return sprintf('%2dh %2dm %2ds', $hours, $minutes, $seconds) if $hours < 24;
+ my $days = $hours / 24;
+ $hours = $hours % 24;
+
+ return sprintf('%2dd %2dh %2dm', $days, $hours, $minutes);
+}
+
+my $bitmap_action_to_human = sub {
+ my ($self, $info) = @_;
+
+ my $action = $info->{action};
+
+ if ($action eq "not-used") {
+ return "disabled (no support)" if $self->{vm_was_running};
+ return "disabled (VM not running)";
+ } elsif ($action eq "not-used-removed") {
+ return "disabled (old bitmap cleared)";
+ } elsif ($action eq "new") {
+ return "created new";
+ } elsif ($action eq "used") {
+ if ($info->{dirty} == 0) {
+ return "OK (drive clean)";
+ } else {
+ my $size = bytes_to_human($info->{size});
+ my $dirty = bytes_to_human($info->{dirty});
+ return "OK ($dirty of $size dirty)";
+ }
+ } elsif ($action eq "invalid") {
+ return "existing bitmap was invalid and has been cleared";
+ } else {
+ return "unknown";
+ }