Ajouter pve-netconfig.sh
This commit is contained in:
@@ -0,0 +1,531 @@
|
||||
#!/bin/bash
|
||||
#===============================================================================
|
||||
# pve-netconfig.sh
|
||||
#
|
||||
# Gestion réseau pour hôte Proxmox VE 9 (Debian 13 Trixie) autonome :
|
||||
# - vmbr0 : DHCP avec fallback IP statique
|
||||
# - vmbr1 : DHCP sans fallback
|
||||
# - Génère /etc/network/interfaces
|
||||
# - Synchronise /etc/hosts avec les IP réellement obtenues (ip -j a)
|
||||
#
|
||||
# Usage :
|
||||
# pve-netconfig.sh apply-interfaces # (Ré)écrit /etc/network/interfaces
|
||||
# pve-netconfig.sh sync-hosts # Met à jour /etc/hosts seulement
|
||||
# pve-netconfig.sh check # Vérifie DHCP vmbr0 -> fallback si KO
|
||||
# pve-netconfig.sh status # Affiche l'état courant
|
||||
#
|
||||
# Auteur : <service informatique>
|
||||
# Licence : usage interne
|
||||
#===============================================================================
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
#===============================================================================
|
||||
# C O N F I G U R A T I O N
|
||||
#===============================================================================
|
||||
|
||||
# --- Interfaces bridges gérées ---------------------------------------------
|
||||
# vmbr0 = LAN principal (management PVE)
|
||||
# vmbr1 = second réseau (DHCP seul, pas de fallback)
|
||||
BRIDGE_MAIN="vmbr0"
|
||||
BRIDGE_SECONDARY="vmbr1"
|
||||
|
||||
# --- Ports physiques rattachés aux bridges ---------------------------------
|
||||
# Laisser vide ("") pour conserver la configuration existante détectée
|
||||
# dans /etc/network/interfaces (recommandé après une install PVE standard).
|
||||
# Sinon, forcer explicitement : PORT_MAIN="eno1"
|
||||
PORT_MAIN=""
|
||||
PORT_SECONDARY=""
|
||||
|
||||
# --- Fallback statique pour vmbr0 (si le DHCP ne répond pas) ----------------
|
||||
FALLBACK_IP="192.168.1.250"
|
||||
FALLBACK_CIDR="24"
|
||||
FALLBACK_GATEWAY="192.168.1.1"
|
||||
FALLBACK_DNS="192.168.1.1 9.9.9.9"
|
||||
|
||||
# --- Comportement DHCP ------------------------------------------------------
|
||||
DHCP_TIMEOUT=25 # Secondes d'attente d'un bail DHCP avant fallback
|
||||
DHCP_RETRY_INTERVAL=300 # Secondes entre 2 tentatives de retour au DHCP
|
||||
# (0 = ne jamais retenter, reste en statique)
|
||||
|
||||
# --- /etc/hosts -------------------------------------------------------------
|
||||
# Nom court + FQDN de l'hôte. Par défaut déduits du système.
|
||||
HOSTNAME_SHORT="$(hostname -s)"
|
||||
HOSTNAME_FQDN="$(hostname -f 2>/dev/null || echo "${HOSTNAME_SHORT}.local")"
|
||||
|
||||
# Alias supplémentaires ajoutés à la ligne de l'IP principale
|
||||
HOSTS_EXTRA_ALIASES="pve"
|
||||
|
||||
# Marqueurs délimitant le bloc géré dans /etc/hosts
|
||||
HOSTS_BEGIN="# >>> pve-netconfig BEGIN (ne pas editer manuellement) >>>"
|
||||
HOSTS_END="# <<< pve-netconfig END <<<"
|
||||
|
||||
# --- Divers -----------------------------------------------------------------
|
||||
LOG_TAG="pve-netconfig"
|
||||
STATE_DIR="/var/lib/pve-netconfig"
|
||||
LOCK_FILE="/run/pve-netconfig.lock"
|
||||
INTERFACES_FILE="/etc/network/interfaces"
|
||||
HOSTS_FILE="/etc/hosts"
|
||||
BACKUP_DIR="/var/backups/pve-netconfig"
|
||||
|
||||
# Mettre à 1 pour appliquer les changements réseau à chaud (ifreload -a)
|
||||
# après réécriture de /etc/network/interfaces. Sinon, reboot requis.
|
||||
AUTO_RELOAD=1
|
||||
|
||||
#===============================================================================
|
||||
# F I N C O N F I G U R A T I O N
|
||||
#===============================================================================
|
||||
|
||||
umask 022
|
||||
mkdir -p "$STATE_DIR" "$BACKUP_DIR"
|
||||
|
||||
log() { logger -t "$LOG_TAG" -p daemon.info -- "$*"; echo "[*] $*"; }
|
||||
warn() { logger -t "$LOG_TAG" -p daemon.warning -- "$*"; echo "[!] $*" >&2; }
|
||||
err() { logger -t "$LOG_TAG" -p daemon.err -- "$*"; echo "[X] $*" >&2; }
|
||||
|
||||
require_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
err "Ce script doit être exécuté en root."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Verrou pour éviter les exécutions concurrentes (hook DHCP + timer + boot)
|
||||
acquire_lock() {
|
||||
exec 9>"$LOCK_FILE"
|
||||
if ! flock -w 30 9; then
|
||||
warn "Impossible d'obtenir le verrou ($LOCK_FILE), abandon."
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
backup_file() {
|
||||
local f="$1"
|
||||
[[ -f "$f" ]] || return 0
|
||||
local ts base
|
||||
ts="$(date +%Y%m%d-%H%M%S)"
|
||||
base="$(basename "$f")"
|
||||
cp -a "$f" "${BACKUP_DIR}/${base}.${ts}"
|
||||
# Rotation : conserver les 20 dernières sauvegardes par fichier
|
||||
ls -1t "${BACKUP_DIR}/${base}."* 2>/dev/null | tail -n +21 | xargs -r rm -f
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Détection des ports physiques déjà déclarés dans /etc/network/interfaces
|
||||
#-------------------------------------------------------------------------------
|
||||
detect_bridge_ports() {
|
||||
local br="$1"
|
||||
awk -v br="$br" '
|
||||
$1=="iface" && $2==br {inblk=1; next}
|
||||
inblk && $1=="iface" {inblk=0}
|
||||
inblk && ($1=="bridge-ports" || $1=="bridge_ports") {
|
||||
$1=""; sub(/^[ \t]+/,""); print; exit
|
||||
}
|
||||
' "$INTERFACES_FILE" 2>/dev/null
|
||||
}
|
||||
|
||||
resolve_ports() {
|
||||
if [[ -z "$PORT_MAIN" ]]; then
|
||||
PORT_MAIN="$(detect_bridge_ports "$BRIDGE_MAIN")"
|
||||
fi
|
||||
if [[ -z "$PORT_SECONDARY" ]]; then
|
||||
PORT_SECONDARY="$(detect_bridge_ports "$BRIDGE_SECONDARY")"
|
||||
fi
|
||||
[[ -z "$PORT_MAIN" ]] && PORT_MAIN="none"
|
||||
[[ -z "$PORT_SECONDARY" ]] && PORT_SECONDARY="none"
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Génération de /etc/network/interfaces
|
||||
#-------------------------------------------------------------------------------
|
||||
apply_interfaces() {
|
||||
require_root
|
||||
resolve_ports
|
||||
|
||||
log "Génération de $INTERFACES_FILE (${BRIDGE_MAIN}=dhcp+fallback, ${BRIDGE_SECONDARY}=dhcp)"
|
||||
backup_file "$INTERFACES_FILE"
|
||||
|
||||
local tmp
|
||||
tmp="$(mktemp /etc/network/.interfaces.XXXXXX)"
|
||||
|
||||
cat > "$tmp" <<EOF
|
||||
# Généré par pve-netconfig.sh le $(date -Is)
|
||||
# Ne pas éditer à la main : modifier /usr/local/sbin/pve-netconfig.sh
|
||||
# puis exécuter : pve-netconfig.sh apply-interfaces
|
||||
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
EOF
|
||||
|
||||
# --- Ports physiques en manual -----------------------------------------
|
||||
local p
|
||||
for p in $PORT_MAIN $PORT_SECONDARY; do
|
||||
[[ "$p" == "none" ]] && continue
|
||||
cat >> "$tmp" <<EOF
|
||||
auto ${p}
|
||||
iface ${p} inet manual
|
||||
|
||||
EOF
|
||||
done
|
||||
|
||||
# --- vmbr0 : DHCP (le fallback est géré par le service systemd) ---------
|
||||
cat >> "$tmp" <<EOF
|
||||
auto ${BRIDGE_MAIN}
|
||||
iface ${BRIDGE_MAIN} inet dhcp
|
||||
bridge-ports ${PORT_MAIN}
|
||||
bridge-stp off
|
||||
bridge-fd 0
|
||||
# Fallback statique si aucun bail DHCP :
|
||||
# ${FALLBACK_IP}/${FALLBACK_CIDR} gw ${FALLBACK_GATEWAY}
|
||||
# appliqué dynamiquement par pve-netconfig-watch.service
|
||||
|
||||
EOF
|
||||
|
||||
# --- vmbr1 : DHCP simple ------------------------------------------------
|
||||
cat >> "$tmp" <<EOF
|
||||
auto ${BRIDGE_SECONDARY}
|
||||
iface ${BRIDGE_SECONDARY} inet dhcp
|
||||
bridge-ports ${PORT_SECONDARY}
|
||||
bridge-stp off
|
||||
bridge-fd 0
|
||||
|
||||
EOF
|
||||
|
||||
# --- Conservation d'un éventuel source-directory ------------------------
|
||||
if grep -qE '^\s*source\s+/etc/network/interfaces\.d' "$INTERFACES_FILE" 2>/dev/null; then
|
||||
echo "source /etc/network/interfaces.d/*" >> "$tmp"
|
||||
fi
|
||||
|
||||
chmod 0644 "$tmp"
|
||||
mv "$tmp" "$INTERFACES_FILE"
|
||||
log "$INTERFACES_FILE écrit."
|
||||
|
||||
if [[ "$AUTO_RELOAD" == "1" ]]; then
|
||||
if command -v ifreload >/dev/null 2>&1; then
|
||||
log "Rechargement à chaud (ifreload -a)..."
|
||||
ifreload -a || warn "ifreload a retourné une erreur, vérifier 'journalctl -u networking'."
|
||||
else
|
||||
warn "ifreload absent (ifupdown2 non installé ?) — un redémarrage sera nécessaire."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Récupération des IPv4 via 'ip -j a' (JSON, parsé avec jq)
|
||||
#-------------------------------------------------------------------------------
|
||||
get_ipv4() {
|
||||
local ifc="$1"
|
||||
ip -4 -j addr show dev "$ifc" 2>/dev/null \
|
||||
| jq -r '.[0].addr_info[]? | select(.family=="inet" and .scope=="global") | .local' \
|
||||
| head -n1
|
||||
}
|
||||
|
||||
get_ipv4_cidr() {
|
||||
local ifc="$1"
|
||||
ip -4 -j addr show dev "$ifc" 2>/dev/null \
|
||||
| jq -r '.[0].addr_info[]? | select(.family=="inet" and .scope=="global")
|
||||
| "\(.local)/\(.prefixlen)"' \
|
||||
| head -n1
|
||||
}
|
||||
|
||||
# Détecte si l'adresse courante de vmbr0 provient d'un bail DHCP
|
||||
has_dhcp_lease() {
|
||||
local ifc="$1"
|
||||
# dhclient (isc-dhcp-client)
|
||||
if [[ -f "/var/lib/dhcp/dhclient.${ifc}.leases" ]] \
|
||||
&& grep -q "fixed-address" "/var/lib/dhcp/dhclient.${ifc}.leases" 2>/dev/null; then
|
||||
pgrep -f "dhclient.*${ifc}" >/dev/null 2>&1 && return 0
|
||||
fi
|
||||
# dhcpcd
|
||||
if [[ -f "/var/lib/dhcpcd/${ifc}.lease" ]] || [[ -f "/var/lib/dhcpcd5/dhcpcd-${ifc}.lease" ]]; then
|
||||
pgrep -f "dhcpcd.*${ifc}" >/dev/null 2>&1 && return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
is_static_fallback_active() {
|
||||
[[ -f "${STATE_DIR}/fallback_active" ]]
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Application / retrait du fallback statique sur vmbr0
|
||||
#-------------------------------------------------------------------------------
|
||||
apply_fallback() {
|
||||
log "Application du fallback statique sur ${BRIDGE_MAIN} : ${FALLBACK_IP}/${FALLBACK_CIDR}"
|
||||
|
||||
# Arrêt du client DHCP sur cette interface
|
||||
pkill -f "dhclient.*${BRIDGE_MAIN}" 2>/dev/null
|
||||
if command -v dhcpcd >/dev/null 2>&1; then
|
||||
dhcpcd -k "$BRIDGE_MAIN" 2>/dev/null
|
||||
fi
|
||||
|
||||
# Purge des adresses IPv4 globales existantes
|
||||
ip -4 addr flush dev "$BRIDGE_MAIN" scope global 2>/dev/null
|
||||
|
||||
ip addr add "${FALLBACK_IP}/${FALLBACK_CIDR}" dev "$BRIDGE_MAIN"
|
||||
ip link set "$BRIDGE_MAIN" up
|
||||
|
||||
if [[ -n "$FALLBACK_GATEWAY" ]]; then
|
||||
ip route replace default via "$FALLBACK_GATEWAY" dev "$BRIDGE_MAIN" 2>/dev/null \
|
||||
|| warn "Impossible d'installer la route par défaut via ${FALLBACK_GATEWAY}"
|
||||
fi
|
||||
|
||||
write_resolv_conf $FALLBACK_DNS
|
||||
|
||||
touch "${STATE_DIR}/fallback_active"
|
||||
log "Fallback actif. Interface de management : https://${FALLBACK_IP}:8006"
|
||||
}
|
||||
|
||||
clear_fallback() {
|
||||
if is_static_fallback_active; then
|
||||
log "Bail DHCP retrouvé sur ${BRIDGE_MAIN} — retrait du fallback statique."
|
||||
ip addr del "${FALLBACK_IP}/${FALLBACK_CIDR}" dev "$BRIDGE_MAIN" 2>/dev/null
|
||||
rm -f "${STATE_DIR}/fallback_active"
|
||||
fi
|
||||
}
|
||||
|
||||
write_resolv_conf() {
|
||||
# N'écrase resolv.conf que si ce n'est pas un lien géré (resolvconf/systemd)
|
||||
if [[ -L /etc/resolv.conf ]]; then
|
||||
warn "/etc/resolv.conf est un lien symbolique — DNS non modifié."
|
||||
return 0
|
||||
fi
|
||||
backup_file /etc/resolv.conf
|
||||
{
|
||||
echo "# Généré par pve-netconfig.sh (fallback statique) $(date -Is)"
|
||||
local domain
|
||||
domain="${HOSTNAME_FQDN#*.}"
|
||||
[[ "$domain" != "$HOSTNAME_FQDN" ]] && echo "search ${domain}"
|
||||
local ns
|
||||
for ns in "$@"; do
|
||||
echo "nameserver ${ns}"
|
||||
done
|
||||
} > /etc/resolv.conf
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Tentative de récupération d'un bail DHCP sur vmbr0
|
||||
#-------------------------------------------------------------------------------
|
||||
try_dhcp() {
|
||||
local ifc="$1"
|
||||
log "Tentative d'obtention d'un bail DHCP sur ${ifc} (timeout ${DHCP_TIMEOUT}s)..."
|
||||
|
||||
if command -v dhclient >/dev/null 2>&1; then
|
||||
timeout "$((DHCP_TIMEOUT + 5))" \
|
||||
dhclient -1 -timeout "$DHCP_TIMEOUT" -v "$ifc" >/dev/null 2>&1
|
||||
elif command -v dhcpcd >/dev/null 2>&1; then
|
||||
timeout "$((DHCP_TIMEOUT + 5))" \
|
||||
dhcpcd -t "$DHCP_TIMEOUT" "$ifc" >/dev/null 2>&1
|
||||
else
|
||||
err "Aucun client DHCP trouvé (dhclient / dhcpcd). Installer isc-dhcp-client."
|
||||
return 1
|
||||
fi
|
||||
|
||||
[[ -n "$(get_ipv4 "$ifc")" ]]
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Contrôle principal : DHCP ou fallback
|
||||
#-------------------------------------------------------------------------------
|
||||
do_check() {
|
||||
require_root
|
||||
acquire_lock
|
||||
|
||||
# --- Attente du lien physique (link carrier) ----------------------------
|
||||
local waited=0
|
||||
while [[ $waited -lt 30 ]]; do
|
||||
if [[ "$(cat "/sys/class/net/${BRIDGE_MAIN}/operstate" 2>/dev/null)" == "up" ]]; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
waited=$((waited + 2))
|
||||
done
|
||||
|
||||
local current_ip
|
||||
current_ip="$(get_ipv4 "$BRIDGE_MAIN")"
|
||||
|
||||
if [[ -n "$current_ip" ]] && has_dhcp_lease "$BRIDGE_MAIN"; then
|
||||
# DHCP OK
|
||||
clear_fallback
|
||||
log "${BRIDGE_MAIN} : bail DHCP actif (${current_ip})."
|
||||
elif is_static_fallback_active; then
|
||||
# On est déjà en fallback : on retente périodiquement le DHCP
|
||||
if [[ "$DHCP_RETRY_INTERVAL" != "0" ]]; then
|
||||
log "Fallback actif — nouvelle tentative DHCP sur ${BRIDGE_MAIN}."
|
||||
if try_dhcp "$BRIDGE_MAIN"; then
|
||||
clear_fallback
|
||||
log "Retour en DHCP réussi : $(get_ipv4 "$BRIDGE_MAIN")"
|
||||
else
|
||||
log "Toujours pas de serveur DHCP — maintien du fallback ${FALLBACK_IP}."
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Pas d'IP et pas encore de fallback
|
||||
warn "${BRIDGE_MAIN} : aucune adresse IPv4. Tentative DHCP..."
|
||||
if try_dhcp "$BRIDGE_MAIN"; then
|
||||
log "Bail DHCP obtenu : $(get_ipv4 "$BRIDGE_MAIN")"
|
||||
else
|
||||
warn "Échec DHCP sur ${BRIDGE_MAIN} — bascule sur le fallback statique."
|
||||
apply_fallback
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- vmbr1 : DHCP uniquement, aucun fallback ---------------------------
|
||||
if ip link show "$BRIDGE_SECONDARY" >/dev/null 2>&1; then
|
||||
local ip2
|
||||
ip2="$(get_ipv4 "$BRIDGE_SECONDARY")"
|
||||
if [[ -z "$ip2" ]]; then
|
||||
log "${BRIDGE_SECONDARY} : pas d'IP, tentative DHCP (sans fallback)."
|
||||
try_dhcp "$BRIDGE_SECONDARY" >/dev/null 2>&1 \
|
||||
&& log "${BRIDGE_SECONDARY} : $(get_ipv4 "$BRIDGE_SECONDARY")" \
|
||||
|| log "${BRIDGE_SECONDARY} : aucun bail DHCP (comportement attendu si non raccordé)."
|
||||
else
|
||||
log "${BRIDGE_SECONDARY} : ${ip2}"
|
||||
fi
|
||||
fi
|
||||
|
||||
sync_hosts_locked
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Mise à jour de /etc/hosts
|
||||
#-------------------------------------------------------------------------------
|
||||
sync_hosts_locked() {
|
||||
local ip_main ip_sec block tmp
|
||||
ip_main="$(get_ipv4 "$BRIDGE_MAIN")"
|
||||
ip_sec="$(get_ipv4 "$BRIDGE_SECONDARY")"
|
||||
|
||||
# PVE ne DOIT jamais se retrouver sans résolution du hostname.
|
||||
if [[ -z "$ip_main" ]]; then
|
||||
if is_static_fallback_active; then
|
||||
ip_main="$FALLBACK_IP"
|
||||
else
|
||||
warn "Aucune IP sur ${BRIDGE_MAIN} — /etc/hosts conserve son contenu actuel."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
block="${HOSTS_BEGIN}\n"
|
||||
block+="${ip_main}\t${HOSTNAME_FQDN} ${HOSTNAME_SHORT}"
|
||||
local a
|
||||
for a in $HOSTS_EXTRA_ALIASES; do
|
||||
[[ "$a" == "$HOSTNAME_SHORT" ]] && continue
|
||||
block+=" ${a}"
|
||||
done
|
||||
block+="\n"
|
||||
|
||||
if [[ -n "$ip_sec" && "$ip_sec" != "$ip_main" ]]; then
|
||||
block+="${ip_sec}\t${HOSTNAME_SHORT}-${BRIDGE_SECONDARY}\n"
|
||||
fi
|
||||
block+="${HOSTS_END}"
|
||||
|
||||
tmp="$(mktemp /etc/.hosts.XXXXXX)"
|
||||
|
||||
# 1) Base statique (loopback + IPv6) toujours présente
|
||||
cat > "$tmp" <<EOF
|
||||
127.0.0.1 localhost
|
||||
|
||||
# The following lines are desirable for IPv6 capable hosts
|
||||
::1 ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
ff02::3 ip6-allhosts
|
||||
|
||||
EOF
|
||||
|
||||
# 2) Bloc géré dynamiquement
|
||||
printf '%b\n\n' "$block" >> "$tmp"
|
||||
|
||||
# 3) Conservation des entrées personnalisées hors bloc et hors base
|
||||
if [[ -f "$HOSTS_FILE" ]]; then
|
||||
awk -v b="$HOSTS_BEGIN" -v e="$HOSTS_END" '
|
||||
$0==b {skip=1; next}
|
||||
$0==e {skip=0; next}
|
||||
skip {next}
|
||||
/^127\.0\.0\.1/ {next}
|
||||
/^::1|^fe00::|^ff00::|^ff02::/ {next}
|
||||
/^# The following lines are desirable/ {next}
|
||||
/^[[:space:]]*$/ {next}
|
||||
{print}
|
||||
' "$HOSTS_FILE" >> "$tmp"
|
||||
fi
|
||||
|
||||
# Vérification de cohérence avant remplacement
|
||||
if ! grep -qE "^${ip_main}[[:space:]]" "$tmp"; then
|
||||
err "Contrôle d'intégrité échoué, /etc/hosts non modifié."
|
||||
rm -f "$tmp"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ -f "$HOSTS_FILE" ]] && diff -q "$tmp" "$HOSTS_FILE" >/dev/null 2>&1; then
|
||||
rm -f "$tmp"
|
||||
log "/etc/hosts déjà à jour (${ip_main})."
|
||||
return 0
|
||||
fi
|
||||
|
||||
backup_file "$HOSTS_FILE"
|
||||
chmod 0644 "$tmp"
|
||||
mv "$tmp" "$HOSTS_FILE"
|
||||
log "/etc/hosts mis à jour : ${HOSTNAME_FQDN} -> ${ip_main}"
|
||||
|
||||
# Recharge pveproxy/pvedaemon pour prendre en compte la nouvelle IP
|
||||
if systemctl is-active --quiet pveproxy; then
|
||||
systemctl reload-or-restart pveproxy pvedaemon 2>/dev/null \
|
||||
|| warn "Rechargement de pveproxy/pvedaemon impossible."
|
||||
fi
|
||||
}
|
||||
|
||||
sync_hosts() {
|
||||
require_root
|
||||
acquire_lock
|
||||
sync_hosts_locked
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Affichage de l'état
|
||||
#-------------------------------------------------------------------------------
|
||||
do_status() {
|
||||
echo "=== pve-netconfig : état ==="
|
||||
echo "Hostname : ${HOSTNAME_SHORT} (${HOSTNAME_FQDN})"
|
||||
printf "%-8s : %s\n" "$BRIDGE_MAIN" "$(get_ipv4_cidr "$BRIDGE_MAIN" || echo '(aucune)')"
|
||||
printf "%-8s : %s\n" "$BRIDGE_SECONDARY" "$(get_ipv4_cidr "$BRIDGE_SECONDARY" || echo '(aucune)')"
|
||||
echo -n "Mode vmbr0 : "
|
||||
if is_static_fallback_active; then
|
||||
echo "FALLBACK STATIQUE (${FALLBACK_IP}/${FALLBACK_CIDR})"
|
||||
elif has_dhcp_lease "$BRIDGE_MAIN"; then
|
||||
echo "DHCP"
|
||||
else
|
||||
echo "indéterminé"
|
||||
fi
|
||||
echo
|
||||
echo "--- Route par défaut ---"
|
||||
ip route show default
|
||||
echo
|
||||
echo "--- Bloc géré dans /etc/hosts ---"
|
||||
sed -n "/${HOSTS_BEGIN//\//\\/}/,/${HOSTS_END//\//\\/}/p" "$HOSTS_FILE" 2>/dev/null
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Point d'entrée
|
||||
#-------------------------------------------------------------------------------
|
||||
case "${1:-}" in
|
||||
apply-interfaces) apply_interfaces ;;
|
||||
sync-hosts) sync_hosts ;;
|
||||
check) do_check ;;
|
||||
status) do_status ;;
|
||||
*)
|
||||
cat <<EOF
|
||||
Usage : $(basename "$0") {apply-interfaces|sync-hosts|check|status}
|
||||
|
||||
apply-interfaces (Ré)génère /etc/network/interfaces selon la configuration
|
||||
check Vérifie le DHCP sur ${BRIDGE_MAIN}, applique le fallback si besoin,
|
||||
puis synchronise /etc/hosts
|
||||
sync-hosts Met à jour uniquement /etc/hosts d'après 'ip a'
|
||||
status Affiche l'état réseau courant
|
||||
EOF
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user