]>
git.proxmox.com Git - pve-guest-common.git/blob - PVE/GuestHelpers.pm
1 package PVE
::GuestHelpers
;
9 use POSIX
qw(strftime);
11 # We use a separate lock to block migration while a replication job
14 our $lockdir = '/var/lock/pve-manager';
16 sub guest_migration_lock
{
17 my ($vmid, $timeout, $func, @param) = @_;
19 my $lockid = "pve-migrate-$vmid";
23 my $res = PVE
::Tools
::lock_file
("$lockdir/$lockid", $timeout, $func, @param);
29 sub check_hookscript
{
30 my ($volid, $storecfg) = @_;
32 $storecfg = PVE
::Storage
::config
() if !defined($storecfg);
33 my ($path, undef, $type) = PVE
::Storage
::path
($storecfg, $volid);
35 die "'$volid' is not in the snippets directory\n"
36 if $type ne 'snippets';
38 die "script '$volid' does not exists\n"
41 die "script '$volid' is not executable\n"
48 my ($conf, $vmid, $phase, $stop_on_error) = @_;
50 return if !$conf->{hookscript
};
53 my $hookscript = check_hookscript
($conf->{hookscript
});
56 PVE
::Tools
::run_command
([$hookscript, $vmid, $phase]);
59 my $errmsg = "hookscript error for $vmid on $phase: $err\n";
60 die $errmsg if ($stop_on_error);
65 # takes a snapshot list (e.g., qm/pct snapshot_list API call result) and
66 # prints it out in a nice tree sorted by age. Can cope with multiple roots
67 sub print_snapshot_tree
{
68 my ($snapshot_list) = @_;
70 my $snapshots = { map { $_->{name
} => $_ } @$snapshot_list };
73 foreach my $e (@$snapshot_list) {
75 if (($parent = $e->{parent
}) && defined $snapshots->{$parent}) {
76 push @{$snapshots->{$parent}->{children
}}, $e->{name
};
78 push @roots, $e->{name
};
82 # sort the elements by snaptime - with "current" (no snaptime) highest
83 my $snaptimesort = sub {
84 return +1 if !defined $snapshots->{$a}->{snaptime
};
85 return -1 if !defined $snapshots->{$b}->{snaptime
};
86 return $snapshots->{$a}->{snaptime
} <=> $snapshots->{$b}->{snaptime
};
89 # recursion function for displaying the tree
92 my ($prefix, $root, $snapshots) = @_;
93 my $e = $snapshots->{$root};
95 my $description = $e->{description
} || 'no-description';
96 ($description) = $description =~ m/(.*)$/m;
99 if (defined $e->{snaptime
}) {
100 $timestring = strftime
("%F %H:%M:%S", localtime($e->{snaptime
}));
103 my $len = 30 - length($prefix); # for aligning the description
104 printf("%s %-${len}s %-23s %s\n", $prefix, $root, $timestring, $description);
106 if ($e->{children
}) {
107 $prefix = " $prefix";
108 foreach my $child (sort $snaptimesort @{$e->{children
}}) {
109 $snapshottree->($prefix, $child, $snapshots);
114 foreach my $root (sort $snaptimesort @roots) {
115 $snapshottree->('`->', $root, $snapshots);