Browse code

Merge "Remove python-netaddr requirement"

Jenkins authored on 2013/07/25 20:10:40
Showing 2 changed files
... ...
@@ -18,15 +18,38 @@ XTRACE=$(set +o | grep xtrace)
18 18
 set +o xtrace
19 19
 
20 20
 
21
-# Exit 0 if address is in network or 1 if address is not in
22
-# network or netaddr library is not installed.
21
+# Convert CIDR notation to a IPv4 netmask
22
+# cidr2netmask cidr-bits
23
+function cidr2netmask() {
24
+    local maskpat="255 255 255 255"
25
+    local maskdgt="254 252 248 240 224 192 128"
26
+    set -- ${maskpat:0:$(( ($1 / 8) * 4 ))}${maskdgt:$(( (7 - ($1 % 8)) * 4 )):3}
27
+    echo ${1-0}.${2-0}.${3-0}.${4-0}
28
+}
29
+
30
+
31
+# Return the network portion of the given IP address using netmask
32
+# netmask is in the traditional dotted-quad format
33
+# maskip ip-address netmask
34
+function maskip() {
35
+    local ip=$1
36
+    local mask=$2
37
+    local l="${ip%.*}"; local r="${ip#*.}"; local n="${mask%.*}"; local m="${mask#*.}"
38
+    local subnet=$((${ip%%.*}&${mask%%.*})).$((${r%%.*}&${m%%.*})).$((${l##*.}&${n##*.})).$((${ip##*.}&${mask##*.}))
39
+    echo $subnet
40
+}
41
+
42
+
43
+# Exit 0 if address is in network or 1 if address is not in network
44
+# ip-range is in CIDR notation: 1.2.3.4/20
23 45
 # address_in_net ip-address ip-range
24 46
 function address_in_net() {
25
-    python -c "
26
-import netaddr
27
-import sys
28
-sys.exit(netaddr.IPAddress('$1') not in netaddr.IPNetwork('$2'))
29
-"
47
+    local ip=$1
48
+    local range=$2
49
+    local masklen=${range#*/}
50
+    local network=$(maskip ${range%/*} $(cidr2netmask $masklen))
51
+    local subnet=$(maskip $ip $(cidr2netmask $masklen))
52
+    [[ $network == $subnet ]]
30 53
 }
31 54
 
32 55
 
33 56
new file mode 100755
... ...
@@ -0,0 +1,118 @@
0
+#!/usr/bin/env bash
1
+
2
+# Tests for DevStack functions
3
+# address_in_net()
4
+
5
+TOP=$(cd $(dirname "$0")/.. && pwd)
6
+
7
+# Import common functions
8
+source $TOP/functions
9
+
10
+# Import configuration
11
+source $TOP/openrc
12
+
13
+
14
+echo "Testing IP addr functions"
15
+
16
+if [[ $(cidr2netmask 4) == 240.0.0.0 ]]; then
17
+    echo "cidr2netmask(): /4...OK"
18
+else
19
+    echo "cidr2netmask(): /4...failed"
20
+fi
21
+if [[ $(cidr2netmask 8) == 255.0.0.0 ]]; then
22
+    echo "cidr2netmask(): /8...OK"
23
+else
24
+    echo "cidr2netmask(): /8...failed"
25
+fi
26
+if [[ $(cidr2netmask 12) == 255.240.0.0 ]]; then
27
+    echo "cidr2netmask(): /12...OK"
28
+else
29
+    echo "cidr2netmask(): /12...failed"
30
+fi
31
+if [[ $(cidr2netmask 16) == 255.255.0.0 ]]; then
32
+    echo "cidr2netmask(): /16...OK"
33
+else
34
+    echo "cidr2netmask(): /16...failed"
35
+fi
36
+if [[ $(cidr2netmask 20) == 255.255.240.0 ]]; then
37
+    echo "cidr2netmask(): /20...OK"
38
+else
39
+    echo "cidr2netmask(): /20...failed"
40
+fi
41
+if [[ $(cidr2netmask 24) == 255.255.255.0 ]]; then
42
+    echo "cidr2netmask(): /24...OK"
43
+else
44
+    echo "cidr2netmask(): /24...failed"
45
+fi
46
+if [[ $(cidr2netmask 28) == 255.255.255.240 ]]; then
47
+    echo "cidr2netmask(): /28...OK"
48
+else
49
+    echo "cidr2netmask(): /28...failed"
50
+fi
51
+if [[ $(cidr2netmask 30) == 255.255.255.252 ]]; then
52
+    echo "cidr2netmask(): /30...OK"
53
+else
54
+    echo "cidr2netmask(): /30...failed"
55
+fi
56
+if [[ $(cidr2netmask 32) == 255.255.255.255 ]]; then
57
+    echo "cidr2netmask(): /32...OK"
58
+else
59
+    echo "cidr2netmask(): /32...failed"
60
+fi
61
+
62
+if [[ $(maskip 169.254.169.254 240.0.0.0) == 160.0.0.0 ]]; then
63
+    echo "maskip(): /4...OK"
64
+else
65
+    echo "maskip(): /4...failed"
66
+fi
67
+if [[ $(maskip 169.254.169.254 255.0.0.0) == 169.0.0.0 ]]; then
68
+    echo "maskip(): /8...OK"
69
+else
70
+    echo "maskip(): /8...failed"
71
+fi
72
+if [[ $(maskip 169.254.169.254 255.240.0.0) == 169.240.0.0 ]]; then
73
+    echo "maskip(): /12...OK"
74
+else
75
+    echo "maskip(): /12...failed"
76
+fi
77
+if [[ $(maskip 169.254.169.254 255.255.0.0) == 169.254.0.0 ]]; then
78
+    echo "maskip(): /16...OK"
79
+else
80
+    echo "maskip(): /16...failed"
81
+fi
82
+if [[ $(maskip 169.254.169.254 255.255.240.0) == 169.254.160.0 ]]; then
83
+    echo "maskip(): /20...OK"
84
+else
85
+    echo "maskip(): /20...failed"
86
+fi
87
+if [[ $(maskip 169.254.169.254 255.255.255.0) == 169.254.169.0 ]]; then
88
+    echo "maskip(): /24...OK"
89
+else
90
+    echo "maskip(): /24...failed"
91
+fi
92
+if [[ $(maskip 169.254.169.254 255.255.255.240) == 169.254.169.240 ]]; then
93
+    echo "maskip(): /28...OK"
94
+else
95
+    echo "maskip(): /28...failed"
96
+fi
97
+if [[ $(maskip 169.254.169.254 255.255.255.255) == 169.254.169.254 ]]; then
98
+    echo "maskip(): /32...OK"
99
+else
100
+    echo "maskip(): /32...failed"
101
+fi
102
+
103
+for mask in 8 12 16 20 24 26 28; do
104
+    echo -n "address_in_net(): in /$mask..."
105
+    if address_in_net 10.10.10.1 10.10.10.0/$mask; then
106
+        echo "OK"
107
+    else
108
+        echo "address_in_net() failed on /$mask"
109
+    fi
110
+
111
+    echo -n "address_in_net(): not in /$mask..."
112
+    if ! address_in_net 10.10.10.1 11.11.11.0/$mask; then
113
+        echo "OK"
114
+    else
115
+        echo "address_in_net() failed on /$mask"
116
+    fi
117
+done