pve-installer/Proxmox/Install/ISOEnv.pm
Christoph Heiss 17f3ff2268 add preliminary pdm support
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
Co-authored-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2024-12-16 20:39:33 +01:00

133 lines
3.0 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,
},
pdm => {
fullname => 'Proxmox Datacenter Manager',
port => '8443', # TODO: confirm
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;