#!/bin/bash # Info: Script to install Resolv packages # Author: JesusPerezLorenzo # Release: 1.0 # Date: 30-10-2023 USAGE="install-resolv.sh " [ "$1" == "-h" ] && echo "$USAGE" && exit 1 _config_resolver() { [ -z "$NAMESERVERS" ] && return local resolv_cfg_path local resolv_cfg_file if [ -d "/etc/resolvconf/resolv.conf.d" ] ; then resolv_cfg_path=/etc/resolvconf/resolv.conf.d resolv_cfg_file="head" else resolv_cfg_path=/etc resolv_cfg_file="resolv.conf" chattr -i "$resolv_cfg_path/$resolv_cfg_file" fi [ ! -r "$resolv_cfg_path/_$resolv_cfg_file" ] && sudo mv "$resolv_cfg_path/$resolv_cfg_file" "$resolv_cfg_path/_$resolv_cfg_file" grep -v "^nameserver" "$resolv_cfg_path/_$resolv_cfg_file" | sudo tee "$resolv_cfg_path/$resolv_cfg_file" &>/dev/null echo " #options rotate options timeout:1 " | sudo tee -a "$resolv_cfg_path/$resolv_cfg_file" &>/dev/null for ns in $NAMESERVERS do echo "nameserver $ns" | sudo tee -a "$resolv_cfg_path/$resolv_cfg_file" &>/dev/null done [ -n "$DOMAINS_SEARCH" ] && echo "search $DOMAINS_SEARCH" | sudo tee -a "$resolv_cfg_path/$resolv_cfg_file" &>/dev/null if [ -d "/etc/resolvconf/resolv.conf.d" ] ; then sudo timeout -k 10 20 systemctl restart resolvconf else chattr +i "$resolv_cfg_path/$resolv_cfg_file" fi } _config_split_dns() { [ -z "$SPLIT_DNS_SERVER" ] && return # Prefer systemd-resolved: true per-domain routing via routing domains. if systemctl cat systemd-resolved &>/dev/null; then local domains="" for d in $SPLIT_DNS_DOMAINS; do domains="$domains ~$d" done mkdir -p /etc/systemd/resolved.conf.d printf '[Resolve]\nDNS=%s\nDomains=%s\n' \ "$SPLIT_DNS_SERVER" "${domains# }" \ > /etc/systemd/resolved.conf.d/10-split-dns.conf local stub=/run/systemd/resolve/stub-resolv.conf local cur cur=$(readlink /etc/resolv.conf 2>/dev/null || echo "") if [ "$cur" != "$stub" ]; then chattr -i /etc/resolv.conf 2>/dev/null || true rm -f /etc/resolv.conf ln -sf "$stub" /etc/resolv.conf fi systemctl enable --now systemd-resolved systemctl daemon-reload systemctl restart systemd-resolved return fi # Fallback: prepend SPLIT_DNS_SERVER as primary nameserver. # coredns-vpn at SPLIT_DNS_SERVER forwards unknown zones to upstream. # Mirror the same path-selection logic as _config_resolver so resolvconf wins. if [ -d "/etc/resolvconf/resolv.conf.d" ]; then # resolvconf is managing /etc/resolv.conf. # Use 'head': its content is cat-ed verbatim into the output, bypassing the # 3-nameserver cap enforced on the 'base' file's entries. local head=/etc/resolvconf/resolv.conf.d/head if ! grep -q "^nameserver ${SPLIT_DNS_SERVER}$" "$head" 2>/dev/null; then local tmp tmp=$(mktemp) printf 'nameserver %s\n' "$SPLIT_DNS_SERVER" > "$tmp" grep "^nameserver" "$head" 2>/dev/null | grep -vF "$SPLIT_DNS_SERVER" >> "$tmp" || true grep -v "^nameserver" "$head" 2>/dev/null >> "$tmp" || true sudo mv "$tmp" "$head" fi resolvconf -u 2>/dev/null || sudo timeout -k 10 20 systemctl restart resolvconf else local resolv=/etc/resolv.conf chattr -i "$resolv" 2>/dev/null || true if ! grep -q "^nameserver ${SPLIT_DNS_SERVER}$" "$resolv" 2>/dev/null; then local tmp tmp=$(mktemp) printf 'nameserver %s\n' "$SPLIT_DNS_SERVER" > "$tmp" grep "^nameserver" "$resolv" 2>/dev/null | grep -vF "$SPLIT_DNS_SERVER" >> "$tmp" || true grep -v "^nameserver" "$resolv" 2>/dev/null >> "$tmp" || true sudo mv "$tmp" "$resolv" fi chattr +i "$resolv" 2>/dev/null || true fi } [ -r "./env-resolv" ] && . ./env-resolv case "${1:-install}" in install|update|reinstall|restart) _config_resolver _config_split_dns ;; resolver) _config_resolver ;; split-dns) _config_split_dns ;; esac exit 0