diff --git a/README.md b/README.md index 677dc26..5656072 100644 --- a/README.md +++ b/README.md @@ -232,59 +232,55 @@ Easily manage IPv4 and IPv6 routes, including adding, deleting, and listing rout ```bash # Add an IPv4 network route -./fcom route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 +./fcom network route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 # Add an IPv6 network route -./fcom route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 +./fcom network route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 # Add an IPv4 network route via a specific interface -./fcom route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 --iface em0 +./fcom network route add --family inet --net 10.0.0.0/24 --gw 10.0.0.1 --iface em0 # Add an IPv6 network route via a specific interface -./fcom route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 --iface em1 +./fcom network route add --family inet6 --net 2001:db8::/64 --gw 2001:db8::1 --iface em1 # Add a default IPv4 route -./fcom route add --family inet --net default --gw 192.168.1.1 +./fcom network route add --family inet --net default --gw 192.168.1.1 # Add a host route (single IP) -./fcom route add --family inet --net 192.168.1.50/32 --gw 10.0.0.1 +./fcom network route add --family inet --net 192.168.1.50/32 --gw 10.0.0.1 ``` -> **Note:** The `--iface` flag sets the outgoing interface for the route (uses FreeBSD's `-ifp` option). It is optional. - #### Delete a Route ```bash # Delete an IPv4 network route -./fcom route del --family inet --net 10.0.0.0/24 +./fcom network route del --family inet --net 10.0.0.0/24 # Delete an IPv6 network route -./fcom route del --family inet6 --net 2001:db8::/64 +./fcom network route del --family inet6 --net 2001:db8::/64 -# Delete a default route (will fail if it's the last default route) -./fcom route del --family inet --net default -# Output: cannot delete the last default route +# Delete a default route (if more than one exists) +./fcom network route del --family inet --net default ``` #### List Routes ```bash # List all IPv4 routes -./fcom route list --family inet - -# List IPv6 routes -./fcom route list --family inet6 +./fcom network route list --family inet +# List all IPv6 routes +./fcom network route list --family inet6 -# List all routes -./fcom route list +# List all routes (both families) +./fcom network route list ``` #### Example: Safe Default Route Handling ```bash # Attempting to delete the last default route will fail: -./fcom route del --family inet --net default +./fcom network route del --family inet --net default # Output: cannot delete the last default route ``` diff --git a/cmd/jail.go b/cmd/jail.go index dedd1a4..fb7695c 100644 --- a/cmd/jail.go +++ b/cmd/jail.go @@ -29,18 +29,23 @@ var jailCreateCmd = &cobra.Command{ Mount: jailMount, } - if err := manager.Create(cfg); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - - result := map[string]interface{}{ + err := manager.Create(cfg) + if err != nil { + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if e := internal.Output(map[string]interface{}{ "jail_id": jailName, "status": "created", "ip": jailIP, - "network": "br-jails", // make dynamic ? - } - if err := internal.Output(result); err != nil { + "network": "br-jails", // todo: make dynamic ! + }); e != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -53,15 +58,20 @@ var jailStartCmd = &cobra.Command{ manager := jail.DefaultManager() if err := manager.Start(jailName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ + if err := internal.Output(map[string]interface{}{ "jail_id": jailName, "status": "started", - } - if err := internal.Output(result); err != nil { + }); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -74,15 +84,20 @@ var jailStopCmd = &cobra.Command{ manager := jail.DefaultManager() if err := manager.Stop(jailName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ + if err := internal.Output(map[string]interface{}{ "jail_id": jailName, "status": "stopped", - } - if err := internal.Output(result); err != nil { + }); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -95,15 +110,20 @@ var jailDestroyCmd = &cobra.Command{ manager := jail.DefaultManager() if err := manager.Destroy(jailName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ + if err := internal.Output(map[string]interface{}{ "jail_id": jailName, "status": "destroyed", - } - if err := internal.Output(result); err != nil { + }); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -117,15 +137,20 @@ var jailListCmd = &cobra.Command{ jails, err := manager.List() if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ + if err := internal.Output(map[string]interface{}{ "jails": jails, "count": len(jails), - } - if err := internal.Output(result); err != nil { + }); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -139,14 +164,19 @@ var jailInfoCmd = &cobra.Command{ info, err := manager.GetInfo(jailName) if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{ + "error": err.Error(), + }); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ + if err := internal.Output(map[string]interface{}{ "jail_info": info, - } - if err := internal.Output(result); err != nil { + }); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, diff --git a/cmd/network.go b/cmd/network.go index 58e444f..f1ee5a9 100644 --- a/cmd/network.go +++ b/cmd/network.go @@ -9,6 +9,12 @@ import ( "github.com/spf13/cobra" ) +// IPs holds lists of IPv4 and IPv6 addresses for output. +type IPs struct { + IPv4 []string + IPv6 []string +} + var ( ifName string delIfaceName string @@ -42,6 +48,13 @@ var ( delVxlanName string ) +var ( + ipIface string + ipAddr string + ipMask int + ipFamily string +) + var networkCmd = &cobra.Command{ Use: "network", Short: "Manage networks", @@ -54,14 +67,14 @@ var ifaceCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.CreateInterface(ifName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "interface": ifName, - "status": "created", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"interface": ifName, "status": "created"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -73,14 +86,14 @@ var delIfaceCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.DeleteInterface(delIfaceName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "interface": delIfaceName, - "status": "deleted", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"interface": delIfaceName, "status": "deleted"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -93,14 +106,14 @@ var bridgeCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.CreateBridge(bridgeName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "bridge": bridgeName, - "status": "created", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"bridge": bridgeName, "status": "created"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -112,14 +125,14 @@ var delBridgeCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.DeleteBridge(delBridgeName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "bridge": delBridgeName, - "status": "deleted", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"bridge": delBridgeName, "status": "deleted"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -131,15 +144,14 @@ var addInterfaceToBridgeCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.AddInterfaceToBridge(bridgeInterfaceName, bridgeInterfaceToAdd); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ - "bridge": bridgeInterfaceName, - "interface": bridgeInterfaceToAdd, - "status": "added", - } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"bridge": bridgeInterfaceName, "interface": bridgeInterfaceToAdd, "status": "added"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -151,15 +163,14 @@ var removeInterfaceFromBridgeCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.RemoveInterfaceFromBridge(bridgeInterfaceName, bridgeInterfaceToRemove); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "bridge": bridgeInterfaceName, - "interface": bridgeInterfaceToRemove, - "status": "removed", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"bridge": bridgeInterfaceName, "interface": bridgeInterfaceToRemove, "status": "removed"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -172,16 +183,14 @@ var vlanCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.CreateVLAN(vlanName, vlanParent, vlanID); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ - "vlan": vlanName, - "parent": vlanParent, - "vlan_id": vlanID, - "status": "created", - } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"vlan": vlanName, "parent": vlanParent, "vlan_id": vlanID, "status": "created"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -193,14 +202,14 @@ var delVlanCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.DeleteVLAN(delVlanName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "vlan": delVlanName, - "status": "deleted", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"vlan": delVlanName, "status": "deleted"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -213,16 +222,14 @@ var greCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.CreateGRE(greName, greRemote, greLocal); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "gre": greName, - "remote": greRemote, - "local": greLocal, - "status": "created", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"gre": greName, "remote": greRemote, "local": greLocal, "status": "created"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -234,14 +241,14 @@ var delGreCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.DeleteGRE(delGreName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ - "gre": delGreName, - "status": "deleted", - } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"gre": delGreName, "status": "deleted"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -254,19 +261,14 @@ var vxlanCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.CreateVXLAN(vxlanName, vxlanLocal, vxlanRemote, vxlanGroup, vxlanDev, vxlanID); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "vxlan": vxlanName, - "local": vxlanLocal, - "remote": vxlanRemote, - "group": vxlanGroup, - "dev": vxlanDev, - "vni": vxlanID, - "status": "created", + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"vxlan": vxlanName, "local": vxlanLocal, "remote": vxlanRemote, "group": vxlanGroup, "dev": vxlanDev, "vni": vxlanID, "status": "created"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -278,14 +280,14 @@ var delVxlanCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface manager := bareos.DefaultManager() if err := manager.DeleteVXLAN(delVxlanName); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - result := map[string]interface{}{ - "vxlan": delVxlanName, - "status": "deleted", - } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"vxlan": delVxlanName, "status": "deleted"}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -298,14 +300,14 @@ var networkListCmd = &cobra.Command{ manager := bareos.DefaultManager() interfaces, err := manager.List() if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - result := map[string]interface{}{ - "interfaces": interfaces, - "count": len(interfaces), + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return } - if err := internal.Output(result); err != nil { + if err := internal.Output(map[string]interface{}{"interfaces": interfaces, "count": len(interfaces)}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -318,13 +320,135 @@ var networkInfoCmd = &cobra.Command{ manager := bareos.DefaultManager() info, err := manager.GetInfo(ifName) if err != nil { + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]interface{}{"interface_info": info}); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - result := map[string]interface{}{ - "interface_info": info, + }, +} + +var ipCmd = &cobra.Command{ + Use: "ip", + Short: "Manage IP addresses on interfaces", +} + +var ipAddCmd = &cobra.Command{ + Use: "add", + Short: "Add an IP address to an interface", + Run: func(cmd *cobra.Command, args []string) { //nolint:revive + err := bareos.AddIP(ipIface, ipAddr, ipMask, ipFamily) + if err != nil { + if e := internal.Output(map[string]any{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]any{ + "interface": ipIface, + "ip": ipAddr, + "mask": ipMask, + "family": ipFamily, + "status": "added", + }); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - if err := internal.Output(result); err != nil { + }, +} + +var ipAliasCmd = &cobra.Command{ + Use: "alias", + Short: "Add an alias IP address to an interface", + Run: func(cmd *cobra.Command, args []string) { //nolint:revive + err := bareos.AliasIP(ipIface, ipAddr, ipMask, ipFamily) + if err != nil { + if e := internal.Output(map[string]any{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]any{ + "interface": ipIface, + "ip": ipAddr, + "mask": ipMask, + "family": ipFamily, + "status": "aliased", + }); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + }, +} + +var ipDeleteCmd = &cobra.Command{ + Use: "delete", + Short: "Delete an IP address from an interface", + Run: func(cmd *cobra.Command, args []string) { //nolint:revive + err := bareos.DeleteIP(ipIface, ipAddr, ipMask, ipFamily) + if err != nil { + if e := internal.Output(map[string]any{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]any{ + "interface": ipIface, + "ip": ipAddr, + "mask": ipMask, + "family": ipFamily, + "status": "deleted", + }); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + }, +} + +var ipListCmd = &cobra.Command{ + Use: "list", + Short: "List IP addresses on interfaces", + Run: func(cmd *cobra.Command, args []string) { //nolint:revive + // use ifconfig parser to list all IPs + manager := bareos.DefaultManager() + if ipIface != "" { + info, err := manager.GetInfo(ipIface) + if err != nil { + if e := internal.Output(map[string]any{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]any{"interface": ipIface, "ipv6": info.IPv6, "ipv4": info.IPv4, "count": len(info.IPv4) + len(info.IPv4)}); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + var allIPs IPs + info, err := manager.List() + if err != nil { + if e := internal.Output(map[string]any{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + return + } + for _, ip := range info { + allIPs.IPv6 = append(allIPs.IPv6, ip.IPv6...) // assuming Info has IPv6 []string + allIPs.IPv4 = append(allIPs.IPv4, ip.IPv4...) // assuming Info has IPv4 []string + } + if err := internal.Output(map[string]any{"ipv6": allIPs.IPv6, "ipv4": allIPs.IPv4, "count": len(allIPs.IPv4) + len(allIPs.IPv6)}); err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } }, @@ -467,6 +591,40 @@ func init() { //nolint os.Exit(1) } + // IP commands + ipAddCmd.Flags().StringVar(&ipIface, "iface", "", "Interface name (required)") + ipAddCmd.Flags().StringVar(&ipAddr, "ip", "", "IP address (required)") + ipAddCmd.Flags().IntVar(&ipMask, "mask", 0, "Netmask/CIDR (required)") + ipAddCmd.Flags().StringVar(&ipFamily, "family", "inet", "Address family (inet or inet6)") + _ = ipAddCmd.MarkFlagRequired("iface") + _ = ipAddCmd.MarkFlagRequired("ip") + _ = ipAddCmd.MarkFlagRequired("mask") + + ipAliasCmd.Flags().StringVar(&ipIface, "iface", "", "Interface name (required)") + ipAliasCmd.Flags().StringVar(&ipAddr, "ip", "", "IP address (required)") + ipAliasCmd.Flags().IntVar(&ipMask, "mask", 0, "Netmask/CIDR (required)") + ipAliasCmd.Flags().StringVar(&ipFamily, "family", "inet", "Address family (inet or inet6)") + _ = ipAliasCmd.MarkFlagRequired("iface") + _ = ipAliasCmd.MarkFlagRequired("ip") + _ = ipAliasCmd.MarkFlagRequired("mask") + + ipDeleteCmd.Flags().StringVar(&ipIface, "iface", "", "Interface name (required)") + ipDeleteCmd.Flags().StringVar(&ipAddr, "ip", "", "IP address (required)") + ipDeleteCmd.Flags().IntVar(&ipMask, "mask", 0, "Netmask/CIDR (required)") + ipDeleteCmd.Flags().StringVar(&ipFamily, "family", "inet", "Address family (inet or inet6)") + _ = ipDeleteCmd.MarkFlagRequired("iface") + _ = ipDeleteCmd.MarkFlagRequired("ip") + _ = ipDeleteCmd.MarkFlagRequired("mask") + + ipCmd.AddCommand(ipAddCmd) + ipCmd.AddCommand(ipAliasCmd) + ipCmd.AddCommand(ipDeleteCmd) + ipCmd.AddCommand(ipListCmd) + networkCmd.AddCommand(ipCmd) + + // Add ip commant to top level, do not delete. + // cmd.AddCommand(ipCmd) + // List and Info commands networkCmd.AddCommand(networkListCmd) diff --git a/cmd/route.go b/cmd/route.go index e13109d..8ece2d7 100644 --- a/cmd/route.go +++ b/cmd/route.go @@ -5,6 +5,8 @@ import ( "fmt" "os" + "FreeBSD-Command-manager/internal" + "github.com/spf13/cobra" ) @@ -23,17 +25,26 @@ var routeCmd = &cobra.Command{ var routeAddCmd = &cobra.Command{ Use: "add", Short: "Add a route", - Run: func(_ *cobra.Command, _ []string) { + Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface if routeNet == "" || routeGW == "" { - fmt.Fprintln(os.Stderr, "--net and --gw are required") - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": "--net and --gw are required"}); e != nil { + fmt.Fprintln(os.Stderr, e) + os.Exit(1) + } + return } err := bareos.AddRouteWithIface(routeFamily, routeNet, routeGW, routeIface) if err != nil { + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, e) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]interface{}{"status": "Route added successfully"}); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - fmt.Println("Route added successfully") }, } @@ -42,15 +53,24 @@ var routeDelCmd = &cobra.Command{ Short: "Delete a route", Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface if routeNet == "" { - fmt.Fprintln(os.Stderr, "--net is required") - os.Exit(1) + if e := internal.Output(map[string]interface{}{"error": "--net is required"}); e != nil { + fmt.Fprintln(os.Stderr, e) + os.Exit(1) + } + return } err := bareos.DelRoute(routeFamily, routeNet) if err != nil { + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, e) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]interface{}{"status": "Route deleted successfully"}); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - fmt.Println("Route deleted successfully") }, } @@ -60,10 +80,16 @@ var routeListCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface out, err := bareos.ListAllRoutes(routeFamily) if err != nil { + if e := internal.Output(map[string]interface{}{"error": err.Error()}); e != nil { + fmt.Fprintln(os.Stderr, e) + os.Exit(1) + } + return + } + if err := internal.Output(map[string]interface{}{"routes": out, "count": len(out)}); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - fmt.Print(out) }, } @@ -82,5 +108,6 @@ func init() { //nolint routeCmd.AddCommand(routeDelCmd) routeCmd.AddCommand(routeListCmd) - cmd.AddCommand(routeCmd) + // Add route to top level, do not delete. + // cmd.AddCommand(routeCmd) } diff --git a/cmd/version.go b/cmd/version.go index 22d6b1b..8c1550c 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,7 +1,10 @@ package cmd import ( + "FreeBSD-Command-manager/internal" + "fmt" + "os" "github.com/spf13/cobra" ) @@ -18,7 +21,16 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Show version information", Run: func(cmd *cobra.Command, args []string) { //nolint:revive // cmd is required by cobra interface - fmt.Printf("%s.%s.%s.%s\n", Version, Commit, Built, Date) + err := internal.Output(map[string]interface{}{ + "version": Version, + "commit": Commit, + "built": Built, + "date": Date, + }) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } }, } diff --git a/coverage.txt b/coverage.txt index 137bff3..94a8357 100644 --- a/coverage.txt +++ b/coverage.txt @@ -1,360 +1,254 @@ mode: atomic +FreeBSD-Command-manager/main.go:17.13,19.2 1 0 FreeBSD-Command-manager/internal/output.go:11.37,14.41 3 0 FreeBSD-Command-manager/internal/output.go:14.41,17.3 2 0 FreeBSD-Command-manager/internal/output.go:18.2,18.12 1 0 FreeBSD-Command-manager/cmd/cmd.go:18.33,23.38 5 0 FreeBSD-Command-manager/cmd/cmd.go:23.38,26.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:22.47,32.45 3 0 -FreeBSD-Command-manager/cmd/jail.go:32.45,35.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:37.3,43.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:43.49,45.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:52.47,55.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:55.49,58.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:60.3,64.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:64.49,66.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:73.47,76.48 2 0 -FreeBSD-Command-manager/cmd/jail.go:76.48,79.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:81.3,85.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:85.49,87.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:94.47,97.51 2 0 -FreeBSD-Command-manager/cmd/jail.go:97.51,100.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:102.3,106.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:106.49,108.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:115.47,119.17 3 0 -FreeBSD-Command-manager/cmd/jail.go:119.17,122.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:124.3,128.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:128.49,130.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:137.47,141.17 3 0 -FreeBSD-Command-manager/cmd/jail.go:141.17,144.4 2 0 -FreeBSD-Command-manager/cmd/jail.go:146.3,149.49 2 0 -FreeBSD-Command-manager/cmd/jail.go:149.49,151.4 1 0 -FreeBSD-Command-manager/cmd/jail.go:155.13,162.63 5 0 -FreeBSD-Command-manager/cmd/jail.go:162.63,165.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:166.2,166.63 1 0 -FreeBSD-Command-manager/cmd/jail.go:166.63,169.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:170.2,170.61 1 0 -FreeBSD-Command-manager/cmd/jail.go:170.61,173.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:176.2,178.62 2 0 -FreeBSD-Command-manager/cmd/jail.go:178.62,181.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:184.2,186.61 2 0 -FreeBSD-Command-manager/cmd/jail.go:186.61,189.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:192.2,194.64 2 0 -FreeBSD-Command-manager/cmd/jail.go:194.64,197.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:199.2,201.61 2 0 -FreeBSD-Command-manager/cmd/jail.go:201.61,204.3 2 0 -FreeBSD-Command-manager/cmd/jail.go:206.2,213.25 7 0 -FreeBSD-Command-manager/cmd/network.go:54.47,56.57 2 0 -FreeBSD-Command-manager/cmd/network.go:56.57,59.4 2 0 -FreeBSD-Command-manager/cmd/network.go:60.3,64.49 2 0 -FreeBSD-Command-manager/cmd/network.go:64.49,66.4 1 0 -FreeBSD-Command-manager/cmd/network.go:73.47,75.63 2 0 -FreeBSD-Command-manager/cmd/network.go:75.63,78.4 2 0 -FreeBSD-Command-manager/cmd/network.go:79.3,83.49 2 0 -FreeBSD-Command-manager/cmd/network.go:83.49,85.4 1 0 -FreeBSD-Command-manager/cmd/network.go:93.47,95.58 2 0 -FreeBSD-Command-manager/cmd/network.go:95.58,98.4 2 0 -FreeBSD-Command-manager/cmd/network.go:99.3,103.49 2 0 -FreeBSD-Command-manager/cmd/network.go:103.49,105.4 1 0 -FreeBSD-Command-manager/cmd/network.go:112.47,114.61 2 0 -FreeBSD-Command-manager/cmd/network.go:114.61,117.4 2 0 -FreeBSD-Command-manager/cmd/network.go:118.3,122.49 2 0 -FreeBSD-Command-manager/cmd/network.go:122.49,124.4 1 0 -FreeBSD-Command-manager/cmd/network.go:131.47,133.97 2 0 -FreeBSD-Command-manager/cmd/network.go:133.97,136.4 2 0 -FreeBSD-Command-manager/cmd/network.go:137.3,142.49 2 0 -FreeBSD-Command-manager/cmd/network.go:142.49,144.4 1 0 -FreeBSD-Command-manager/cmd/network.go:151.47,153.105 2 0 -FreeBSD-Command-manager/cmd/network.go:153.105,156.4 2 0 -FreeBSD-Command-manager/cmd/network.go:157.3,162.49 2 0 -FreeBSD-Command-manager/cmd/network.go:162.49,164.4 1 0 -FreeBSD-Command-manager/cmd/network.go:172.47,174.74 2 0 -FreeBSD-Command-manager/cmd/network.go:174.74,177.4 2 0 -FreeBSD-Command-manager/cmd/network.go:178.3,184.49 2 0 -FreeBSD-Command-manager/cmd/network.go:184.49,186.4 1 0 -FreeBSD-Command-manager/cmd/network.go:193.47,195.57 2 0 -FreeBSD-Command-manager/cmd/network.go:195.57,198.4 2 0 -FreeBSD-Command-manager/cmd/network.go:199.3,203.49 2 0 -FreeBSD-Command-manager/cmd/network.go:203.49,205.4 1 0 -FreeBSD-Command-manager/cmd/network.go:213.47,215.73 2 0 -FreeBSD-Command-manager/cmd/network.go:215.73,218.4 2 0 -FreeBSD-Command-manager/cmd/network.go:219.3,225.49 2 0 -FreeBSD-Command-manager/cmd/network.go:225.49,227.4 1 0 -FreeBSD-Command-manager/cmd/network.go:234.47,236.55 2 0 -FreeBSD-Command-manager/cmd/network.go:236.55,239.4 2 0 -FreeBSD-Command-manager/cmd/network.go:240.3,244.49 2 0 -FreeBSD-Command-manager/cmd/network.go:244.49,246.4 1 0 -FreeBSD-Command-manager/cmd/network.go:254.47,256.112 2 0 -FreeBSD-Command-manager/cmd/network.go:256.112,259.4 2 0 -FreeBSD-Command-manager/cmd/network.go:260.3,269.49 2 0 -FreeBSD-Command-manager/cmd/network.go:269.49,271.4 1 0 -FreeBSD-Command-manager/cmd/network.go:278.47,280.59 2 0 -FreeBSD-Command-manager/cmd/network.go:280.59,283.4 2 0 -FreeBSD-Command-manager/cmd/network.go:284.3,288.49 2 0 -FreeBSD-Command-manager/cmd/network.go:288.49,290.4 1 0 -FreeBSD-Command-manager/cmd/network.go:297.47,300.17 3 0 -FreeBSD-Command-manager/cmd/network.go:300.17,303.4 2 0 -FreeBSD-Command-manager/cmd/network.go:304.3,308.49 2 0 -FreeBSD-Command-manager/cmd/network.go:308.49,310.4 1 0 -FreeBSD-Command-manager/cmd/network.go:317.47,320.17 3 0 -FreeBSD-Command-manager/cmd/network.go:320.17,323.4 2 0 -FreeBSD-Command-manager/cmd/network.go:324.3,327.49 2 0 -FreeBSD-Command-manager/cmd/network.go:327.49,329.4 1 0 -FreeBSD-Command-manager/cmd/network.go:333.13,337.58 3 0 -FreeBSD-Command-manager/cmd/network.go:337.58,340.3 2 0 -FreeBSD-Command-manager/cmd/network.go:342.2,344.61 3 0 -FreeBSD-Command-manager/cmd/network.go:344.61,347.3 2 0 -FreeBSD-Command-manager/cmd/network.go:350.2,352.59 3 0 -FreeBSD-Command-manager/cmd/network.go:352.59,355.3 2 0 -FreeBSD-Command-manager/cmd/network.go:357.2,359.62 3 0 -FreeBSD-Command-manager/cmd/network.go:359.62,362.3 2 0 -FreeBSD-Command-manager/cmd/network.go:364.2,367.75 4 0 -FreeBSD-Command-manager/cmd/network.go:367.75,370.3 2 0 -FreeBSD-Command-manager/cmd/network.go:371.2,371.78 1 0 -FreeBSD-Command-manager/cmd/network.go:371.78,374.3 2 0 -FreeBSD-Command-manager/cmd/network.go:376.2,379.80 4 0 -FreeBSD-Command-manager/cmd/network.go:379.80,382.3 2 0 -FreeBSD-Command-manager/cmd/network.go:383.2,383.83 1 0 -FreeBSD-Command-manager/cmd/network.go:383.83,386.3 2 0 -FreeBSD-Command-manager/cmd/network.go:389.2,393.57 5 0 -FreeBSD-Command-manager/cmd/network.go:393.57,396.3 2 0 -FreeBSD-Command-manager/cmd/network.go:397.2,397.59 1 0 -FreeBSD-Command-manager/cmd/network.go:397.59,400.3 2 0 -FreeBSD-Command-manager/cmd/network.go:401.2,401.55 1 0 -FreeBSD-Command-manager/cmd/network.go:401.55,404.3 2 0 -FreeBSD-Command-manager/cmd/network.go:406.2,408.60 3 0 -FreeBSD-Command-manager/cmd/network.go:408.60,411.3 2 0 -FreeBSD-Command-manager/cmd/network.go:414.2,418.56 5 0 -FreeBSD-Command-manager/cmd/network.go:418.56,421.3 2 0 -FreeBSD-Command-manager/cmd/network.go:422.2,422.57 1 0 -FreeBSD-Command-manager/cmd/network.go:422.57,425.3 2 0 -FreeBSD-Command-manager/cmd/network.go:426.2,426.58 1 0 -FreeBSD-Command-manager/cmd/network.go:426.58,429.3 2 0 -FreeBSD-Command-manager/cmd/network.go:431.2,433.59 3 0 -FreeBSD-Command-manager/cmd/network.go:433.59,436.3 2 0 -FreeBSD-Command-manager/cmd/network.go:439.2,446.58 8 0 -FreeBSD-Command-manager/cmd/network.go:446.58,449.3 2 0 -FreeBSD-Command-manager/cmd/network.go:450.2,450.59 1 0 -FreeBSD-Command-manager/cmd/network.go:450.59,453.3 2 0 -FreeBSD-Command-manager/cmd/network.go:454.2,454.60 1 0 -FreeBSD-Command-manager/cmd/network.go:454.60,457.3 2 0 -FreeBSD-Command-manager/cmd/network.go:458.2,458.57 1 0 -FreeBSD-Command-manager/cmd/network.go:458.57,461.3 2 0 -FreeBSD-Command-manager/cmd/network.go:463.2,465.61 3 0 -FreeBSD-Command-manager/cmd/network.go:465.61,468.3 2 0 -FreeBSD-Command-manager/cmd/network.go:471.2,475.64 4 0 -FreeBSD-Command-manager/cmd/network.go:475.64,478.3 2 0 -FreeBSD-Command-manager/cmd/network.go:480.2,482.28 2 0 -FreeBSD-Command-manager/cmd/route.go:25.47,26.38 1 0 -FreeBSD-Command-manager/cmd/route.go:26.38,29.4 2 0 -FreeBSD-Command-manager/cmd/route.go:30.3,31.17 2 0 -FreeBSD-Command-manager/cmd/route.go:31.17,34.4 2 0 -FreeBSD-Command-manager/cmd/route.go:35.3,35.42 1 0 -FreeBSD-Command-manager/cmd/route.go:42.47,43.21 1 0 -FreeBSD-Command-manager/cmd/route.go:43.21,46.4 2 0 -FreeBSD-Command-manager/cmd/route.go:47.3,48.17 2 0 -FreeBSD-Command-manager/cmd/route.go:48.17,51.4 2 0 -FreeBSD-Command-manager/cmd/route.go:52.3,52.44 1 0 -FreeBSD-Command-manager/cmd/route.go:59.47,61.17 2 0 -FreeBSD-Command-manager/cmd/route.go:61.17,64.4 2 0 -FreeBSD-Command-manager/cmd/route.go:65.3,65.17 1 0 -FreeBSD-Command-manager/cmd/route.go:69.13,84.2 10 0 -FreeBSD-Command-manager/cmd/version.go:20.47,22.3 1 0 -FreeBSD-Command-manager/cmd/version.go:25.13,27.2 1 0 -FreeBSD-Command-manager/main.go:17.13,19.2 1 0 -FreeBSD-Command-manager/internal/network/bareos/basic.go:9.54,10.16 1 3 -FreeBSD-Command-manager/internal/network/bareos/basic.go:10.16,12.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/basic.go:14.2,15.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/basic.go:15.16,17.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/basic.go:20.2,21.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/basic.go:21.16,23.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/basic.go:25.2,25.12 1 2 -FreeBSD-Command-manager/internal/network/bareos/basic.go:29.54,30.16 1 5 -FreeBSD-Command-manager/internal/network/bareos/basic.go:30.16,32.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/basic.go:34.2,35.16 2 4 -FreeBSD-Command-manager/internal/network/bareos/basic.go:35.16,37.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/basic.go:39.2,39.12 1 4 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:8.51,11.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:11.16,13.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:16.2,17.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:17.16,19.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:21.2,21.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:21.16,24.17 2 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:24.17,26.4 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:29.2,29.12 1 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:33.51,34.16 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:34.16,36.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:38.2,38.32 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:42.80,43.22 1 3 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:43.22,45.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:46.2,46.25 1 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:46.25,48.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:51.2,52.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:52.16,54.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:56.2,56.12 1 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:60.85,61.22 1 3 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:61.22,63.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:64.2,64.25 1 2 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:64.25,66.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:69.2,70.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:70.16,72.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/bridge.go:74.2,74.12 1 1 -FreeBSD-Command-manager/internal/network/bareos/gre.go:8.63,9.18 1 4 -FreeBSD-Command-manager/internal/network/bareos/gre.go:9.18,11.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/gre.go:12.2,12.17 1 3 -FreeBSD-Command-manager/internal/network/bareos/gre.go:12.17,14.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/gre.go:17.2,18.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:18.16,20.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/gre.go:23.2,24.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:24.16,26.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/gre.go:29.2,30.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:30.16,32.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/gre.go:34.2,34.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:34.16,37.17 2 1 -FreeBSD-Command-manager/internal/network/bareos/gre.go:37.17,39.4 1 0 -FreeBSD-Command-manager/internal/network/bareos/gre.go:42.2,42.12 1 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:46.48,47.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/gre.go:47.16,49.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/gre.go:51.2,51.32 1 1 -FreeBSD-Command-manager/internal/network/bareos/ip.go:11.61,12.42 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:12.42,14.3 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:15.2,16.15 2 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:16.15,18.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:19.2,22.16 4 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:22.16,24.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:25.2,25.12 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:29.63,30.42 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:30.42,32.3 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:33.2,34.15 2 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:34.15,36.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:37.2,40.16 4 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:40.16,42.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:43.2,43.12 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:47.64,48.42 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:48.42,50.3 1 3 -FreeBSD-Command-manager/internal/network/bareos/ip.go:51.2,52.15 2 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:52.15,54.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:55.2,58.16 4 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:58.16,60.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/ip.go:61.2,61.12 1 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:48.51,52.2 1 40 -FreeBSD-Command-manager/internal/network/bareos/manager.go:55.51,57.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:57.16,59.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:60.2,60.44 1 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:64.64,65.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/manager.go:65.16,67.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:68.2,69.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:69.16,71.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:72.2,73.21 2 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:73.21,75.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:76.2,76.23 1 1 -FreeBSD-Command-manager/internal/network/bareos/manager.go:83.52,85.2 1 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:88.84,92.2 3 0 -FreeBSD-Command-manager/internal/network/bareos/manager.go:95.40,98.2 2 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:11.52,12.18 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:12.18,14.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:15.2,17.16 3 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:17.16,19.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:20.2,20.28 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:26.49,28.15 2 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:28.15,30.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:31.2,33.16 3 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:33.16,35.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:36.2,36.12 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:41.45,43.15 2 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:43.15,45.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:46.2,46.26 1 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:46.26,48.17 2 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:48.17,50.4 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:51.3,51.17 1 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:51.17,53.4 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:55.2,57.16 3 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:57.16,59.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:60.2,60.12 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:64.51,65.18 1 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:65.18,67.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:68.2,69.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:69.16,71.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:72.2,73.16 2 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:73.16,75.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:76.2,76.75 1 1 -FreeBSD-Command-manager/internal/network/bareos/route.go:80.53,82.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:82.16,84.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/route.go:85.2,86.48 2 2 -FreeBSD-Command-manager/internal/network/bareos/route.go:86.48,88.48 2 5 -FreeBSD-Command-manager/internal/network/bareos/route.go:88.48,90.4 1 3 -FreeBSD-Command-manager/internal/network/bareos/route.go:92.2,92.19 1 2 -FreeBSD-Command-manager/internal/network/bareos/testing.go:11.52,17.2 1 41 -FreeBSD-Command-manager/internal/network/bareos/testing.go:20.84,23.27 2 44 -FreeBSD-Command-manager/internal/network/bareos/testing.go:23.27,25.3 1 122 -FreeBSD-Command-manager/internal/network/bareos/testing.go:26.2,29.45 2 44 -FreeBSD-Command-manager/internal/network/bareos/testing.go:29.45,31.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/testing.go:34.2,34.49 1 43 -FreeBSD-Command-manager/internal/network/bareos/testing.go:34.49,36.3 1 32 -FreeBSD-Command-manager/internal/network/bareos/testing.go:38.2,38.16 1 11 -FreeBSD-Command-manager/internal/network/bareos/testing.go:42.65,44.2 1 32 -FreeBSD-Command-manager/internal/network/bareos/testing.go:47.67,49.2 1 1 -FreeBSD-Command-manager/internal/network/bareos/testing.go:52.54,54.2 1 28 -FreeBSD-Command-manager/internal/network/bareos/testing.go:57.47,59.2 1 1 -FreeBSD-Command-manager/internal/network/bareos/testing.go:62.40,65.2 2 1 -FreeBSD-Command-manager/internal/network/bareos/testing.go:68.75,70.2 1 0 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:8.69,9.18 1 5 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:9.18,11.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:12.2,12.33 1 4 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:12.33,14.3 1 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:17.2,18.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:18.16,20.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:23.2,24.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:24.16,26.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:29.2,30.16 2 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:30.16,32.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:34.2,34.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:34.16,37.17 2 1 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:37.17,39.4 1 0 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:42.2,42.12 1 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:46.49,47.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:47.16,49.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vlan.go:51.2,51.32 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:10.90,11.17 1 9 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:11.17,13.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:14.2,14.18 1 8 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:14.18,16.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:17.2,17.39 1 7 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:17.39,19.3 1 2 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:22.2,22.31 1 5 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:22.31,24.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:25.2,25.32 1 4 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:25.32,27.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:30.2,31.16 2 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:31.16,33.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:36.2,39.17 2 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:39.17,41.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:42.2,42.15 1 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:42.15,44.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:47.2,48.16 2 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:48.16,50.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:53.2,54.16 2 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:54.16,56.3 1 0 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:58.2,58.16 1 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:58.16,61.17 2 2 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:61.17,63.4 1 0 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:66.2,66.12 1 3 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:70.50,71.16 1 2 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:71.16,73.3 1 1 -FreeBSD-Command-manager/internal/network/bareos/vxlan.go:75.2,75.32 1 1 -FreeBSD-Command-manager/pkg/jail/parser.go:19.51,23.21 4 3 -FreeBSD-Command-manager/pkg/jail/parser.go:23.21,25.24 2 8 -FreeBSD-Command-manager/pkg/jail/parser.go:25.24,27.12 2 2 -FreeBSD-Command-manager/pkg/jail/parser.go:29.3,30.34 2 6 -FreeBSD-Command-manager/pkg/jail/parser.go:30.34,31.12 1 1 -FreeBSD-Command-manager/pkg/jail/parser.go:33.3,34.29 2 5 -FreeBSD-Command-manager/pkg/jail/parser.go:34.29,35.13 1 25 -FreeBSD-Command-manager/pkg/jail/parser.go:36.16,37.26 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:38.17,39.28 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:40.20,41.26 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:42.20,43.26 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:44.16,45.26 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:48.3,48.30 1 5 -FreeBSD-Command-manager/pkg/jail/parser.go:50.2,50.19 1 3 +FreeBSD-Command-manager/cmd/jail.go:22.47,33.17 4 0 +FreeBSD-Command-manager/cmd/jail.go:33.17,36.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:36.17,39.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:40.4,40.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:42.3,47.16 1 0 +FreeBSD-Command-manager/cmd/jail.go:47.16,50.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:57.47,60.49 2 0 +FreeBSD-Command-manager/cmd/jail.go:60.49,63.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:63.17,66.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:67.4,67.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:70.3,73.18 1 0 +FreeBSD-Command-manager/cmd/jail.go:73.18,76.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:83.47,86.48 2 0 +FreeBSD-Command-manager/cmd/jail.go:86.48,89.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:89.17,92.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:93.4,93.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:96.3,99.18 1 0 +FreeBSD-Command-manager/cmd/jail.go:99.18,102.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:109.47,112.51 2 0 +FreeBSD-Command-manager/cmd/jail.go:112.51,115.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:115.17,118.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:119.4,119.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:122.3,125.18 1 0 +FreeBSD-Command-manager/cmd/jail.go:125.18,128.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:135.47,139.17 3 0 +FreeBSD-Command-manager/cmd/jail.go:139.17,142.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:142.17,145.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:146.4,146.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:149.3,152.18 1 0 +FreeBSD-Command-manager/cmd/jail.go:152.18,155.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:162.47,166.17 3 0 +FreeBSD-Command-manager/cmd/jail.go:166.17,169.17 1 0 +FreeBSD-Command-manager/cmd/jail.go:169.17,172.5 2 0 +FreeBSD-Command-manager/cmd/jail.go:173.4,173.10 1 0 +FreeBSD-Command-manager/cmd/jail.go:176.3,178.18 1 0 +FreeBSD-Command-manager/cmd/jail.go:178.18,181.4 2 0 +FreeBSD-Command-manager/cmd/jail.go:185.13,192.63 5 0 +FreeBSD-Command-manager/cmd/jail.go:192.63,195.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:196.2,196.63 1 0 +FreeBSD-Command-manager/cmd/jail.go:196.63,199.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:200.2,200.61 1 0 +FreeBSD-Command-manager/cmd/jail.go:200.61,203.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:206.2,208.62 2 0 +FreeBSD-Command-manager/cmd/jail.go:208.62,211.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:214.2,216.61 2 0 +FreeBSD-Command-manager/cmd/jail.go:216.61,219.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:222.2,224.64 2 0 +FreeBSD-Command-manager/cmd/jail.go:224.64,227.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:229.2,231.61 2 0 +FreeBSD-Command-manager/cmd/jail.go:231.61,234.3 2 0 +FreeBSD-Command-manager/cmd/jail.go:236.2,243.25 7 0 +FreeBSD-Command-manager/cmd/network.go:67.47,69.57 2 0 +FreeBSD-Command-manager/cmd/network.go:69.57,70.84 1 0 +FreeBSD-Command-manager/cmd/network.go:70.84,73.5 2 0 +FreeBSD-Command-manager/cmd/network.go:74.4,74.10 1 0 +FreeBSD-Command-manager/cmd/network.go:76.3,76.107 1 0 +FreeBSD-Command-manager/cmd/network.go:76.107,79.4 2 0 +FreeBSD-Command-manager/cmd/network.go:86.47,88.63 2 0 +FreeBSD-Command-manager/cmd/network.go:88.63,89.84 1 0 +FreeBSD-Command-manager/cmd/network.go:89.84,92.5 2 0 +FreeBSD-Command-manager/cmd/network.go:93.4,93.10 1 0 +FreeBSD-Command-manager/cmd/network.go:95.3,95.113 1 0 +FreeBSD-Command-manager/cmd/network.go:95.113,98.4 2 0 +FreeBSD-Command-manager/cmd/network.go:106.47,108.58 2 0 +FreeBSD-Command-manager/cmd/network.go:108.58,109.84 1 0 +FreeBSD-Command-manager/cmd/network.go:109.84,112.5 2 0 +FreeBSD-Command-manager/cmd/network.go:113.4,113.10 1 0 +FreeBSD-Command-manager/cmd/network.go:115.3,115.108 1 0 +FreeBSD-Command-manager/cmd/network.go:115.108,118.4 2 0 +FreeBSD-Command-manager/cmd/network.go:125.47,127.61 2 0 +FreeBSD-Command-manager/cmd/network.go:127.61,128.84 1 0 +FreeBSD-Command-manager/cmd/network.go:128.84,131.5 2 0 +FreeBSD-Command-manager/cmd/network.go:132.4,132.10 1 0 +FreeBSD-Command-manager/cmd/network.go:134.3,134.111 1 0 +FreeBSD-Command-manager/cmd/network.go:134.111,137.4 2 0 +FreeBSD-Command-manager/cmd/network.go:144.47,146.97 2 0 +FreeBSD-Command-manager/cmd/network.go:146.97,147.84 1 0 +FreeBSD-Command-manager/cmd/network.go:147.84,150.5 2 0 +FreeBSD-Command-manager/cmd/network.go:151.4,151.10 1 0 +FreeBSD-Command-manager/cmd/network.go:153.3,153.150 1 0 +FreeBSD-Command-manager/cmd/network.go:153.150,156.4 2 0 +FreeBSD-Command-manager/cmd/network.go:163.47,165.105 2 0 +FreeBSD-Command-manager/cmd/network.go:165.105,166.84 1 0 +FreeBSD-Command-manager/cmd/network.go:166.84,169.5 2 0 +FreeBSD-Command-manager/cmd/network.go:170.4,170.10 1 0 +FreeBSD-Command-manager/cmd/network.go:172.3,172.155 1 0 +FreeBSD-Command-manager/cmd/network.go:172.155,175.4 2 0 +FreeBSD-Command-manager/cmd/network.go:183.47,185.74 2 0 +FreeBSD-Command-manager/cmd/network.go:185.74,186.84 1 0 +FreeBSD-Command-manager/cmd/network.go:186.84,189.5 2 0 +FreeBSD-Command-manager/cmd/network.go:190.4,190.10 1 0 +FreeBSD-Command-manager/cmd/network.go:192.3,192.145 1 0 +FreeBSD-Command-manager/cmd/network.go:192.145,195.4 2 0 +FreeBSD-Command-manager/cmd/network.go:202.47,204.57 2 0 +FreeBSD-Command-manager/cmd/network.go:204.57,205.84 1 0 +FreeBSD-Command-manager/cmd/network.go:205.84,208.5 2 0 +FreeBSD-Command-manager/cmd/network.go:209.4,209.10 1 0 +FreeBSD-Command-manager/cmd/network.go:211.3,211.107 1 0 +FreeBSD-Command-manager/cmd/network.go:211.107,214.4 2 0 +FreeBSD-Command-manager/cmd/network.go:222.47,224.73 2 0 +FreeBSD-Command-manager/cmd/network.go:224.73,225.84 1 0 +FreeBSD-Command-manager/cmd/network.go:225.84,228.5 2 0 +FreeBSD-Command-manager/cmd/network.go:229.4,229.10 1 0 +FreeBSD-Command-manager/cmd/network.go:231.3,231.142 1 0 +FreeBSD-Command-manager/cmd/network.go:231.142,234.4 2 0 +FreeBSD-Command-manager/cmd/network.go:241.47,243.55 2 0 +FreeBSD-Command-manager/cmd/network.go:243.55,244.84 1 0 +FreeBSD-Command-manager/cmd/network.go:244.84,247.5 2 0 +FreeBSD-Command-manager/cmd/network.go:248.4,248.10 1 0 +FreeBSD-Command-manager/cmd/network.go:250.3,250.105 1 0 +FreeBSD-Command-manager/cmd/network.go:250.105,253.4 2 0 +FreeBSD-Command-manager/cmd/network.go:261.47,263.112 2 0 +FreeBSD-Command-manager/cmd/network.go:263.112,264.84 1 0 +FreeBSD-Command-manager/cmd/network.go:264.84,267.5 2 0 +FreeBSD-Command-manager/cmd/network.go:268.4,268.10 1 0 +FreeBSD-Command-manager/cmd/network.go:270.3,270.204 1 0 +FreeBSD-Command-manager/cmd/network.go:270.204,273.4 2 0 +FreeBSD-Command-manager/cmd/network.go:280.47,282.59 2 0 +FreeBSD-Command-manager/cmd/network.go:282.59,283.84 1 0 +FreeBSD-Command-manager/cmd/network.go:283.84,286.5 2 0 +FreeBSD-Command-manager/cmd/network.go:287.4,287.10 1 0 +FreeBSD-Command-manager/cmd/network.go:289.3,289.109 1 0 +FreeBSD-Command-manager/cmd/network.go:289.109,292.4 2 0 +FreeBSD-Command-manager/cmd/network.go:299.47,302.17 3 0 +FreeBSD-Command-manager/cmd/network.go:302.17,303.84 1 0 +FreeBSD-Command-manager/cmd/network.go:303.84,306.5 2 0 +FreeBSD-Command-manager/cmd/network.go:307.4,307.10 1 0 +FreeBSD-Command-manager/cmd/network.go:309.3,309.117 1 0 +FreeBSD-Command-manager/cmd/network.go:309.117,312.4 2 0 +FreeBSD-Command-manager/cmd/network.go:319.47,322.17 3 0 +FreeBSD-Command-manager/cmd/network.go:322.17,323.84 1 0 +FreeBSD-Command-manager/cmd/network.go:323.84,326.5 2 0 +FreeBSD-Command-manager/cmd/network.go:327.4,327.10 1 0 +FreeBSD-Command-manager/cmd/network.go:329.3,329.89 1 0 +FreeBSD-Command-manager/cmd/network.go:329.89,332.4 2 0 +FreeBSD-Command-manager/cmd/network.go:344.47,346.17 2 0 +FreeBSD-Command-manager/cmd/network.go:346.17,347.76 1 0 +FreeBSD-Command-manager/cmd/network.go:347.76,350.5 2 0 +FreeBSD-Command-manager/cmd/network.go:351.4,351.10 1 0 +FreeBSD-Command-manager/cmd/network.go:353.3,359.18 1 0 +FreeBSD-Command-manager/cmd/network.go:359.18,362.4 2 0 +FreeBSD-Command-manager/cmd/network.go:369.47,371.17 2 0 +FreeBSD-Command-manager/cmd/network.go:371.17,372.76 1 0 +FreeBSD-Command-manager/cmd/network.go:372.76,375.5 2 0 +FreeBSD-Command-manager/cmd/network.go:376.4,376.10 1 0 +FreeBSD-Command-manager/cmd/network.go:378.3,384.18 1 0 +FreeBSD-Command-manager/cmd/network.go:384.18,387.4 2 0 +FreeBSD-Command-manager/cmd/network.go:394.47,396.17 2 0 +FreeBSD-Command-manager/cmd/network.go:396.17,397.76 1 0 +FreeBSD-Command-manager/cmd/network.go:397.76,400.5 2 0 +FreeBSD-Command-manager/cmd/network.go:401.4,401.10 1 0 +FreeBSD-Command-manager/cmd/network.go:403.3,409.18 1 0 +FreeBSD-Command-manager/cmd/network.go:409.18,412.4 2 0 +FreeBSD-Command-manager/cmd/network.go:419.47,422.20 2 0 +FreeBSD-Command-manager/cmd/network.go:422.20,424.18 2 0 +FreeBSD-Command-manager/cmd/network.go:424.18,425.77 1 0 +FreeBSD-Command-manager/cmd/network.go:425.77,428.6 2 0 +FreeBSD-Command-manager/cmd/network.go:429.5,429.11 1 0 +FreeBSD-Command-manager/cmd/network.go:431.4,431.160 1 0 +FreeBSD-Command-manager/cmd/network.go:431.160,434.5 2 0 +FreeBSD-Command-manager/cmd/network.go:435.4,435.10 1 0 +FreeBSD-Command-manager/cmd/network.go:437.3,439.17 3 0 +FreeBSD-Command-manager/cmd/network.go:439.17,440.76 1 0 +FreeBSD-Command-manager/cmd/network.go:440.76,443.5 2 0 +FreeBSD-Command-manager/cmd/network.go:444.4,444.10 1 0 +FreeBSD-Command-manager/cmd/network.go:446.3,446.27 1 0 +FreeBSD-Command-manager/cmd/network.go:446.27,449.4 2 0 +FreeBSD-Command-manager/cmd/network.go:450.3,450.145 1 0 +FreeBSD-Command-manager/cmd/network.go:450.145,453.4 2 0 +FreeBSD-Command-manager/cmd/network.go:457.13,461.58 3 0 +FreeBSD-Command-manager/cmd/network.go:461.58,464.3 2 0 +FreeBSD-Command-manager/cmd/network.go:466.2,468.61 3 0 +FreeBSD-Command-manager/cmd/network.go:468.61,471.3 2 0 +FreeBSD-Command-manager/cmd/network.go:474.2,476.59 3 0 +FreeBSD-Command-manager/cmd/network.go:476.59,479.3 2 0 +FreeBSD-Command-manager/cmd/network.go:481.2,483.62 3 0 +FreeBSD-Command-manager/cmd/network.go:483.62,486.3 2 0 +FreeBSD-Command-manager/cmd/network.go:488.2,491.75 4 0 +FreeBSD-Command-manager/cmd/network.go:491.75,494.3 2 0 +FreeBSD-Command-manager/cmd/network.go:495.2,495.78 1 0 +FreeBSD-Command-manager/cmd/network.go:495.78,498.3 2 0 +FreeBSD-Command-manager/cmd/network.go:500.2,503.80 4 0 +FreeBSD-Command-manager/cmd/network.go:503.80,506.3 2 0 +FreeBSD-Command-manager/cmd/network.go:507.2,507.83 1 0 +FreeBSD-Command-manager/cmd/network.go:507.83,510.3 2 0 +FreeBSD-Command-manager/cmd/network.go:513.2,517.57 5 0 +FreeBSD-Command-manager/cmd/network.go:517.57,520.3 2 0 +FreeBSD-Command-manager/cmd/network.go:521.2,521.59 1 0 +FreeBSD-Command-manager/cmd/network.go:521.59,524.3 2 0 +FreeBSD-Command-manager/cmd/network.go:525.2,525.55 1 0 +FreeBSD-Command-manager/cmd/network.go:525.55,528.3 2 0 +FreeBSD-Command-manager/cmd/network.go:530.2,532.60 3 0 +FreeBSD-Command-manager/cmd/network.go:532.60,535.3 2 0 +FreeBSD-Command-manager/cmd/network.go:538.2,542.56 5 0 +FreeBSD-Command-manager/cmd/network.go:542.56,545.3 2 0 +FreeBSD-Command-manager/cmd/network.go:546.2,546.57 1 0 +FreeBSD-Command-manager/cmd/network.go:546.57,549.3 2 0 +FreeBSD-Command-manager/cmd/network.go:550.2,550.58 1 0 +FreeBSD-Command-manager/cmd/network.go:550.58,553.3 2 0 +FreeBSD-Command-manager/cmd/network.go:555.2,557.59 3 0 +FreeBSD-Command-manager/cmd/network.go:557.59,560.3 2 0 +FreeBSD-Command-manager/cmd/network.go:563.2,570.58 8 0 +FreeBSD-Command-manager/cmd/network.go:570.58,573.3 2 0 +FreeBSD-Command-manager/cmd/network.go:574.2,574.59 1 0 +FreeBSD-Command-manager/cmd/network.go:574.59,577.3 2 0 +FreeBSD-Command-manager/cmd/network.go:578.2,578.60 1 0 +FreeBSD-Command-manager/cmd/network.go:578.60,581.3 2 0 +FreeBSD-Command-manager/cmd/network.go:582.2,582.57 1 0 +FreeBSD-Command-manager/cmd/network.go:582.57,585.3 2 0 +FreeBSD-Command-manager/cmd/network.go:587.2,589.61 3 0 +FreeBSD-Command-manager/cmd/network.go:589.61,592.3 2 0 +FreeBSD-Command-manager/cmd/network.go:595.2,633.64 30 0 +FreeBSD-Command-manager/cmd/network.go:633.64,636.3 2 0 +FreeBSD-Command-manager/cmd/network.go:638.2,640.28 2 0 +FreeBSD-Command-manager/cmd/route.go:28.47,29.38 1 0 +FreeBSD-Command-manager/cmd/route.go:29.38,30.102 1 0 +FreeBSD-Command-manager/cmd/route.go:30.102,33.5 2 0 +FreeBSD-Command-manager/cmd/route.go:34.4,34.10 1 0 +FreeBSD-Command-manager/cmd/route.go:36.3,37.17 2 0 +FreeBSD-Command-manager/cmd/route.go:37.17,38.84 1 0 +FreeBSD-Command-manager/cmd/route.go:38.84,41.5 2 0 +FreeBSD-Command-manager/cmd/route.go:42.4,42.10 1 0 +FreeBSD-Command-manager/cmd/route.go:44.3,44.103 1 0 +FreeBSD-Command-manager/cmd/route.go:44.103,47.4 2 0 +FreeBSD-Command-manager/cmd/route.go:54.47,55.21 1 0 +FreeBSD-Command-manager/cmd/route.go:55.21,56.92 1 0 +FreeBSD-Command-manager/cmd/route.go:56.92,59.5 2 0 +FreeBSD-Command-manager/cmd/route.go:60.4,60.10 1 0 +FreeBSD-Command-manager/cmd/route.go:62.3,63.17 2 0 +FreeBSD-Command-manager/cmd/route.go:63.17,64.84 1 0 +FreeBSD-Command-manager/cmd/route.go:64.84,67.5 2 0 +FreeBSD-Command-manager/cmd/route.go:68.4,68.10 1 0 +FreeBSD-Command-manager/cmd/route.go:70.3,70.105 1 0 +FreeBSD-Command-manager/cmd/route.go:70.105,73.4 2 0 +FreeBSD-Command-manager/cmd/route.go:80.47,82.17 2 0 +FreeBSD-Command-manager/cmd/route.go:82.17,83.84 1 0 +FreeBSD-Command-manager/cmd/route.go:83.84,86.5 2 0 +FreeBSD-Command-manager/cmd/route.go:87.4,87.10 1 0 +FreeBSD-Command-manager/cmd/route.go:89.3,89.99 1 0 +FreeBSD-Command-manager/cmd/route.go:89.99,92.4 2 0 +FreeBSD-Command-manager/cmd/route.go:96.13,113.2 10 0 +FreeBSD-Command-manager/cmd/version.go:23.47,30.17 2 0 +FreeBSD-Command-manager/cmd/version.go:30.17,33.4 2 0 +FreeBSD-Command-manager/cmd/version.go:37.13,39.2 1 0 FreeBSD-Command-manager/internal/jail/manager.go:54.102,59.2 1 15 FreeBSD-Command-manager/internal/jail/manager.go:62.55,64.54 1 5 FreeBSD-Command-manager/internal/jail/manager.go:64.54,66.3 1 1 @@ -533,3 +427,234 @@ FreeBSD-Command-manager/pkg/ifconfig/parser.go:296.16,298.3 1 0 FreeBSD-Command-manager/pkg/ifconfig/parser.go:300.2,301.18 2 2 FreeBSD-Command-manager/pkg/ifconfig/parser.go:301.18,304.3 2 8 FreeBSD-Command-manager/pkg/ifconfig/parser.go:306.2,306.17 1 2 +FreeBSD-Command-manager/internal/network/bareos/basic.go:9.54,10.16 1 3 +FreeBSD-Command-manager/internal/network/bareos/basic.go:10.16,12.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/basic.go:14.2,15.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/basic.go:15.16,17.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/basic.go:20.2,21.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/basic.go:21.16,23.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/basic.go:25.2,25.12 1 2 +FreeBSD-Command-manager/internal/network/bareos/basic.go:29.54,30.16 1 5 +FreeBSD-Command-manager/internal/network/bareos/basic.go:30.16,32.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/basic.go:34.2,35.16 2 4 +FreeBSD-Command-manager/internal/network/bareos/basic.go:35.16,37.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/basic.go:39.2,39.12 1 4 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:8.51,11.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:11.16,13.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:16.2,17.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:17.16,19.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:21.2,21.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:21.16,24.17 2 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:24.17,26.4 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:29.2,29.12 1 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:33.51,34.16 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:34.16,36.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:38.2,38.32 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:42.80,43.22 1 3 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:43.22,45.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:46.2,46.25 1 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:46.25,48.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:51.2,52.16 2 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:52.16,54.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:56.2,56.12 1 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:60.85,61.22 1 3 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:61.22,63.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:64.2,64.25 1 2 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:64.25,66.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:69.2,70.16 2 1 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:70.16,72.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/bridge.go:74.2,74.12 1 1 +FreeBSD-Command-manager/internal/network/bareos/gre.go:8.63,9.18 1 4 +FreeBSD-Command-manager/internal/network/bareos/gre.go:9.18,11.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/gre.go:12.2,12.17 1 3 +FreeBSD-Command-manager/internal/network/bareos/gre.go:12.17,14.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/gre.go:17.2,18.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:18.16,20.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/gre.go:23.2,24.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:24.16,26.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/gre.go:29.2,30.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:30.16,32.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/gre.go:34.2,34.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:34.16,37.17 2 1 +FreeBSD-Command-manager/internal/network/bareos/gre.go:37.17,39.4 1 0 +FreeBSD-Command-manager/internal/network/bareos/gre.go:42.2,42.12 1 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:46.48,47.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/gre.go:47.16,49.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/gre.go:51.2,51.32 1 1 +FreeBSD-Command-manager/internal/network/bareos/ip.go:14.61,15.42 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:15.42,17.3 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:18.2,19.15 2 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:19.15,21.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:22.2,25.16 4 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:25.16,27.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:28.2,28.12 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:32.63,33.42 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:33.42,35.3 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:36.2,37.15 2 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:37.15,39.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:40.2,43.16 4 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:43.16,45.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:46.2,46.12 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:50.64,51.42 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:51.42,53.3 1 3 +FreeBSD-Command-manager/internal/network/bareos/ip.go:54.2,55.15 2 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:55.15,57.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:58.2,61.16 4 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:61.16,63.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/ip.go:64.2,64.12 1 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:48.51,52.2 1 42 +FreeBSD-Command-manager/internal/network/bareos/manager.go:55.51,57.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/manager.go:57.16,59.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:60.2,60.44 1 2 +FreeBSD-Command-manager/internal/network/bareos/manager.go:64.64,65.16 1 3 +FreeBSD-Command-manager/internal/network/bareos/manager.go:65.16,67.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/manager.go:68.2,69.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/manager.go:69.16,71.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:72.2,73.21 2 2 +FreeBSD-Command-manager/internal/network/bareos/manager.go:73.21,75.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:76.2,76.23 1 2 +FreeBSD-Command-manager/internal/network/bareos/manager.go:83.52,85.2 1 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:88.84,92.2 3 0 +FreeBSD-Command-manager/internal/network/bareos/manager.go:95.40,98.2 2 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:12.52,14.18 2 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:14.18,16.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:16.8,18.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:19.2,20.16 2 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:20.16,22.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:23.2,23.28 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:29.49,31.15 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:31.15,33.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:34.2,36.16 3 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:36.16,38.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:39.2,39.12 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:43.65,45.15 2 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:45.15,47.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:48.2,49.17 2 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:49.17,51.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:52.2,54.16 3 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:54.16,56.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:57.2,57.12 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:62.45,64.15 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:64.15,66.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:67.2,67.26 1 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:67.26,69.17 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:69.17,71.4 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:72.3,72.17 1 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:72.17,74.4 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:76.2,78.16 3 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:78.16,80.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:81.2,81.12 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:85.60,88.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:88.16,90.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:92.2,93.16 2 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:93.16,95.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:96.2,96.20 1 1 +FreeBSD-Command-manager/internal/network/bareos/route.go:100.53,102.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:102.16,104.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/route.go:105.2,106.48 2 2 +FreeBSD-Command-manager/internal/network/bareos/route.go:106.48,108.48 2 5 +FreeBSD-Command-manager/internal/network/bareos/route.go:108.48,110.4 1 3 +FreeBSD-Command-manager/internal/network/bareos/route.go:112.2,112.19 1 2 +FreeBSD-Command-manager/internal/network/bareos/testing.go:11.52,17.2 1 43 +FreeBSD-Command-manager/internal/network/bareos/testing.go:20.84,23.27 2 46 +FreeBSD-Command-manager/internal/network/bareos/testing.go:23.27,25.3 1 123 +FreeBSD-Command-manager/internal/network/bareos/testing.go:26.2,29.45 2 46 +FreeBSD-Command-manager/internal/network/bareos/testing.go:29.45,31.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/testing.go:34.2,34.49 1 45 +FreeBSD-Command-manager/internal/network/bareos/testing.go:34.49,36.3 1 34 +FreeBSD-Command-manager/internal/network/bareos/testing.go:38.2,38.16 1 11 +FreeBSD-Command-manager/internal/network/bareos/testing.go:42.65,44.2 1 34 +FreeBSD-Command-manager/internal/network/bareos/testing.go:47.67,49.2 1 1 +FreeBSD-Command-manager/internal/network/bareos/testing.go:52.54,54.2 1 28 +FreeBSD-Command-manager/internal/network/bareos/testing.go:57.47,59.2 1 1 +FreeBSD-Command-manager/internal/network/bareos/testing.go:62.40,65.2 2 1 +FreeBSD-Command-manager/internal/network/bareos/testing.go:68.75,70.2 1 0 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:8.69,9.18 1 5 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:9.18,11.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:12.2,12.33 1 4 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:12.33,14.3 1 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:17.2,18.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:18.16,20.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:23.2,24.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:24.16,26.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:29.2,30.16 2 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:30.16,32.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:34.2,34.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:34.16,37.17 2 1 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:37.17,39.4 1 0 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:42.2,42.12 1 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:46.49,47.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:47.16,49.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vlan.go:51.2,51.32 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:10.90,11.17 1 9 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:11.17,13.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:14.2,14.18 1 8 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:14.18,16.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:17.2,17.39 1 7 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:17.39,19.3 1 2 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:22.2,22.31 1 5 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:22.31,24.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:25.2,25.32 1 4 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:25.32,27.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:30.2,31.16 2 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:31.16,33.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:36.2,39.17 2 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:39.17,41.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:42.2,42.15 1 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:42.15,44.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:47.2,48.16 2 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:48.16,50.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:53.2,54.16 2 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:54.16,56.3 1 0 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:58.2,58.16 1 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:58.16,61.17 2 2 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:61.17,63.4 1 0 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:66.2,66.12 1 3 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:70.50,71.16 1 2 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:71.16,73.3 1 1 +FreeBSD-Command-manager/internal/network/bareos/vxlan.go:75.2,75.32 1 1 +FreeBSD-Command-manager/pkg/netstat/parser.go:24.24,26.2 1 0 +FreeBSD-Command-manager/pkg/netstat/parser.go:29.51,35.21 5 3 +FreeBSD-Command-manager/pkg/netstat/parser.go:35.21,38.23 3 14 +FreeBSD-Command-manager/pkg/netstat/parser.go:38.23,39.12 1 1 +FreeBSD-Command-manager/pkg/netstat/parser.go:42.3,42.105 1 13 +FreeBSD-Command-manager/pkg/netstat/parser.go:42.105,44.29 2 2 +FreeBSD-Command-manager/pkg/netstat/parser.go:44.29,46.5 1 10 +FreeBSD-Command-manager/pkg/netstat/parser.go:47.4,47.12 1 2 +FreeBSD-Command-manager/pkg/netstat/parser.go:49.3,49.19 1 11 +FreeBSD-Command-manager/pkg/netstat/parser.go:49.19,50.12 1 4 +FreeBSD-Command-manager/pkg/netstat/parser.go:53.3,53.35 1 7 +FreeBSD-Command-manager/pkg/netstat/parser.go:53.35,54.12 1 1 +FreeBSD-Command-manager/pkg/netstat/parser.go:57.3,58.67 2 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:58.67,60.4 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:61.3,61.63 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:61.63,63.4 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:64.3,64.61 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:64.61,66.4 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:67.3,67.61 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:67.61,69.4 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:69.9,69.68 1 0 +FreeBSD-Command-manager/pkg/netstat/parser.go:69.68,71.4 1 0 +FreeBSD-Command-manager/pkg/netstat/parser.go:72.3,72.62 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:72.62,74.4 1 0 +FreeBSD-Command-manager/pkg/netstat/parser.go:77.3,77.45 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:77.45,79.4 1 6 +FreeBSD-Command-manager/pkg/netstat/parser.go:81.2,81.38 1 3 +FreeBSD-Command-manager/pkg/netstat/parser.go:81.38,83.3 1 0 +FreeBSD-Command-manager/pkg/netstat/parser.go:84.2,84.18 1 3 +FreeBSD-Command-manager/pkg/netstat/parser.go:84.18,86.3 1 1 +FreeBSD-Command-manager/pkg/netstat/parser.go:87.2,87.20 1 2 +FreeBSD-Command-manager/pkg/jail/parser.go:19.51,23.21 4 3 +FreeBSD-Command-manager/pkg/jail/parser.go:23.21,25.24 2 8 +FreeBSD-Command-manager/pkg/jail/parser.go:25.24,27.12 2 2 +FreeBSD-Command-manager/pkg/jail/parser.go:29.3,30.34 2 6 +FreeBSD-Command-manager/pkg/jail/parser.go:30.34,31.12 1 1 +FreeBSD-Command-manager/pkg/jail/parser.go:33.3,34.29 2 5 +FreeBSD-Command-manager/pkg/jail/parser.go:34.29,35.13 1 25 +FreeBSD-Command-manager/pkg/jail/parser.go:36.16,37.26 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:38.17,39.28 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:40.20,41.26 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:42.20,43.26 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:44.16,45.26 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:48.3,48.30 1 5 +FreeBSD-Command-manager/pkg/jail/parser.go:50.2,50.19 1 3 diff --git a/internal/network/bareos/ip.go b/internal/network/bareos/ip.go index 31bbdca..16dbbb0 100644 --- a/internal/network/bareos/ip.go +++ b/internal/network/bareos/ip.go @@ -5,7 +5,10 @@ import ( "os/exec" ) -const defaultFamily = "inet" +const ( + inetFamily = "inet" + inet6Family = "inet6" +) // AddIP adds an IP address to an interface (IPv4 or IPv6). func AddIP(iface, ip string, mask int, family string) error { @@ -14,7 +17,7 @@ func AddIP(iface, ip string, mask int, family string) error { } fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } addr := fmt.Sprintf("%s/%d", ip, mask) execCmd := exec.Command("ifconfig", iface, fam, addr, "add") //nolint:gosec @@ -32,7 +35,7 @@ func AliasIP(iface, ip string, mask int, family string) error { } fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } addr := fmt.Sprintf("%s/%d", ip, mask) execCmd := exec.Command("ifconfig", iface, fam, addr, "alias") //nolint:gosec @@ -50,7 +53,7 @@ func DeleteIP(iface, ip string, mask int, family string) error { } fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } addr := fmt.Sprintf("%s/%d", ip, mask) execCmd := exec.Command("ifconfig", iface, fam, addr, "delete") //nolint:gosec diff --git a/internal/network/bareos/manager_test.go b/internal/network/bareos/manager_test.go index f1aa910..5dcb92d 100644 --- a/internal/network/bareos/manager_test.go +++ b/internal/network/bareos/manager_test.go @@ -1,13 +1,14 @@ package bareos import ( + "FreeBSD-Command-manager/pkg/ifconfig" "errors" "os/exec" "strings" "testing" ) -const inet6Family = "inet6" +const testDefaultRoute = "default" func TestBareOSManager_CreateInterface(t *testing.T) { tests := []struct { @@ -726,19 +727,19 @@ func TestBareOSManager_RemoveInterfaceFromBridge(t *testing.T) { func TestAddIP_InvalidInput(t *testing.T) { t.Run("empty iface", func(t *testing.T) { - err := AddIP("", "192.168.1.10", 24, defaultFamily) + err := AddIP("", "192.168.1.10", 24, inetFamily) if err == nil { t.Error("expected error for empty iface") } }) t.Run("empty ip", func(t *testing.T) { - err := AddIP("em0", "", 24, defaultFamily) + err := AddIP("em0", "", 24, inetFamily) if err == nil { t.Error("expected error for empty ip") } }) t.Run("zero mask", func(t *testing.T) { - err := AddIP("em0", "192.168.1.10", 0, defaultFamily) + err := AddIP("em0", "192.168.1.10", 0, inetFamily) if err == nil { t.Error("expected error for zero mask") } @@ -747,19 +748,19 @@ func TestAddIP_InvalidInput(t *testing.T) { func TestAliasIP_InvalidInput(t *testing.T) { t.Run("empty iface", func(t *testing.T) { - err := AliasIP("", "192.168.1.20", 24, defaultFamily) + err := AliasIP("", "192.168.1.20", 24, inetFamily) if err == nil { t.Error("expected error for empty iface") } }) t.Run("empty ip", func(t *testing.T) { - err := AliasIP("em0", "", 24, defaultFamily) + err := AliasIP("em0", "", 24, inetFamily) if err == nil { t.Error("expected error for empty ip") } }) t.Run("zero mask", func(t *testing.T) { - err := AliasIP("em0", "192.168.1.20", 0, defaultFamily) + err := AliasIP("em0", "192.168.1.20", 0, inetFamily) if err == nil { t.Error("expected error for zero mask") } @@ -768,19 +769,19 @@ func TestAliasIP_InvalidInput(t *testing.T) { func TestDeleteIP_InvalidInput(t *testing.T) { t.Run("empty iface", func(t *testing.T) { - err := DeleteIP("", "192.168.1.10", 24, defaultFamily) + err := DeleteIP("", "192.168.1.10", 24, inetFamily) if err == nil { t.Error("expected error for empty iface") } }) t.Run("empty ip", func(t *testing.T) { - err := DeleteIP("em0", "", 24, defaultFamily) + err := DeleteIP("em0", "", 24, inetFamily) if err == nil { t.Error("expected error for empty ip") } }) t.Run("zero mask", func(t *testing.T) { - err := DeleteIP("em0", "192.168.1.10", 0, defaultFamily) + err := DeleteIP("em0", "192.168.1.10", 0, inetFamily) if err == nil { t.Error("expected error for zero mask") } @@ -797,7 +798,7 @@ func TestAddRoute(t *testing.T) { return exec.Command("echo") // always succeeds } - err := AddRoute(defaultFamily, "10.0.0.0/24", "10.0.0.1") + err := AddRoute(inetFamily, "10.0.0.0/24", "10.0.0.1") if err != nil { t.Errorf("expected no error, got %v", err) } @@ -814,7 +815,7 @@ func TestAddRoute_Error(t *testing.T) { return exec.Command("false") // always fails } - err := AddRoute(defaultFamily, "10.0.0.0/24", "10.0.0.1") + err := AddRoute(inetFamily, "10.0.0.0/24", "10.0.0.1") if err == nil || !strings.Contains(err.Error(), "route add error") { t.Errorf("expected route add error, got %v", err) } @@ -826,7 +827,7 @@ func TestDelRoute_LastDefault(t *testing.T) { defer func() { listRoutes = oldListRoutes; execCommand = oldExecCommand }() listRoutes = func(family string) (string, error) { - if family == defaultFamily { + if family == inetFamily { return "default 10.0.0.1\n", nil // only one default } if family == inet6Family { @@ -835,7 +836,7 @@ func TestDelRoute_LastDefault(t *testing.T) { return "", nil } - err := DelRoute(defaultFamily, "default") + err := DelRoute(inetFamily, "default") if err == nil || !strings.Contains(err.Error(), "cannot delete the last default route") { t.Errorf("expected last default route error, got %v", err) } @@ -847,7 +848,7 @@ func TestDelRoute_Success(t *testing.T) { defer func() { listRoutes = oldListRoutes; execCommand = oldExecCommand }() listRoutes = func(family string) (string, error) { - if family == defaultFamily { + if family == inetFamily { return "default 10.0.0.1\ndefault 10.0.0.2\n", nil // two defaults } if family == inet6Family { @@ -859,7 +860,7 @@ func TestDelRoute_Success(t *testing.T) { return exec.Command("echo", "") // always succeeds } - err := DelRoute(defaultFamily, "default") + err := DelRoute(inetFamily, "default") if err != nil { t.Errorf("expected no error, got %v", err) } @@ -870,21 +871,30 @@ func TestListAllRoutes(t *testing.T) { defer func() { listRoutes = oldListRoutes }() listRoutes = func(family string) (string, error) { - if family == defaultFamily { - return "default 10.0.0.1\n10.0.0.0/24 10.0.0.1\n", nil + if family == inetFamily { + return `Destination Gateway Flags Netif +10.0.0.0/24 10.0.0.1 UGS em0 +default 10.0.0.1 UGS em0 +`, nil } if family == inet6Family { - return "default fe80::1\n2001:db8::/64 fe80::1\n", nil + return `Destination Gateway Flags Netif +2001:db8::/64 fe80::1 UGS em1 +default fe80::1 UGS em1 +`, nil } return "", nil } - out, err := ListAllRoutes("") + routes, err := ListAllRoutes(inetFamily) if err != nil { t.Errorf("expected no error, got %v", err) } - if !strings.Contains(out, "IPv4 routes:") || !strings.Contains(out, "IPv6 routes:") { - t.Errorf("expected both IPv4 and IPv6 routes, got %s", out) + if len(routes) != 2 { + t.Errorf("expected 2 routes, got %d", len(routes)) + } + if routes[0].Destination != "10.0.0.0/24" || routes[1].Destination != testDefaultRoute { + t.Errorf("unexpected route destinations: %+v", routes) } } @@ -896,8 +906,74 @@ func TestListAllRoutes_Error(t *testing.T) { return "", errors.New("fail") } - _, err := ListAllRoutes(defaultFamily) + _, err := ListAllRoutes(inetFamily) if err == nil || !strings.Contains(err.Error(), "fail") { t.Errorf("expected error, got %v", err) } } + +func TestManager_List_IPs(t *testing.T) { + mockCmd := NewMockCommandExecutor() + mockCmd.SetOutput("ifconfig", `em0: flags=1008843 metric 0 mtu 1500 + inet 192.168.1.10 netmask 0xffffff00 + inet6 fe80::1 prefixlen 64 +lo0: flags=1008049 metric 0 mtu 16384 + inet 127.0.0.1 netmask 0xff000000 + inet6 ::1 prefixlen 128 +`) + manager := NewManager(mockCmd) + infos, err := manager.List() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + // Check em0 + em0 := findInfo(infos, "em0") + if em0 == nil { + t.Fatal("em0 not found") + } + if len(em0.IPv4) != 1 || em0.IPv4[0] != "192.168.1.10/24" { + t.Errorf("em0 IPv4 mismatch: %v", em0.IPv4) + } + if len(em0.IPv6) != 1 || em0.IPv6[0] != "fe80::1/64" { + t.Errorf("em0 IPv6 mismatch: %v", em0.IPv6) + } + // Check lo0 + lo0 := findInfo(infos, "lo0") + if lo0 == nil { + t.Fatal("lo0 not found") + } + if len(lo0.IPv4) != 1 || lo0.IPv4[0] != "127.0.0.1/8" { + t.Errorf("lo0 IPv4 mismatch: %v", lo0.IPv4) + } + if len(lo0.IPv6) != 1 || lo0.IPv6[0] != "::1/128" { + t.Errorf("lo0 IPv6 mismatch: %v", lo0.IPv6) + } +} + +func TestManager_GetInfo_IPs(t *testing.T) { + mockCmd := NewMockCommandExecutor() + mockCmd.SetOutput("ifconfig em0", `em0: flags=1008843 metric 0 mtu 1500 + inet 192.168.1.10 netmask 0xffffff00 + inet6 fe80::1 prefixlen 64 +`) + manager := NewManager(mockCmd) + info, err := manager.GetInfo("em0") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(info.IPv4) != 1 || info.IPv4[0] != "192.168.1.10/24" { + t.Errorf("em0 IPv4 mismatch: %v", info.IPv4) + } + if len(info.IPv6) != 1 || info.IPv6[0] != "fe80::1/64" { + t.Errorf("em0 IPv6 mismatch: %v", info.IPv6) + } +} + +func findInfo(infos []ifconfig.Info, name string) *ifconfig.Info { + for i := range infos { + if infos[i].Name == name { + return &infos[i] + } + } + return nil +} diff --git a/internal/network/bareos/route.go b/internal/network/bareos/route.go index 76027f1..f456268 100644 --- a/internal/network/bareos/route.go +++ b/internal/network/bareos/route.go @@ -1,6 +1,7 @@ package bareos import ( + "FreeBSD-Command-manager/pkg/netstat" "fmt" "os/exec" "strings" @@ -9,10 +10,12 @@ import ( var execCommand = exec.Command func realListRoutes(family string) (string, error) { + var cmd *exec.Cmd if family == "" { - family = defaultFamily + cmd = execCommand("netstat", "-rn") + } else { + cmd = execCommand("netstat", "-rn", "-f", family) } - cmd := execCommand("netstat", "-rn", "-f", family) output, err := cmd.CombinedOutput() if err != nil { return "", fmt.Errorf("route list error: %v, output: %s", err, string(output)) @@ -26,7 +29,7 @@ var listRoutes = realListRoutes func AddRoute(family, network, gw string) error { fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } cmd := execCommand("route", "-n", "add", "-"+fam, network, gw) output, err := cmd.CombinedOutput() @@ -40,7 +43,7 @@ func AddRoute(family, network, gw string) error { func AddRouteWithIface(family, network, gw, iface string) error { fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } args := []string{"-n", "add", "-" + fam, network, gw} if iface != "" { @@ -59,7 +62,7 @@ func AddRouteWithIface(family, network, gw, iface string) error { func DelRoute(family, network string) error { fam := family if fam == "" { - fam = defaultFamily + fam = inetFamily } if network == "default" { count, err := countDefaultRoutes(fam) @@ -78,20 +81,19 @@ func DelRoute(family, network string) error { return nil } -// ListAllRoutes lists both IPv4 and IPv6 routes if family is empty, otherwise lists the specified family. -func ListAllRoutes(family string) (string, error) { - if family != "" { - return listRoutes(family) - } - ipv4, err := listRoutes(defaultFamily) +// ListAllRoutes lists both IPv4 and IPv6 routes as a JSON string using the netstat parser. +func ListAllRoutes(family string) ([]netstat.Route, error) { + output, err := listRoutes(family) + if err != nil { - return "", fmt.Errorf("IPv4: %v", err) + return nil, fmt.Errorf("route list error: %w, output: %s", err, output) } - ipv6, err := listRoutes("inet6") + + routes, err := netstat.ParseNetstat(output) if err != nil { - return "", fmt.Errorf("IPv6: %v", err) + return nil, fmt.Errorf("parse netstat error: %w", err) } - return fmt.Sprintf("IPv4 routes:\n%s\nIPv6 routes:\n%s", ipv4, ipv6), nil + return routes, nil } // countDefaultRoutes returns the number of default routes for the given family. diff --git a/pkg/netstat/parser.go b/pkg/netstat/parser.go new file mode 100644 index 0000000..7232bf6 --- /dev/null +++ b/pkg/netstat/parser.go @@ -0,0 +1,88 @@ +// Package netstat provides parsing utilities for netstat output. +package netstat + +import ( + "bufio" + "fmt" + "runtime" + "strings" +) + +// Route represents a parsed route entry from netstat output. +type Route struct { + Destination string `json:"destination"` + Gateway string `json:"gateway"` + Genmask string `json:"genmask,omitempty"` + Flags string `json:"flags,omitempty"` + Metric string `json:"metric,omitempty"` + Interface string `json:"interface"` +} + +const minRouteFields = 4 + +// SystemOS returns the current system's OS name in lowercase. +func SystemOS() string { + return strings.ToLower(runtime.GOOS) +} + +// ParseNetstat parses the output of 'netstat -rn' on FreeBSD and returns a slice of Route. +func ParseNetstat(output string) ([]Route, error) { + var routes []Route + var headerIdx = map[string]int{} + var headerFound bool + + scanner := bufio.NewScanner(strings.NewReader(output)) + for scanner.Scan() { + line := scanner.Text() + fields := strings.Fields(line) + if len(fields) == 0 { + continue + } + // Find the header line + if !headerFound && (strings.HasPrefix(line, "Destination") || strings.HasPrefix(line, "destination")) { + headerFound = true + for i, f := range fields { + headerIdx[strings.ToLower(f)] = i + } + continue + } + if !headerFound { + continue + } + // Skip lines that are not data + if len(fields) < minRouteFields { + continue + } + // Parse fields based on header + var r Route + if idx, ok := headerIdx["destination"]; ok && idx < len(fields) { + r.Destination = fields[idx] + } + if idx, ok := headerIdx["gateway"]; ok && idx < len(fields) { + r.Gateway = fields[idx] + } + if idx, ok := headerIdx["flags"]; ok && idx < len(fields) { + r.Flags = fields[idx] + } + if idx, ok := headerIdx["netif"]; ok && idx < len(fields) { + r.Interface = fields[idx] + } else if idx, ok := headerIdx["iface"]; ok && idx < len(fields) { + r.Interface = fields[idx] + } + if idx, ok := headerIdx["metric"]; ok && idx < len(fields) { + r.Metric = fields[idx] + } + // FreeBSD does not have Genmask, so skip + // Only add if Destination and Gateway are present + if r.Destination != "" && r.Gateway != "" { + routes = append(routes, r) + } + } + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("scanner error: %w", err) + } + if !headerFound { + return nil, fmt.Errorf("no netstat header found") + } + return routes, nil +} diff --git a/pkg/netstat/parser_test.go b/pkg/netstat/parser_test.go new file mode 100644 index 0000000..96e3f14 --- /dev/null +++ b/pkg/netstat/parser_test.go @@ -0,0 +1,64 @@ +package netstat + +import ( + "reflect" + "testing" +) + +func TestParseNetstat_FreeBSD(t *testing.T) { + sample := `Routing tables + +Internet: +Destination Gateway Flags Netif Expire +10.0.0.0/24 10.0.0.1 UGS em0 +10.0.0.1 link#1 UHS lo0 +127.0.0.1 link#2 UH lo0 +192.168.1.0/24 192.168.1.1 UGS em1 +192.168.1.1 link#3 UHS lo0 +` + + expected := []Route{ + {Destination: "10.0.0.0/24", Gateway: "10.0.0.1", Flags: "UGS", Interface: "em0"}, + {Destination: "10.0.0.1", Gateway: "link#1", Flags: "UHS", Interface: "lo0"}, + {Destination: "127.0.0.1", Gateway: "link#2", Flags: "UH", Interface: "lo0"}, + {Destination: "192.168.1.0/24", Gateway: "192.168.1.1", Flags: "UGS", Interface: "em1"}, + {Destination: "192.168.1.1", Gateway: "link#3", Flags: "UHS", Interface: "lo0"}, + } + + routes, err := ParseNetstat(sample) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(routes, expected) { + t.Errorf("parsed routes do not match expected.\nGot: %#v\nWant: %#v", routes, expected) + } +} + +func TestParseNetstat_EmptyInput(t *testing.T) { + routes, err := ParseNetstat("") + if err == nil { + t.Error("expected error for missing header, got nil") + } + if len(routes) != 0 { + t.Errorf("expected no routes, got: %#v", routes) + } +} + +func TestParseNetstat_MalformedLines(t *testing.T) { + sample := `Routing tables +Internet: +Destination Gateway Flags Netif Expire +MALFORMED LINE +10.0.0.0/24 10.0.0.1 UGS em0 +` + expected := []Route{ + {Destination: "10.0.0.0/24", Gateway: "10.0.0.1", Flags: "UGS", Interface: "em0"}, + } + routes, err := ParseNetstat(sample) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(routes, expected) { + t.Errorf("parsed routes do not match expected.\nGot: %#v\nWant: %#v", routes, expected) + } +}