this is cool and all but the tables don't render properly

This commit is contained in:
2025-02-01 23:15:54 -05:00
parent b09cb83017
commit 3a7ed5973b
28 changed files with 1917 additions and 88 deletions

View File

@@ -3,14 +3,17 @@ package main
import (
"bytes"
"errors"
"go4.org/netipx"
`fmt`
"io"
"log"
"net"
"net/netip"
"os"
"strings"
"go4.org/netipx"
"subnetter/netsplit"
`subnetter/version`
"github.com/jessevdk/go-flags"
"r00t2.io/sysutils/paths"
@@ -29,8 +32,10 @@ func main() {
var remaining *netipx.IPSet
var buf *bytes.Buffer
var res *netsplit.StructuredResults
var splitErr *netsplit.SplitErr = new(netsplit.SplitErr)
var parser *flags.Parser = flags.NewParser(args, flags.Default)
var noStrict bool
var strictErr error
var splitErr = new(netsplit.SplitErr)
var parser = flags.NewParser(args, flags.Default)
if _, err = parser.Parse(); err != nil {
switch flagsErr := err.(type) {
@@ -46,12 +51,30 @@ func main() {
}
}
if version.Ver, err = version.Version(); err != nil {
log.Panicln(err)
}
// If args.Version or args.DetailVersion are true, just print them and exit.
if args.DetailVersion || args.Version {
if args.Version {
fmt.Println(version.Ver.Short())
return
} else if args.DetailVersion {
fmt.Println(version.Ver.Detail())
return
}
}
switch parser.Active.Name {
case "table":
// TODO: print table and exit
buf = new(bytes.Buffer)
if err = tblTpl.ExecuteTemplate(buf, "table.tpl", args.Table.tableOpts); err != nil {
log.Panicln(err)
}
os.Stdout.Write(buf.Bytes())
return
case "parse":
// TODO: parse file/bytes, unmarshal, and render with new options then exit
if strings.TrimSpace(args.Parse.InFile) == "-" {
buf = new(bytes.Buffer)
if _, err = io.Copy(buf, os.Stdin); err != nil {
@@ -102,26 +125,32 @@ func main() {
}
cmnArgs = args.SplitHost.common
splitter = &netsplit.HostSplitter{
BaseSplitter: new(netsplit.BaseSplitter),
NumberHosts: args.SplitHost.Hosts,
Strict: args.SplitHost.Strict,
BaseSplitter: new(netsplit.BaseSplitter),
}
noStrict = !args.SplitHost.Strict
strictErr = netsplit.ErrBadNumHosts
case "split-nets":
if err = validate.Struct(args.SplitSubnets); err != nil {
log.Panicln(err)
}
cmnArgs = args.SplitSubnets.common
splitter = &netsplit.SubnetSplitter{
BaseSplitter: new(netsplit.BaseSplitter),
Strict: args.SplitSubnets.Strict,
NumberSubnets: args.SplitSubnets.NumNets,
BaseSplitter: new(netsplit.BaseSplitter),
}
noStrict = !args.SplitSubnets.Strict
strictErr = netsplit.ErrNoNetSpace
case "split-cidr":
if err = validate.Struct(args.SplitCIDR); err != nil {
log.Panicln(err)
}
cmnArgs = args.SplitCIDR.common
splitter = &netsplit.CIDRSplitter{
BaseSplitter: new(netsplit.BaseSplitter),
PrefixLength: args.SplitCIDR.Prefix,
BaseSplitter: new(netsplit.BaseSplitter),
}
case "vlsm":
if err = validate.Struct(args.VLSM); err != nil {
@@ -129,9 +158,9 @@ func main() {
}
cmnArgs = args.VLSM.common
splitter = &netsplit.VLSMSplitter{
BaseSplitter: new(netsplit.BaseSplitter),
Ascending: args.VLSM.Asc,
PrefixLengths: args.VLSM.Sizes,
BaseSplitter: new(netsplit.BaseSplitter),
}
}
if origPfx, err = netip.ParsePrefix(cmnArgs.Network.Network); err != nil {
@@ -147,8 +176,12 @@ func main() {
splitter.SetParent(*pfx)
if nets, remaining, err = splitter.Split(); err != nil {
if errors.As(err, &splitErr) {
printSplitErr(splitErr)
os.Exit(1)
if noStrict && errors.Is(splitErr.Wrapped, strictErr) {
err = nil
} else {
printSplitErr(splitErr)
os.Exit(1)
}
} else {
log.Panicln(err)
}