#!/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