172 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |