diff --git a/ulib/debian b/ulib/debian index 8af28cf..cf66e9d 100644 --- a/ulib/debian +++ b/ulib/debian @@ -194,31 +194,6 @@ $ip$TAB$host $hostname" "$tmpfile" ac_clean "$tmpfile" } -function __network_reset_interfaces() { - local tmpfile; ac_set_tmpfile tmpfile - - echo >"$tmpfile" "\ -# This file describes the network interfaces available on your system -# and how to activate them. For more information, see interfaces(5). - -# The loopback network interface -auto lo -iface lo inet loopback -" - if [ -n "$__DEBIAN_NETWORK_DEVEL_SHOW_MODIFS" ]; then - if testdiff "$tmpfile" /etc/network/interfaces; then - uecho "Setting /etc/network/interfaces to:" - cat "$tmpfile" | sed 's/^/ /g' 1>&2 - else - uecho "/etc/network/interfaces: pas de modifications" - fi - elif testdiff "$tmpfile" /etc/network/interfaces; then - __network_backup /etc/network/interfaces - cat "$tmpfile" >/etc/network/interfaces - fi - ac_clean "$tmpfile" -} - function __network_parse_confip() { # confip --> iface [ipspecs@] [ipspecs] local __npc_tmp @@ -352,36 +327,82 @@ $1 == "0.0.0.0" && $8 == iface { print gatewayvar "=\"" $2 "\"" }')" } -#BUG" +#BUG")" -function __network_update_bridge() { - # vérifier la configuration (interfaces de ifaces[@] en manual, présence du - # bridge, bridge en auto, adresse ip principale statique ou en dhcp, - # adresses ip supplémentaires), puis si nécessaire, supprimer l'ancienne - # configuration et créer la nouvelle. - local inf="$1"; shift - local outf="$1"; shift - awkrun <"$inf" >"$outf" -f iface="$1" ipspecs[@]="${2:-ipspecs}" ifaces[@]="${3:-ifaces}" ' -{ print } -' -} - -function __network_update_iface() { - # vérifier la configuration (présence de l'interface, interface en auto, - # adresse ip principale statique ou en dhcp, adresses ip supplémentaires), - # puis si nécessaire, supprimer l'ancienne configuration et créer la - # nouvelle. - local inf="$1"; shift - local outf="$1"; shift - local IPSPECS_SCRIPT='BEGIN { +__DEBIAN_NETWORK_UPDATE_BASE_SCRIPT=' +BEGIN { method = "dhcp" - ips_count = ipspecs_count + array_new(have_iface_hotplugs) + array_new(have_iface_autos) + array_new(have_iface_manuals) array_new(ips) array_new(suffixes) array_new(gateways) - array_new(have_ups) - array_new(have_downs) - for (i = 1; i <= ips_count; i++) { + array_new(have_ip_ups) + array_new(have_ip_downs) +} +function indexof_iface(iface, i) { + for (i = 1; i <= ifaces_count; i++) { + if (ifaces[i] == iface) { + return i + } + } + return 0 +} +function indexof_ip(ip, i) { + for (i = 1; i <= ipspecs_count; i++) { + if (ips[i] == ip) { + return i + } + } + return 0 +} +function get_netmask(suffix) { + if (suffix == 0) return "0.0.0.0" + else if (suffix == 8) return "255.0.0.0" + else if (suffix == 16) return "255.255.0.0" + else if (suffix == 24) return "255.255.255.0" + else if (suffix == 32) return "255.255.255.255" + else return suffix +} +function remove_hotplug_iface(iface, line) { + if (line == "") line = $0 + if (line !~ / $/) line = line " " + gsub(" " iface " ", " ", line) + return line +} +function print_hotplug_iface(line) { + if (line ~ /^allow-hotplug *$/) { + # une seule interface sur la ligne: ne pas l"afficher + } else { + # supprimer l"interface de la ligne + sub(/ *$/, "", line) + print line + } +} +function remove_auto_iface(iface, line) { + if (line == "") line = $0 " " + gsub(" " iface " ", " ", line) + return line +} +function print_auto_iface(line) { + if (line ~ /^(allow-)?auto *$/) { + # une seule interface sur la ligne: ne pas l"afficher + } else { + # supprimer l"interface de la ligne + sub(/ *$/, "", line) + print line + } +} +' +__DEBIAN_NETWORK_UPDATE_BRIDGE_SCRIPT=' +BEGIN { + for (i = 1; i <= ifaces_count; i++) { + have_iface_hotplugs[i] = 0 + have_iface_autos[i] = 0 + have_iface_manuals[i] = 0 + } + for (i = 1; i <= ipspecs_count; i++) { if (match(ipspecs[i], "^([^/]*)(/([^+]*))?(\\+(.*))?$", vs) != 0) { ip = vs[1] suffix = vs[3] @@ -395,23 +416,280 @@ function __network_update_iface() { if (ip == "dhcp") method = "dhcp" else method = "static" } - if (suffix == "") suffix = "255.255.255.0" + if (suffix == "") suffix = "24" ips[i] = ip suffixes[i] = suffix gateways[i] = gateway - have_ups[i] = 0 - have_downs[i] = 0 + have_ip_ups[i] = 0 + have_ip_downs[i] = 0 } } -function indexof_ip(ip, i) { - for (i = 1; i = ips_count; i++) { - if (ips[i] == ip) { - return i - } - } - return 0 -} ' +__DEBIAN_NETWORK_UPDATE_IFACE_SCRIPT=' +BEGIN { + for (i = 1; i <= ipspecs_count; i++) { + if (match(ipspecs[i], "^([^/]*)(/([^+]*))?(\\+(.*))?$", vs) != 0) { + ip = vs[1] + suffix = vs[3] + gateway = vs[5] + } else { + ip = "" + suffix = "" + gateway = "" + } + if (i == 1) { + if (ip == "dhcp") method = "dhcp" + else method = "static" + } + if (suffix == "") suffix = "24" + ips[i] = ip + suffixes[i] = suffix + gateways[i] = gateway + have_ip_ups[i] = 0 + have_ip_downs[i] = 0 + } +} +' + +function __network_update_bridge() { + # vérifier la configuration (interfaces de ifaces[@] en manual, présence du + # bridge, bridge en auto, adresse ip principale statique ou en dhcp, + # adresses ip supplémentaires), puis si nécessaire, supprimer l'ancienne + # configuration et créer la nouvelle. + local inf="$1"; shift + local outf="$1"; shift + awkrun <"$inf" -f iface="$1" ipspecs[@]="${2:-ipspecs}" ifaces[@]="${3:-ifaces}" ' +BEGIN { + have_hotplug = 0 + have_auto = 0 + have_iface = 0 + have_method = 0 # static ou dhcp + in_iface = 0 + have_mainip = 0 +} +'" +$__DEBIAN_NETWORK_UPDATE_BASE_SCRIPT +$__DEBIAN_NETWORK_UPDATE_BRIDGE_SCRIPT +"' + +$1 == "iface" && $2 == iface && $3 == "inet" { + have_iface = 1 + if (($0 " ") ~ (" " method " ")) have_method = 1 + in_iface = 1 + next +} +in_iface && ($0 " ") ~ "^[ \\t]*address " mainip " " { have_mainip = 1 } +in_iface && $0 ~ "^[ \\t]*up (/sbin/)?ip addr add " { + if (match($0, "ip addr add (.*)/.* dev " iface, vs) != 0) { + i = indexof_ip(vs[1]) + if (i != 0) have_ip_ups[i] = 1 + } + next +} +in_iface && $0 ~ "^[ \\t]*down (/sbin/)?ip addr del " { + if (match($0, "ip addr del (.*)/.* dev " iface, vs) != 0) { + i = indexof_ip(vs[1]) + if (i != 0) have_ip_downs[i] = 1 + } + next +} +$1 == "iface" { + i = indexof_iface($2) + if (i != 0 && $3 == "inet" && $4 == "manual") { + have_iface_manuals[i] = 1 + } + in_iface = 0 + next +} +$1 == "allow-hotplug" { + if (($0 " ") ~ (" " iface " ")) have_hotplug = 1 + for (i = 1; i <= ifaces_count; i++) { + if (($0 " ") ~ (" " ifaces[i] " ")) iface_have_hotplugs[i] = 1 + } + in_iface = 0 + next +} +$1 ~ /^(allow-)?auto$/ { + if (($0 " ") ~ (" " iface " ")) have_auto = 1 + for (i = 1; i <= ifaces_count; i++) { + if (($0 " ") ~ (" " ifaces[i] " ")) have_iface_autos[i] = 1 + } + in_iface = 0 + next +} + +END { + check_hotplug = !have_hotplug + if (check_hotplug) for (i = 1; i <= ifaces_count; i++) { + if (iface_have_hotplugs[i]) { + check_hotplug = 0 + break + } + } + check_auto = have_auto + if (check_auto) for (i = 1; i <= ifaces_count; i++) { + if (!have_iface_autos[i]) { + check_auto = 0 + break + } + } + check_iface = have_iface && have_method && have_mainip + check_supplips = 1 + for (i = 1; i <= ipspecs_count; i++) { + if (!have_ip_ups[i] || !have_ip_downs[i]) { + check_supplips = 0 + break + } + } + + if (!check_hotplug || !check_auto || !check_iface || !check_supplips) { + exit 1 # il faut refaire la configuration + } + exit 0 # tout est ok +} +' && return 1 + + # il faut refaire la configuration + awkrun <"$inf" >"$outf" -f iface="$1" ipspecs[@]="${2:-ipspecs}" ifaces[@]="${3:-ifaces}" ' +BEGIN { + have_auto = 0 + remove_auto = 0 + array_new(remove_iface_autos) + for (i = 1; i <= ifaces_count; i++) { + remove_iface_autos[i] = 0 + } + replace_conf = 1 + in_iface = 0 + found_iface = 0 + remove_old_iface = 0 +} +'" +$__DEBIAN_NETWORK_UPDATE_BASE_SCRIPT +$__DEBIAN_NETWORK_UPDATE_BRIDGE_SCRIPT +"' +function write_conf() { + replace_conf = 0 + + for (i = 1; i <= ifaces_count; i++) { + printed = 0 + if (!have_iface_autos[i]) { + print "auto " ifaces[i] + printed = 1 + } + if (!have_iface_manuals[i]) { + print "iface " ifaces[i] " inet manual" + printed = 1 + } + if (printed) print "" + } + + if (!have_auto) print "auto " iface + print "iface " iface " inet " method + if (ipspecs_count > 0 && method == "static") { + print " address " ips[1] + print " netmask " get_netmask(suffixes[1]) + print " gateway " gateways[1] + } + ports = " bridge_ports" + if (ifaces_count == 0) { + ports = ports " none" + } else { + for (i = 1; i <= ifaces_count; i++) { + ports = ports " " ifaces[i] + } + } + print ports + print " bridge_stp off" + print " bridge_fd 2" + print " bridge_maxwait 0" + serial = 0 + for (i = 2; i <= ipspecs_count; i++) { + print " up ip addr add " ips[i] "/" suffixes[i] " dev " iface " label " iface ":" serial + print " down ip addr del " ips[i] "/" suffixes[i] " dev " iface " label " iface ":" serial + serial++ + } + print "" +} + +remove_old_iface && $1 == "iface" { + remove_old_iface = 0 +} +!remove_old_iface && replace_conf && !in_iface && $1 == "iface" && $2 == iface && $3 == "inet" { + in_iface = 1 + found_iface = 1 + next +} +!remove_old_iface && $1 == "iface" { + in_iface = 0 + for (i = 1; i <= ifaces_count; i++) { + if ($2 == ifaces[i]) { + if ($3 == "inet" && $4 == "manual") { + have_iface_manuals[i] = 1 + break + } else { + remove_old_iface = 1 + } + } + } + if (replace_conf && found_iface) write_conf() + if (!remove_old_iface) print + next +} +$1 == "allow-hotplug" { + in_iface = 0 + remove_old_iface = 0 + if (replace_conf && found_iface) write_conf() + + line = $0 + if (($0 " ") ~ (" " iface " ")) line = remove_hotplug_iface(iface, line) + for (i = 1; i <= ifaces_count; i++) { + if (($0 " ") ~ (" " ifaces[i] " ")) line = remove_hotplug_iface(ifaces[i], line) + } + print_hotplug_iface(line) + next +} +$1 ~ /(allow-)?auto/ { + in_iface = 0 + remove_old_iface = 0 + if (replace_conf && found_iface) write_conf() + + line = $0 + if (($0 " ") ~ (" " iface " ")) { + if (!remove_auto) { + have_auto = 1 + remove_auto = 1 + } else { + line = remove_auto_iface(iface, line) + } + } + for (i = 1; i <= ifaces_count; i++) { + if (($0 " ") ~ (" " ifaces[i] " ")) { + if (!remove_iface_autos[i]) { + have_iface_autos[i] = 1 + remove_iface_autos[i] = 1 + } else { + line = remove_auto_iface(ifaces[i], line) + } + } + } + print_auto_iface(line) + next +} +{ print } +END { + if (replace_conf) write_conf() +} +' + return 0 +} + +function __network_update_iface() { + # vérifier la configuration (présence de l'interface, interface en auto, + # adresse ip principale statique ou en dhcp, adresses ip supplémentaires), + # puis si nécessaire, supprimer l'ancienne configuration et créer la + # nouvelle. + local inf="$1"; shift + local outf="$1"; shift awkrun <"$inf" -f iface="$1" ipspecs[@]="${2:-ipspecs}" ' BEGIN { have_hotplug = 0 @@ -421,32 +699,43 @@ BEGIN { in_iface = 0 have_mainip = 0 } -'"$IPSPECS_SCRIPT"' +'" +$__DEBIAN_NETWORK_UPDATE_BASE_SCRIPT +$__DEBIAN_NETWORK_UPDATE_IFACE_SCRIPT +"' -($0 " ") ~ ("^allow-hotplug.* " iface " ") { have_hotplug = 1; next } -($0 " ") ~ ("^(allow-)?auto.* " iface " ") { have_auto = 1; next } -$0 ~ ("^iface " iface " inet ") { +$1 == "iface" && $2 == iface && $3 == "inet" { have_iface = 1 if (($0 " ") ~ (" " method " ")) have_method = 1 in_iface = 1 next } -$0 ~ ("^iface ") { in_iface = 0; next; } -in_iface && $0 ~ "^[ ]*address " mainip { have_mainip = 1 } -in_iface && $0 ~ "^[ ]*up (/sbin/)?ip addr add " { +in_iface && ($0 " ") ~ "^[ \\t]*address " mainip " " { have_mainip = 1 } +in_iface && $0 ~ "^[ \\t]*up (/sbin/)?ip addr add " { if (match($0, "ip addr add (.*)/.* dev " iface, vs) != 0) { i = indexof_ip(vs[1]) - if (i != 0) have_ups[i] = 1 + if (i != 0) have_ip_ups[i] = 1 } next } -in_iface && $0 ~ "^[ ]*down (/sbin/)?ip addr del " { +in_iface && $0 ~ "^[ \\t]*down (/sbin/)?ip addr del " { if (match($0, "ip addr del (.*)/.* dev " iface, vs) != 0) { i = indexof_ip(vs[1]) - if (i != 0) have_downs[i] = 1 + if (i != 0) have_ip_downs[i] = 1 } next } +$1 == "iface" { in_iface = 0; next; } +$1 == "allow-hotplug" { + if (($0 " ") ~ (" " iface " ")) have_hotplug = 1 + in_iface = 0 + next +} +$1 ~ /^(allow-)?auto$/ { + if (($0 " ") ~ (" " iface " ")) have_auto = 1 + in_iface = 0 + next +} END { check_hotplug = !have_hotplug @@ -454,7 +743,7 @@ END { check_iface = have_iface && have_method && have_mainip check_supplips = 1 for (i = 1; i <= ipspecs_count; i++) { - if (!have_ups[i] || !have_downs[i]) { + if (!have_ip_ups[i] || !have_ip_downs[i]) { check_supplips = 0 break } @@ -474,60 +763,35 @@ BEGIN { remove_auto = 0 replace_conf = 1 in_iface = 0 + found_iface = 0 } -'"$IPSPECS_SCRIPT"' -function remove_hotplug_iface() { - line = $0 " "; gsub(" " iface " ", " ", line) - if (line ~ /^allow-hotplug *$/) { - # une seule interface sur la ligne: la commenter - print "#" $0 - } else { - # supprimer l"interface de la ligne - sub(/ *$/, "", line) - print line - } -} -function remove_auto_iface() { - line = $0 " "; gsub(" " iface " ", " ", line) - if (line ~ /^(allow-)?auto *$/) { - # une seule interface sur la ligne: la commenter - print "#" $0 - } else { - # supprimer l"interface de la ligne - sub(/ *$/, "", line) - print line - } -} -function get_netmask(suffix) { - if (suffix == 0) return "0.0.0.0" - else if (suffix == 8) return "255.0.0.0" - else if (suffix == 16) return "255.255.0.0" - else if (suffix == 24) return "255.255.255.0" - else if (suffix == 32) return "255.255.255.255" - else return suffix -} +'" +$__DEBIAN_NETWORK_UPDATE_BASE_SCRIPT +$__DEBIAN_NETWORK_UPDATE_IFACE_SCRIPT +"' function write_conf() { replace_conf = 0 if (!have_auto) print "auto " iface print "iface " iface " inet " method - if (ips_count > 0 && method == "static") { + if (ipspecs_count > 0 && method == "static") { print " address " ips[1] print " netmask " get_netmask(suffixes[1]) print " gateway " gateways[1] } serial = 0 - for (i = 2; i <= ips_count; i++) { + for (i = 2; i <= ipspecs_count; i++) { print " up ip addr add " ips[i] "/" suffixes[i] " dev " iface " label " iface ":" serial print " down ip addr del " ips[i] "/" suffixes[i] " dev " iface " label " iface ":" serial serial++ } + print "" } -($0 " ") ~ ("^allow-hotplug.* " iface " ") { remove_hotplug_iface(); next; } +($0 " ") ~ ("^allow-hotplug.* " iface " ") { print_hotplug_iface(remove_hotplug_iface(iface)); next; } !remove_auto && ($0 " ") ~ ("^(allow-)?auto.* " iface " ") { have_auto = 1; remove_auto = 1; next; } -remove_auto && ($0 " ") ~ ("^(allow-)?auto.* " iface " ") { remove_auto_iface(); next; } -replace_conf && !in_iface && $0 ~ ("^iface " iface " inet ") { in_iface = 1; next; } -replace_conf && in_iface && $0 ~ "^iface " { print; in_iface = 0; write_conf(); next; } +remove_auto && ($0 " ") ~ ("^(allow-)?auto.* " iface " ") { print_auto_iface(remove_auto_iface(iface)); next; } +replace_conf && !in_iface && $0 ~ ("^iface " iface " inet ") { in_iface = 1; found_iface = 1; next; } +replace_conf && found_iface && in_iface && $0 ~ "^iface " { print; in_iface = 0; write_conf(); next; } { print } END { if (replace_conf) write_conf() @@ -567,7 +831,7 @@ function network_config() { [ -n "$2" ] && array_copy __nc_confips "$2" [ -n "$3" ] && array_copy __nc_confbrs "$3" - local host="$1" mainiface="$4" + local host="$1" mainiface="$4" reset_interfaces="$5" local -a confips confbrs array_copy confips __nc_confips array_copy confbrs __nc_confbrs @@ -610,6 +874,7 @@ function network_config() { local -a confstdips confbrips for confip in "${confips[@]}"; do __network_parse_confip "$confip" iface + [ -n "$iface" ] || iface="$mainiface" if array_contains brifaces "$iface"; then array_add confbrips "$confip" else @@ -623,6 +888,17 @@ function network_config() { ac_set_tmpfile workfile cat /etc/network/interfaces >"$interfaces" + if [ -n "$reset_interfaces" ]; then + echo >"$interfaces" "\ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +# The loopback network interface +auto lo +iface lo inet loopback +" + fi + # configurer chaque bridge local -a tmpifaces local tmpbr @@ -638,7 +914,7 @@ function network_config() { for confbr in "${confbrs[@]}"; do __network_parse_confbr "$confbr" tmpbr tmpifaces if [ "$tmpbr" == "$br" ]; then - array_copy ifaces "$tmpifaces" + array_copy ifaces tmpifaces break fi done