]> git.proxmox.com Git - pve-installer.git/blame - Proxmox/Install/Config.pm
fix #4829: install: add new ZFS `arc_max` setup option
[pve-installer.git] / Proxmox / Install / Config.pm
CommitLineData
390889ab
TL
1package Proxmox::Install::Config;
2
3use strict;
4use warnings;
5
6use Carp;
7use JSON qw(from_json to_json);
8
e90bb4ef
TL
9use Proxmox::Log;
10
390889ab 11use Proxmox::Install::ISOEnv;
7f3941d1 12use Proxmox::Sys::Net;
390889ab 13
8e66eb8e
TL
14my sub parse_kernel_cmdline {
15 my ($cfg) = @_;
16
17 my $cmdline = Proxmox::Install::RunEnv::get('kernel_cmdline');
18
19 if ($cmdline =~ m/\s(ext4|xfs)(\s.*)?$/) {
20 $cfg->{filesys} = $1;
21 }
22
23 if ($cmdline =~ m/hdsize=(\d+(\.\d+)?)[\s\n]/i) {
24 $cfg->{hdsize} = $1;
25 }
26
27 if ($cmdline =~ m/swapsize=(\d+(\.\d+)?)[\s\n]/i) {
28 $cfg->{swapsize} = $1;
29 }
30
31 if ($cmdline =~ m/maxroot=(\d+(\.\d+)?)[\s\n]/i) {
32 $cfg->{maxroot} = $1;
33 }
34
35 if ($cmdline =~ m/minfree=(\d+(\.\d+)?)[\s\n]/i) {
36 $cfg->{minfree} = $1;
37 }
38
39 my $iso_env = Proxmox::Install::ISOEnv::get();
40 if ($iso_env->{product} eq 'pve') {
41 if ($cmdline =~ m/maxvz=(\d+(\.\d+)?)[\s\n]/i) {
42 $cfg->{maxvz} = $1;
43 }
44 }
45
46 return $cfg;
47}
48
49
390889ab 50my sub init_cfg {
74041d68
TL
51 my $iso_env = Proxmox::Install::ISOEnv::get();
52
53 my $country = Proxmox::Install::RunEnv::get('country');
55c2fb99 54 if (defined($country) && !defined($iso_env->{locales}->{country}->{$country})) {
74041d68
TL
55 log_warn("ignoring detected country '$country', invalid or unknown\n");
56 $country = undef;
57 }
58
59 my $initial = {
390889ab
TL
60 # installer behavior related
61 autoreboot => 1,
62
63 # disk and filesystem related
64 filesys => 'ext4',
65 hdsize => undef,
66 swapsize => undef,
67 maxroot => undef,
68 minfree => undef,
69 maxvz => undef,
6edd095a
TL
70 zfs_opts => {
71 ashift => 12,
72 compress => 'on',
73 checksum => 'on',
74 copies => 1,
42aa2fa7 75 arc_max => Proxmox::Install::RunEnv::default_zfs_arc_max(), # in MiB
6edd095a 76 },
5bcefda0
TL
77 # TODO: single disk selection config
78 target_hd => undef,
79 disk_selection => {},
74041d68
TL
80
81 # locale
82 country => $country,
2959225b 83 timezone => 'Europe/Vienna',
b3bcf70e 84 keymap => 'en-us',
a024147b
TL
85
86 # root credentials & details
87 password => undef,
8924c145 88 mailto => 'mail@example.invalid',
8a7e31ce
TL
89
90 # network related
91 mngmt_nic => undef,
44e93c11
TL
92 # FIXME: fix call sites and remove below, it's just an ugly relict of GTK GUI and time
93 # pressure on creating the single source of truth for installation config
8a7e31ce 94 mngmt_nic_id => undef,
b7ad1ad4
TL
95 hostname => undef,
96 domain => undef,
7f3941d1
TL
97 cidr => undef,
98 gateway => undef,
99 dns => undef,
390889ab 100 };
74041d68 101
8e66eb8e
TL
102 $initial = parse_kernel_cmdline($initial);
103
74041d68 104 return $initial;
390889ab
TL
105}
106
107# merge a $new hash into the current config, with $new taking precedence
108sub merge {
109 my ($new) = @_;
110
111 my $current = get();
112
113 for my $k (sort keys $new->%*) { # first check all
114 croak "unknown key '$k'" if !exists($current->{$k})
115 }
116 $current->{$_} = $new->{$_} for sort keys $new->%*; # then merge
117
118 return $current;
119}
120
121my $_cfg = undef; # NOTE: global singleton
122sub get {
123 my ($k) = @_;
124 $_cfg = init_cfg() if !defined($_cfg);
125 return defined($k) ? $_cfg->{$k} : $_cfg;
126}
127
128sub set_key {
129 my ($k, $v) = @_;
130 my $cfg = get();
131 croak "unknown key '$k'" if !exists($cfg->{$k});
132 $cfg->{$k} = $v;
133}
134
0a3ac982
TL
135sub set_autoreboot { set_key('autoreboot', $_[0]); }
136sub get_autoreboot { return get('autoreboot'); }
137
cd1a45ad
TL
138sub set_filesys { set_key('filesys', $_[0]); }
139sub get_filesys { return get('filesys'); }
140
a8a14c4d
TL
141sub set_hdsize { set_key('hdsize', $_[0]); }
142sub get_hdsize { return get('hdsize'); }
143
ef41b049
TL
144sub set_swapsize { set_key('swapsize', $_[0]); }
145sub get_swapsize { return get('swapsize'); }
146
b4ab3f19
TL
147sub set_maxroot { set_key('maxroot', $_[0]); }
148sub get_maxroot { return get('maxroot'); }
149
35e7bf16
TL
150sub set_minfree { set_key('minfree', $_[0]); }
151sub get_minfree { return get('minfree'); }
152
140f2e85
TL
153sub set_maxvz { set_key('maxvz', $_[0]); }
154sub get_maxvz { return get('maxvz'); }
155
6edd095a
TL
156sub set_zfs_opt {
157 my ($k, $v) = @_;
158 my $zfs_opts = get('zfs_opts');
159 croak "unknown zfs opts key '$k'" if !exists($zfs_opts->{$k});
160 $zfs_opts->{$k} = $v;
161}
162sub get_zfs_opt {
163 my ($k) = @_;
164 my $zfs_opts = get('zfs_opts');
165 return defined($k) ? $zfs_opts->{$k} : $zfs_opts;
166}
167
5bcefda0
TL
168sub set_target_hd { set_key('target_hd', $_[0]); }
169sub get_target_hd { return get('target_hd'); }
170
171sub set_disk_selection {
172 my ($id, $v) = @_;
173 my $disk_selection = get('disk_selection');
174 $disk_selection->{$id} = $v;
175}
176sub get_disk_selection {
177 my ($id) = @_;
178 my $disk_selection = get('disk_selection');
179 return defined($id) ? $disk_selection->{$id} : $disk_selection;
180}
181
74041d68
TL
182sub set_country { set_key('country', $_[0]); }
183sub get_country { return get('country'); }
184
2959225b
TL
185sub set_timezone { set_key('timezone', $_[0]); }
186sub get_timezone { return get('timezone'); }
187
b3bcf70e
TL
188sub set_keymap { set_key('keymap', $_[0]); }
189sub get_keymap { return get('keymap'); }
190
a024147b
TL
191sub set_password { set_key('password', $_[0]); }
192sub get_password { return get('password'); }
193
8924c145
TL
194sub set_mailto { set_key('mailto', $_[0]); }
195sub get_mailto { return get('mailto'); }
196
8a7e31ce
TL
197sub set_mngmt_nic { set_key('mngmt_nic', $_[0]); }
198sub get_mngmt_nic { return get('mngmt_nic'); }
199
200sub set_mngmt_nic_id { set_key('mngmt_nic_id', $_[0]); }
201sub get_mngmt_nic_id { return get('mngmt_nic_id'); }
202
e02f38dc
TL
203sub set_hostname { set_key('hostname', $_[0]); }
204sub get_hostname { return get('hostname'); }
205
206sub set_domain { set_key('domain', $_[0]); }
207sub get_domain { return get('domain'); }
208
209sub get_fqdn { # virtual config
210 my ($hostname, $domain) = (get('hostname'), get('domain'));
211 return defined($hostname) && defined($domain) ? "${hostname}.${domain}" : undef;
212}
213
7f3941d1
TL
214sub set_cidr { set_key('cidr', $_[0]); }
215sub get_cidr { return get('cidr'); }
216
217sub get_ip_addr { #'virtual config
218 my $cidr = get('cidr') // return;
219 my ($ip, $mask) = split('/', $cidr);
220 return $ip;
221}
222sub get_ip_version { # virtual config
223 my $ip = get_ip_addr() // return;
224 return Proxmox::Sys::Net::parse_ip_address($ip);
225}
226
227sub set_gateway { set_key('gateway', $_[0]); }
228sub get_gateway { return get('gateway'); }
229
230sub set_dns { set_key('dns', $_[0]); }
231sub get_dns { return get('dns'); }
232
390889ab 2331;