/usr/share/lxc/hooks/dhclient is in liblxc-common 3.0.0-0ubuntu2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #! /bin/bash
set -eu
LXC_DHCP_SCRIPT="/usr/share/lxc/hooks/dhclient-script"
LXC_DHCP_CONFIG="/etc/lxc/dhclient.conf"
rootfs_path="${LXC_ROOTFS_PATH#*:}"
hookdir="${rootfs_path/%rootfs/hook}"
conffile_arg=""
if [ -e "${LXC_DHCP_CONFIG}" ]; then
conffile_arg="-cf ${LXC_DHCP_CONFIG}"
fi
debugfile="/dev/null"
if [ "${LXC_LOG_LEVEL}" = "DEBUG" ] || [ "${LXC_LOG_LEVEL}" = "TRACE" ]; then
debugfile="${hookdir}/dhclient.log"
echo "INFO: Writing dhclient log at ${debugfile}." >&2
fi
pidfile="${hookdir}/dhclient.pid"
leasefile="${hookdir}/dhclient.leases"
usage() {
echo "Usage: ${0##*/} <name> lxc {start-host|stop}"
}
# Wrap the dhclient command with "aa-exec -p unconfined" if AppArmor is enabled.
dhclient() {
bin="/sbin/dhclient"
if [ -d "/sys/kernel/security/apparmor" ] && which aa-exec >/dev/null; then
bin="aa-exec -p unconfined ${bin}"
fi
echo $bin
}
dhclient_start() {
ns_args=("--uts" "--net")
if [ -z "$(readlink /proc/${LXC_PID}/ns/user /proc/self/ns/user | uniq -d)" ]; then
ns_args+=("--user")
fi
mkdir -p "${hookdir}"
if [ -e "${pidfile}" ]; then
echo "WARN: DHCP client is already running, skipping start hook." >> "${debugfile}"
else
echo "INFO: Starting DHCP client and acquiring a lease..." >> "${debugfile}"
nsenter ${ns_args[@]} --target "${LXC_PID}" -- \
$(dhclient) -1 ${conffile_arg} -pf "${pidfile}" -lf "${leasefile}" -e "ROOTFS=${rootfs_path}" -sf "${LXC_DHCP_SCRIPT}" -v >> "${debugfile}" 2>&1
fi
}
dhclient_stop() {
# We can't use LXC_PID here since the container process has exited,
# use the namespace file descriptors in the hook arguments instead.
ns_args=("")
if [ "${LXC_HOOK_VERSION:-0}" -eq 0 ]; then
for arg in "$@"; do
case "${arg}" in
uts:* | user:* | net:*) ns_args+=("--${arg/:/=}") ;;
*) ;;
esac
done
else
ns_args+=("--uts=${LXC_UTS_NS}")
ns_args+=("--net=${LXC_NET_NS}")
[ -n "${LXC_USER_NS:+x}" ] && ns_args+=("--user=${LXC_USER_NS}")
fi
if [ -e "${pidfile}" ]; then
echo "INFO: Stopping DHCP client and releasing leases..." >> "${debugfile}"
nsenter ${ns_args[@]} -- \
$(dhclient) -r ${conffile_arg} -pf "${pidfile}" -lf "${leasefile}" -e "ROOTFS=${rootfs_path}" -sf "${LXC_DHCP_SCRIPT}" -v >> "${debugfile}" 2>&1
else
echo "WARN: DHCP client is not running, skipping stop hook." >> "${debugfile}"
fi
# dhclient could fail to release the lease and shutdown, try to cleanup after ourselves just in case.
nsenter ${ns_args[@]} -- \
/bin/sh -c 'pkill --ns $$ --nslist net -f "^/sbin/dhclient"' || true
rm -f "${pidfile}"
}
HOOK_SECTION=
HOOK_TYPE=
case "${LXC_HOOK_VERSION:-0}" in
0) HOOK_SECTION="${2:-}"; HOOK_TYPE="${3:-}"; shift 3;;
1) HOOK_SECTION="${LXC_HOOK_SECTION:-}"; HOOK_TYPE="${LXC_HOOK_TYPE:-}";;
*) echo "ERROR: Unsupported hook version: ${LXC_HOOK_VERSION}." >&2; exit 1;;
esac
if [ "${HOOK_SECTION}" != "lxc" ]; then
echo "ERROR: Not running through LXC." >&2
exit 1
fi
case "${HOOK_TYPE}" in
start-host) dhclient_start $@;;
stop) dhclient_stop $@;;
*) usage; exit 1;;
esac
exit 0
|