- cmd/root.go: Cobra root with all 11 subcommands, viper config loading - cmd/stubs.go: 8 stub commands for future phases (verify, import, recon, keys, serve, dorks, hook, schedule) - cmd/scan.go: scan command wiring engine + storage + output with per-installation salt - cmd/providers.go: providers list/info/stats subcommands - cmd/config.go: config init/set/get subcommands - pkg/config/config.go: Config struct with Load() and defaults - pkg/output/table.go: lipgloss terminal table for PrintFindings - pkg/storage/settings.go: GetSetting/SetSetting for settings table CRUD
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
var configCmd = &cobra.Command{
|
|
Use: "config",
|
|
Short: "Manage KeyHunter configuration",
|
|
}
|
|
|
|
var configInitCmd = &cobra.Command{
|
|
Use: "init",
|
|
Short: "Create default configuration file at ~/.keyhunter.yaml",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
home, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return fmt.Errorf("cannot determine home directory: %w", err)
|
|
}
|
|
configPath := filepath.Join(home, ".keyhunter.yaml")
|
|
|
|
// Set defaults before writing
|
|
viper.SetDefault("scan.workers", 0)
|
|
viper.SetDefault("database.path", filepath.Join(home, ".keyhunter", "keyhunter.db"))
|
|
|
|
if err := viper.WriteConfigAs(configPath); err != nil {
|
|
return fmt.Errorf("writing config: %w", err)
|
|
}
|
|
fmt.Printf("Config initialized: %s\n", configPath)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var configSetCmd = &cobra.Command{
|
|
Use: "set <key> <value>",
|
|
Short: "Set a configuration value",
|
|
Args: cobra.ExactArgs(2),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
key, value := args[0], args[1]
|
|
viper.Set(key, value)
|
|
if err := viper.WriteConfig(); err != nil {
|
|
// If config file doesn't exist yet, create it
|
|
home, _ := os.UserHomeDir()
|
|
configPath := filepath.Join(home, ".keyhunter.yaml")
|
|
if err2 := viper.WriteConfigAs(configPath); err2 != nil {
|
|
return fmt.Errorf("writing config: %w", err2)
|
|
}
|
|
}
|
|
fmt.Printf("Set %s = %s\n", key, value)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var configGetCmd = &cobra.Command{
|
|
Use: "get <key>",
|
|
Short: "Get a configuration value",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
val := viper.Get(args[0])
|
|
if val == nil {
|
|
return fmt.Errorf("key %q not found", args[0])
|
|
}
|
|
fmt.Printf("%v\n", val)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
configCmd.AddCommand(configInitCmd)
|
|
configCmd.AddCommand(configSetCmd)
|
|
configCmd.AddCommand(configGetCmd)
|
|
}
|