diff options
| author | rtk0c <[email protected]> | 2025-11-08 16:33:25 -0800 |
|---|---|---|
| committer | rtk0c <[email protected]> | 2025-11-08 16:47:12 -0800 |
| commit | d2597b3d5aa9e07ff92a09eb73d580b2d325f073 (patch) | |
| tree | fabd86a4aa07a9a78d4f97a505013fcf8e08b17a | |
| parent | 0dbdad755139bec2b917adae63e282f4159bfcee (diff) | |
Prompt claude-4.5 plus manual fixup
https://www.perplexity.ai/search/i-will-give-you-the-source-cod-gC4f5PhBQYeuk1GBVZ0Dnw#0
| -rw-r--r-- | netns.diff | 132 | ||||
| -rwxr-xr-x | wg-quick | 55 |
2 files changed, 182 insertions, 5 deletions
diff --git a/netns.diff b/netns.diff new file mode 100644 index 0000000..4072b84 --- /dev/null +++ b/netns.diff @@ -0,0 +1,132 @@ +--- wg-quick.orig ++++ wg-quick +@@ -24,6 +24,7 @@ + SAVE_CONFIG=0 + CONFIG_FILE="" + PROGRAM="${0##*/}" + ARGS=( "$@" ) ++NETNS="" + +@@ -68,6 +69,20 @@ + "$@" + } + ++ensure_netns() { ++ [[ -z $NETNS ]] && return 0 ++ if [[ ! -e /run/netns/$NETNS ]]; then ++ cmd ip netns add "$NETNS" ++ fi ++} ++ ++move_to_netns() { ++ [[ -z $NETNS ]] && return 0 ++ cmd ip link set "$INTERFACE" netns "$NETNS" ++} ++ + die() { + echo "$PROGRAM: $*" >&2 + exit 1 + +@@ -169,11 +184,23 @@ + local proto=-4 + [[ $1 == *:* ]] && proto=-6 +- cmd ip $proto route add "$1" dev "$INTERFACE" table "$TABLE" ++ ++ if [[ -n $NETNS ]]; then ++ cmd ip -n "$NETNS" $proto route add "$1" dev "$INTERFACE" table "$TABLE" ++ else ++ cmd ip $proto route add "$1" dev "$INTERFACE" table "$TABLE" ++ fi + elif [[ $1 == */0 ]]; then + add_default "$1" + else +- [[ -n $(ip $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip $proto route add "$1" dev "$INTERFACE" ++ if [[ -n $NETNS ]]; then ++ [[ -n $(ip -n "$NETNS" $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip -n "$NETNS" $proto route add "$1" dev "$INTERFACE" ++ else ++ [[ -n $(ip $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip $proto route add "$1" dev "$INTERFACE" ++ fi + fi + } + +@@ -267,8 +294,18 @@ + HAVE_SET_DNS=0 + set_dns() { + [[ ${#DNS[@]} -gt 0 ]] || return 0 ++ if [[ -n $NETNS ]]; then ++ local netns_resolv_dir="/etc/netns/$NETNS" ++ cmd mkdir -p "$netns_resolv_dir" ++ { printf 'nameserver %s\n' "${DNS[@]}" ++ [[ ${#DNS_SEARCH[@]} -eq 0 ]] || printf 'search %s\n' "${DNS_SEARCH[*]}" ++ } | cmd tee "$netns_resolv_dir/resolv.conf" > /dev/null ++ else + { printf 'nameserver %s\n' "${DNS[@]}" + [[ ${#DNS_SEARCH[@]} -eq 0 ]] || printf 'search %s\n' "${DNS_SEARCH[*]}" + } | cmd resolvconf -a "$(resolvconf_iface_prefix)$INTERFACE" -m 0 -x ++ fi + HAVE_SET_DNS=1 + } + +@@ -276,6 +313,11 @@ + unset_dns() { + [[ ${#DNS[@]} -gt 0 ]] || return 0 ++ if [[ -n $NETNS ]]; then ++ local netns_resolv="/etc/netns/$NETNS/resolv.conf" ++ [[ -f $netns_resolv ]] && cmd rm -f "$netns_resolv" ++ return 0 ++ fi + cmd resolvconf -d "$(resolvconf_iface_prefix)$INTERFACE" -f + } + +@@ -431,7 +473,7 @@ + + cmd_usage() { + cat >&2 <<-_EOF +- Usage: $PROGRAM [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] ++ Usage: $PROGRAM [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] [ NETNS ] + + CONFIG_FILE is a configuration file, whose filename is the interface name + followed by \`.conf'. Otherwise, INTERFACE is an interface name, with + +@@ -462,9 +504,11 @@ + cmd_up() { + local i + [[ -z $(ip link show dev "$INTERFACE" 2>/dev/null) ]] || die "\`$INTERFACE' already exists" ++ ensure_netns + trap 'del_if; exit' INT TERM EXIT + add_if + execute_hooks "${PRE_UP[@]}" ++ move_to_netns + set_config + for i in "${ADDRESSES[@]}"; do + add_addr "$i" +@@ -503,16 +547,28 @@ + if [[ $# -eq 1 && ( $1 == --help || $1 == -h || $1 == help ) ]]; then + cmd_usage + elif [[ $# -eq 2 && $1 == up ]]; then ++ auto_su ++ parse_options "$2" ++ cmd_up ++elif [[ $# -eq 3 && $1 == up ]]; then + auto_su + parse_options "$2" ++ NETNS="$3" + cmd_up + elif [[ $# -eq 2 && $1 == down ]]; then ++ auto_su ++ parse_options "$2" ++ cmd_down ++elif [[ $# -eq 3 && $1 == down ]]; then + auto_su + parse_options "$2" ++ NETNS="$3" + cmd_down + elif [[ $# -eq 2 && $1 == save ]]; then + auto_su + parse_options "$2" + cmd_save + elif [[ $# -eq 2 && $1 == strip ]]; then ++ auto_su + parse_options "$2" + cmd_strip + else @@ -26,12 +26,26 @@ SAVE_CONFIG=0 CONFIG_FILE="" PROGRAM="${0##*/}" ARGS=( "$@" ) +NETNS="" cmd() { echo "[#] $*" >&2 "$@" } +ensure_netns() { + [[ -z $NETNS ]] && return 0 + if [[ ! -e /run/netns/$NETNS ]]; then + cmd ip netns add "$NETNS" + fi +} + +move_to_netns() { + [[ -z $NETNS ]] && return 0 + cmd ip link set "$INTERFACE" netns "$NETNS" +} + + die() { echo "$PROGRAM: $*" >&2 exit 1 @@ -153,6 +167,16 @@ resolvconf_iface_prefix() { HAVE_SET_DNS=0 set_dns() { [[ ${#DNS[@]} -gt 0 ]] || return 0 + if [[ -n $NETNS ]]; then + local netns_resolv_dir="/etc/netns/$NETNS" + cmd mkdir -p "$netns_resolv_dir" + # TODO make this not jank + { printf 'nameserver %s\n' "${DNS[@]}" + [[ ${#DNS_SEARCH[@]} -eq 0 ]] || printf 'search %s\n' "${DNS_SEARCH[*]}" + } | cmd tee "$netns_resolv_dir/resolv.conf" > /dev/null + HAVE_SET_DNS=1 + return 0 + fi { printf 'nameserver %s\n' "${DNS[@]}" [[ ${#DNS_SEARCH[@]} -eq 0 ]] || printf 'search %s\n' "${DNS_SEARCH[*]}" } | cmd resolvconf -a "$(resolvconf_iface_prefix)$INTERFACE" -m 0 -x @@ -161,6 +185,11 @@ set_dns() { unset_dns() { [[ ${#DNS[@]} -gt 0 ]] || return 0 + if [[ -n $NETNS ]]; then + local netns_resolv="/etc/netns/$NETNS/resolv.conf" + [[ -f $netns_resolv ]] && cmd rm -f "$netns_resolv" + return 0 + fi cmd resolvconf -d "$(resolvconf_iface_prefix)$INTERFACE" -f } @@ -170,11 +199,19 @@ add_route() { [[ $TABLE != off ]] || return 0 if [[ -n $TABLE && $TABLE != auto ]]; then - cmd ip $proto route add "$1" dev "$INTERFACE" table "$TABLE" + if [[ -n $NETNS ]]; then + cmd ip -n "$NETNS" $proto route add "$1" dev "$INTERFACE" table "$TABLE" + else + cmd ip $proto route add "$1" dev "$INTERFACE" table "$TABLE" + fi elif [[ $1 == */0 ]]; then add_default "$1" else - [[ -n $(ip $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip $proto route add "$1" dev "$INTERFACE" + if [[ -n $NETNS ]]; then + [[ -n $(ip -n "$NETNS" $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip -n "$NETNS" $proto route add "$1" dev "$INTERFACE" + else + [[ -n $(ip $proto route show dev "$INTERFACE" match "$1" 2>/dev/null) ]] || cmd ip $proto route add "$1" dev "$INTERFACE" + fi fi } @@ -298,7 +335,7 @@ execute_hooks() { cmd_usage() { cat >&2 <<-_EOF - Usage: $PROGRAM [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] + Usage: $PROGRAM [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] [ NETNS ] CONFIG_FILE is a configuration file, whose filename is the interface name followed by \`.conf'. Otherwise, INTERFACE is an interface name, with @@ -326,9 +363,11 @@ cmd_usage() { cmd_up() { local i [[ -z $(ip link show dev "$INTERFACE" 2>/dev/null) ]] || die "\`$INTERFACE' already exists" + ensure_netns trap 'del_if; exit' INT TERM EXIT add_if execute_hooks "${PRE_UP[@]}" + move_to_netns set_config for i in "${ADDRESSES[@]}"; do add_addr "$i" @@ -365,13 +404,19 @@ cmd_strip() { if [[ $# -eq 1 && ( $1 == --help || $1 == -h || $1 == help ) ]]; then cmd_usage -elif [[ $# -eq 2 && $1 == up ]]; then +elif [[ $# -ge 2 && $1 == up ]]; then auto_su parse_options "$2" + if [[ $# -eq 3 ]]; then + NETNS="$3" + fi cmd_up -elif [[ $# -eq 2 && $1 == down ]]; then +elif [[ $# -ge 2 && $1 == down ]]; then auto_su parse_options "$2" + if [[ $# -eq 3 ]]; then + NETNS="$3" + fi cmd_down elif [[ $# -eq 2 && $1 == save ]]; then auto_su |
