This should deduplicate some code in our hooks and add support for `lxc.hook.version`. That way users can use newer hook versions without breaking the PVE hooks in the process.
Patches 2 & 4 are best viewed with -w. I'm attaching -w of 2 below, 4 isn't that tragic. Wolfgang Bumiller (5): add PVE::LXC::Tools change hooks to use new helper tools: add device file iterator, and cgroup_do_write autodev hook: use new helpers and whitespace fixup config: whitelist lxc.hook.version src/PVE/LXC/Config.pm | 1 + src/PVE/LXC/Makefile | 7 +- src/PVE/LXC/Tools.pm | 133 +++++++++++++++++++++++++++++++ src/lxc-pve-autodev-hook | 115 ++++++++------------------- src/lxc-pve-poststop-hook | 154 ++++++++++++------------------------ src/lxc-pve-prestart-hook | 161 ++++++++++++-------------------------- 6 files changed, 276 insertions(+), 295 deletions(-) create mode 100644 src/PVE/LXC/Tools.pm -- 2.20.1 commit 2be78e2a0fc97014422e6eacfc64916d7a755813 Author: Wolfgang Bumiller <w.bumil...@proxmox.com> Date: Fri Jul 12 13:46:42 2019 +0200 change hooks to use new helper We now get rid of all the PVE::CLIHandler baggage which reduces the code a lot. It is also not compatible with the new lxc.hook.version=1 method of hooks! The new helper is specific to lxc hooks and supports both current `lxc.hook.version`s. Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com> diff --git a/src/lxc-pve-autodev-hook b/src/lxc-pve-autodev-hook index c934bfd..4913870 100755 --- a/src/lxc-pve-autodev-hook +++ b/src/lxc-pve-autodev-hook @@ -3,23 +3,16 @@ use strict; use warnings; -exit 0 if $ENV{LXC_NAME} && $ENV{LXC_NAME} !~ /^\d+$/; - use File::Path; use File::Basename; +use PVE::LXC::Tools; use PVE::Tools; -my $vmid = $ENV{LXC_NAME}; -my $root = $ENV{LXC_ROOTFS_MOUNT}; +PVE::LXC::Tools::lxc_hook('autodev', 'lxc', sub { + my ($vmid, $vars, undef, undef) = @_; -if (@ARGV != 3 || $ARGV[1] ne 'lxc' || $ARGV[2] ne 'autodev') { - die "invalid usage, this is an LXC autodev hook\n"; -} - -if ($vmid ne $ARGV[0]) { - die "got wrong name: $ARGV[0] while LXC_NAME=$vmid\n"; -} + my $root = $vars->{ROOTFS_MOUNT}; my $devlist_file = "/var/lib/lxc/$vmid/devices"; my $fd; @@ -87,5 +80,4 @@ while (defined(my $line = <$fd>)) { } } close $fd; - -exit 0; +}); diff --git a/src/lxc-pve-poststop-hook b/src/lxc-pve-poststop-hook index 00bd0b3..19d0b52 100755 --- a/src/lxc-pve-poststop-hook +++ b/src/lxc-pve-poststop-hook @@ -1,53 +1,21 @@ #!/usr/bin/perl -package lxc_pve_poststop_hook; - use strict; use warnings; -exit 0 if $ENV{LXC_NAME} && $ENV{LXC_NAME} !~ /^\d+$/; - use POSIX; use File::Path; -use PVE::SafeSyslog; -use PVE::Tools; -use PVE::Cluster; -use PVE::INotify; -use PVE::RPCEnvironment; -use PVE::JSONSchema qw(get_standard_option); -use PVE::CLIHandler; -use PVE::Storage; -use PVE::Storage::Plugin; -use PVE::LXC; use PVE::GuestHelpers; +use PVE::LXC::Config; +use PVE::LXC::Tools; +use PVE::LXC; +use PVE::Network; +use PVE::Storage; +use PVE::Tools; -use base qw(PVE::CLIHandler); - -__PACKAGE__->register_method ({ - name => 'lxc-pve-poststop-hook', - path => 'lxc-pve-poststop-hook', - method => 'GET', - description => "vm_stop_cleanup.", - parameters => { - additionalProperties => 0, - properties => { - name => { - description => "The container name. This hook is only active for containers using numeric IDs, where configuration is stored on /etc/pve/lxc/<name>.conf (else it is just a NOP).", - type => 'string', - pattern => '\S+', - maxLength => 64, - } - }, - }, - returns => { type => 'null' }, - - code => sub { - my ($param) = @_; - - return undef if $param->{name} !~ m/^\d+$/; - - my $vmid = $param->{name}; +PVE::LXC::Tools::lxc_hook('post-stop', 'lxc', sub { + my ($vmid, $vars, undef, undef) = @_; return undef if ! -f PVE::LXC::Config->config_file($vmid); @@ -57,9 +25,7 @@ __PACKAGE__->register_method ({ PVE::LXC::vm_stop_cleanup($storage_cfg, $vmid, $conf); - my $rootfs = $ENV{LXC_ROOTFS_PATH}; - die "Missing container root directory!\n" if !$rootfs; - PVE::Tools::run_command(['umount', '--recursive', $rootfs]); + PVE::Tools::run_command(['umount', '--recursive', $vars->{ROOTFS_PATH}]); # Because netlink is not a reliable protocol it can happen that lxc's # link-deletion messages get lost (or end up being too early?) @@ -72,7 +38,7 @@ __PACKAGE__->register_method ({ PVE::Network::veth_delete("veth${vmid}i$ind"); } - my $target = $ENV{LXC_TARGET}; + my $target = $vars->{TARGET}; if ($target && $target eq 'reboot') { # In order to make sure hot-plugged config changes aren't reverted # to what the monitor initially loaded we need to stop the container @@ -91,24 +57,4 @@ __PACKAGE__->register_method ({ } PVE::GuestHelpers::exec_hookscript($conf, $vmid, 'post-stop'); - - return undef; - }}); - - -push @ARGV, 'help' if !scalar(@ARGV); - -my $param = {}; - -if ((scalar(@ARGV) == 3) && ($ARGV[1] eq 'lxc') && ($ARGV[2] eq 'post-stop')) { - $param->{name} = $ENV{'LXC_NAME'}; - die "got wrong name" if $param->{name} ne $ARGV[0]; - - @ARGV = (); -} else { - @ARGV = ('help'); -} - -our $cmddef = [ __PACKAGE__, 'lxc-pve-poststop-hook', [], $param]; - -__PACKAGE__->run_cli_handler(); +}); diff --git a/src/lxc-pve-prestart-hook b/src/lxc-pve-prestart-hook index 18b60cf..c0965ab 100755 --- a/src/lxc-pve-prestart-hook +++ b/src/lxc-pve-prestart-hook @@ -5,57 +5,21 @@ package lxc_pve_prestart_hook; use strict; use warnings; -exit 0 if $ENV{LXC_NAME} && $ENV{LXC_NAME} !~ /^\d+$/; - use POSIX; use File::Path; use Fcntl ':mode'; -use PVE::SafeSyslog; -use PVE::Tools; use PVE::Cluster; -use PVE::INotify; -use PVE::RPCEnvironment; -use PVE::JSONSchema qw(get_standard_option); -use PVE::CLIHandler; -use PVE::Storage; -use PVE::LXC; +use PVE::LXC::Config; use PVE::LXC::Setup; +use PVE::LXC::Tools; +use PVE::LXC; +use PVE::Storage; +use PVE::Tools; + +PVE::LXC::Tools::lxc_hook('pre-start', 'lxc', sub { + my ($vmid, $vars, undef, undef) = @_; -use base qw(PVE::CLIHandler); - -__PACKAGE__->register_method ({ - name => 'lxc-pve-prestart-hook', - path => 'lxc-pve-prestart-hook', - method => 'GET', - description => "Create a new container root directory.", - parameters => { - additionalProperties => 0, - properties => { - name => { - description => "The container name. This hook is only active for containers using numeric IDs, where configuration is stored on /etc/pve/lxc/<name>.conf (else it is just a NOP).", - type => 'string', - pattern => '\S+', - maxLength => 64, - }, - path => { - description => "The path to the container configuration directory (LXC internal argument - do not pass manually!).", - type => 'string', - }, - rootfs => { - description => "The path to the container's rootfs (LXC internal argument - do not pass manually!)", - type => 'string', - }, - }, - }, - returns => { type => 'null' }, - - code => sub { - my ($param) = @_; - - return undef if $param->{name} !~ m/^\d+$/; - - my $vmid = $param->{name}; my $skiplock_flag_fn = "/run/lxc/skiplock-$vmid"; my $skiplock = 1 if -e $skiplock_flag_fn; unlink $skiplock_flag_fn if $skiplock; @@ -76,7 +40,7 @@ __PACKAGE__->register_method ({ PVE::Storage::activate_volumes($storage_cfg, $vollist); - my $rootdir = $param->{rootfs}; + my $rootdir = $vars->{ROOTFS_PATH}; # Delete any leftover reboot-trigger file unlink("/var/lib/lxc/$vmid/reboot"); @@ -116,25 +80,4 @@ __PACKAGE__->register_method ({ } PVE::Tools::file_set_contents($devlist_file, $devlist); } - return undef; - }}); - - -push @ARGV, 'help' if !scalar(@ARGV); - -my $param = {}; - -if ((scalar(@ARGV) == 3) && ($ARGV[1] eq 'lxc') && ($ARGV[2] eq 'pre-start')) { - $param->{name} = $ENV{'LXC_NAME'}; - die "got wrong name" if $param->{name} ne $ARGV[0]; - - $param->{path} = $ENV{'LXC_CONFIG_FILE'}; - $param->{rootfs} = $ENV{'LXC_ROOTFS_PATH'}; - @ARGV = (); -} else { - @ARGV = ('help'); -} - -our $cmddef = [ __PACKAGE__, 'lxc-pve-prestart-hook', [], $param]; - -__PACKAGE__->run_cli_handler(); +}); _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel