1
0
mirror of https://github.com/mailcow/mailcow-dockerized.git synced 2025-12-22 14:21:31 +00:00
Files
mailcow-dockerized/_modules/ipv6_controller.sh
2025-05-26 17:09:58 +02:00

108 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# _modules/ipv6_controller.sh
# 1) Check if the host supports IPv6
get_ipv6_support() {
if grep -qs '^1' /proc/sys/net/ipv6/conf/all/disable_ipv6 2>/dev/null \
|| ! ip -6 route show default &>/dev/null; then
ENABLE_IPV6_LINE="ENABLE_IPV6=false"
echo "IPv6 not detected on host disabling IPv6 support."
else
ENABLE_IPV6_LINE="ENABLE_IPV6=true"
echo "IPv6 detected on host leaving IPv6 support enabled."
fi
}
# 2) Ensure Docker daemon.json has the required IPv6 settings
docker_daemon_edit(){
DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json"
MISSING=()
# helper: check for a key/value in the JSON
_has_kv() { grep -Eq "\"$1\"\s*:\s*$2" "$DOCKER_DAEMON_CONFIG" 2>/dev/null; }
if [[ -f "$DOCKER_DAEMON_CONFIG" ]]; then
# Validate JSON syntax if jq is available
if command -v jq &>/dev/null; then
if ! jq empty "$DOCKER_DAEMON_CONFIG" &>/dev/null; then
echo "ERROR: Invalid JSON in $DOCKER_DAEMON_CONFIG please correct it manually."
exit 1
fi
else
echo "WARNING: jq not found JSON syntax not validated."
fi
# Check required settings
! _has_kv ipv6 true && MISSING+=("ipv6: true")
! grep -Eq '"fixed-cidr-v6"\s*:\s*".+"' "$DOCKER_DAEMON_CONFIG" \
&& MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"')
# Determine Docker major version
DOCKER_MAJOR=$(docker version --format '{{.Server.Version}}' 2>/dev/null | cut -d. -f1)
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
_has_kv ipv6 true && ! _has_kv ip6tables true \
&& MISSING+=("ip6tables: true")
! _has_kv experimental true \
&& MISSING+=("experimental: true")
else
echo "Docker ≥27 detected skipping ip6tables/experimental checks."
fi
# If anything is missing, offer to auto-fix
if ((${#MISSING[@]}>0)); then
echo "Your daemon.json is missing: ${MISSING[*]}"
read -p "Would you like to update $DOCKER_DAEMON_CONFIG now? [Y/n] " ans
ans=${ans:-Y}
if [[ $ans =~ ^[Yy]$ ]]; then
cp "$DOCKER_DAEMON_CONFIG" "${DOCKER_DAEMON_CONFIG}.bak"
if command -v jq &>/dev/null; then
TMP=$(mktemp)
JQ_FILTER='.ipv6 = true | .["fixed-cidr-v6"] = "fd00:dead:beef:c0::/80"'
[[ "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]] \
&& JQ_FILTER+=' | .ip6tables = true | .experimental = true'
jq "$JQ_FILTER" "$DOCKER_DAEMON_CONFIG" >"$TMP" && mv "$TMP" "$DOCKER_DAEMON_CONFIG"
echo "daemon.json updated. Restarting Docker..."
(command -v systemctl &>/dev/null && systemctl restart docker) \
|| service docker restart
echo "Docker restarted. Please rerun this script."
exit 1
else
echo "Please install jq or manually update daemon.json and restart Docker."
exit 1
fi
else
ENABLE_IPV6_LINE="ENABLE_IPV6=false"
echo "User declined update disabling IPv6 support."
fi
fi
else
echo "WARNING: $DOCKER_DAEMON_CONFIG not found skipping Docker config check."
fi
}
# 3) Wrapper to integrate into both generate_config.sh and update.sh
configure_ipv6() {
get_ipv6_support
# Only edit Docker config if IPv6 is enabled on host
if [[ "$ENABLE_IPV6_LINE" == "ENABLE_IPV6=true" ]]; then
docker_daemon_edit
else
echo "Skipping Docker IPv6 configuration because host does not support IPv6."
fi
# Write ENABLE_IPV6 into mailcow.conf (generate_config.sh) or export in current shell (update.sh)
if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]]; then
# generate_config.sh: append or replace in mailcow.conf
if grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then
sed -i "s/^ENABLE_IPV6=.*/$ENABLE_IPV6_LINE/" "$MAILCOW_CONF"
else
echo "$ENABLE_IPV6_LINE" >> "$MAILCOW_CONF"
fi
else
# update.sh: export into the running environment
export "$ENABLE_IPV6_LINE"
fi
echo "IPv6 configuration complete: $ENABLE_IPV6_LINE"
}