Files
prefixgen/main.go
2025-07-26 20:10:32 +02:00

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