Commit a9088430 authored by Vitaly Lipatov's avatar Vitaly Lipatov

route-update.sh: support hostnames in gateway file via DNS resolution

Gateway file now accepts hostnames in addition to IPs and "default". Hostnames are resolved via dig (A for IPv4, AAAA for IPv6). Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent bf391c49
......@@ -68,8 +68,8 @@ MODES OF OPERATION:
--help, -h Show this help and exit.
DIRECTORY STRUCTURE:
routes.d/GROUP/gateway Gateway IP(s), one per line. "default" = default gw.
Multiple lines = multipath (per-flow balancing).
routes.d/GROUP/gateway Gateway: IP, hostname, or "default" (one per line).
Hostnames are resolved via dig. Multiple lines = multipath.
routes.d/GROUP/options Optional flags, one per line:
set-default Also set system default route via gateway.
routes.d/GROUP/table (legacy) Routing table number override.
......@@ -137,6 +137,31 @@ resolve_default_gw()
$1 route show default | awk '/default/ {print $3; exit}'
}
# Resolve gateway value: "default" → system default, hostname → IP, IP → as-is
# Usage: resolve_gw VALUE IPCMD
resolve_gw()
{
local val="$1"
local ipcmd="${2:-ip}"
case "$val" in
default)
resolve_default_gw "$ipcmd"
;;
*[a-zA-Z]*)
# Domain name: resolve to IP
if [ "$ipcmd" = "ip -6" ] ; then
dig +short AAAA "$val" | grep -m1 ':'
else
dig +short A "$val" | grep -m1 '[0-9]'
fi
;;
*)
echo "$val"
;;
esac
}
# Look up table number: first from rt_tables by name, then from last IP octet
# If derived from IP, auto-creates entry in rt_tables
# Usage: lookup_table NAME GATEWAY
......@@ -188,9 +213,11 @@ read_group_config()
gw="" ; table="" ; route_via="" ; opt_set_default=""
if [ -f "$dir/gateway" ] ; then
gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .)
if [ "$gw" = "default" ] ; then
gw=$(resolve_default_gw "$ipcmd")
local raw_gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .)
gw=$(resolve_gw "$raw_gw" "$ipcmd")
if [ -z "$gw" ] ; then
echo "[$name] Cannot resolve gateway '$raw_gw', skipping" >&2
return 1
fi
else
echo "[$name] No gateway file, skipping" >&2
......@@ -220,9 +247,8 @@ read_group_config()
route_via="table $table"
local g
for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do
if [ "$g" = "default" ] ; then
g=$(resolve_default_gw "$ipcmd")
fi
g=$(resolve_gw "$g" "$ipcmd")
[ -z "$g" ] && continue
route_via="$route_via nexthop via $g weight 1"
done
fi
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment