diff --git a/README.html b/README.html
index a0762e0..fbb0665 100644
--- a/README.html
+++ b/README.html
@@ -441,7 +441,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
Brent Saner
bts@square-r00t.net
-
Last rendered 2025-11-08 23:34:42 -0500
+
Last rendered 2026-03-19 17:42:33 -0400
Table of Contents
diff --git a/TODO b/TODO
index 5629af3..701792e 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,27 @@
+- add TUI
+
+- add "subnet finder" - given a prefix, find the subnet of size S that contains address X.
+-- if the existing libraries don't have an easy/fast way of doing this, try a binary search.
+
+- add env vars to all args
+- add ability to limit number of returned cidrs from split-cidr, split-nets
+- add ability to support "address pools" - multiple networks specified at end, or a path to a "pool file" (one network per line)
+- add VLSM spec to allow for e.g. `-s
[:]`, where Y would be an optional repeater
+ e.g.:
+ -s 25:3
+ == -s 25 -s 25 -s 25
+ -s 25:2 -s 25:3
+ == -s 25:5
+ == -s 25 -s 25 -s 25 -s 25 -s 25
+ Ensure ordering is preserved/do not consolidate:
+ -s 25:2 -s 24:2 -s 25:2
+ == -s 25 -s 25 -s 24 -s 24 -s 25
+ != -s 25 -s 25 -s 25 -s 25 -s 24 -s 24 (that'd be -s 25:4 -s 24:2 explicitly)
+
+- add option to consolidate subnets into minimum representation of pools/subnets. ("coalesce" operation)
+
+- add NetBox integration?
+
- 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:
diff --git a/build.sh b/build.sh
index 218bcb5..de76fe9 100755
--- a/build.sh
+++ b/build.sh
@@ -4,52 +4,56 @@ set -e
# This is not portable. It has bashisms.
+# Like this (bash >= 4.x)
+declare -A os_sfx=(
+ ["linux"]='bin'
+ ["windows"]='exe'
+ ["darwin"]='app'
+)
+declare -A tgts=(
+ ["amd64"]='x86_64'
+ ["arm64"]='arm64'
+)
+
BUILD_TIME="$(date '+%s')"
BUILD_USER="$(whoami)"
BUILD_SUDO_USER="${SUDO_USER}"
BUILD_HOST="$(hostname)"
# Check to make sure git is available.
-if ! command -v git &> /dev/null;
-then
- echo "Git is not available; automatic version handling unsupported."
- echo "You must build by calling 'go build' directly in the respective directories."
- exit 0
+if ! command -v git &> /dev/null; then
+ echo "Git is not available; automatic version handling unsupported."
+ echo "You must build by calling 'go build' directly in the respective directories instead."
+ exit 0
fi
# Check git directory/repository.
-if ! git rev-parse --is-inside-work-tree &>/dev/null;
-then
- echo "Not running inside a git work tree; automatic version handling unsupported/build script unsupported."
- echo "You must build by calling 'go build' directly in the respective directories instead."
- exit 0
+if ! git rev-parse --is-inside-work-tree &> /dev/null; then
+ echo "Not running inside a git work tree; automatic version handling unsupported/build script unsupported."
+ echo "You must build by calling 'go build' directly in the respective directories instead."
+ exit 0
fi
-# The repo URI for origin.
-REPO_URI="$(git remote get-url origin)"
-
# If it has a tag in the path of the current HEAD that matches a version string...
# I wish git describe supported regex. It does not; only globs. Gross.
# If there's a bug anywhere, it's here.
-if git describe --tags --abbrev=0 --match "v[0-9]*" HEAD &> /dev/null;
-then
- # It has a tag we can use.
- CURRENT_VER="$(git describe --tags --abbrev=0 --match "v[0-9]*" HEAD)"
- COMMITS_SINCE="$(git rev-list --count ${CURRENT_VER}..HEAD)"
+if git describe --tags --abbrev=0 --match "v[0-9]*" HEAD &> /dev/null; then
+ # It has a tag we can use.
+ CURRENT_VER="$(git describe --tags --abbrev=0 --match "v[0-9]*" HEAD)"
+ COMMITS_SINCE="$(git rev-list --count ${CURRENT_VER}..HEAD)"
else
- # No tag available.
- CURRENT_VER=""
- COMMITS_SINCE=""
+ # No tag available.
+ CURRENT_VER=""
+ COMMITS_SINCE=""
fi
# If it's dirty (staged but not committed or unstaged files)...
-if ! git diff-index --quiet HEAD;
-then
- # It's dirty.
- IS_DIRTY="1"
+if ! git diff-index --quiet HEAD; then
+ # It's dirty.
+ IS_DIRTY="1"
else
- # It's clean.
- IS_DIRTY="0"
+ # It's clean.
+ IS_DIRTY="0"
fi
# Get the commit hash of the *most recent* commit in the path of current HEAD...
@@ -61,9 +65,8 @@ CURRENT_SHORT="$(git rev-parse --verify --short HEAD)"
MODPATH="$(sed -n -re 's@^\s*module\s+(.*)(//.*)?$@\1@p' go.mod)"
# Build the ldflags string.
+# BEHOLD! BASH WITCHCRAFT.
LDFLAGS_STR="\
--X '${MODPATH}/version.repoUri=${REPO_URI}' \
--X '${MODPATH}/version.sourceControl=git' \
-X '${MODPATH}/version.version=${CURRENT_VER}' \
-X '${MODPATH}/version.commitHash=${CURRENT_HASH}' \
-X '${MODPATH}/version.commitShort=${CURRENT_SHORT}' \
@@ -74,54 +77,55 @@ LDFLAGS_STR="\
-X '${MODPATH}/version.buildSudoUser=${BUILD_SUDO_USER}' \
-X '${MODPATH}/version.buildHost=${BUILD_HOST}'"
+set -u
+
+# Build the binary version string.
+#BASEVER="dev"
+BASEVER="0.0.0"
+if [ ! -z "${CURRENT_VER}" ];
+then
+ BASEVER="${CURRENT_VER##v}"
+fi
# And finally build.
-export CGO_ENABLED=0
-
mkdir -p ./bin/
+go mod tidy
+go get -u ./...
+go mod tidy
+export CGO_ENABLED=0
+_origdir="$(pwd)"
+_pfx=''
+for cmd_dir in cmd/*; do
+ cmd_dir="${_origdir}/${cmd_dir}"
+ cmd="$(basename "${cmd_dir}")"
+ _bin="${_pfx}${cmd}"
+ #echo "${cmd_dir} => ${_bin}..."
+ echo "${_bin}..."
+ if [ ! -f "${cmd_dir}/main.go" ]; then
+ continue
+ fi
+ cd "${cmd_dir}"
+ for ga in "${!tgts[@]}"; do
+ echo -e "\t${ga}..."
+ for osnm in "${!os_sfx[@]}"; do
+ echo -e "\t\t${osnm}: "
+ _sfx="${os_sfx[$osnm]}"
+ _a="${tgts[$ga]}"
+ bin="${_origdir}/bin/${_bin}-${_a}-${CURRENT_VER:-dev}.${_sfx}"
+ export GOOS="${osnm}"
+ export GOARCH="${ga}"
+ echo -e "\t\t\tBuilding '${bin}'..."
+ go build \
+ -o "${bin}" \
+ -ldflags \
+ "${LDFLAGS_STR}"
+# "${LDFLAGS_STR}" \
+# *.go
+ echo -e "\t\t\tDone."
+ done
+ echo -e "\tDone."
+ done
+ echo "Done."
+done
-cmd="subnetter"
-# Linux
-bin="${cmd}"
-echo "Building ./bin/${bin}..."
-go build \
- -o "./bin/${bin}" \
- -ldflags \
- "${LDFLAGS_STR}" \
- cmd/${cmd}/*.go
-echo " Done."
-
-# Windows
-GOOS="windows"
-bin="subnetter.exe"
-echo "Building ./bin/${bin}..."
-go build \
- -o "./bin/${bin}" \
- -ldflags \
- "${LDFLAGS_STR}" \
- cmd/${cmd}/*.go
-echo " Done."
-
-# macOS
-GOOS="darwin"
-## x86_64
-bin="subnetter.x86_64.app"
-echo "Building ./bin/${bin}..."
-go build \
- -o "./bin/${bin}" \
- -ldflags \
- "${LDFLAGS_STR}" \
- cmd/${cmd}/*.go
-echo " Done."
-## ARM64 (m1/m2/... etc.; "Apple Silicon")
-GOARCH="arm64"
-bin="subnetter.m1.app"
-echo "Building ./bin/${bin}..."
-go build \
- -o "./bin/${bin}" \
- -ldflags \
- "${LDFLAGS_STR}" \
- cmd/${cmd}/*.go
-echo " Done."
-
-echo "Build complete."
+echo -e "\nBuild complete."
diff --git a/go.mod b/go.mod
index 1a9e5ff..5a6c139 100644
--- a/go.mod
+++ b/go.mod
@@ -1,29 +1,29 @@
module r00t2.io/subnetter
-go 1.24.5
+go 1.25.0
require (
github.com/TwiN/go-color v1.4.1
- github.com/go-playground/validator/v10 v10.28.0
- github.com/go-resty/resty/v2 v2.16.5
- github.com/goccy/go-yaml v1.18.0
+ github.com/go-playground/validator/v10 v10.30.1
+ github.com/go-resty/resty/v2 v2.17.2
+ github.com/goccy/go-yaml v1.19.2
github.com/jessevdk/go-flags v1.6.1
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
- golang.org/x/mod v0.29.0
- r00t2.io/goutils v1.10.3
- r00t2.io/sysutils v1.15.0
+ golang.org/x/mod v0.34.0
+ r00t2.io/goutils v1.16.7
+ r00t2.io/sysutils v1.16.2
)
require (
github.com/djherbis/times v1.6.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.11 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.13 // 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.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
+ golang.org/x/crypto v0.49.0 // indirect
+ golang.org/x/net v0.52.0 // indirect
+ golang.org/x/sync v0.20.0 // indirect
+ golang.org/x/sys v0.42.0 // indirect
+ golang.org/x/text v0.35.0 // indirect
)
diff --git a/go.sum b/go.sum
index 25b0992..8bff54e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,31 +1,23 @@
github.com/TwiN/go-color v1.4.1 h1:mqG0P/KBgHKVqmtL5ye7K0/Gr4l6hTksPgTgMk3mUzc=
github.com/TwiN/go-color v1.4.1/go.mod h1:WcPf/jtiW95WBIsEeY1Lc/b8aaWoiqQpu5cf8WFxu+s=
-github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM=
+github.com/gabriel-vasile/mimetype v1.4.13/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=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
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/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=
+github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=
+github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk=
+github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA=
+github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=
+github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4=
github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
@@ -36,42 +28,24 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
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/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
+golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
+golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
+golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
+golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
+golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
+golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
+golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
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=
+golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
+golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
+golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
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=
+r00t2.io/goutils v1.16.7 h1:JydslP+m3FHlXdV0q4ci+DEL3/PSX9ASuuUeMrDMSAw=
+r00t2.io/goutils v1.16.7/go.mod h1:VXsgdl3QoiP9bgqykYpJ/NwoxZ992jslMiV32EhaIOc=
+r00t2.io/sysutils v1.16.2 h1:wI01UwZ/bXn/lzBiCpqDmzZCOWiK87kz04SB4xRw+W0=
+r00t2.io/sysutils v1.16.2/go.mod h1:iXK+ALOwIdRKjAJIE5USlkZ669SVDHBNNuYhunsznH8=