mise à jour du module debian

- support de jessie+
- possibilité de spécifier qu'une interface n'a pas de passerelle avec la
  syntaxe iface//-:ipsuffixes
- support de la configuration de réseau partiel
- support de la mise à jour de /etc/networks
This commit is contained in:
Jephté Clain 2016-12-30 18:14:01 +04:00
parent e3cd3cec3f
commit fbc1a5cc9b
1 changed files with 127 additions and 24 deletions

View File

@ -176,20 +176,40 @@ function network_fix_confbrs() {
function __network_fix_confips() {
local -a confips ipsuffixes ifaces ips
local confip iface gateway ip suffix mainip
local confip iface gateway network ip suffix mainip
local mainiface="$1"
# recenser les interfaces et créer les tableaux __IFACE_ipspecs
for confip in "${__nfc_confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes
[ -n "$iface" ] || iface="$mainiface"
array_addu ifaces "$iface"
eval "local ${iface}_gateway; local -a ${iface}_ipsuffixes"
if [ -n "$iface" ]; then
network="${iface}_network"
if ! array_contains ifaces "$iface"; then
array_add ifaces "$iface"
eval "local ${iface}_gateway $network; local -a ${iface}_ipsuffixes"
fi
if [ -z "${!network}" -a -n "${ipsuffixes[0]}" ]; then
setv "$network" "$(ipcalc_network "${ipsuffixes[0]}")"
fi
fi
done
# puis construire la liste des adresses IP associées à chaque interface
for confip in "${__nfc_confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes
# si aucune interface n'est spécifiée, sélectionner celle correspondant
# à la même adresse de réseau. sinon prendre $mainiface
if [ -z "$iface" ]; then
network="$(ipcalc_network "${ipsuffixes[0]}")"
local ip_iface ip_network
for ip_iface in "${ifaces[@]}"; do
ip_network="${ip_iface}_network"
if [ "${!ip_network}" == "$network" ]; then
iface="$ip_iface"
break
fi
done
fi
[ -n "$iface" ] || iface="$mainiface"
# si la passerelle a déjà été spécifiée, la récupérer
local tmpgw="${iface}_gateway"
@ -356,6 +376,7 @@ function __network_set_confips() {
array_from_lines ifaces "$(__network_valid_ifaces)"
for iface in "${ifaces[@]}"; do
__network_set_gateway "$iface"
[ -n "$gateway" ] || gateway=-
__network_set_confip "$iface" "$gateway" || continue
array_add confips "$confip"
done
@ -462,6 +483,7 @@ BEGIN {
have_iface = 0
have_method = 0 # static ou dhcp
have_gateway = ipsuffixes[1] == "dhcp" || gateway == ""
if (gateway == "none" || gateway == "-") gateway = ""
array_new(have_ips)
array_new(have_ip_ups)
array_new(have_ip_downs)
@ -692,6 +714,8 @@ function network_interfaces_add_confip() {
local nifile="${4:-$__DEBIAN_NETWORK_INTERFACES}"
local mainip netmask method
[ "$gateway" == "none" -o "$gateway" == "-" ] && gateway=
network_parse_ipsuffix "${ipsuffixes[0]}" mainip netmask
if [ "$mainip" == "dhcp" ]; then
mainip=
@ -928,7 +952,9 @@ $ip$TAB$host $hostname" "$tmpfile"
}
function network_config() {
# (Re)configurer le réseau sur l'hôte courant.
# (Re)configurer le réseau sur l'hôte courant. Des efforts sont faits pour
# ne mettre à jour les fichiers que si c'est nécessaire. Si un des arguments
# $1..$6 n'est pas spécifié, il est ignoré.
# $1 (host) est le nom d'hôte.
# $2 (confips) est le nom d'un tableau contenant la configuration des
# adresses ips pour les interfaces.
@ -939,9 +965,12 @@ function network_config() {
# son interface. En principe, l'interface principale est le premier bridge
# défini ou la première interface définie.
# $5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le
# fichier /etc/network/interfaces, mais de le recréer depuis zéro.
# fichier /etc/network/interfaces, mais de le recréer depuis zéro. la valeur
# 'force' spécifie de recréer le fichier même si ce n'est pas nécessaire à
# priori.
# $6 (oldhost) est le nom d'hôte actuel, avant la modification
# Si un des arguments n'est pas spécifié, il est ignoré.
# $7(=/etc/network/interfaces) est le fichier à mettre à jour
#
# Le tableau confips doit contenir des définitions d'une des formes
# suivantes:
# [[iface][//gateway]:]address[/suffix],...
@ -952,6 +981,7 @@ function network_config() {
# interface, seule la première spécification d'adresse IP tient compte de
# l'argument gateway. Les autres spécifications définissent des adresses IP
# supplémentaires pour l'interface.
#
# Le tableau brs doit contenir des définitions de la forme suivante:
# br:ifaces,...
# br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces
@ -967,6 +997,7 @@ function network_config() {
local -a confbrs; array_copy confbrs __nc_confbrs
local mainiface="$4" reset_interfaces="$5" oldhost="$6"
local modified
local nifile="${7:-$__DEBIAN_NETWORK_INTERFACES}"
network_fix_confs confbrs confips "$mainiface"
@ -1001,13 +1032,16 @@ function network_config() {
# vérifier si une modification est nécessaire
local modify
for confbr in "${confbrs[@]}"; do
network_parse_confbr "$confbr" br ifaces
if ! network_interfaces_check_confbr "$br" iface; then
modify=1
break
fi
done
[ "$reset_interfaces" == force ] && modify=1
if [ -z "$modify" ]; then
for confbr in "${confbrs[@]}"; do
network_parse_confbr "$confbr" br ifaces
if ! network_interfaces_check_confbr "$br" iface; then
modify=1
break
fi
done
fi
if [ -z "$modify" ]; then
for confip in "${confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes
@ -1022,13 +1056,17 @@ function network_config() {
if [ -n "$modify" ]; then
# faire une copie de travail
local interfaces; ac_set_tmpfile interfaces
cat "$__DEBIAN_NETWORK_INTERFACES" >"$interfaces"
cat "$nifile" >"$interfaces"
if [ -n "$reset_interfaces" ]; then
local source_itfd
check_sysinfos -d debian -v jessie+ && source_itfd=1
echo >"$interfaces" "\
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
${source_itfd:+
source /etc/network/interfaces.d/*
}
# The loopback network interface
auto lo
iface lo inet loopback
@ -1059,21 +1097,21 @@ iface lo inet loopback
# Fin de traitement
if [ -n "$__DEBIAN_NETWORK_DEVEL_SHOW_MODIFS" ]; then
if testdiff "$interfaces" "$__DEBIAN_NETWORK_INTERFACES"; then
uecho "Setting $__DEBIAN_NETWORK_INTERFACES to:"
if testdiff "$interfaces" "$nifile"; then
uecho "Setting $nifile to:"
cat "$interfaces" | sed 's/^/ /g' 1>&2
else
uecho "$__DEBIAN_NETWORK_INTERFACES: pas de modifications"
uecho "$nifile: pas de modifications"
fi
elif testdiff "$interfaces" "$__DEBIAN_NETWORK_INTERFACES"; then
__network_backup "$__DEBIAN_NETWORK_INTERFACES"
elif testdiff "$interfaces" "$nifile"; then
__network_backup "$nifile"
if show_debug; then
edebug "Setting $__DEBIAN_NETWORK_INTERFACES to:"
edebug "Setting $nifile to:"
cat "$interfaces" | sed 's/^/ /g' 1>&2
else
estep "$__DEBIAN_NETWORK_INTERFACES"
estep "$nifile"
fi
cat "$interfaces" >"$__DEBIAN_NETWORK_INTERFACES"
cat "$interfaces" >"$nifile"
modified=1
fi
ac_clean "$interfaces"
@ -1112,3 +1150,68 @@ iface lo inet loopback
[ -z "$modified" ] && return 10
return 0
}
function network_config_partial() {
# une version allégée de network_config() qui ne permet que de rajouter des
# adresses IPs en plus de celles qui sont déjà configurées.
# $1(=confips) est le nom d'un tableau contenant la configuration des
# adresses ips pour les interfaces.
# $2(=/etc/network/interfaces) est le fichier à mettre à jour
local -a __ncp_newconfips; array_copy __ncp_newconfips "${1:-confips}"
local nifile="${2:-$__DEBIAN_NETWORK_INTERFACES}"
local -a confips confbrs
network_set_confips
network_set_confbrs
network_fix_confs
array_extend confips __ncp_newconfips
network_config "" confips confbrs "" "" "" "$nifile" || return
# des modifications ont eu lieu, tenter de configurer les nouvelles adresses
# d'abord calculer les adresses ips qui sont activées
network_set_confips
local -a ips
local ipsuffix ip suffix
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
local -a ups; local up
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
return 0
}
function network_update_etc_networks() {
# écraser le contenu du fichier /etc/networks avec la chaine $1
# si $1 est vide, initialiser le fichier avec un contenu par défaut.
local contents="$1" TAB=$'\t'
[ -n "$contents" ] || contents="\
default${TAB}${TAB}0.0.0.0
loopback${TAB}127.0.0.0
link-local${TAB}169.254.0.0"
if [ "$(</etc/networks)" != "$contents" ]; then
__network_backup /etc/networks
echo "$contents" >/etc/networks
fi
}