nutools/netconfig

172 lines
5.4 KiB
Plaintext
Raw Permalink Normal View History

#!/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