Mainly redefine or reused what Terraform did. * allow to used `variables`, `variable` and `local` blocks * import the following functions and their docs from Terraform: abs, abspath, basename, base64decode, base64encode, bcrypt, can, ceil, chomp, chunklist, cidrhost, cidrnetmask, cidrsubnet, cidrsubnets, coalesce, coalescelist, compact, concat, contains, convert, csvdecode, dirname, distinct, element, file, fileexists, fileset, flatten, floor, format, formatdate, formatlist, indent, index, join, jsondecode, jsonencode, keys, length, log, lookup, lower, max, md5, merge, min, parseint, pathexpand, pow, range, reverse, rsadecrypt, setintersection, setproduct, setunion, sha1, sha256, sha512, signum, slice, sort, split, strrev, substr, timestamp, timeadd, title, trim, trimprefix, trimspace, trimsuffix, try, upper, urlencode, uuidv4, uuidv5, values, yamldecode, yamlencode, zipmap.
38 lines
852 B
Go
38 lines
852 B
Go
package cidr
|
|
|
|
import (
|
|
"fmt"
|
|
"math/big"
|
|
"net"
|
|
)
|
|
|
|
func ipToInt(ip net.IP) (*big.Int, int) {
|
|
val := &big.Int{}
|
|
val.SetBytes([]byte(ip))
|
|
if len(ip) == net.IPv4len {
|
|
return val, 32
|
|
} else if len(ip) == net.IPv6len {
|
|
return val, 128
|
|
} else {
|
|
panic(fmt.Errorf("Unsupported address length %d", len(ip)))
|
|
}
|
|
}
|
|
|
|
func intToIP(ipInt *big.Int, bits int) net.IP {
|
|
ipBytes := ipInt.Bytes()
|
|
ret := make([]byte, bits/8)
|
|
// Pack our IP bytes into the end of the return array,
|
|
// since big.Int.Bytes() removes front zero padding.
|
|
for i := 1; i <= len(ipBytes); i++ {
|
|
ret[len(ret)-i] = ipBytes[len(ipBytes)-i]
|
|
}
|
|
return net.IP(ret)
|
|
}
|
|
|
|
func insertNumIntoIP(ip net.IP, bigNum *big.Int, prefixLen int) net.IP {
|
|
ipInt, totalBits := ipToInt(ip)
|
|
bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
|
|
ipInt.Or(ipInt, bigNum)
|
|
return intToIP(ipInt, totalBits)
|
|
}
|