My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# ----------------------------------------------------------------------------
# Calcula os endereços de rede e broadcast à partir do IP e máscara da rede.
# Obs.: Se não for especificado a máscara, é assumido a 255.255.255.0.
# Uso: zzcalculaip ip [netmask]
# Ex.: zzcalculaip 127.0.0.1 24
# zzcalculaip 10.0.0.0/8
# zzcalculaip 192.168.10.0 255.255.255.240
# zzcalculaip 10.10.10.0
#
# Autor: Thobias Salazar Trevisan, www.thobias.org
# Desde: 2005-09-01
# Licença: GPL
# Requisitos: zzconverte
# ----------------------------------------------------------------------------
zzcalculaip ()
{
zzzz -h calculaip "$1" && return

local endereco mascara rede broadcast
local mascara_binario mascara_decimal mascara_ip
local i ip1 ip2 ip3 ip4 nm1 nm2 nm3 nm4 componente

# Verificação dos parâmetros
[ $# -eq 0 -o $# -gt 2 ] && { zztool uso calculaip; return 1; }

# Obtém a máscara da rede (netmask)
if zztool grep_var / "$1"
then
endereco=${1%/*}
mascara="${1#*/}"
else
endereco=$1
mascara=${2:-24}
fi

# Verificações básicas
if ! (
zztool testa_ip $mascara || (
zztool testa_numero $mascara && test $mascara -le 32))
then
echo "Máscara inválida: $mascara"
return 1
fi
zztool -e testa_ip $endereco || return 1

# Guarda os componentes da máscara em $1, $2, ...
# Ou é um ou quatro componentes: 24 ou 255.255.255.0
set - $(echo $mascara | tr . ' ')

# Máscara no formato NN
if [ $# -eq 1 ]
then
# Converte de decimal para binário
# Coloca N números 1 grudados '1111111' (N=$1)
# e completa com zeros à direita até 32, com pontos:
# $1=12 vira 11111111.11110000.00000000.00000000
mascara=$(printf "%$1s" 1 | tr ' ' 1)
mascara=$(
printf '%-32s' $mascara |
tr ' ' 0 |
sed 's/./&./24 ; s/./&./16 ; s/./&./8'
)
fi

# Conversão de decimal para binário nos componentes do IP e netmask
for i in 1 2 3 4
do
componente=$(echo $endereco | cut -d'.' -f $i)
eval ip$i=$(printf '%08d' $(zzconverte db $componente))

componente=$(echo $mascara | cut -d'.' -f $i)
if [ "$2" ]
then
eval nm$i=$(printf '%08d' $(zzconverte db $componente))
else
eval nm$i=$componente
fi
done

# Uma verificação na máscara depois das conversões
mascara_binario=$nm1$nm2$nm3$nm4
if ! (
zztool testa_binario $mascara_binario &&
test ${#mascara_binario} -eq 32)
then
echo 'Máscara inválida'
return 1
fi

mascara_decimal=$(echo $mascara_binario | tr -d 0)
mascara_decimal=${#mascara_decimal}
mascara_ip=$((2#$nm1)).$((2#$nm2)).$((2#$nm3)).$((2#$nm4))

echo "End. IP : $endereco"
echo "Mascara : $mascara_ip = $mascara_decimal"

rede=$(( ((2#$ip1$ip2$ip3$ip4)) & ((2#$nm1$nm2$nm3$nm4)) ))
i=$(echo $nm1$nm2$nm3$nm4 | tr 01 10)
broadcast=$(($rede | ((2#$i)) ))

# Cálculo do endereço de rede
endereco=""
for i in 1 2 3 4
do
ip1=$((rede & 255))
rede=$((rede >> 8))
endereco="$ip1.$endereco"
done

echo "Rede : ${endereco%.} / $mascara_decimal"

# Cálculo do endereço de broadcast
endereco=''
for i in 1 2 3 4
do
ip1=$((broadcast & 255))
broadcast=$((broadcast >> 8))
endereco="$ip1.$endereco"
done
echo "Broadcast: ${endereco%.}"
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r706 by aureliojargas on Mar 29, 2012   Diff
lint: é desnecessário colocar $()
dentro de aspas.
r668 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis.
r529 by aureliojargas on May 23, 2011   Diff
zzcalculaip: Agora usando zztool -e na
verificação de número IP inválido.
Testador atualizado.
All revisions of this file

File info

Size: 3172 bytes, 121 lines
Powered by Google Project Hosting