Files
computer-playbook/scripts/system/network/ipv6/disable.sh
T

112 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
STATE_FILE="/tmp/infinito-dev-environment-ipv6.state"
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "[ipv6] error: disable.sh must be run as root (for example via 'sudo' or 'make disable-ipv6')" >&2
exit 1
fi
write_state_file() {
local current_all="$1"
local current_default="$2"
local path
local iface
local value
{
printf 'ALL_DISABLE_IPV6=%q\n' "${current_all}"
printf 'DEFAULT_DISABLE_IPV6=%q\n' "${current_default}"
printf 'declare -A IFACE_DISABLE_IPV6=(\n'
for path in /proc/sys/net/ipv6/conf/*/disable_ipv6; do
[[ -e "${path}" ]] || continue
iface="${path%/disable_ipv6}"
iface="${iface##*/}"
value="$(<"${path}")"
printf ' [%q]=%q\n' "${iface}" "${value}"
done
printf ')\n'
} >"${STATE_FILE}"
}
disable_existing_interfaces() {
local path
local iface
for path in /proc/sys/net/ipv6/conf/*/disable_ipv6; do
[[ -e "${path}" ]] || continue
iface="${path%/disable_ipv6}"
iface="${iface##*/}"
[[ "${iface}" == "all" || "${iface}" == "default" ]] && continue
if ! sysctl -w "net.ipv6.conf.${iface}.disable_ipv6=1" >/dev/null 2>&1; then
echo "[ipv6] warning: cannot update net.ipv6.conf.${iface}.disable_ipv6"
fi
done
}
restart_docker_service() {
if ! command -v systemctl >/dev/null 2>&1; then
echo "[ipv6] warning: systemctl is unavailable; skipping docker.service restart"
return 0
fi
if ! systemctl list-unit-files docker.service >/dev/null 2>&1; then
echo "[ipv6] warning: docker.service is unavailable; skipping docker.service restart"
return 0
fi
echo "[ipv6] restarting docker.service"
if ! systemctl restart docker.service >/dev/null 2>&1; then
echo "[ipv6] warning: failed to restart docker.service"
return 0
fi
echo "[ipv6] restarted docker.service"
}
if ! command -v sysctl >/dev/null 2>&1; then
echo "[ipv6] skipping disable: sysctl is unavailable in this environment"
exit 0
fi
if ! current_all="$(sysctl -n net.ipv6.conf.all.disable_ipv6 2>/dev/null)"; then
echo "[ipv6] skipping disable: kernel does not expose net.ipv6.conf.all.disable_ipv6"
exit 0
fi
if ! current_default="$(sysctl -n net.ipv6.conf.default.disable_ipv6 2>/dev/null)"; then
echo "[ipv6] skipping disable: kernel does not expose net.ipv6.conf.default.disable_ipv6"
exit 0
fi
echo "[ipv6] current: all=${current_all} default=${current_default}"
if [[ ! -f "${STATE_FILE}" ]]; then
write_state_file "${current_all}" "${current_default}"
else
echo "[ipv6] existing state file found at ${STATE_FILE}; keeping original restore values"
fi
if ! sysctl -w net.ipv6.conf.all.disable_ipv6=1 >/dev/null; then
rm -f "${STATE_FILE}"
echo "[ipv6] skipping disable: cannot update net.ipv6.conf.all.disable_ipv6"
exit 0
fi
if ! sysctl -w net.ipv6.conf.default.disable_ipv6=1 >/dev/null; then
if ! sysctl -w "net.ipv6.conf.all.disable_ipv6=${current_all}" >/dev/null 2>&1; then
echo "[ipv6] warning: failed to restore net.ipv6.conf.all.disable_ipv6"
fi
rm -f "${STATE_FILE}"
echo "[ipv6] skipping disable: cannot update net.ipv6.conf.default.disable_ipv6"
exit 0
fi
disable_existing_interfaces
restart_docker_service
echo "[ipv6] disabled for all, default, and currently existing interfaces"
echo "[ipv6] note: make disable-ipv6 calls make refresh after the docker.service restart"