From 98087e0613644cd7605bac028a06b032e6c26272 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Fri, 24 Jan 2014 16:26:22 +0400 Subject: [PATCH] =?UTF-8?q?d=C3=A9but=20d'impl=C3=A9mentation=20de=20debia?= =?UTF-8?q?n/network=5Fconfig()=20pour=20vmtemplate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ulib/.ulib_version | 2 +- ulib/debian | 139 ++++++++++++++++++++++++++++++++++++++++++++- ulib/ipcalc | 18 +++++- 3 files changed, 152 insertions(+), 7 deletions(-) diff --git a/ulib/.ulib_version b/ulib/.ulib_version index d6b2404..209e3ef 100644 --- a/ulib/.ulib_version +++ b/ulib/.ulib_version @@ -1 +1 @@ -19 +20 diff --git a/ulib/debian b/ulib/debian index a9b48ff..d3bf7ab 100644 --- a/ulib/debian +++ b/ulib/debian @@ -67,9 +67,9 @@ function service_enable() { ################################################################################ # Gestion des interfaces réseau -function create_bridge() { - # Créer un nouveau pont nommé $1 avec les paramètres $2 - # Si $2 est vide, sa valeur par défaut est +function network_create_bridge() { + # Modifier le fichier /etc/network/interfaces pour créer un nouveau pont + # nommé $1 avec les paramètres $2. Si $2 est vide, sa valeur par défaut est # bridge_ports none # bridge_stp off # bridge_fd 2 @@ -111,3 +111,136 @@ END { } }' } + +function __network_hostname() { + echo "${1%%.*}" >/etc/hostname +} + +function __network_mailname() { + echo "$1" >/etc/mailname +} + +function __network_hosts() { + local host="$1" hostname="${1%%.*}" ip="$2" + local tmpfile; ac_set_tmpfile tmpfile + "$tmpfile" + local sip="${ip//./\\.}" shost="${host//./\\.}" + if ! quietgrep "^$sip[ $TAB]\\+$shost[ $TAB]\\+$hostname" "$tmpfile"; then + sed -i "/^$sip/d; 1i\\ +$ip$TAB$host $hostname" "$tmpfile" + fi + + testdiff "$tmpfile" /etc/host && cat "$tmpfile" >/etc/hosts + ac_clean "$tmpfile" +} + +function __network_fix_mainip() { + splitfsep2 "$1" : "${2:-mainiface}" "${3:-mainip}" +} + +function __network_fix_supplips() { + local -a __sips __ifaces __ips + local __sip __iface __sip_ips + array_copy __sips "$1" + # recenser les interfaces et créer les tableaux + for __sip in "${__sips[@]}"; do + splitfsep2 "$__sip" : __iface __sip_ips + array_addu __ifaces "$__iface" + eval "local -a __${__iface}_iface_ips" + done + # puis constuire la liste des adresses IP associées à chaque interface + for __sip in "${__sips[@]}"; do + splitfsep2 "$__sip" : __iface __sip_ips + array_split __ips "$__sip_ips" , + eval "array_extendu __${__iface}_iface_ips __ips" + done + # puis construire le tableau final + array_new __sips + for __iface in "${__ifaces[@]}"; do + array_add __sips "${__iface:-eth0}:$(array_join "__${__iface}_iface_ips" ,)" + done + array_copy "$1" __sips +} + +function __network_fix_confbrs() { + local -a __confbrs __brs __ifaces + local __confbr __br __confbr_ifaces + array_copy __confbrs "$1" + # recenser les bridges et créer les tableaux + for __confbr in "${__confbrs[@]}"; do + splitfsep2 "$__confbr" : __br __confbr_ifaces + array_addu __brs "$__br" + eval "local -a ${__br}_br_ifaces" + done + # puis constuire la liste des interfaces associées à chaque bridge + for __confbr in "${__confbrs[@]}"; do + splitfsep2 "$__confbr" : __br __confbr_ifaces + array_split __ifaces "$__confbr_ifaces" , + eval "array_extendu ${__br}_br_ifaces __ifaces" + done + # puis construire le tableau final + array_new __confbrs + for __br in "${__brs[@]}"; do + array_add __confbrs "${__br:-br0}:$(array_join "${__br}_br_ifaces" ,)" + done + array_copy "$1" __confbrs +} + +function network_config() { + # (Re)configurer le réseau sur l'hôte courant. + # $1 (host) est le nom d'hôte, $2 (mainip) l'adresse ip principale, $3 + # (netmask) le masque de sous-réseau, $4 (broadcast) l'adresse de broadcast, + # $5 (gateway) la passerelle, $6 (supplips) le nom d'un tableau contenant + # des adresses ip supplémentaires, et $7 (brs) le nom d'un tableau contenant + # les bridges à configurer. + # Si un des arguments n'est pas spécifié, il est ignoré. + # netmask, broadcast et gateway sont ignorés si ip n'est pas spécifié. + # mainip est de la forme [iface:]address. iface vaut par défaut eth0 + # Le tableau supplips doit contenir des définitions de la forme + # [iface:]addresses. iface vaut par défaut eth0. addresses est une liste + # d'adresses ip séparées par une virgule. e.g. br0:10.82.80.65,10.82.80.66 + # Le tableau brs doit contenir des définitions de la forme br:ifaces. br est + # le nom du bridge, e.g. br0. ifaces est une liste d'interfaces séparées par + # une virgule. e.g. br0:eth0,eth1 + urequire ipcalc conf + + local -a __nc_supplips __nc_brs + [ -n "$6" ] && array_copy __nc_supplips "$7" + [ -n "$7" ] && array_copy __nc_brs "$8" + + local host="$1" mainip="$2" netmask="${3:-255.255.255.0}" broadcast="$4" gateway="$5" mainiface="$6" + local -a supplips brs + array_copy supplips __nc_supplips + array_copy brs __nc_brs + + # configurer le nom d'hôte + if [ -n "$host" ]; then + host="$(ipcalc_fqdn_maybe "$host")" + etitle "Configuration du nom d'hôte: $host" + + # si on ne spécifie pas l'adresse ip principale, la résoudre ici. ceci + # est nécessaire pour mettre à jour /etc/hosts + local ip="$mainip" + if [ -z "$ip" ]; then + local -a ips + resolv_ips ips "$host" + [ -n "${ips[*]}" ] || { + eerror "$host: Impossible de résoudre ce nom d'hôte" + return 1 + } + ip="${ips[0]}" + fi + + estep "/etc/hostname" + __network_hostname "$host" + estep "/etc/mailname" + __network_mailname "$host" + estep "/etc/hosts" + __network_hosts "$host" "$ip" + + eend + fi + + return 0 +} diff --git a/ulib/ipcalc b/ulib/ipcalc index ee7619d..abbf193 100644 --- a/ulib/ipcalc +++ b/ulib/ipcalc @@ -145,9 +145,9 @@ function ipcalc_match() { } function ipcalc_fqdn() { - # Calculer si possible le nom pleinement qualifié correspondant à l'hôte - # $1. Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a - # pas pu être effectué. + # Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1. + # Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas + # pu être effectué. local -a ips hosts local ip host if ! ips=("$(ipcalc_checkip "$1")"); then @@ -168,3 +168,15 @@ function ipcalc_fqdn() { return 1 } +function ipcalc_fqdn_maybe() { + # Si $1 *semble* déjà être un nom d'hôte pleinement qualifié, l'afficher tel + # quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement + # qualifié correspondant. + if ipcalc_checkip "$1" >/dev/null; then + ipcalc_fqdn "$1" + elif [[ "$1" == *.* ]]; then + echo "$1" + else + ipcalc_fqdn "$1" + fi +}