golcg- Unnamed repository; edit this file 'description' to name the repository. |
git clone git://git.acid.vegas/-c.git |
Log | Files | Refs | Archive | README | LICENSE |
main.go (1922B)
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "strconv" 8 "strings" 9 10 "github.com/acidvegas/golcg" 11 ) 12 13 const Version = "1.0.0" 14 15 func parseShardArg(shard string) (int, int, error) { 16 if shard == "" { 17 return 1, 1, nil 18 } 19 20 parts := strings.Split(shard, "/") 21 if len(parts) != 2 { 22 return 0, 0, fmt.Errorf("invalid shard format. Expected INDEX/TOTAL, got %s", shard) 23 } 24 25 index, err := strconv.Atoi(parts[0]) 26 if err != nil { 27 return 0, 0, fmt.Errorf("invalid shard index: %v", err) 28 } 29 30 total, err := strconv.Atoi(parts[1]) 31 if err != nil { 32 return 0, 0, fmt.Errorf("invalid shard total: %v", err) 33 } 34 35 if index < 1 || index > total { 36 return 0, 0, fmt.Errorf("shard index must be between 1 and total") 37 } 38 39 if total < 1 { 40 return 0, 0, fmt.Errorf("total shards must be greater than 0") 41 } 42 43 return index, total, nil 44 } 45 46 func main() { 47 cidr := flag.String("cidr", "", "Target IP range in CIDR format") 48 shard := flag.String("shard", "", "Shard specification in INDEX/TOTAL format (e.g., 1/4)") 49 seed := flag.Int("seed", 0, "Random seed for LCG") 50 stateStr := flag.String("state", "", "Resume from specific LCG state") 51 version := flag.Bool("version", false, "Show version information") 52 flag.Parse() 53 54 if *version { 55 fmt.Printf("golcg version %s\n", Version) 56 os.Exit(0) 57 } 58 59 if *cidr == "" { 60 fmt.Println("Error: CIDR is required") 61 flag.Usage() 62 os.Exit(1) 63 } 64 65 shardNum, totalShards, err := parseShardArg(*shard) 66 if err != nil { 67 fmt.Printf("Error: %v\n", err) 68 os.Exit(1) 69 } 70 71 var state *uint32 72 if *stateStr != "" { 73 stateVal, err := strconv.ParseUint(*stateStr, 10, 32) 74 if err != nil { 75 fmt.Printf("Error parsing state: %v\n", err) 76 os.Exit(1) 77 } 78 stateUint32 := uint32(stateVal) 79 state = &stateUint32 80 } 81 82 stream, err := golcg.IPStream(*cidr, shardNum, totalShards, *seed, state) 83 if err != nil { 84 fmt.Printf("Error: %v\n", err) 85 os.Exit(1) 86 } 87 88 for ip := range stream { 89 fmt.Println(ip) 90 } 91 }