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 }