Replace RESTEnvironment::log_warn in the setup plugins with the callback that writes them to a file during the prestart-hook. Also improve the callback so it works inside the protected_call chroot.
Calls to "warn" are left unmodified for now. Signed-off-by: Robert Obkircher <[email protected]> --- src/PVE/LXC/Setup.pm | 2 +- src/PVE/LXC/Setup/Base.pm | 2 +- src/PVE/LXC/Setup/Debian.pm | 5 ++--- src/PVE/LXC/Setup/Plugin.pm | 2 +- src/PVE/LXC/Setup/Ubuntu.pm | 5 ++--- src/lxc-pve-prestart-hook | 25 +++++++++++-------------- 6 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm index da2df5d..500b63c 100644 --- a/src/PVE/LXC/Setup.pm +++ b/src/PVE/LXC/Setup.pm @@ -124,7 +124,7 @@ sub new { my $plugin_class = $plugins->{$type} || die "no such OS type '$type'\n"; - my $plugin = $plugin_class->new($conf, $rootdir, $os_release); + my $plugin = $plugin_class->new($conf, $rootdir, $os_release, $log_warn); $self->{plugin} = $plugin; $self->{in_chroot} = 0; diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm index 671e8c8..829b685 100644 --- a/src/PVE/LXC/Setup/Base.pm +++ b/src/PVE/LXC/Setup/Base.pm @@ -24,7 +24,7 @@ use PVE::LXC::Tools; use base qw(PVE::LXC::Setup::Plugin); sub new { - my ($class, $conf, $rootdir, $os_release) = @_; + my ($class, $conf, $rootdir, $os_release, $log_warn) = @_; return bless { conf => $conf, rootdir => $rootdir, os_release => $os_release }, $class; } diff --git a/src/PVE/LXC/Setup/Debian.pm b/src/PVE/LXC/Setup/Debian.pm index 030d934..dbb5050 100644 --- a/src/PVE/LXC/Setup/Debian.pm +++ b/src/PVE/LXC/Setup/Debian.pm @@ -6,7 +6,6 @@ use warnings; use PVE::Tools qw($IPV6RE); use PVE::LXC; use PVE::Network; -use PVE::RESTEnvironment qw(log_warn); use File::Path; @@ -20,7 +19,7 @@ use constant { }; sub new { - my ($class, $conf, $rootdir) = @_; + my ($class, $conf, $rootdir, $os_release, $log_warn) = @_; my $version = PVE::Tools::file_read_firstline("$rootdir/etc/debian_version"); @@ -47,7 +46,7 @@ sub new { die "Container Debian version '$version' is too old\n" if $version < DEBIAN_MINIMUM_RELEASE; if ($version >= (DEBIAN_MAXIMUM_RELEASE + 1)) { # also allow all MAX.X point releases. - log_warn("The container's Debian version '$version' is newer than the tested version '" + $log_warn->("The container's Debian version '$version' is newer than the tested version '" . DEBIAN_MAXIMUM_RELEASE . "'. While everything may work fine, full compatibility cannot be guaranteed." . " Please check for PVE system updates.\n"); diff --git a/src/PVE/LXC/Setup/Plugin.pm b/src/PVE/LXC/Setup/Plugin.pm index b9d9c2d..fbcfa8e 100644 --- a/src/PVE/LXC/Setup/Plugin.pm +++ b/src/PVE/LXC/Setup/Plugin.pm @@ -8,7 +8,7 @@ use warnings; use Carp; sub new { - my ($class, $conf, $rootdir, $os_release) = @_; + my ($class, $conf, $rootdir, $os_release, $log_warn) = @_; croak "implement me in sub-class\n"; } diff --git a/src/PVE/LXC/Setup/Ubuntu.pm b/src/PVE/LXC/Setup/Ubuntu.pm index e364fa8..a213541 100644 --- a/src/PVE/LXC/Setup/Ubuntu.pm +++ b/src/PVE/LXC/Setup/Ubuntu.pm @@ -5,7 +5,6 @@ use warnings; use PVE::Tools; use PVE::LXC; -use PVE::RESTEnvironment qw(log_warn); use File::Path; @@ -43,7 +42,7 @@ my $known_versions = { }; sub new { - my ($class, $conf, $rootdir) = @_; + my ($class, $conf, $rootdir, $os_release, $log_warn) = @_; my $lsb_fn = "$rootdir/etc/lsb-release"; my $lsbinfo = PVE::Tools::file_get_contents($lsb_fn); @@ -64,7 +63,7 @@ sub new { # cannot support 16.10 or older, their systemd is not cgroupv2 ready die "unsupported ancient Ubuntu version '$version'\n" if $major < 17; - log_warn("The container's Ubuntu version '$version' is not in the known version list." + $log_warn->("The container's Ubuntu version '$version' is not in the known version list." . " As it's newer than the minimum supported version it's likely to work OK, but full" . " compatibility cannot be guaranteed. Please check for PVE system updates.\n"); } else { diff --git a/src/lxc-pve-prestart-hook b/src/lxc-pve-prestart-hook index 0e69630..f5dd728 100755 --- a/src/lxc-pve-prestart-hook +++ b/src/lxc-pve-prestart-hook @@ -28,17 +28,6 @@ eval { $have_sdn = 1; }; -my $WARNFD; - -sub log_warn { - my ($vmid, $message) = @_; - - if (!defined($WARNFD)) { - open($WARNFD, '>', "/run/pve/ct-${vmid}.warnings"); - } - print $WARNFD "$message\n"; -} - PVE::LXC::Tools::lxc_hook( 'pre-start', 'lxc', @@ -53,6 +42,15 @@ PVE::LXC::Tools::lxc_hook( PVE::RESTEnvironment->setup_default_cli_env(); + my $warn_file = "/run/pve/ct-${vmid}.warnings"; + # open eagerly so logging works inside the protected_call chroot + open(my $warnfd, '>', $warn_file) or die "Failed to open $warn_file: $!"; + my $log_warn = sub { + my ($message) = @_; + print $warnfd "$message\n"; + $warnfd->flush; # required because protected_call calls POSIX::_exit + }; + return undef if !-f PVE::LXC::Config->config_file($vmid); my $conf = PVE::LXC::Config->load_config($vmid); @@ -155,13 +153,12 @@ PVE::LXC::Tools::lxc_hook( PVE::LXC::Config->foreach_passthrough_device($conf, $setup_passthrough_device); - my $warn_sub = sub { log_warn($vmid, @_); }; - my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir, undef, $warn_sub); + my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir, undef, $log_warn); $lxc_setup->pre_start_hook(); if (PVE::CGroup::cgroup_mode() == 2) { if (!$lxc_setup->unified_cgroupv2_support()) { - log_warn( + $log_warn->( $vmid, "old systemd (< v232) detected, container won't run in a pure cgroupv2" . " environment! Please see documentation -> container -> cgroup version.", -- 2.47.3 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
