common/network/range.go

47 lines
1.1 KiB
Go
Raw Normal View History

2022-02-13 02:14:54 +00:00
package network
2022-01-01 21:39:27 +00:00
import ipa "inet.af/netaddr"
2022-03-12 05:56:07 +00:00
// 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.
2022-02-13 02:14:54 +00:00
func IterateNetRange(ips interface{}) chan *ipa.IP {
2022-01-01 21:39:27 +00:00
var addrs ipa.IPRange
switch ips.(type) {
2022-03-12 05:56:07 +00:00
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
}
2022-01-01 21:39:27 +00:00
case ipa.IPRange:
addrs = ips.(ipa.IPRange)
case ipa.IPPrefix:
addrs = ips.(ipa.IPPrefix).Range()
2022-03-12 05:56:07 +00:00
default:
return nil
2022-01-01 21:39:27 +00:00
}
ch := make(chan *ipa.IP)
2022-03-12 05:56:07 +00:00
go func(ret chan *ipa.IP) {
2022-01-01 21:39:27 +00:00
var head ipa.IP
head = addrs.From()
end := addrs.To()
for head != end {
if !head.IsUnspecified() {
2022-03-12 05:56:07 +00:00
ret <- &head
2022-01-01 21:39:27 +00:00
}
head = head.Next()
}
2022-03-12 05:56:07 +00:00
close(ret)
}(ch)
2022-01-01 21:39:27 +00:00
return ch
}