]> git.proxmox.com Git - pve-installer.git/blob - Proxmox/Install/Config.pm
f959f014fc81b8731e7179a2c50a1549fe2d9a98
[pve-installer.git] / Proxmox / Install / Config.pm
1 package Proxmox::Install::Config;
2
3 use strict;
4 use warnings;
5
6 use Carp;
7 use JSON qw(from_json to_json);
8
9 use Proxmox::Install::ISOEnv;
10
11 my sub init_cfg {
12 my $iso_env = Proxmox::Install::ISOEnv::get();
13
14 my $country = Proxmox::Install::RunEnv::get('country');
15 if (!defined($iso_env->{locales}->{country}->{$country})) {
16 log_warn("ignoring detected country '$country', invalid or unknown\n");
17 $country = undef;
18 }
19
20 my $initial = {
21 # installer behavior related
22 autoreboot => 1,
23
24 # disk and filesystem related
25 filesys => 'ext4',
26 hdsize => undef,
27 swapsize => undef,
28 maxroot => undef,
29 minfree => undef,
30 maxvz => undef,
31
32 # locale
33 country => $country,
34 timezone => 'Europe/Vienna',
35 keymap => 'en-us',
36
37 # root credentials & details
38 password => undef,
39 mailto => 'mail@example.invalid',
40
41 # network related
42 mngmt_nic => undef,
43 mngmt_nic_id => undef,
44 hostname => 'proxmox',
45 domain => 'example.invalid',
46 };
47
48 # TODO add disksel$i => undef entries
49
50 return $initial;
51 }
52
53 # merge a $new hash into the current config, with $new taking precedence
54 sub merge {
55 my ($new) = @_;
56
57 my $current = get();
58
59 for my $k (sort keys $new->%*) { # first check all
60 croak "unknown key '$k'" if !exists($current->{$k})
61 }
62 $current->{$_} = $new->{$_} for sort keys $new->%*; # then merge
63
64 return $current;
65 }
66
67 my $_cfg = undef; # NOTE: global singleton
68 sub get {
69 my ($k) = @_;
70 $_cfg = init_cfg() if !defined($_cfg);
71 return defined($k) ? $_cfg->{$k} : $_cfg;
72 }
73
74 sub set_key {
75 my ($k, $v) = @_;
76 my $cfg = get();
77 croak "unknown key '$k'" if !exists($cfg->{$k});
78 $cfg->{$k} = $v;
79 }
80
81 sub parse_kernel_cmdline {
82 my $cfg = get();
83
84 my $cmdline = Proxmox::Install::RunEnv::get('kernel_cmdline');
85
86 if ($cmdline =~ m/\s(ext4|xfs)(\s.*)?$/) {
87 $cfg->{filesys} = $1;
88 }
89
90 if ($cmdline =~ m/hdsize=(\d+(\.\d+)?)[\s\n]/i) {
91 $cfg->{hdsize} = $1;
92 }
93
94 if ($cmdline =~ m/swapsize=(\d+(\.\d+)?)[\s\n]/i) {
95 $cfg->{swapsize} = $1;
96 }
97
98 if ($cmdline =~ m/maxroot=(\d+(\.\d+)?)[\s\n]/i) {
99 $cfg->{maxroot} = $1;
100 }
101
102 if ($cmdline =~ m/minfree=(\d+(\.\d+)?)[\s\n]/i) {
103 $cfg->{minfree} = $1;
104 }
105
106 my $iso_env = Proxmox::Install::ISOEnv::get();
107 if ($iso_env->{product} eq 'pve') {
108 if ($cmdline =~ m/maxvz=(\d+(\.\d+)?)[\s\n]/i) {
109 $cfg->{maxvz} = $1;
110 }
111 }
112
113 return $cfg;
114 }
115
116 sub set_autoreboot { set_key('autoreboot', $_[0]); }
117 sub get_autoreboot { return get('autoreboot'); }
118
119 sub set_filesys { set_key('filesys', $_[0]); }
120 sub get_filesys { return get('filesys'); }
121
122 sub set_hdsize { set_key('hdsize', $_[0]); }
123 sub get_hdsize { return get('hdsize'); }
124
125 sub set_swapsize { set_key('swapsize', $_[0]); }
126 sub get_swapsize { return get('swapsize'); }
127
128 sub set_maxroot { set_key('maxroot', $_[0]); }
129 sub get_maxroot { return get('maxroot'); }
130
131 sub set_minfree { set_key('minfree', $_[0]); }
132 sub get_minfree { return get('minfree'); }
133
134 sub set_maxvz { set_key('maxvz', $_[0]); }
135 sub get_maxvz { return get('maxvz'); }
136
137 sub set_country { set_key('country', $_[0]); }
138 sub get_country { return get('country'); }
139
140 sub set_timezone { set_key('timezone', $_[0]); }
141 sub get_timezone { return get('timezone'); }
142
143 sub set_keymap { set_key('keymap', $_[0]); }
144 sub get_keymap { return get('keymap'); }
145
146 sub set_password { set_key('password', $_[0]); }
147 sub get_password { return get('password'); }
148
149 sub set_mailto { set_key('mailto', $_[0]); }
150 sub get_mailto { return get('mailto'); }
151
152 sub set_mngmt_nic { set_key('mngmt_nic', $_[0]); }
153 sub get_mngmt_nic { return get('mngmt_nic'); }
154
155 sub set_mngmt_nic_id { set_key('mngmt_nic_id', $_[0]); }
156 sub get_mngmt_nic_id { return get('mngmt_nic_id'); }
157
158 sub set_hostname { set_key('hostname', $_[0]); }
159 sub get_hostname { return get('hostname'); }
160
161 sub set_domain { set_key('domain', $_[0]); }
162 sub get_domain { return get('domain'); }
163
164 sub get_fqdn { # virtual config
165 my ($hostname, $domain) = (get('hostname'), get('domain'));
166 return defined($hostname) && defined($domain) ? "${hostname}.${domain}" : undef;
167 }
168
169 1;