|
| 1 | +#!/bin/sh |
| 2 | +set -e |
| 3 | + |
| 4 | +AWG_INTERFACE="${AWG_INTERFACE:-awg0}" |
| 5 | +AWG_CONFIG="${AWG_CONFIG:-/etc/amneziawg/${AWG_INTERFACE}.conf}" |
| 6 | +AWG_LOG_LEVEL="${AWG_LOG_LEVEL:-info}" |
| 7 | + |
| 8 | +export WG_SOCKET_DIR=/run/amneziawg |
| 9 | + |
| 10 | +log() { echo "[amneziawg] $*"; } |
| 11 | + |
| 12 | +if [ ! -f "$AWG_CONFIG" ]; then |
| 13 | + log "ERROR: config file not found: $AWG_CONFIG" |
| 14 | + log "Provide config via ExtensionServiceConfig:" |
| 15 | + log "" |
| 16 | + log " apiVersion: v1alpha1" |
| 17 | + log " kind: ExtensionServiceConfig" |
| 18 | + log " name: amneziawg" |
| 19 | + log " configFiles:" |
| 20 | + log " - content: |" |
| 21 | + log " [Interface]" |
| 22 | + log " PrivateKey = <key>" |
| 23 | + log " ListenPort = 51820" |
| 24 | + log " Address = 10.0.0.1/24" |
| 25 | + log " Jc = 5" |
| 26 | + log " Jmin = 50" |
| 27 | + log " Jmax = 1000" |
| 28 | + log " S1 = 0" |
| 29 | + log " S2 = 0" |
| 30 | + log " H1 = 1" |
| 31 | + log " H2 = 2" |
| 32 | + log " H3 = 3" |
| 33 | + log " H4 = 4" |
| 34 | + log " [Peer]" |
| 35 | + log " PublicKey = <key>" |
| 36 | + log " Endpoint = <host>:51820" |
| 37 | + log " AllowedIPs = 0.0.0.0/0" |
| 38 | + log " mountPath: /etc/amneziawg/awg0.conf" |
| 39 | + exit 1 |
| 40 | +fi |
| 41 | + |
| 42 | +parse_field() { |
| 43 | + grep -i "^${1} *=" "$2" | head -1 | sed "s/^[^ ]* *= *//" |
| 44 | +} |
| 45 | + |
| 46 | +collect_field() { |
| 47 | + grep -i "^${1} *=" "$2" | sed "s/^[^ ]* *= *//" | tr '\n' ' ' |
| 48 | +} |
| 49 | + |
| 50 | +ADDRESSES=$(collect_field Address "$AWG_CONFIG") |
| 51 | +MTU=$(parse_field MTU "$AWG_CONFIG") |
| 52 | + |
| 53 | +STRIPPED_CONF=$(mktemp) |
| 54 | +grep -iv "^\(Address\|DNS\|MTU\|Table\|PreUp\|PostUp\|PreDown\|PostDown\|SaveConfig\) *=" "$AWG_CONFIG" > "$STRIPPED_CONF" |
| 55 | + |
| 56 | +log "Starting amneziawg-go on interface $AWG_INTERFACE" |
| 57 | +export LOG_LEVEL="$AWG_LOG_LEVEL" |
| 58 | + |
| 59 | +mkdir -p /run/amneziawg |
| 60 | +amneziawg-go "$AWG_INTERFACE" & |
| 61 | +AWG_PID=$! |
| 62 | + |
| 63 | +SOCK="/run/amneziawg/${AWG_INTERFACE}.sock" |
| 64 | +for i in $(seq 1 50); do |
| 65 | + [ -S "$SOCK" ] && break |
| 66 | + sleep 0.1 |
| 67 | +done |
| 68 | + |
| 69 | +if [ ! -S "$SOCK" ]; then |
| 70 | + log "ERROR: UAPI socket did not appear at $SOCK" |
| 71 | + kill $AWG_PID 2>/dev/null |
| 72 | + exit 1 |
| 73 | +fi |
| 74 | + |
| 75 | +awg setconf "$AWG_INTERFACE" "$STRIPPED_CONF" |
| 76 | +rm -f "$STRIPPED_CONF" |
| 77 | +log "Configuration applied from $AWG_CONFIG" |
| 78 | + |
| 79 | +for addr in $ADDRESSES; do |
| 80 | + ip addr add "$addr" dev "$AWG_INTERFACE" 2>/dev/null || true |
| 81 | + log "Address $addr added" |
| 82 | +done |
| 83 | + |
| 84 | +if [ -n "$MTU" ]; then |
| 85 | + ip link set mtu "$MTU" dev "$AWG_INTERFACE" |
| 86 | + log "MTU set to $MTU" |
| 87 | +fi |
| 88 | + |
| 89 | +ip link set "$AWG_INTERFACE" up |
| 90 | +log "Interface $AWG_INTERFACE is UP" |
| 91 | + |
| 92 | +POST_UP=$(grep -i "^PostUp *=" "$AWG_CONFIG" | sed "s/^[^ ]* *= *//" || true) |
| 93 | +if [ -n "$POST_UP" ]; then |
| 94 | + log "Running PostUp" |
| 95 | + eval "$POST_UP" || true |
| 96 | +fi |
| 97 | + |
| 98 | +cleanup() { |
| 99 | + log "Shutting down $AWG_INTERFACE" |
| 100 | + POST_DOWN=$(grep -i "^PostDown *=" "$AWG_CONFIG" | sed "s/^[^ ]* *= *//" || true) |
| 101 | + if [ -n "$POST_DOWN" ]; then |
| 102 | + log "Running PostDown" |
| 103 | + eval "$POST_DOWN" || true |
| 104 | + fi |
| 105 | + ip link set "$AWG_INTERFACE" down 2>/dev/null || true |
| 106 | + ip link delete "$AWG_INTERFACE" 2>/dev/null || true |
| 107 | + kill $AWG_PID 2>/dev/null |
| 108 | +} |
| 109 | +trap cleanup TERM INT |
| 110 | + |
| 111 | +log "AmneziaWG is running:" |
| 112 | +awg show "$AWG_INTERFACE" |
| 113 | + |
| 114 | +wait $AWG_PID |
0 commit comments