pve-installer/Proxmox/Install/ISOEnv.pm
Christoph Heiss dc401eb3f0 country.pl: generate final structure as json at build time directly
Currently, we generate a custom-format `country.dat` at build time,
which we then ship with the installer. In the live environment, this
then gets parsed (via regexes) into another format and is finally
written out as JSON for e.g. the TUI and auto-installer to consume.

Instead, skip the intermediate format completely and just generate the
final data structure as JSON at build time.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
2024-12-10 18:00:24 +01:00

127 lines
2.9 KiB
Perl

package Proxmox::Install::ISOEnv;
use strict;
use warnings;
use Carp;
use Cwd ();
use JSON qw(from_json);
use Proxmox::Sys::File qw(file_read_all);
use base qw(Exporter);
our @EXPORT = qw(is_test_mode);
my $product_cfg = {
pve => {
fullname => 'Proxmox VE',
port => '8006',
enable_btrfs => 1,
bridged_network => 1,
},
pmg => {
fullname => 'Proxmox Mail Gateway',
port => '8006',
enable_btrfs => 0,
bridged_network => 0,
},
pbs => {
fullname => 'Proxmox Backup Server',
port => '8007',
enable_btrfs => 0,
bridged_network => 0,
},
};
my sub read_locale_info {
my ($lib_dir) = @_;
my $json = file_read_all("${lib_dir}/locale-info.json");
return from_json($json, { utf8 => 1 });
}
my sub get_cd_info {
my $info_fn = '/.cd-info'; # default place in the ISO environment
if (!-f $info_fn && -f "cd-info.test") {
$info_fn = "cd-info.test"; # use from CWD for test mode
}
open(my $fh, '<', $info_fn) or die "could not open CD info file '$info_fn' - $!";
my $cd_info = {};
while (my $line = <$fh>) {
chomp $line;
if ($line =~ /^(\S+)=['"]?(.+?)['"]?$/) { # we control cd-info content, so good enough.
$cd_info->{lc($1)} = $2;
}
}
close ($fh);
die "CD-info is missing required key 'product'!\n" if !defined $cd_info->{product};
return $cd_info;
}
my sub get_locations {
my $is_test = is_test_mode();
my $base_lib_dir = '/var/lib/proxmox-installer';
my $iso_dir = $is_test ? $ENV{'CD_BUILDER_DIR'} || "../pve-cd-builder/tmp/data-gz/" : "/cdrom";
return {
iso => $iso_dir,
lib => $is_test ? Cwd::cwd() . "/testdir/${base_lib_dir}" : $base_lib_dir,
pkg => "${iso_dir}/proxmox/packages/",
run => $is_test ? Cwd::cwd() . "/testdir/run/proxmox-installer" : '/run/proxmox-installer',
};
}
# setup global environment already on module load
$ENV{DEBIAN_FRONTEND} = 'noninteractive';
$ENV{LC_ALL} = 'C';
$ENV{'LVM_SUPPRESS_FD_WARNINGS'} = '1';
sub setup {
my $cd_info = get_cd_info();
my $product = $cd_info->{product};
my $cfg = $product_cfg->{$product} or die "unknown product '$product'\n";
$cfg->{product} = $product;
my $locations = get_locations();
my $env = {
product => $product,
cfg => $cfg,
iso => $cd_info,
locations => $locations,
'run-env-cache-file' => "$locations->{run}/run-env-info.json",
locales => read_locale_info($locations->{lib}),
};
return $env;
}
my $_env = undef;
sub get {
my ($k) = @_;
$_env = setup() if !defined($_env);
return defined($k) ? $_env->{$k} : $_env;
}
my $test_images;
# sets a test image to use as disk and enables the testmode
sub set_test_image {
my ($new_test_image) = @_;
croak "cannot disable test mode again after enabled" if defined($test_images) && !defined($new_test_image);
$test_images = $new_test_image;
}
sub is_test_mode {
return !!$test_images;
}
sub get_test_images {
return [ split(/,/, $test_images) ];
}
1;