nutools/ensure-vip

123 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire ipcalc
function display_help() {
uecho "$scriptname: s'assurer que l'hôte courant a l'adresse IP spécifiée
USAGE
$scriptname IPs...
NB: ce script ne supporte que la modification d'interfaces qui ne sont pas des
bridges. il est conçu avant tout pour utilisation sur un serveur, pas un poste
de travail.
OPTIONS
-i, --ignore-iface IFACE
Ajouter une interface à la liste des interfaces à ignorer. Si cette
option est utilisée, la liste par défaut n'est pas utilisée, sauf si
l'option -d est utilisée aussi.
-d, --defaults
Ajouter les valeurs suivantes à liste des interfaces à ignorer:
${DEFAULT_IGNORE_IFACES[*]}
Cette option est automatiquement activée si l'option -i n'est pas
utilisée
-n, --fake
Afficher simplement les modification à effectuer"
}
DEFAULT_IGNORE_IFACES=(
"docker*"
"br-*"
"veth*"
)
DEFAULT_PROFILES=(prod test devel)
ignore_ifaces=()
fake=
args=(
--help '$exit_with display_help'
-i:,--ignore-iface: ignore_ifaces
-d,--defaults '$array_extend ignore_ifaces DEFAULT_IGNORE_IFACES'
-n,--fake fake=1
)
parse_args "$@"; set -- "${args[@]}"
require_debian
for vip in "$@"; do
[ "${vip%/*}" != "$vip" ] || vip="$vip/32"
vips+=("$vip")
done
array_fix_paths ignore_ifaces
[ ${#ignore_ifaces[*]} -gt 0 ] || ignore_ifaces=("${DEFAULT_IGNORE_IFACES[@]}")
if [ -n "$fake" ]; then
set_verbosity --debug
__NETWORK_DEVEL_SHOW_MODIFS=1
__DEBIAN_NETWORK_DEVEL_SHOW_MODIFS=1
fi
################################################################################
# réimplémentation "corrigée" de network_config_partial()
nifile="$__DEBIAN_NETWORK_INTERFACES"
network_set_confips
network_set_confbrs
tmpconfips=()
for confip in "${confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes
continue=
for ignore_iface in "${ignore_ifaces[@]}"; do
if eval "[[ \"\$iface\" == $(qwc "$ignore_iface") ]]"; then
continue=1
break
fi
done
[ -n "$continue" ] && continue
tmpconfips+=("$confip")
network_parse_ipsuffix "${ipsuffixes[0]}" mainip suffix
for vip in "${vips[@]}"; do
if [ "${vip%.*}" == "${mainip%.*}" ]; then
tmpconfips+=("$iface:$vip")
fi
done
done
confips=("${tmpconfips[@]}")
confbrs=()
network_fix_confs
network_config "" confips confbrs || exit 0
# des modifications ont eu lieu, tenter de configurer les nouvelles adresses
# d'abord calculer les adresses ips qui sont activées
network_set_confips
for confip in "${confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes
for ipsuffix in "${ipsuffixes[@]}"; do
network_parse_ipsuffix "$ipsuffix" ip suffix
array_addu ips "$ip"
done
done
# puis lister les commandes correspondant aux adresses ips non activées
array_from_lines ups "$(awkrun <"$nifile" -f ips[@] '
$1 == "up" && $2 == "ip" && $3 == "addr" && $4 == "add" {
ip = $5; sub(/(\/[0-9.]+)?$/, "", ip) # enlever suffixe
if (! in_array(ip, ips)) {
$1 = ""
print
}
}')"
if [ ${#ups[*]} -gt 0 ]; then
etitle "Configuration des nouvelles adresses"
for up in "${ups[@]}"; do
estep "$up"
eval "$up"
done
eend
fi