mirror of
https://git.proxmox.com/git/pve-installer
synced 2025-04-28 14:55:03 +00:00

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>
127 lines
2.9 KiB
Perl
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;
|