Remove python-netaddr as a DevStack (stack.sh) requirement,
this does not change any individual project requirements.
Specifically it replaces address_in_net() and adds cidr2netmask()
and maskip() functions.
Change-Id: Ic604437fde2e057faced40a310ab282f3eb27726
| ... | ... |
@@ -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 |