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
|
|
|
|
}
|