common/network/range.go

47 lines
1.1 KiB
Go

package network
import ipa "inet.af/netaddr"
// IterateNetRange will ingest either a netaddr range or a netaddr prefix from the inet.af/netaddr package;
// returning a channel that will stream all the individual netaddr IPs within the given range or prefix.
// Alternatively, feed it a string in prefix or range format. (192.168.69.0/24) (192.168.69.0-192.168.69.254)
// Will return nil value if input is invalid.
func IterateNetRange(ips interface{}) chan *ipa.IP {
var addrs ipa.IPRange
switch ips.(type) {
case string:
strefix, prefixErr := ipa.ParseIPPrefix(ips.(string))
strange, rangeErr := ipa.ParseIPRange(ips.(string))
switch {
case rangeErr == nil:
addrs = strange
case prefixErr == nil:
addrs = strefix.Range()
default:
return nil
}
case ipa.IPRange:
addrs = ips.(ipa.IPRange)
case ipa.IPPrefix:
addrs = ips.(ipa.IPPrefix).Range()
default:
return nil
}
ch := make(chan *ipa.IP)
go func(ret chan *ipa.IP) {
var head ipa.IP
head = addrs.From()
end := addrs.To()
for head != end {
if !head.IsUnspecified() {
ret <- &head
}
head = head.Next()
}
close(ret)
}(ch)
return ch
}