From 52c7ca5abe3599a0f5ac545ddacb6d8b956c445f Mon Sep 17 00:00:00 2001 From: brent saner Date: Thu, 19 Mar 2026 17:42:33 -0400 Subject: [PATCH] v0.3.1 * Deps bump * Better build.sh --- README.html | 2 +- TODO | 24 ++++++++ build.sh | 156 +++++++++++++++++++++++++++------------------------- go.mod | 26 ++++----- go.sum | 78 +++++++++----------------- 5 files changed, 144 insertions(+), 142 deletions(-) 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

-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=