Commit f6be4b15 authored by Vitaly Lipatov's avatar Vitaly Lipatov

route-update.sh: use shared helpers from functions

Replace inline definitions with shared functions: log, has_option, rule_pref, resolve_gw, resolve_default_gw. Use read_value/read_values instead of grep -v '^#' | grep -m1, ipcmd_for instead of manual detection, table_by_name inside lookup_table. Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 0b20bdb1
......@@ -105,101 +105,29 @@ while [ -n "$1" ] ; do
done
# Helpers
log() { echo "$(date '+%H:%M:%S') $*" ; }
vlog() { [ -n "$VERBOSE" ] && log " $*" ; }
md5_lists()
{
cat "$@" 2>/dev/null | md5sum | awk '{print $1}'
}
ensure_state_dir()
{
mkdir -p "$STATE_DIR/$1"
}
# Get rule priority from table number (table * 10)
rule_pref()
{
echo $(( $1 * 10 ))
}
# Resolve "default" keyword to actual default gateway
# Usage: resolve_default_gw IPCMD
# IPCMD: "ip" for IPv4, "ip -6" for IPv6
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
}
md5_lists() { cat "$@" 2>/dev/null | md5sum | awk '{print $1}' ; }
ensure_state_dir() { mkdir -p "$STATE_DIR/$1" ; }
# 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
lookup_table()
{
local name="$1"
local gateway="$2"
# Try rt_tables first
local num=$(awk -v n="$name" '$2 == n { print $1; exit }' /etc/iproute2/rt_tables 2>/dev/null)
if [ -n "$num" ] ; then
echo "$num"
return
fi
local name="$1" gateway="$2"
local num=$(table_by_name "$name")
if [ -n "$num" ] ; then echo "$num" ; return ; fi
# Fallback: last component of gateway IP
# IPv4: 91.232.225.122 → 122
# IPv6: 2a03:5a00:c:20::122 → 122
# Fallback: last component of gateway IP (91.232.225.122 → 122)
num=$(echo "$gateway" | sed -E 's/.*[.:]([0-9]+)$/\1/')
# Auto-register in rt_tables
if [ -n "$num" ] ; then
echo "$num $name" >> /etc/iproute2/rt_tables
vlog "Added rt_tables entry: $num $name"
fi
echo "$num"
}
# Check if option is set in group's options file
# Usage: has_option DIR OPTION
has_option()
{
[ -f "$1/options" ] && grep -q "^$2$" "$1/options" 2>/dev/null
}
# Read gateway and table from a group directory
# Sets: gw, table, route_via, opt_set_default
# gw - first gateway (for display and IPv4/v6 detection)
# table - routing table number (from rt_tables or last IP octet)
# route_via - route suffix: "via GW table T" or "table T nexthop via GW1 ... nexthop via GW2 ..."
# opt_set_default - "1" if set-default option is enabled
# $1 - directory, $2 - ip command ("ip" or "ip -6")
read_group_config()
{
local dir="$1"
......@@ -208,7 +136,7 @@ read_group_config()
gw="" ; table="" ; route_via="" ; opt_set_default=""
if [ -f "$dir/gateway" ] ; then
local raw_gw=$(grep -v '^#' "$dir/gateway" | grep -m1 .)
local raw_gw=$(read_value "$dir/gateway")
gw=$(resolve_gw "$raw_gw" "$ipcmd")
if [ -z "$gw" ] ; then
echo "[$name] Cannot resolve gateway '$raw_gw', skipping" >&2
......@@ -221,7 +149,7 @@ read_group_config()
# Table from file (legacy) or by name lookup
if [ -f "$dir/table" ] ; then
table=$(grep -v '^#' "$dir/table" | grep -m1 .)
table=$(read_value "$dir/table")
else
table=$(lookup_table "$name" "$gw")
fi
......@@ -235,13 +163,13 @@ read_group_config()
has_option "$dir" "set-default" && opt_set_default=1
# Build route suffix: single vs multipath
local gw_count=$(grep -v '^#' "$dir/gateway" | grep -c .)
local gw_count=$(read_values "$dir/gateway" | wc -l)
if [ "$gw_count" -le 1 ] ; then
route_via="via $gw table $table"
else
route_via="table $table"
local g
for g in $(grep -v '^#' "$dir/gateway" | grep .) ; do
for g in $(read_values "$dir/gateway") ; do
g=$(resolve_gw "$g" "$ipcmd")
[ -z "$g" ] && continue
route_via="$route_via nexthop via $g weight 1"
......@@ -268,9 +196,7 @@ if [ "$ACTION" = "add" ] || [ "$ACTION" = "del" ] ; then
[ -n "$ADD_DEL_TARGET" ] && [ -n "$ADD_DEL_GROUP" ] || { echo "Usage: $0 --$ACTION IP|DOMAIN GROUP" >&2 ; exit 1 ; }
groupdir=$(find_group "$ADD_DEL_GROUP") || exit 1
# Detect IPv4 vs IPv6 from directory location
ipcmd="ip"
echo "$groupdir" | grep -q "$ROUTES6_DIR" && ipcmd="ip -6"
ipcmd=$(ipcmd_for "$groupdir")
read_group_config "$groupdir" "$ipcmd" || exit 1
if [ "$ACTION" = "add" ] ; then
......@@ -298,8 +224,7 @@ fi
# --- Flush a specific group ---
if [ -n "$FLUSH_GROUP" ] ; then
groupdir=$(find_group "$FLUSH_GROUP") || exit 1
ipcmd="ip"
echo "$groupdir" | grep -q "$ROUTES6_DIR" && ipcmd="ip -6"
ipcmd=$(ipcmd_for "$groupdir")
read_group_config "$groupdir" "$ipcmd" || exit 1
log "Flushing table $table (group $FLUSH_GROUP)"
[ -z "$SHOW" ] && $ipcmd route flush table "$table" 2>/dev/null
......@@ -461,7 +386,7 @@ process_routes()
fi
local count=$(wc -l < "$resolved_new")
local gw_display=$(grep -v '^#' "$gwdir/gateway" | grep . | paste -sd,)
local gw_display=$(read_values "$gwdir/gateway" | paste -sd,)
log "[$name]$label Loading $count routes into table $table via $gw_display"
if [ -n "$SHOW" ] ; then
......@@ -517,8 +442,7 @@ cleanup_state()
{
for routes_dir in "$ROUTES_DIR" "$ROUTES6_DIR" ; do
[ -d "$STATE_DIR/$routes_dir" ] || continue
local ipcmd="ip"
[ "$routes_dir" = "$ROUTES6_DIR" ] && ipcmd="ip -6"
local ipcmd=$(ipcmd_for "$routes_dir")
for sdir in "$STATE_DIR/$routes_dir"/*/ ; do
[ -d "$sdir" ] || continue
......
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