Cybersecurity-Projects/PROJECTS/advanced/honeypot-network/internal/cli/root.go

114 lines
2.1 KiB
Go

/*
©AngelaMos | 2026
root.go
Cobra root command and CLI entry point for hive
Configures the root command with global persistent flags and
registers all subcommands. Signal handling via NotifyContext
ensures graceful shutdown on SIGINT/SIGTERM.
*/
package cli
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/fatih/color"
"github.com/spf13/cobra"
"github.com/CarterPerez-dev/hive/internal/config"
"github.com/CarterPerez-dev/hive/internal/ui"
)
var (
flagConfig string
flagVerbose bool
flagNoColor bool
)
func Execute() {
os.Exit(run())
}
func run() int {
ctx, cancel := signal.NotifyContext(
context.Background(),
syscall.SIGINT,
syscall.SIGTERM,
)
defer cancel()
if err := newRootCmd().ExecuteContext(ctx); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
return 1
}
return 0
}
func newRootCmd() *cobra.Command {
root := &cobra.Command{
Use: "hive",
Short: "Multi-service honeypot network",
Long: `hive deploys a network of realistic honeypots (SSH, HTTP, FTP,
SMB, MySQL, Redis) that capture attacker behavior, map activity to
MITRE ATT&CK techniques, and generate threat intelligence.`,
SilenceUsage: true,
SilenceErrors: true,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
if flagNoColor {
color.NoColor = true
}
},
}
pflags := root.PersistentFlags()
pflags.StringVarP(
&flagConfig,
"config", "c",
config.DefaultConfigPath,
"Path to config file",
)
pflags.BoolVarP(
&flagVerbose,
"verbose", "v",
false,
"Enable verbose logging",
)
pflags.BoolVar(
&flagNoColor,
"no-color",
false,
"Disable colored output",
)
root.AddCommand(
newServeCmd(),
newMigrateCmd(),
newKeygenCmd(),
newVersionCmd(),
)
return root
}
func newVersionCmd() *cobra.Command {
return &cobra.Command{
Use: "version",
Short: "Print version information",
Run: func(cmd *cobra.Command, args []string) {
ui.PrintBanner()
fmt.Printf(" Version: %s\n", config.ToolVersion)
fmt.Printf(" Module: github.com/CarterPerez-dev/hive\n")
},
}
}
func loadConfig() (*config.Config, error) {
return config.Load(flagConfig)
}