Add a callback to the LXC setup plugins to allow custom logging when the RESTEnvironment is not available and use it to redirect warnings to a file during the prestart-hook.
Only calls to RESTEnvironment::log_warn were migrated, calls to "warn" are left unmodified for now. Signed-off-by: Robert Obkircher <[email protected]> --- src/PVE/LXC/Setup.pm | 9 ++++++--- 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 | 24 +++++++++++------------- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm index 87330c4..57b8df1 100644 --- a/src/PVE/LXC/Setup.pm +++ b/src/PVE/LXC/Setup.pm @@ -6,6 +6,7 @@ use warnings; use POSIX; use Cwd 'abs_path'; +use PVE::RESTEnvironment; use PVE::Tools; use PVE::LXC::Setup::Alpine; @@ -97,11 +98,13 @@ my $autodetect_type = sub { }; sub new { - my ($class, $conf, $rootdir, $type) = @_; + my ($class, $conf, $rootdir, $type, $log_warn) = @_; die "no root directory\n" if !$rootdir || $rootdir eq '/'; - my $self = bless { conf => $conf, rootdir => $rootdir }, $class; + $log_warn ||= sub { PVE::RESTEnvironment::log_warn(@_); }; + + my $self = bless { conf => $conf, rootdir => $rootdir, log_warn => $log_warn }, $class; my $os_release = $self->get_ct_os_release(); @@ -121,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 bb4a12b..2e1c84c 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 73125e1..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,12 +153,12 @@ PVE::LXC::Tools::lxc_hook( PVE::LXC::Config->foreach_passthrough_device($conf, $setup_passthrough_device); - my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir); + 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
