]>
git.proxmox.com Git - pve-container.git/blob - src/lxc-pve-poststop-hook
e3a8956ed1b644b8e3222924dfd343650af15644
3 package lxc_pve_poststop_hook
;
8 exit 0 if $ENV { LXC_NAME
} && $ENV { LXC_NAME
} !~ /^\d+$/ ;
18 use PVE
:: RPCEnvironment
;
19 use PVE
:: JSONSchema
qw(get_standard_option) ;
22 use PVE
:: Storage
:: Plugin
;
26 use base
qw(PVE::CLIHandler) ;
28 __PACKAGE__-
> register_method ({
29 name
=> 'lxc-pve-poststop-hook' ,
30 path
=> 'lxc-pve-poststop-hook' ,
32 description
=> "vm_stop_cleanup." ,
34 additionalProperties
=> 0 ,
37 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)." ,
44 returns
=> { type
=> 'null' },
49 return undef if $param ->{ name
} !~ m/^\d+$/ ;
51 my $vmid = $param ->{ name
};
53 return undef if ! - f PVE
:: LXC
:: Config-
> config_file ( $vmid );
55 my $conf = PVE
:: LXC
:: Config-
> load_config ( $vmid );
57 my $storage_cfg = PVE
:: Storage
:: config
();
59 PVE
:: LXC
:: vm_stop_cleanup
( $storage_cfg, $vmid, $conf );
61 my $rootfs = $ENV { LXC_ROOTFS_PATH
};
62 die "Missing container root directory! \n " if ! $rootfs ;
63 PVE
:: Tools
:: run_command
([ 'umount' , '--recursive' , $rootfs ]);
65 # Because netlink is not a reliable protocol it can happen that lxc's
66 # link-deletion messages get lost (or end up being too early?)
67 for my $k ( keys %$conf ) {
68 next if $k !~ /^net(\d+)/ ;
70 my $net = PVE
:: LXC
:: Config-
> parse_lxc_network ( $conf ->{ $k });
71 next if $net ->{ type
} ne 'veth' ;
72 # veth_delete tests with '-d /sys/class/net/$name' before running the command
73 PVE
:: Network
:: veth_delete
( "veth${vmid}i $ind " );
76 my $target = $ENV { LXC_TARGET
};
77 if ( $target && $target eq 'reboot' ) {
78 # In order to make sure hot-plugged config changes aren't reverted
79 # to what the monitor initially loaded we need to stop the container
81 # Update the config and queue a restart of the lxc@$vmid task, note
82 # that we must not block because we're part of the service cgroup
83 # systemd waits for to die before issuing the new lxc-start command.
84 PVE
:: LXC
:: update_lxc_config
( $vmid, $conf );
86 # Synchronization pipe
87 my $scope = IO
:: Pipe-
> new () or die "pipe failed: $!\n " ;
89 die "fork failed: $!\n " if ! defined ( $pid );
92 # We inherit a pipe from LXC, replace it with stderr otherwise
93 # lxc will keep waiting for us...
97 # Change scope otherwise we're part of lxc@.service and then
98 # if lxc finishes cleaning up before we restart it systemd
99 # might clean US up as well (read: kill us) => race
100 PVE
:: Tools
:: enter_systemd_scope
( "restart- $vmid " , "Restarter for Proxmox VE CT $vmid " ,
101 Slice
=> 'lxc.slice' ,
103 # Tell the main stop hook we're "in the clear":
105 # Wait for the container to clean up everything...
106 PVE
:: Tools
:: run_command
([ 'lxc-wait' , "--name= $vmid " , '--state=STOPPED' ]);
107 # ... before finally triggering a restart:
108 PVE
:: Tools
:: run_command
([ 'systemctl' , 'restart' , "lxc\ @$vmid " ]);
113 # Wait for the restarter scope to make sure systemd doesn't kill it before it started...
116 # cause lxc to stop instead of rebooting
124 push @ARGV, 'help' if ! scalar ( @ARGV );
128 if (( scalar ( @ARGV ) == 3 ) && ( $ARGV [ 1 ] eq 'lxc' ) && ( $ARGV [ 2 ] eq 'post-stop' )) {
129 $param ->{ name
} = $ENV { 'LXC_NAME' };
130 die "got wrong name" if $param ->{ name
} ne $ARGV [ 0 ];
137 our $cmddef = [ __PACKAGE__
, 'lxc-pve-poststop-hook' , [], $param ];
139 __PACKAGE__-
> run_cli_handler ();