]>
git.proxmox.com Git - qemu-server.git/blob - PVE/QemuServer/Helpers.pm
1 package PVE
::QemuServer
::Helpers
;
18 my $nodename = PVE
::INotify
::nodename
();
20 # Paths and directories
22 our $var_run_tmpdir = "/var/run/qemu-server";
23 mkdir $var_run_tmpdir;
26 my ($vmid, $qga) = @_;
27 my $sockettype = $qga ?
'qga' : 'qmp';
28 return "${var_run_tmpdir}/$vmid.$sockettype";
33 return "${var_run_tmpdir}/$vmid.pid";
38 return "${var_run_tmpdir}/$vmid.vnc";
41 # Parse the cmdline of a running kvm/qemu process and return arguments as hash
45 my $fh = IO
::File-
>new("/proc/$pid/cmdline", "r");
50 my @param = split(/\0/, $line);
53 return if !$cmd || ($cmd !~ m
|kvm
$| && $cmd !~ m
@(?
:^|/)qemu-system-[^/]+$@);
57 for (my $i = 0; $i < scalar (@param); $i++) {
61 if ($p =~ m/^--?(.*)$/) {
63 $phash->{$pending_cmd} = {};
66 } elsif ($pending_cmd) {
67 $phash->{$pending_cmd} = { value
=> $p };
77 sub vm_running_locally
{
80 my $pidfile = pidfile_name
($vmid);
82 if (my $fd = IO
::File-
>new("<$pidfile")) {
87 my $mtime = $st->mtime;
88 if ($mtime > time()) {
89 warn "file '$pidfile' modified in future\n";
92 if ($line =~ m/^(\d+)$/) {
94 my $cmdline = parse_cmdline
($pid);
95 if ($cmdline && defined($cmdline->{pidfile
}) && $cmdline->{pidfile
}->{value
}
96 && $cmdline->{pidfile
}->{value
} eq $pidfile) {
97 if (my $pinfo = PVE
::ProcFSTools
::check_process_running
($pid)) {
108 my ($verstr, $major, $minor, $pve) = @_;
110 if ($verstr =~ m/^(\d+)\.(\d+)(?:\.(\d+))?(?:\+pve(\d+))?/) {
111 return 1 if version_cmp
($1, $major, $2, $minor, $4, $pve) >= 0;
115 die "internal error: cannot check version of invalid string '$verstr'";
118 # gets in pairs the versions you want to compares, i.e.:
119 # ($a-major, $b-major, $a-minor, $b-minor, $a-extra, $b-extra, ...)
120 # returns 0 if same, -1 if $a is older than $b, +1 if $a is newer than $b
124 my $size = scalar(@versions);
126 return 0 if $size == 0;
129 my (undef, $fn, $line) = caller(0);
130 die "cannot compare odd count of versions, called from $fn:$line\n";
133 for (my $i = 0; $i < $size; $i += 2) {
134 my ($a, $b) = splice(@versions, 0, 2);
139 return -1 if $a < $b;
144 sub config_aware_timeout
{
145 my ($config, $is_suspended) = @_;
146 my $memory = $config->{memory
};
149 # Based on user reported startup time for vm with 512GiB @ 4-5 minutes
150 if (defined($memory) && $memory > 30720) {
151 $timeout = int($memory/1024);
154 if ($is_suspended && $timeout < 300) {
158 if ($config->{hugepages
} && $timeout < 150) {
165 sub get_node_pvecfg_version
{
168 my $nodes_version_info = PVE
::Cluster
::get_node_kv
('version-info', $node);
169 return if !$nodes_version_info->{$node};
171 my $version_info = decode_json
($nodes_version_info->{$node});
172 return $version_info->{version
};
175 sub pvecfg_min_version
{
176 my ($verstr, $major, $minor, $release) = @_;
178 return 0 if !$verstr;
180 if ($verstr =~ m/^(\d+)\.(\d+)-(\d+)/) {
181 return 1 if version_cmp
($1, $major, $2, $minor, $3, $release) >= 0;
185 die "internal error: cannot check version of invalid string '$verstr'";