|
| 1 | +#!/bin/bash |
| 2 | +# Persistent DHCP caching - NetworkManager dispatcher script |
| 3 | +# This script saves successful DHCP configuration and restores on failure |
| 4 | +# Managed by kdevops - dhclient_cache role |
| 5 | + |
| 6 | +INTERFACE="$1" |
| 7 | +ACTION="$2" |
| 8 | +CACHE_DIR="/var/lib/NetworkManager/cache" |
| 9 | +CACHE_FILE="${CACHE_DIR}/${INTERFACE}.cached-config" |
| 10 | +CACHE_TIMEOUT={{ dhclient_cache_timeout }} |
| 11 | + |
| 12 | +# Ensure cache directory exists |
| 13 | +mkdir -p "${CACHE_DIR}" |
| 14 | + |
| 15 | +case "${ACTION}" in |
| 16 | + up|dhcp4-change) |
| 17 | + # Save current network configuration to cache |
| 18 | + IP4_ADDRESS=$(nmcli -t -f IP4.ADDRESS device show "${INTERFACE}" 2>/dev/null | cut -d: -f2) |
| 19 | + IP4_GATEWAY=$(nmcli -t -f IP4.GATEWAY device show "${INTERFACE}" 2>/dev/null | cut -d: -f2) |
| 20 | + IP4_DNS=$(nmcli -t -f IP4.DNS device show "${INTERFACE}" 2>/dev/null | cut -d: -f2 | tr '\n' ' ') |
| 21 | + |
| 22 | + if [ -n "${IP4_ADDRESS}" ]; then |
| 23 | + { |
| 24 | + echo "# Cached NetworkManager DHCP configuration for ${INTERFACE}" |
| 25 | + echo "# Cached at: $(date)" |
| 26 | + echo "# Cache timeout: ${CACHE_TIMEOUT} seconds" |
| 27 | + echo "IP4_ADDRESS=\"${IP4_ADDRESS}\"" |
| 28 | + echo "IP4_GATEWAY=\"${IP4_GATEWAY}\"" |
| 29 | + echo "IP4_DNS=\"${IP4_DNS}\"" |
| 30 | + echo "cache_timestamp=\"$(date +%s)\"" |
| 31 | + } > "${CACHE_FILE}" |
| 32 | + chmod 644 "${CACHE_FILE}" |
| 33 | + logger -t kdevops-dhcp-cache "Saved NetworkManager DHCP config to cache for ${INTERFACE}: ${IP4_ADDRESS}" |
| 34 | + fi |
| 35 | + ;; |
| 36 | + |
| 37 | + connectivity-change) |
| 38 | + # Check if we have connectivity, if not try to restore from cache |
| 39 | + CONNECTIVITY=$(nmcli -t -f CONNECTIVITY general status) |
| 40 | + if [ "${CONNECTIVITY}" = "none" ] || [ "${CONNECTIVITY}" = "limited" ]; then |
| 41 | + if [ -f "${CACHE_FILE}" ]; then |
| 42 | + source "${CACHE_FILE}" |
| 43 | + |
| 44 | + # Check if cache is still valid |
| 45 | + current_timestamp=$(date +%s) |
| 46 | + cache_age=$((current_timestamp - cache_timestamp)) |
| 47 | + |
| 48 | + if [ ${cache_age} -lt ${CACHE_TIMEOUT} ]; then |
| 49 | + logger -t kdevops-dhcp-cache "NetworkManager connectivity ${CONNECTIVITY} for ${INTERFACE}, restoring from cache (age: ${cache_age}s)" |
| 50 | + |
| 51 | + # Apply cached configuration using nmcli |
| 52 | + if [ -n "${IP4_ADDRESS}" ]; then |
| 53 | + nmcli connection modify "${INTERFACE}" ipv4.method manual \ |
| 54 | + ipv4.addresses "${IP4_ADDRESS}" \ |
| 55 | + ipv4.gateway "${IP4_GATEWAY}" \ |
| 56 | + ipv4.dns "${IP4_DNS}" |
| 57 | + nmcli connection up "${INTERFACE}" |
| 58 | + logger -t kdevops-dhcp-cache "Successfully restored cached NetworkManager configuration: ${IP4_ADDRESS}" |
| 59 | + fi |
| 60 | + else |
| 61 | + logger -t kdevops-dhcp-cache "Cached config for ${INTERFACE} expired (age: ${cache_age}s > ${CACHE_TIMEOUT}s)" |
| 62 | + fi |
| 63 | + else |
| 64 | + logger -t kdevops-dhcp-cache "No cached config found for ${INTERFACE} after connectivity change" |
| 65 | + fi |
| 66 | + fi |
| 67 | + ;; |
| 68 | +esac |
0 commit comments