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: ...@@ -68,8 +68,8 @@ MODES OF OPERATION:
--help, -h Show this help and exit. --help, -h Show this help and exit.
DIRECTORY STRUCTURE: DIRECTORY STRUCTURE:
routes.d/GROUP/gateway Gateway IP(s), one per line. "default" = default gw. routes.d/GROUP/gateway Gateway: IP, hostname, or "default" (one per line).
Multiple lines = multipath (per-flow balancing). Hostnames are resolved via dig. Multiple lines = multipath.
routes.d/GROUP/options Optional flags, one per line: routes.d/GROUP/options Optional flags, one per line:
set-default Also set system default route via gateway. set-default Also set system default route via gateway.
routes.d/GROUP/table (legacy) Routing table number override. routes.d/GROUP/table (legacy) Routing table number override.
...@@ -137,6 +137,31 @@ resolve_default_gw() ...@@ -137,6 +137,31 @@ resolve_default_gw()
$1 route show default | awk '/default/ {print $3; exit}' $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 # 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 # If derived from IP, auto-creates entry in rt_tables
# Usage: lookup_table NAME GATEWAY # Usage: lookup_table NAME GATEWAY
...@@ -188,9 +213,11 @@ read_group_config() ...@@ -188,9 +213,11 @@ read_group_config()
gw="" ; table="" ; route_via="" ; opt_set_default="" gw="" ; table="" ; route_via="" ; opt_set_default=""
if [ -f "$dir/gateway" ] ; then if [ -f "$dir/gateway" ] ; then
gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .) local raw_gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .)
if [ "$gw" = "default" ] ; then gw=$(resolve_gw "$raw_gw" "$ipcmd")
gw=$(resolve_default_gw "$ipcmd") if [ -z "$gw" ] ; then
echo "[$name] Cannot resolve gateway '$raw_gw', skipping" >&2
return 1
fi fi
else else
echo "[$name] No gateway file, skipping" >&2 echo "[$name] No gateway file, skipping" >&2
...@@ -220,9 +247,8 @@ read_group_config() ...@@ -220,9 +247,8 @@ read_group_config()
route_via="table $table" route_via="table $table"
local g local g
for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do
if [ "$g" = "default" ] ; then g=$(resolve_gw "$g" "$ipcmd")
g=$(resolve_default_gw "$ipcmd") [ -z "$g" ] && continue
fi
route_via="$route_via nexthop via $g weight 1" route_via="$route_via nexthop via $g weight 1"
done done
fi 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