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() { function __network_fix_confips() {
local -a confips ipsuffixes ifaces ips local -a confips ipsuffixes ifaces ips
local confip iface gateway ip suffix mainip local confip iface gateway network ip suffix mainip
local mainiface="$1" local mainiface="$1"
# recenser les interfaces et créer les tableaux __IFACE_ipspecs # recenser les interfaces et créer les tableaux __IFACE_ipspecs
for confip in "${__nfc_confips[@]}"; do for confip in "${__nfc_confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes network_parse_confip "$confip" iface gateway ipsuffixes
[ -n "$iface" ] || iface="$mainiface" if [ -n "$iface" ]; then
array_addu ifaces "$iface" network="${iface}_network"
eval "local ${iface}_gateway; local -a ${iface}_ipsuffixes" 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 done
# puis construire la liste des adresses IP associées à chaque interface # puis construire la liste des adresses IP associées à chaque interface
for confip in "${__nfc_confips[@]}"; do for confip in "${__nfc_confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes 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" [ -n "$iface" ] || iface="$mainiface"
# si la passerelle a déjà été spécifiée, la récupérer # si la passerelle a déjà été spécifiée, la récupérer
local tmpgw="${iface}_gateway" local tmpgw="${iface}_gateway"
@ -356,6 +376,7 @@ function __network_set_confips() {
array_from_lines ifaces "$(__network_valid_ifaces)" array_from_lines ifaces "$(__network_valid_ifaces)"
for iface in "${ifaces[@]}"; do for iface in "${ifaces[@]}"; do
__network_set_gateway "$iface" __network_set_gateway "$iface"
[ -n "$gateway" ] || gateway=-
__network_set_confip "$iface" "$gateway" || continue __network_set_confip "$iface" "$gateway" || continue
array_add confips "$confip" array_add confips "$confip"
done done
@ -462,6 +483,7 @@ BEGIN {
have_iface = 0 have_iface = 0
have_method = 0 # static ou dhcp have_method = 0 # static ou dhcp
have_gateway = ipsuffixes[1] == "dhcp" || gateway == "" have_gateway = ipsuffixes[1] == "dhcp" || gateway == ""
if (gateway == "none" || gateway == "-") gateway = ""
array_new(have_ips) array_new(have_ips)
array_new(have_ip_ups) array_new(have_ip_ups)
array_new(have_ip_downs) array_new(have_ip_downs)
@ -692,6 +714,8 @@ function network_interfaces_add_confip() {
local nifile="${4:-$__DEBIAN_NETWORK_INTERFACES}" local nifile="${4:-$__DEBIAN_NETWORK_INTERFACES}"
local mainip netmask method local mainip netmask method
[ "$gateway" == "none" -o "$gateway" == "-" ] && gateway=
network_parse_ipsuffix "${ipsuffixes[0]}" mainip netmask network_parse_ipsuffix "${ipsuffixes[0]}" mainip netmask
if [ "$mainip" == "dhcp" ]; then if [ "$mainip" == "dhcp" ]; then
mainip= mainip=
@ -928,7 +952,9 @@ $ip$TAB$host $hostname" "$tmpfile"
} }
function network_config() { 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. # $1 (host) est le nom d'hôte.
# $2 (confips) est le nom d'un tableau contenant la configuration des # $2 (confips) est le nom d'un tableau contenant la configuration des
# adresses ips pour les interfaces. # adresses ips pour les interfaces.
@ -939,9 +965,12 @@ function network_config() {
# son interface. En principe, l'interface principale est le premier bridge # son interface. En principe, l'interface principale est le premier bridge
# défini ou la première interface définie. # défini ou la première interface définie.
# $5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le # $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 # $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 # Le tableau confips doit contenir des définitions d'une des formes
# suivantes: # suivantes:
# [[iface][//gateway]:]address[/suffix],... # [[iface][//gateway]:]address[/suffix],...
@ -952,6 +981,7 @@ function network_config() {
# interface, seule la première spécification d'adresse IP tient compte de # 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 # l'argument gateway. Les autres spécifications définissent des adresses IP
# supplémentaires pour l'interface. # supplémentaires pour l'interface.
#
# Le tableau brs doit contenir des définitions de la forme suivante: # Le tableau brs doit contenir des définitions de la forme suivante:
# br:ifaces,... # br:ifaces,...
# br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces # 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 -a confbrs; array_copy confbrs __nc_confbrs
local mainiface="$4" reset_interfaces="$5" oldhost="$6" local mainiface="$4" reset_interfaces="$5" oldhost="$6"
local modified local modified
local nifile="${7:-$__DEBIAN_NETWORK_INTERFACES}"
network_fix_confs confbrs confips "$mainiface" network_fix_confs confbrs confips "$mainiface"
@ -1001,13 +1032,16 @@ function network_config() {
# vérifier si une modification est nécessaire # vérifier si une modification est nécessaire
local modify local modify
for confbr in "${confbrs[@]}"; do [ "$reset_interfaces" == force ] && modify=1
network_parse_confbr "$confbr" br ifaces if [ -z "$modify" ]; then
if ! network_interfaces_check_confbr "$br" iface; then for confbr in "${confbrs[@]}"; do
modify=1 network_parse_confbr "$confbr" br ifaces
break if ! network_interfaces_check_confbr "$br" iface; then
fi modify=1
done break
fi
done
fi
if [ -z "$modify" ]; then if [ -z "$modify" ]; then
for confip in "${confips[@]}"; do for confip in "${confips[@]}"; do
network_parse_confip "$confip" iface gateway ipsuffixes network_parse_confip "$confip" iface gateway ipsuffixes
@ -1022,13 +1056,17 @@ function network_config() {
if [ -n "$modify" ]; then if [ -n "$modify" ]; then
# faire une copie de travail # faire une copie de travail
local interfaces; ac_set_tmpfile interfaces local interfaces; ac_set_tmpfile interfaces
cat "$__DEBIAN_NETWORK_INTERFACES" >"$interfaces" cat "$nifile" >"$interfaces"
if [ -n "$reset_interfaces" ]; then if [ -n "$reset_interfaces" ]; then
local source_itfd
check_sysinfos -d debian -v jessie+ && source_itfd=1
echo >"$interfaces" "\ echo >"$interfaces" "\
# This file describes the network interfaces available on your system # This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5). # and how to activate them. For more information, see interfaces(5).
${source_itfd:+
source /etc/network/interfaces.d/*
}
# The loopback network interface # The loopback network interface
auto lo auto lo
iface lo inet loopback iface lo inet loopback
@ -1059,21 +1097,21 @@ iface lo inet loopback
# Fin de traitement # Fin de traitement
if [ -n "$__DEBIAN_NETWORK_DEVEL_SHOW_MODIFS" ]; then if [ -n "$__DEBIAN_NETWORK_DEVEL_SHOW_MODIFS" ]; then
if testdiff "$interfaces" "$__DEBIAN_NETWORK_INTERFACES"; then if testdiff "$interfaces" "$nifile"; then
uecho "Setting $__DEBIAN_NETWORK_INTERFACES to:" uecho "Setting $nifile to:"
cat "$interfaces" | sed 's/^/ /g' 1>&2 cat "$interfaces" | sed 's/^/ /g' 1>&2
else else
uecho "$__DEBIAN_NETWORK_INTERFACES: pas de modifications" uecho "$nifile: pas de modifications"
fi fi
elif testdiff "$interfaces" "$__DEBIAN_NETWORK_INTERFACES"; then elif testdiff "$interfaces" "$nifile"; then
__network_backup "$__DEBIAN_NETWORK_INTERFACES" __network_backup "$nifile"
if show_debug; then if show_debug; then
edebug "Setting $__DEBIAN_NETWORK_INTERFACES to:" edebug "Setting $nifile to:"
cat "$interfaces" | sed 's/^/ /g' 1>&2 cat "$interfaces" | sed 's/^/ /g' 1>&2
else else
estep "$__DEBIAN_NETWORK_INTERFACES" estep "$nifile"
fi fi
cat "$interfaces" >"$__DEBIAN_NETWORK_INTERFACES" cat "$interfaces" >"$nifile"
modified=1 modified=1
fi fi
ac_clean "$interfaces" ac_clean "$interfaces"
@ -1112,3 +1150,68 @@ iface lo inet loopback
[ -z "$modified" ] && return 10 [ -z "$modified" ] && return 10
return 0 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
}