91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
/*
|
|
©AngelaMos | 2026
|
|
root.go
|
|
|
|
Root cobra command and global flag definitions
|
|
|
|
Defines the sentinel root command with persistent flags for JSON
|
|
output, minimum severity filtering, verbose mode, and custom scan
|
|
root. Subcommands are attached in their respective init functions.
|
|
*/
|
|
|
|
package cli
|
|
|
|
import (
|
|
"log/slog"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/CarterPerez-dev/sentinel/internal/ui"
|
|
)
|
|
|
|
const fallbackHostname = "unknown"
|
|
|
|
var (
|
|
flagJSON bool
|
|
flagMinSeverity string
|
|
flagVerbose bool
|
|
flagRoot string
|
|
flagIgnoreFile string
|
|
)
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "sentinel",
|
|
Short: "Linux persistence mechanism scanner",
|
|
Long: `sentinel scans a Linux system for persistence mechanisms
|
|
across systemd, cron, shell profiles, SSH, LD_PRELOAD,
|
|
kernel modules, udev rules, init.d, XDG autostart, at jobs,
|
|
MOTD scripts, and PAM modules.`,
|
|
PersistentPreRun: func(
|
|
cmd *cobra.Command, args []string,
|
|
) {
|
|
configureLogging()
|
|
if !flagJSON {
|
|
ui.PrintBanner()
|
|
}
|
|
},
|
|
}
|
|
|
|
func configureLogging() {
|
|
level := slog.LevelWarn
|
|
if flagVerbose {
|
|
level = slog.LevelDebug
|
|
}
|
|
|
|
handler := slog.NewTextHandler(
|
|
os.Stderr,
|
|
&slog.HandlerOptions{Level: level},
|
|
)
|
|
slog.SetDefault(slog.New(handler))
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.PersistentFlags().BoolVar(
|
|
&flagJSON, "json", false,
|
|
"output results as JSON",
|
|
)
|
|
rootCmd.PersistentFlags().StringVar(
|
|
&flagMinSeverity, "min-severity", "info",
|
|
"minimum severity to report (info|low|medium|high|critical)",
|
|
)
|
|
rootCmd.PersistentFlags().BoolVar(
|
|
&flagVerbose, "verbose", false,
|
|
"enable verbose logging",
|
|
)
|
|
rootCmd.PersistentFlags().StringVar(
|
|
&flagRoot, "root", "/",
|
|
"filesystem root to scan (for testing or chroot)",
|
|
)
|
|
rootCmd.PersistentFlags().StringVar(
|
|
&flagIgnoreFile, "ignore-file", "",
|
|
"path to .sentinel-ignore.yml for suppressing findings",
|
|
)
|
|
}
|
|
|
|
func Execute() {
|
|
if err := rootCmd.Execute(); err != nil {
|
|
os.Exit(1)
|
|
}
|
|
}
|