From 4cbb17bf9e710bd992cc065afc9da55ae596df0a Mon Sep 17 00:00:00 2001 From: brent saner Date: Sat, 8 Nov 2025 23:33:21 -0500 Subject: [PATCH] v0.3.0 * Default is now previous single-verbosity level; it was too annoying to add the -v every time. ** -q/--quiet has been added to return to the previous default output --- .githooks/pre-commit/01-docgen | 23 ++ .githooks/pre-commit/02-gofmt | 15 + ACKNOWLEDGEMENTS | 8 - README.adoc | 17 +- README.html | 661 +++++++++++++++++++++++++++++++ TODO | 10 +- cmd/subnetter/args.go | 3 +- cmd/subnetter/funcs.go | 45 ++- go.mod | 24 +- go.sum | 22 + netsplit/{conts.go => consts.go} | 0 11 files changed, 792 insertions(+), 36 deletions(-) create mode 100755 .githooks/pre-commit/01-docgen create mode 100755 .githooks/pre-commit/02-gofmt delete mode 100644 ACKNOWLEDGEMENTS create mode 100644 README.html rename netsplit/{conts.go => consts.go} (100%) diff --git a/.githooks/pre-commit/01-docgen b/.githooks/pre-commit/01-docgen new file mode 100755 index 0000000..dd14a4e --- /dev/null +++ b/.githooks/pre-commit/01-docgen @@ -0,0 +1,23 @@ +#!/bin/bash + +#docsdir="${PWD}/docs" +docsdir="${PWD}" + +if ! command -v asciidoctor &> /dev/null; +then + exit 0 +fi + +mkdir -p "${docsdir}" + +for f in $(find . -maxdepth 1 -type f -iname "*.adoc"); do + filename=$(basename -- "${f}") + nosuffix="${filename%.*}" + + asciidoctor \ + -a allow-uri-read \ + -o "${docsdir}/${nosuffix}.html" \ + "${f}" + git add "${docsdir}/${nosuffix}.html" +done +echo "Regenerated docs" diff --git a/.githooks/pre-commit/02-gofmt b/.githooks/pre-commit/02-gofmt new file mode 100755 index 0000000..161d7f7 --- /dev/null +++ b/.githooks/pre-commit/02-gofmt @@ -0,0 +1,15 @@ +#!/bin/bash + +srcdir="${PWD}/examples" + +if ! command -v gofmt &> /dev/null; +then + exit 0 +fi + +for f in $(find ${srcdir} -type f -iname "*.go"); +do + gofmt -w "${f}" + git add "${f}" +done +echo "Reformatted examples" diff --git a/ACKNOWLEDGEMENTS b/ACKNOWLEDGEMENTS deleted file mode 100644 index 101462d..0000000 --- a/ACKNOWLEDGEMENTS +++ /dev/null @@ -1,8 +0,0 @@ -The "IPv6 Segment Reference Diagram" output as rendered in the `table` -subcommand is from: - https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing -as fetched on April 07, 2025. -It is licensed under Creative Commons "CC BY-SA 4.0"; -see: - https://creativecommons.org/licenses/by-sa/4.0/ - https://creativecommons.org/licenses/by-sa/4.0/legalcode.en) diff --git a/README.adoc b/README.adoc index fdd5bc4..a04eade 100644 --- a/README.adoc +++ b/README.adoc @@ -56,10 +56,25 @@ A tool to assist in design of segregate/segment/split/subnet networks. [id="ref"] == References + +[TIP] +==== +See also the <> section for specific material used directly. +==== + This program in general draws inspiration from `ipcalc` (http://jodies.de/ipcalc[0^], https://github.com/kjokjo/ipcalc[1^], https://gitlab.com/ipcalc/ipcalc[2^]) and http://www.routemeister.net/projects/sipcalc/[`sipcalc`^]. The `table` subcommand is inspired by `iptab` from https://metacpan.org/pod/Net::IP[Perl Net-IP^]. Additional notes for certain contexts are primarily taken from https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing[the Wikipedia article on _Classless Inter-Domain Routing_^] (as of _Jan 28, 2025_). -Reservations are pulled/cached directly from the IANA registries (https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml[IPv4^], https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml[IPv6^]). \ No newline at end of file +Reservations are pulled/cached directly from the IANA registries (https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml[IPv4^], https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml[IPv6^]). + +[id="ack"] +== Acknowledgements + +[id="ack_segrefdiag"] +=== IPv6 Segment Reference Diagram +The _IPv6 Segment Reference Diagram_ default output as rendered from the `table` subcommand is generally from https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing as fetched on April 07, 2025. + +It is licensed under https://creativecommons.org/licenses/by-sa/4.0/[Creative Commons CC BY-SA 4.0^] (https://creativecommons.org/licenses/by-sa/4.0/legalcode.en[full license^]). diff --git a/README.html b/README.html new file mode 100644 index 0000000..a0762e0 --- /dev/null +++ b/README.html @@ -0,0 +1,661 @@ + + + + + + + + +Subnetter + + + + + +
+
+

1. What is it?

+
+
+

A tool to assist in design of segregate/segment/split/subnet networks.

+
+
+
+
+

2. Output

+
+
+
    +
  • +

    PTP refers to "Peer-to-Peer" (e.g. RFC 3021).

    +
  • +
  • +

    6rd refers to "IPv6 Rapid Deployment", a derivation of 6to4 (RFC 5569, RFC 5969).

    +
  • +
  • +

    LIR refers to "Local Internet Registry" (ARIN).

    +
  • +
  • +

    RIR refers to "Regional Internet Registry" (ARIN).

    +
  • +
  • +

    Unicast refers to "Global Unicast" (RFC 1122, RFC 4291 § 2.5.4, RFC 4632).

    +
    +
      +
    • +

      For IPv6 addresses, it will be true for ULA (Unique Local Addresses) (RFC 4193) also.

      +
    • +
    • +

      For IPv4 addresses, it will be true if the address is routable by external hosts (a unicast address), including private IP addresses (RFC 1918).

      +
    • +
    +
    +
  • +
  • +

    ILM refers to "Interface-Local Multicast" (RFC 4291 § 2.7, RFC 7346).

    +
    +
      +
    • +

      It will always be false for IPv4 addresses.

      +
    • +
    +
    +
  • +
  • +

    LLM refers to "Link-Local Multicast" (RFC 4291 § 2.7, RFC 7346).

    +
    +
      +
    • +

      For IPv4 addresses, it will be true if it is in the 224.0.0.0/4 range (RFC 5735).

      +
    • +
    +
    +
  • +
  • +

    LLU refers to "Link-Local Unicast" (RFC 4291 § 2.7, RFC 7346).

    +
    +
      +
    • +

      For IPv4 addresses, it will be true if it is an APIPA (Automatic Private IP Addressing) address (RFC 3927) (in the 169.254.0.0/16 range).

      +
    • +
    +
    +
  • +
  • +

    First and Last refer to the first and last "usable" ("host"/assignable) addresses in a subnet/network.

    +
    +
      +
    • +

      Note that for IPv6, the first address (x::) in a subnet may or may not be assignable/"usable". If it is assigned to a device, that device must be a router for anycast. See RFC 4291 § 2.6.1 for details. In the interest of convenience, subnetter will report this address as not usable/addressable in ranges for this reason as it is technically not a "host" address.

      +
    • +
    • +

      Note that for IPv6, some subnetting calculators erroneously report the last address as usable. They are reserved in strictly RFC-compliant networks for anycast reasons (per RFC 2526). Subnetter follows RFC as closely as possible, and any deviation from RFC is considered a bug — as such, the last address of IPv6 subnets is considered not usable/addressable.

      +
    • +
    • +

      There are additional restrictions for /64 subnets, but they fall earlier in the range. These are not explicitly excluded in the usable host range, nor are they excluded from the total host count.

      +
    • +
    +
    +
  • +
  • +

    Private networks (RFC 1918), ULA prefixes (RFC 4193), and documentation prefixes (RFC 3849, RFC 5737, RFC 9637) are treated as "normal" networks (in that it is allowed to subnet them).

    +
  • +
  • +

    Various other reserved IPv4 and IPv6 addresses/networks will print warnings with their corresponding RFC(s) (unless -R/--allow-reserved is specified) if they are specified as/included in the initial prefix/network. (RFC 6890 and its update via RFC 8190 are useful summaries.) Note that for checking to function, an Internet connection is required as it pulls it directly from IANA live to ensure the data is accurate to standards. This may be cached locally if -c/--cache-reservations is specified, in which case a locally-cached copy will be used if present and populated then used if not.

    +
    +
      +
    • +

      The cache directory may be specified by -C/--cache-dir (which can be specifically defaulted via the SBNTR_RSVCACHE_DIR environment variable). If it is not specified, the default (see below) will be used.

      +
    • +
    • +

      This directory’s default location determined by the following, and will be created if it doesn’t exist:

      +
      +
        +
      • +

        For non-Windows systems (macOS, Linux, etc.)…​

        +
        +
          +
        • +

          If the XDG_CACHE_HOME environment variable is present, it will be ${XDG_CACHE_HOME}/subnetter/. (If XDG base dirs are enabled, this is usually ~/.cache/subnetter/ or, explicitly, /home/<username>/.cache/subnetter/)

          +
        • +
        • +

          If the XDG_CACHE_HOME environment variable is not present…​

          +
          +
            +
          • +

            On macOS, an explicit fallback of ~/Library/Caches/subnetter/ will be used. (To my knowledge/understanding, this is the standard user cache directory and cannot be changed.) This usually evaluates to /Users/<username>/Library/Caches/subnetter/.

            +
          • +
          • +

            On all others, an explicit fallback of ~/.cache/subnetter will be used.

            +
            +
              +
            • +

              On most non-macOS/*NIX-like systems , this is usually /home/<username>/.cache/subetter/, provided normal user homes. On Plan9 platforms (e.g. Plan 9 4th Ed., 9front, 9legacy), the /env/home environment variable ($home) will be used, the ./lib/ subdirectory under there (which typically/should already exist) will be appended to it, and that appended with ./cache/subnetter/ (this usually evaluates to /usr/<username>/lib/cache/subnetter/).

              +
            • +
            +
            +
          • +
          +
          +
        • +
        +
        +
      • +
      • +

        For Windows systems…​

        +
        +
          +
        • +

          If the LOCALAPPDATA environment variable is present, it will be %LOCALAPPDATA%\Cache\subnetter\ (or ${env:LOCALAPPDATA}\Cache\subnetter\ in Powershell syntax). This usually evaluates to C:\Users\<username>\AppData\Local\Cache\subnetter\.

          +
        • +
        +
        +
      • +
      +
      +
    • +
    +
    +
  • +
+
+
+
+
+

3. References

+
+
+ + + + + +
+
Tip
+
+
+

See also the Acknowledgements section for specific material used directly.

+
+
+
+
+

This program in general draws inspiration from ipcalc (0, 1, 2) and sipcalc.

+
+
+

The table subcommand is inspired by iptab from Perl Net-IP.

+
+
+

Additional notes for certain contexts are primarily taken from the Wikipedia article on Classless Inter-Domain Routing (as of Jan 28, 2025).

+
+
+

Reservations are pulled/cached directly from the IANA registries (IPv4, IPv6).

+
+
+
+
+

4. Acknowledgements

+
+
+

4.1. IPv6 Segment Reference Diagram

+
+

The IPv6 Segment Reference Diagram default output as rendered from the table subcommand is generally from https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing as fetched on April 07, 2025.

+
+
+

It is licensed under Creative Commons CC BY-SA 4.0 (full license).

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/TODO b/TODO index 1494721..5629af3 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,13 @@ -- add table rendering for reserved networks? +- add table rendering for reserved networks +-- note that the IANA doesn't seem to include all? e.g. ff02:: etc. +-- ... that's because it's in a different registry: + https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml + https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml + see https://www.iana.org/numbers "IP Address Allocations" section - when checking/rendering reserved networks, currently the footnotes aren't returned. -- netsplit.IANARegistryFootnote -- encapsulated in the IANARegistry.Footnotes -- add new interface, Getter? different formatting? \ No newline at end of file +- add new interface, Getter? different formatting? +-- (i forget what this was for. carving a smaller subnet out of a subnet?) diff --git a/cmd/subnetter/args.go b/cmd/subnetter/args.go index dd70978..48ce110 100644 --- a/cmd/subnetter/args.go +++ b/cmd/subnetter/args.go @@ -25,7 +25,8 @@ type commonBase struct { Plain bool `short:"p" long:"plain" description:"Show plain output instead of unicode (only used if -f/--format=pretty)."` Separator string `short:"S" long:"separator" default:"\n" description:"Separator between addresses; only used for -f/--format=pretty with no verbosity."` Fmt string `short:"f" long:"format" choice:"json" choice:"pretty" choice:"yml" choice:"xml" default:"pretty" description:"Output format. 'pretty' is not intended to be parseable, either by subnetter or by external tooling."` - Verbose []bool `short:"v" long:"verbose" description:"Show verbose information if -f/--format=pretty. May be specified multiple times to increase verbosity (up to 3 levels)."` + Verbose []bool `short:"v" long:"verbose" description:"Show verbose (even more) information if -f/--format=pretty. May be specified multiple times to increase verbosity (up to 2 levels)."` + Quiet bool `short:"q" long:"quiet" description:"The opposite of -v/--verbose (if -f/--format=pretty). Overrides any/all verbosity and instead produces a much more simple newline-separated output that may be easier for e.g. shell script to parse."` AllowReserved bool `short:"R" long:"allow-reserved" description:"If specified, do not warn about reserved IP addresses/networks."` reservedArgs AllowHostNet bool `short:"H" long:"allow-host" description:"If specified, do not warn about host bits. Host bits are always removed for subnetting (as otherwise there would be errors); this is only used only for output."` diff --git a/cmd/subnetter/funcs.go b/cmd/subnetter/funcs.go index 5f54a83..57650b8 100644 --- a/cmd/subnetter/funcs.go +++ b/cmd/subnetter/funcs.go @@ -104,6 +104,8 @@ func printMask(label string, pfx netip.Prefix, verb, indent int, indentStr strin var mask net.IPMask var first netip.Addr var last netip.Addr + var firstUsable netip.Addr + var lastUsable netip.Addr var sb = new(strings.Builder) var pre = strings.Repeat(indentStr, indent) var pre2 = strings.Repeat(indentStr, indent+1) @@ -118,17 +120,23 @@ func printMask(label string, pfx netip.Prefix, verb, indent int, indentStr strin maskF = "d" maskSep = "." maskEvery = 1 - // IPv4 *always* reserves last addr for broadcast UNLESS it's a /31 (or /32). RFC 919, RFC 1770, RFC 5735. + // IPv4 *always* reserves lastUsable addr for broadcast UNLESS it's a /31 (or /32). RFC 919, RFC 1770, RFC 5735. switch pfx.Bits() { case 32: // Host first = pfx.Masked().Addr() last = pfx.Masked().Addr() + firstUsable = first + lastUsable = last case 31: // Point-to-Point first = pfx.Masked().Addr() last = pfx.Masked().Addr().Next() + firstUsable = first + lastUsable = last default: // RFC 919, RFC 5735 - first = pfx.Masked().Addr().Next() - last = netipx.PrefixLastIP(pfx.Masked()).Prev() + first = pfx.Masked().Addr() + last = netipx.PrefixLastIP(pfx.Masked()) + firstUsable = first.Next() + lastUsable = last.Prev() } } else { maskF = "02x" @@ -138,16 +146,24 @@ func printMask(label string, pfx netip.Prefix, verb, indent int, indentStr strin case 128: // Host/Loopback first = pfx.Masked().Addr() last = pfx.Masked().Addr() + firstUsable = first + lastUsable = last case 127: // Point-to-Point first = pfx.Masked().Addr() last = pfx.Masked().Addr().Next() + firstUsable = first + lastUsable = last case 64: - first = pfx.Masked().Addr().Next() + first = pfx.Masked().Addr() + firstUsable = first.Next() // IPv6 only reserves the last address (for EUI-64 reasons) for /64's. - last = netipx.PrefixLastIP(pfx.Masked()).Prev() + last = netipx.PrefixLastIP(pfx.Masked()) + lastUsable = last.Prev() default: first = pfx.Masked().Addr() + firstUsable = first last = netipx.PrefixLastIP(pfx.Masked()) + lastUsable = last } } @@ -158,6 +174,8 @@ func printMask(label string, pfx netip.Prefix, verb, indent int, indentStr strin fmt.Fprintf(sb, "%sBits:\t\t%d\n", pre2, pfx.Bits()) fmt.Fprintf(sb, "%sFirst:\t\t%s\n", pre2, first.String()) fmt.Fprintf(sb, "%sLast:\t\t%s\n", pre2, last.String()) + fmt.Fprintf(sb, "%sFirst Usable:\t%s\n", pre2, firstUsable.String()) + fmt.Fprintf(sb, "%sLast Usable:\t%s\n", pre2, lastUsable.String()) fmt.Fprintf(sb, "%sAddresses:\t%d\n", pre2, netsplit.NumAddrsPfx(pfx.Masked(), true, true)) fmt.Fprintf(sb, "%sHosts:\t\t%d\n", pre2, netsplit.NumAddrsPfx(pfx.Masked(), false, false)) if verb >= 2 { @@ -211,23 +229,23 @@ func printMask(label string, pfx netip.Prefix, verb, indent int, indentStr strin func printNets(orig *netip.Prefix, origNet *net.IPNet, nets []*netip.Prefix, remaining *netipx.IPSet, args *common, splitter netsplit.NetSplitter) (err error) { var b []byte + var resIdx int var netsLen uint var remLen uint var buf *bytes.Buffer var masked netip.Prefix var remPfxs []*netip.Prefix var invertedMask net.IPMask - var resIdx int var resPfx netip.Prefix var resRec *netsplit.IANAAddrNetResRecord var reservedList []*netip.Prefix var reserved map[netip.Prefix]*netsplit.IANAAddrNetResRecord var res *netsplit.StructuredResults - var verb = -1 var fmts []string var sectSep1 string var sectSep2 string // var sectSep3 string + var verb int = 1 if orig == nil { return @@ -245,11 +263,14 @@ func printNets(orig *netip.Prefix, origNet *net.IPNet, nets []*netip.Prefix, rem sectSep2 = fmts[1] // sectSep3 = fmts[2] - if args.Verbose != nil { - verb = 0 - for _, i := range args.Verbose { - if i { - verb++ + if args.Quiet { + verb-- + } else { + if args.Verbose != nil { + for _, i := range args.Verbose { + if i { + verb++ + } } } } diff --git a/go.mod b/go.mod index 242a766..1a9e5ff 100644 --- a/go.mod +++ b/go.mod @@ -1,29 +1,29 @@ module r00t2.io/subnetter -go 1.24.0 +go 1.24.5 require ( github.com/TwiN/go-color v1.4.1 - github.com/go-playground/validator/v10 v10.25.0 + github.com/go-playground/validator/v10 v10.28.0 github.com/go-resty/resty/v2 v2.16.5 - github.com/goccy/go-yaml v1.15.23 + github.com/goccy/go-yaml v1.18.0 github.com/jessevdk/go-flags v1.6.1 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba - golang.org/x/mod v0.24.0 - r00t2.io/goutils v1.8.1 - r00t2.io/sysutils v1.12.0 + golang.org/x/mod v0.29.0 + r00t2.io/goutils v1.10.3 + r00t2.io/sysutils v1.15.0 ) require ( github.com/djherbis/times v1.6.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gabriel-vasile/mimetype v1.4.11 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/stretchr/testify v1.9.0 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/net v0.37.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.30.0 // indirect ) diff --git a/go.sum b/go.sum index 2aa67a1..25b0992 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik= +github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -15,10 +17,14 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688= +github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU= github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/goccy/go-yaml v1.15.23 h1:WS0GAX1uNPDLUvLkNU2vXq6oTnsmfVFocjQ/4qA48qo= github.com/goccy/go-yaml v1.15.23/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= @@ -32,24 +38,40 @@ go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBs go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= r00t2.io/goutils v1.8.1 h1:TQcUycPKsYn0QI4uCqb56utmvu/vVSxlblBg98iXStg= r00t2.io/goutils v1.8.1/go.mod h1:9ObJI9S71wDLTOahwoOPs19DhZVYrOh4LEHmQ8SW4Lk= +r00t2.io/goutils v1.10.3 h1:GmEtsM/nrrVWooYJllXDRsgInobEinv2dn5ccU4zGAA= +r00t2.io/goutils v1.10.3/go.mod h1:76AxpXUeL10uFklxRB11kQsrtj2AKiNm8AwG1bNoBCA= r00t2.io/sysutils v1.1.1/go.mod h1:Wlfi1rrJpoKBOjWiYM9rw2FaiZqraD6VpXyiHgoDo/o= r00t2.io/sysutils v1.12.0 h1:Ce3qUOyLixE1ZtFT/+SVwOT5kSkzg5+l1VloGeGugrU= r00t2.io/sysutils v1.12.0/go.mod h1:bNTKNBk9MnUhj9coG9JBNicSi5FrtJHEM645um85pyw= +r00t2.io/sysutils v1.15.0 h1:FSnREfbXDhBQEO7LMpnRQeKlPshozxk9XHw3YgWRgRg= +r00t2.io/sysutils v1.15.0/go.mod h1:28qB0074EIRQ8Sy/ybaA5jC3qA32iW2aYLkMCRhyAFM= diff --git a/netsplit/conts.go b/netsplit/consts.go similarity index 100% rename from netsplit/conts.go rename to netsplit/consts.go