From c6727703ef03d73435ee7293e53245acb1760311 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Tue, 28 Jan 2014 15:55:40 +0400 Subject: [PATCH] __network_set_confips() et __network_set_confbrs() --- ulib/debian | 89 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/ulib/debian b/ulib/debian index dcf86ff..94c20ac 100644 --- a/ulib/debian +++ b/ulib/debian @@ -318,32 +318,34 @@ function __network_resolve_mainiface() { [ -n "${!__nrm_mainiface}" ] || set_var "$__nrm_mainiface" eth0 } -function __network_set_mainip() { - # XXX modifier pour en faire set_confips, qui initialise confips en fonction - # des adresses actuelles, principale et supplémentaire +function __network_set_confip() { eval "$(ip addr show dev "$1" | awk "BEGIN { mainipvar = \"${2:-mainip}\" - suffixvar = \"${3:-suffix}\" - broadcastvar = \"${4:-broadcast}\" + supplipsvar = \"${3:-supplips}\" "' print mainipvar "=" - print suffixvar "=" - print broadcastvar "=" + print supplipsvar "=()" + mainip = "" + supplips = 0 } $1 == "inet" { - mainip = ""; suffix = ""; broadcast = "" - if (match($0, "inet ([^ ]*)/([^ ]*) ", vs) != 0) { - mainip = vs[1] - suffix = vs[2] + if (mainip == "") { + mainip = $2 + print mainipvar "=\"" mainip "\"" + } else { + if (!supplips) { + supplips = 1 + print supplipsvar "=(" + } + print "\"" $2 "\"" } - if (match($0, "brd ([^ ]*) ", vs) != 0) { - broadcast = vs[1] +} +END { + if (supplips) { + print ")" } - print mainipvar "=\"" mainip "\"" - print suffixvar "=\"" suffix "\"" - print broadcastvar "=\"" broadcast "\"" - exit 0 }')" + set_var "$2" "$(array_join "$2" ,)" } function __network_set_gateway() { @@ -359,6 +361,36 @@ $1 == "0.0.0.0" && $8 == iface { } #BUG")" +function __network_set_confips() { + local -a __nsc_confips __nsc_ifaces __nsc_supplips + local __nsc_iface __nsc_mainip __nsc_gateway + array_from_lines __nsc_ifaces "$(ip link | grep -v '<.*LOOPBACK.*>' | grep '<.*UP.*>' | awk '{ sub(/:$/, "", $2); print $2}')" + for __nsc_iface in "${__nsc_ifaces[@]}"; do + __network_set_confip "$__nsc_iface" __nsc_mainip __nsc_supplips + [ -n "$__nsc_mainip" ] || continue + __network_set_gateway "$__nsc_iface" __nsc_gateway + array_add __nsc_confips "$__nsc_iface:$__nsc_mainip${__nsc_gateway:++$__nsc_gateway}${__nsc_supplips:+,$__nsc_supplips}" + done + array_copy "${1:-confips}" __nsc_confips +} + +function __network_set_confbrs() { + local -a __nsc_ifaces __nsc_tmpconfbrs __nsc_confbrs + local __nsc_confbr __nsc_br __nsc_iface + array_from_lines __nsc_ifaces "$(ip link | grep -v '<.*LOOPBACK.*>' | grep '<.*UP.*>' | awk '{ sub(/:$/, "", $2); print $2}')" + array_from_lines __nsc_tmpconfbrs "$(brctl show 2>/dev/null | awk 'BEGIN { br = "" } +NR == 1 { next } +$1 != "" { br = $1 } +{ print br ":" $4 } +')" + for __nsc_confbr in "${__nsc_tmpconfbrs[@]}"; do + splitpair "$__nsc_confbr" __nsc_br __nsc_iface + array_contains __nsc_ifaces "$__nsc_br" || continue + array_add __nsc_confbrs "$__nsc_confbr" + done + array_copy "${1:-confbrs}" __nsc_confbrs +} + __DEBIAN_NETWORK_UPDATE_BASE_SCRIPT=' BEGIN { method = "dhcp" @@ -618,7 +650,9 @@ function write_conf() { if (ipspecs_count > 0 && method == "static") { print " address " ips[1] print " netmask " get_netmask(suffixes[1]) - print " gateway " gateways[1] + if (gateways[1] != "" && gateways[1] != ips[1]) { + print " gateway " gateways[1] + } } ports = " bridge_ports" if (ifaces_count == 0) { @@ -806,7 +840,9 @@ function write_conf() { if (ipspecs_count > 0 && method == "static") { print " address " ips[1] print " netmask " get_netmask(suffixes[1]) - print " gateway " gateways[1] + if (gateways[1] != "" && gateways[1] != ips[1]) { + print " gateway " gateways[1] + } } serial = 0 for (i = 2; i <= ipspecs_count; i++) { @@ -832,12 +868,17 @@ END { function network_config() { # (Re)configurer le réseau sur l'hôte courant. - # $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. $3 - # (confbrs) est le nom d'un tableau contenant la configuration des bridges à - # créer/mettre à jour. $4 (mainiface) est le nom de l'interface - # principale. En principe, l'interface principale est le premier bridge + # $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. + # $3 (confbrs) est le nom d'un tableau contenant la configuration des + # bridges à créer/mettre à jour. + # $4 (mainiface) est le nom de l'interface principale, c'est à dire + # l'interface qui est sélectionnée si une adresse ip n'est pas préfixée de + # 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. # Si un des arguments n'est pas spécifié, il est ignoré. # Le tableau confips doit contenir des définitions d'une des formes # suivantes: