diff --git a/netconfig b/netconfig new file mode 100755 index 0000000..6c4ee0a --- /dev/null +++ b/netconfig @@ -0,0 +1,171 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname "$0")/lib/ulib/ulib" || exit 1 +urequire DEFAULTS debian + +function display_help() { + uecho "$scriptname: gérer la configuration du réseau + +USAGE + $scriptname -c network.conf + $scriptname [iface:]ip[/suffix]... + +OPTIONS + -P, --partial + Activer le mode de configuration partielle. C'est la valeur par défaut. + Dans ce mode, la configuration courante n'est pas modifiée. Seules de + nouvelles adresses ips sont configurées le cas échéant. + -F, --full + Activer le mode de configuration complète. Dans ce mode, le nom d'hôte + ainsi que toutes les interfaces, pont et adresses sont configurés. + -z, --reset + En mode full, recréer le fichier /etc/network/interfaces au lieu + d'essayer de le mettre à jour. + -l, --inline + Prendre la configuration depuis la ligne de commande. C'est la valeur + par défaut, sauf si un fichier network.conf existe dans le répertoire + courant. + Dans ce mode, chaque argument est une spécification d'adresse IP à + configurer. Les autres paramètres i.e les ponts, le nom d'hôte et le + contenu du fichier /etc/networks sont spécifiés avec les options -b, + -h et -e + -c, --config CONFIG + Spécifier le fichier de configuration à utiliser pour la configuration + du réseau. Cette option est automatiquement activée si le répertoire + courant contient un fichier network.conf + -w, --write + Ecrire la configuration actuelle dans le fichier network.conf + Note: comme ce script demande les droits de root, le fichier sera écrit + avec le propriétaire root. + -b, --bridge BR:IFACES + En mode inline, spécifier une liste de ponts à configurer. + -h, --host HOST + En mode inline, spécifier le nom d'hôte pleinement qualifié + -e, --etc-networks CONTENT + Spécifier un contenu pour remplacer le fichier /etc/networks" +} + +mode=partial +reset= +source=auto +config= +write= +brs=() +host= +etc_networks= +args=( + --help '$exit_with display_help' + -P,--partial mode=partial + -F,--full mode=full + -z,--reset reset=1 + -l,--inline source=inline + -c:,--config: '$set@ config; source=config' + -w,--write write=1 + -b:,--bridge: brs + -h:,--host: host= + -e:,--etc-networks: etc_networks= +) +parse_args "$@"; set -- "${args[@]}" + +# vérification du système +check_sysinfos -d debian || die "Ce script n'est supporté que sur debian linux" + +# relancer en root +args=() + +case "$mode" in +p|partial) mode=partial; array_add args --partial;; +f|full) mode=full; array_add args --full;; +*) die "$mode: mode invalide. ce doit être full ou partial";; +esac +[ "$mode" == full ] || reset= +[ -n "$reset" ] && array_add args --reset + +if [ "$source" == auto ]; then + if [ -f network.conf ]; then + estepi "Chargement automatique de network.conf" + source=config + config=network.conf + else + source=inline + fi +fi +case "$source" in +i|inline) + ips=("$@") + ;; +c|config) + [ -f "$config" ] || die "$config: fichier introuvable" + eval "$( + ips=(); brs=(); host= + source "$config" >&/dev/null + set_array_cmd ips + set_array_cmd brs + echo_setv host "$host" + echo_setv etc_networks "$etc_networks" + )" + ;; +esac +array_add args --inline +for br in "${brs[@]}"; do + array_add args --bridge "$br" +done +[ -n "$host" ] && array_add args --host "$host" +[ -n "$write" ] && array_add args --write +array_add args "${ips[@]}" + +run_as_root "${args[@]}" + +# (re)configurer le réseau +modified= +if [ "$mode" == full ]; then + enote "La configuration COMPLETE suivante va être appliquée + brs: ${brs[*]} + ips: ${ips[*]} + host: $host" + ask_yesno "Voulez-vous continuer?" O || die + if [ ${#ips[*]} -gt 0 -o ${#brs[*]} -gt 0 -o -n "$hosts" ]; then + network_config "$host" ips brs "" "$reset" && modified=1 + fi + [ -n "$etc_networks" ] && network_update_etc_networks "$etc_networks" + [ -n "$modified" ] && eimportant "Vous devriez redémarrer le serveur pour prendre en compte la nouvelle configuration" + +elif [ "$mode" == partial ]; then + enote "La configuration PARTIELLE suivante va être appliquée + ips: ${ips[*]}" + ask_yesno "Voulez-vous continuer?" O || die + if [ ${#ips[*]} -gt 0 ]; then + network_config_partial ips && modified=1 + fi +fi + +# Ecrire le fichier de configuration +if [ -n "$write" ]; then + if [ -f network.conf ]; then + ask_yesno "Le fichier network.conf existe. Voulez-vous l'écraser?" N || die + fi + + network_set_confbrs brs + network_set_confips ips + network_fix_confs brs ips + [ -n "$host" ] || setx host=hostname -f + + estep "network.conf" + echo >network.conf "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +# Liste des ponts à configurer. Chaque élément est de la forme BR:IFACES +# BR est le nom du pont, e.g. br0. IFACES est une liste d'interfaces séparées +# par une virgule. e.g. br0:eth0,eth1 +$(set_array_cmd brs) + +# Liste des adresses IPs à configurer. Chaque élément est de la forme +# [IFACE:]dhcp ou [[IFACE][//GATEWAY]:]IP[/SUFFIX] +$(set_array_cmd ips) + +# Nom d'hôte pleinement qualifié. Si ce paramètre est spécifié, les fichiers +# /etc/hosts, /etc/hostname et /etc/mailname sont mis à jour. +$(echo_setv host "$host") + +# Contenu du fichier /etc/networks +$(echo_setv etc_networks "$etc_networks")" +fi