171 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| ## Calculateur d'adresse IP
 | |
| ##@cooked nocomments
 | |
| ##@require base
 | |
| uprovide ipcalc
 | |
| urequire base
 | |
| 
 | |
| function get_random_kvm_macaddr() {
 | |
|     # Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM
 | |
|     echo "52:54:00:$(awk 'BEGIN {srand(); printf("%02X:%02X:%02X", rand()*256, rand()*256, rand()*256)}' 2>/dev/null)"    
 | |
| }
 | |
| 
 | |
| function ipcalc_splitipmask() {
 | |
|     # Découper $1 de la forme ip[/mask] entre l'adresse ip, qui est placé dans
 | |
|     # la variable $2(=ip) et le masque, qui est placée dans la variable
 | |
|     # $3(=mask)
 | |
|     if [[ "$1" == */* ]]; then
 | |
|         set_var "${2:-ip}" "${1%%/*}"
 | |
|         set_var "${3:-mask}" "${1#*/}"
 | |
|     else
 | |
|         set_var "${2:-ip}" "$1"
 | |
|         set_var "${3:-mask}"
 | |
|     fi        
 | |
| }
 | |
| 
 | |
| function ipcalc_checkip() {
 | |
|     # Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est
 | |
|     # valide, l'afficher. Sinon, retourner 1
 | |
|     awkrun status=0 '{
 | |
|   # si l"adresse ne fait pas la taille voulue, rajouter des .0
 | |
|   ip = $0
 | |
|   gsub(/[^.]/, "", ip)
 | |
|   count = length(ip)
 | |
|   while (count < 3) {
 | |
|     $0 = $0 ".0"
 | |
|     count++
 | |
|   }
 | |
| 
 | |
|   # puis tester la validité
 | |
|   if ($0 !~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {
 | |
|     status = 1
 | |
|     exit
 | |
|   }
 | |
|   match($0, /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/, ps)
 | |
|   for (i = 1; i <= 4; i++) {
 | |
|     p = 0 + ps[i]
 | |
|     if (p > 255) {
 | |
|       status = 1
 | |
|       exit
 | |
|     }
 | |
|   }
 | |
|   print $0
 | |
| }
 | |
| END { exit status }' <<<"$1"
 | |
| }
 | |
| 
 | |
| function ipcalc_checkmask() {
 | |
|     # vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui,
 | |
|     # afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1
 | |
|     local mask="$1"
 | |
|     [ "$mask" == 0.0.0.0 ] && mask=0
 | |
|     [ "$mask" == 255.0.0.0 ] && mask=8
 | |
|     [ "$mask" == 255.255.0.0 ] && mask=16
 | |
|     [ "$mask" == 255.255.255.0 ] && mask=24
 | |
|     [ "$mask" == 255.255.255.255 ] && mask=32
 | |
|     [ "$mask" == 0 -o "$mask" == 8 -o "$mask" == 16 -o "$mask" == 24 -o "$mask" == 32 ] || return 1
 | |
|     echo "$mask"
 | |
| }
 | |
| 
 | |
| function ipcalc_broadcast() {
 | |
|     # Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque
 | |
|     # de sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
 | |
|     # /x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
 | |
|     # sont supportés.
 | |
|     # Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
 | |
|     # suffixe sont invalides ou non supportés.
 | |
|     [ -n "$1" ] || return
 | |
|     local ip mask
 | |
| 
 | |
|     ipcalc_splitipmask "$1" ip mask
 | |
|     [ -n "$mask" ] || mask="$2"
 | |
|     [ -n "$mask" ] || mask=24
 | |
| 
 | |
|     ip="$(ipcalc_checkip "$ip")" || return
 | |
|     mask="$(ipcalc_checkmask "$mask")" || return
 | |
| 
 | |
|     case "$mask" in
 | |
|     0) echo "255.255.255.255";;
 | |
|     8) ip="${ip%.*.*.*}"; echo "$ip.255.255.255";;
 | |
|     16) ip="${ip%.*.*}"; echo "$ip.255.255";;
 | |
|     24) ip="${ip%.*}"; echo "$ip.255";;
 | |
|     32) echo "$ip";;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function ipcalc_gateway() {
 | |
|     # Calculer l'adresse du gateway correspondant à l'adresse ip $1, en
 | |
|     # considérant que le gateway est la première adresse du réseau. Le masque de
 | |
|     # sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
 | |
|     # /x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
 | |
|     # sont supportés.
 | |
|     # Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
 | |
|     # suffixe sont invalides ou non supportés.
 | |
|     [ -n "$1" ] || return
 | |
|     local ip mask
 | |
| 
 | |
|     ipcalc_splitipmask "$1" ip mask
 | |
|     [ -n "$mask" ] || mask="$2"
 | |
|     [ -n "$mask" ] || mask=24
 | |
| 
 | |
|     ip="$(ipcalc_checkip "$ip")" || return
 | |
|     mask="$(ipcalc_checkmask "$mask")" || return
 | |
| 
 | |
|     case "$mask" in
 | |
|     0) echo "0.0.0.1";;
 | |
|     8) ip="${ip%.*.*.*}"; echo "$ip.0.0.1";;
 | |
|     16) ip="${ip%.*.*}"; echo "$ip.0.1";;
 | |
|     24) ip="${ip%.*}"; echo "$ip.1";;
 | |
|     32) echo "$ip";;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function ipcalc_match() {
 | |
|     # Vérifier si l'adresse $1 correspond au modèle $2, e.g.:
 | |
|     #     ipcalc_match 10.75.0.23 10/8         --> TRUE
 | |
|     #     ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE
 | |
|     #     ipcalc_match 10.75.0.23 10.75.0.28   --> FALSE 
 | |
|     [ -n "$1" -a -n "$2" ] || return
 | |
|     local ip tip tmask
 | |
| 
 | |
|     ipcalc_splitipmask "$2" tip tmask
 | |
|     [ -n "$tmask" ] || tmask=32
 | |
| 
 | |
|     ip="$(ipcalc_checkip "$1")" || return
 | |
|     tip="$(ipcalc_checkip "$tip")" || return
 | |
|     tmask="$(ipcalc_checkmask "$tmask")" || return
 | |
| 
 | |
|     case "$tmask" in
 | |
|     0) return 0;;
 | |
|     8) [ "${ip%.*.*.*}" == "${tip%.*.*.*}" ];;
 | |
|     16) [ "${ip%.*.*}" == "${tip%.*.*}" ];;
 | |
|     24) [ "${ip%.*}" == "${tip%.*}" ];;
 | |
|     32) [ "$ip" == "$tip" ];;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| 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é.
 | |
|     local -a ips hosts
 | |
|     local ip host
 | |
|     if ! ips=("$(ipcalc_checkip "$1")"); then
 | |
|         resolv_ips ips "$1"
 | |
|         if [ -z "${ips[*]}" ]; then
 | |
|             echo "$1"
 | |
|             return 1
 | |
|         fi
 | |
|     fi
 | |
|     for ip in "${ips[@]}"; do
 | |
|         resolv_hosts hosts "$ip"
 | |
|         if [ -n "${hosts[*]}" ]; then
 | |
|             echo "${hosts[0]}"
 | |
|             return 0
 | |
|         fi
 | |
|     done
 | |
|     echo "$1"
 | |
|     return 1
 | |
| }
 | |
| 
 |