##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Outils pour les distributions debian ##@cooked nocomments ##@require base ##@require sysinfos ##@require service uprovide debian urequire base sysinfos service ################################################################################ # Gestion des packages function pkg_check() { # Vérifier que les packages sont installés sur le système local pkg status for pkg in "$@"; do status="$(LANG=C dpkg -s "$pkg" 2>/dev/null | grep '^Status:')" || return 1 [[ "$status" == *not-installed* ]] && return 1 [[ "$status" == *deinstall* ]] && return 1 done return 0 } function pkg_update() { # Mettre à jour la liste des packages silencieusement sans confirmation LANG=C apt-get update -qy } function pkg_upgrade() { # Mettre à jour la liste des packages silencieusement sans confirmation LANG=C apt-get upgrade -qy } function pkg_install() { # Installer les packages silencieusement et sans confirmation LANG=C apt-get install -qy "$@" } function pkg_installm() { # Installer les packages silencieusement et sans confirmation # Retourner 0 si au moins un des packages a été installé. Sinon, les # packages n'ont pas été installés, soit parce qu'ils sont déjà installé, # soit parce qu'il y a eu une erreur. if ! pkg_check "$@"; then # essayer d'installer les packages pkg_install "$@" else # aucun package n'a été installé return 1 fi } ################################################################################ # Gestion des services function service_disable() { # Désactiver le service $1 pour qu'il ne se lance pas automatiquement au # démarrage update-rc.d -f "$1" remove } function service_enable() { # Activer le service $1 pour qu'il se lance automatiquement au démarrage update-rc.d "$1" defaults } ################################################################################ # Gestion des interfaces réseau 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 # bridge_maxwait 0 # OPTIONS: # --static L'interface est statique plutôt que de recevoir son # adresse par DHCP # --auto Démarrer l'interface automatiquement # Une définition existante de l'interface n'est jamais écrasée. # Retourner vrai si la définition a été ajoutée dans /etc/network/interfaces local args method auto ifname lines method=dhcp parse_opts \ --static method=static \ --auto auto \ @ args -- "$@" && set -- "${args[@]}" || { eerror "$args" return 1 } ifname="${1:-br0}" array_from_lines lines "$2" lines="$(array_to_lines lines "" " ")" doinplacef /etc/network/interfaces awkrun ifname="$ifname" lines="$lines" method="$method" auto="$auto" ' BEGIN { foundif = 0 } $0 ~ "^iface " ifname " " { foundif = 1 } { print } END { if (foundif) { exit 1 } else { print "" if (auto != "") print "auto " ifname print "iface " ifname " inet " method if (lines != "") print lines exit 0 } }' } 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 # quelques pistes de réflexion pour la suite de l'implémentation: # pour la configuration de l'adresse ip principale, il faut d'abord # déterminer l'interface principale # si l'interface principale est un bridge, il faut mettre les interfaces # concernées en manual et configurer les adresses ips du bridge # si l'interface principale est une interface standard, il suffit de # configurer les adresses pour cette interface. # bien que possible en pratique, interdire qu'une interface soit membre d'un # bridge et aie une adresse. # après avoir classifiée les bridge et les interfaces non attachées à des # bridges, il faut: configurer les interfaces standard, configurer les # interfaces des bridges en manual, configurer les bridges return 0 }