92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"flag"
|
|
"fmt"
|
|
"math/big"
|
|
"net"
|
|
"os"
|
|
)
|
|
|
|
func randomIPv6Prefix(minlen, maxlen int) string {
|
|
randBytes := make([]byte, 16)
|
|
_, err := rand.Read(randBytes)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
ip := net.IP(randBytes)
|
|
plen := minlen
|
|
if maxlen > minlen {
|
|
m, _ := rand.Int(rand.Reader, big.NewInt(int64(maxlen-minlen+1)))
|
|
plen = minlen + int(m.Int64())
|
|
}
|
|
mask := net.CIDRMask(plen, 128)
|
|
return fmt.Sprintf("%s/%d", ip.Mask(mask).String(), plen)
|
|
}
|
|
|
|
func randomIPv4Prefix(minlen, maxlen int) string {
|
|
randBytes := make([]byte, 4)
|
|
_, err := rand.Read(randBytes)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
ip := net.IPv4(randBytes[0], randBytes[1], randBytes[2], randBytes[3])
|
|
plen := minlen
|
|
if maxlen > minlen {
|
|
m, _ := rand.Int(rand.Reader, big.NewInt(int64(maxlen-minlen+1)))
|
|
plen = minlen + int(m.Int64())
|
|
}
|
|
mask := net.CIDRMask(plen, 32)
|
|
return fmt.Sprintf("%s/%d", ip.Mask(mask).String(), plen)
|
|
}
|
|
|
|
func main() {
|
|
var v6 bool
|
|
var v4 bool
|
|
var minlen int
|
|
var maxlen int
|
|
var count int
|
|
|
|
flag.BoolVar(&v6, "v6", false, "Generate IPv6 prefixes (default)")
|
|
flag.BoolVar(&v6, "ipv6", false, "Generate IPv6 prefixes (default)")
|
|
flag.BoolVar(&v4, "v4", false, "Generate IPv4 prefixes")
|
|
flag.BoolVar(&v4, "ipv4", false, "Generate IPv4 prefixes")
|
|
flag.IntVar(&minlen, "minlen", 48, "Minimum prefix length")
|
|
flag.IntVar(&maxlen, "maxlen", 48, "Maximum prefix length")
|
|
flag.IntVar(&count, "count", 5, "Number of prefixes to generate")
|
|
flag.Parse()
|
|
|
|
if !v4 && !v6 {
|
|
v6 = true // Default to v6
|
|
}
|
|
|
|
if minlen > maxlen || minlen < 1 || maxlen > 128 {
|
|
fmt.Fprintf(os.Stderr, "Invalid minlen/maxlen values\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
if v4 && maxlen > 32 {
|
|
fmt.Fprintf(os.Stderr, "For IPv4, maximum prefix length cannot exceed 32\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
if v6 && maxlen > 128 {
|
|
fmt.Fprintf(os.Stderr, "For IPv6, maximum prefix length cannot exceed 128\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
if count < 1 {
|
|
fmt.Fprintf(os.Stderr, "Count must be >= 1\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
for i := 0; i < count; i++ {
|
|
if v6 {
|
|
fmt.Println(randomIPv6Prefix(minlen, maxlen))
|
|
} else {
|
|
fmt.Println(randomIPv4Prefix(minlen, maxlen))
|
|
}
|
|
}
|
|
}
|