Como sugestão de @ garethTheRed nos comentários, eu criei um gancho do Network Manager Dispatcher.
Crie o seguinte arquivo em /etc/NetworkManager/dispatcher.d/99_foo.dynu.com.sh
. Isso progride quando uma nova conexão de rede é detectada (ou seja, ethernet ou wifi). Em seguida, ele identifica minha "rede doméstica" de duas maneiras: o BSSID / SSID e o IP estático que meu roteador me atribui. (No momento não funciona quando eu conecto via ethernet, já que isso é relativamente raro.) Em seguida, ele anexa o mapeamento ao arquivo hosts se estivermos na rede doméstica; se não, então remove esta linha.
#!/bin/sh
# Map domain name to internal IP when connected to home network (via wifi)
# Partially inspired by http://sysadminsjourney.com/content/2008/12/18/use-networkmanager-launch-scripts-based-network-location/
WIFI_ID_TEST='Connected to 11:11:11:11:11:11 (on wlp3s0)
SSID: WifiName'
LOCAL_IP_TEST='192.168.1.90'
MAPPING='192.168.1.100 foo.dynu.com'
HOSTS_PATH=/etc/hosts
IF=$1
STATUS=$2
# Either wifi or ethernet goes up
if [ "$STATUS" = 'up' ] && { [ "$IF" = 'wlp3s0' ] || [ "$IF" = 'enp10s0' ]; }; then
# BSSID and my static IP, i.e. home network
if [ "$(iw dev wlp3s0 link | head -n 2)" = "$WIFI_ID_TEST" ] && [ -n "$(ip addr show wlp3s0 to ${LOCAL_IP_TEST})" ]; then
grep -qx "$MAPPING" "$HOSTS_PATH" || echo "$MAPPING" >> "$HOSTS_PATH"
else
ESC_MAPPING="^$(<<<"$MAPPING" sed 's/\./\./g')$"
sed -i "/${ESC_MAPPING}/d" "$HOSTS_PATH"
fi
fi