1 package PVE
::VZDump
::ConvertOVZ
;
5 use POSIX qw
(LONG_MAX
);
7 my $res_unlimited = LONG_MAX
;
9 sub ovz_config_extract_mem_swap
{
10 my ($veconf, $unit) = @_;
14 my ($mem, $swap) = (int((512*1024*1024 + $unit - 1)/$unit), 0);
16 my $maxpages = ($res_unlimited / 4096);
18 if ($veconf->{swappages
}) {
19 if ($veconf->{physpages
} && $veconf->{physpages
}->{lim
} &&
20 ($veconf->{physpages
}->{lim
} < $maxpages)) {
21 $mem = int(($veconf->{physpages
}->{lim
} * 4096 + $unit - 1) / $unit);
23 if ($veconf->{swappages
}->{lim
} && ($veconf->{swappages
}->{lim
} < $maxpages)) {
24 $swap = int (($veconf->{swappages
}->{lim
} * 4096 + $unit - 1) / $unit);
27 if ($veconf->{vmguarpages
} && $veconf->{vmguarpages
}->{bar
} &&
28 ($veconf->{vmguarpages
}->{bar
} < $maxpages)) {
29 $mem = int(($veconf->{vmguarpages
}->{bar
} * 4096 + $unit - 1) / $unit);
36 sub parse_res_num_ignore
{
37 my ($key, $text) = @_;
39 if ($text =~ m/^(\d+|unlimited)(:.*)?$/) {
40 return { bar
=> $1 eq 'unlimited' ?
$res_unlimited : $1 };
46 sub parse_res_num_num
{
47 my ($key, $text) = @_;
49 if ($text =~ m/^(\d+|unlimited)(:(\d+|unlimited))?$/) {
50 my $res = { bar
=> $1 eq 'unlimited' ?
$res_unlimited : $1 };
52 $res->{lim
} = $3 eq 'unlimited' ?
$res_unlimited : $3;
54 $res->{lim
} = $res->{bar
};
62 sub parse_res_bar_limit
{
63 my ($text, $base) = @_;
65 return $res_unlimited if $text eq 'unlimited';
67 if ($text =~ m/^(\d+)([TGMKP])?$/i) {
69 my $mult = $2 ?
lc($2) : '';
72 } elsif ($mult eq 'm') {
73 $val = $val * 1024 * 1024;
74 } elsif ($mult eq 'g') {
75 $val = $val * 1024 * 1024 * 1024;
76 } elsif ($mult eq 't') {
77 $val = $val * 1024 * 1024 * 1024 * 1024;
78 } elsif ($mult eq 'p') {
83 return int($val/$base);
89 sub parse_res_bytes_bytes
{
90 my ($key, $text) = @_;
92 my @a = split(/:/, $text);
93 $a[1] = $a[0] if !defined($a[1]);
95 my $bar = parse_res_bar_limit
($a[0], 1);
96 my $lim = parse_res_bar_limit
($a[1], 1);
98 if (defined($bar) && defined($lim)) {
99 return { bar
=> $bar, lim
=> $lim };
105 sub parse_res_block_block
{
106 my ($key, $text) = @_;
108 my @a = split(/:/, $text);
109 $a[1] = $a[0] if !defined($a[1]);
111 my $bar = parse_res_bar_limit
($a[0], 1024);
112 my $lim = parse_res_bar_limit
($a[1], 1024);
114 if (defined($bar) && defined($lim)) {
115 return { bar
=> $bar, lim
=> $lim };
121 sub parse_res_pages_pages
{
122 my ($key, $text) = @_;
124 my @a = split(/:/, $text);
125 $a[1] = $a[0] if !defined($a[1]);
127 my $bar = parse_res_bar_limit
($a[0], 4096);
128 my $lim = parse_res_bar_limit
($a[1], 4096);
130 if (defined($bar) && defined($lim)) {
131 return { bar
=> $bar, lim
=> $lim };
137 sub parse_res_pages_unlimited
{
138 my ($key, $text) = @_;
140 my @a = split(/:/, $text);
142 my $bar = parse_res_bar_limit
($a[0], 4096);
145 return { bar
=> $bar, lim
=> $res_unlimited };
151 sub parse_res_pages_ignore
{
152 my ($key, $text) = @_;
154 my @a = split(/:/, $text);
156 my $bar = parse_res_bar_limit
($a[0], 4096);
159 return { bar
=> $bar };
165 sub parse_res_ignore_pages
{
166 my ($key, $text) = @_;
168 my @a = split(/:/, $text);
169 $a[1] = $a[0] if !defined($a[1]);
171 my $lim = parse_res_bar_limit
($a[1] , 4096);
174 return { bar
=> 0, lim
=> $lim };
181 my ($key, $text) = @_;
183 return { value
=> 1 } if $text =~ m/^(yes|true|on|1)$/i;
184 return { value
=> 0 } if $text =~ m/^(no|false|off|0)$/i;
190 my ($key, $text) = @_;
192 if ($text =~ m/^(\d+)$/) {
193 return { value
=> int($1) };
199 my $ovz_ressources = {
200 numproc
=> \
&parse_res_num_ignore
,
201 numtcpsock
=> \
&parse_res_num_ignore
,
202 numothersock
=> \
&parse_res_num_ignore
,
203 numfile
=> \
&parse_res_num_ignore
,
204 numflock
=> \
&parse_res_num_num
,
205 numpty
=> \
&parse_res_num_ignore
,
206 numsiginfo
=> \
&parse_res_num_ignore
,
207 numiptent
=> \
&parse_res_num_ignore
,
209 vmguarpages
=> \
&parse_res_pages_unlimited
,
210 oomguarpages
=> \
&parse_res_pages_unlimited
,
211 lockedpages
=> \
&parse_res_pages_ignore
,
212 privvmpages
=> \
&parse_res_pages_pages
,
213 shmpages
=> \
&parse_res_pages_ignore
,
214 physpages
=> \
&parse_res_pages_pages
,
215 swappages
=> \
&parse_res_ignore_pages
,
217 kmemsize
=> \
&parse_res_bytes_bytes
,
218 tcpsndbuf
=> \
&parse_res_bytes_bytes
,
219 tcprcvbuf
=> \
&parse_res_bytes_bytes
,
220 othersockbuf
=> \
&parse_res_bytes_bytes
,
221 dgramrcvbuf
=> \
&parse_res_bytes_bytes
,
222 dcachesize
=> \
&parse_res_bytes_bytes
,
224 disk_quota
=> \
&parse_boolean
,
225 diskspace
=> \
&parse_res_block_block
,
226 diskinodes
=> \
&parse_res_num_num
,
227 quotatime
=> \
&parse_integer
,
228 quotaugidlimit
=> \
&parse_integer
,
230 cpuunits
=> \
&parse_integer
,
231 cpulimit
=> \
&parse_integer
,
232 cpus
=> \
&parse_integer
,
235 iptables
=> 'string',
237 ip_address
=> 'string',
239 hostname
=> 'string',
240 nameserver
=> 'string',
241 searchdomain
=> 'string',
244 description
=> 'string',
245 onboot
=> \
&parse_boolean
,
246 initlog
=> \
&parse_boolean
,
247 bootorder
=> \
&parse_integer
,
248 ostemplate
=> 'string',
250 ve_private
=> 'string',
251 disabled
=> \
&parse_boolean
,
252 origin_sample
=> 'string',
253 noatime
=> \
&parse_boolean
,
254 capability
=> 'string',
255 devnodes
=> 'string',
258 features
=> 'string',
259 ioprio
=> \
&parse_integer
,
263 my $parse_ovz_config = sub {
268 return undef if !defined($raw);
270 while ($raw && $raw =~ /^(.*?)(\n|$)/mg) {
273 next if $line =~ m/^\#/;
274 next if $line =~ m/^\s*$/;
276 if ($line =~ m/^\s*([A-Z][A-Z0-9_]*)\s*=\s*\"(.*)\"\s*$/i) {
279 my $parser = $ovz_ressources->{$name};
280 if (!$parser || !ref($parser)) {
281 $data->{$name}->{value
} = $text;
284 if (my $res = &$parser($name, $text)) {
285 $data->{$name} = $res;
290 die "unable to parse config line: $line\n";
301 my $ovz_conf = &$parse_ovz_config($raw);
303 my $disksize = $ovz_conf->{'diskspace'}->{'bar'} * 1024;
305 my ($mem, $swap) = ovz_config_extract_mem_swap
($ovz_conf, 0);
307 $conf->{memory
} = $mem / 1024 / 1024;
309 $conf->{swap
} = ($swap + $mem) / 1024 / 1024;
311 $conf->{cpuunits
} = 1024;
313 $conf->{cpulimit
} = $ovz_conf->{cpus
}->{value
} if $ovz_conf->{cpus
};
315 $conf->{hostname
} = $ovz_conf->{hostname
}->{value
};
317 return wantarray ?
($conf, $disksize) : $conf;