2024-03-27 02:11:46 -06:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2024-03-28 15:45:20 -06:00
|
|
|
"context"
|
2024-03-27 02:11:46 -06:00
|
|
|
"flag"
|
|
|
|
"fmt"
|
2024-03-28 15:45:20 -06:00
|
|
|
"git.pixelridgesoftworks.com/BackGo/pkg/backup"
|
|
|
|
"git.pixelridgesoftworks.com/BackGo/pkg/logger"
|
2024-03-27 02:11:46 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
type Command struct {
|
|
|
|
Name string
|
|
|
|
Description string
|
|
|
|
FlagSet *flag.FlagSet
|
|
|
|
SubCommands map[string]*Command
|
2024-03-28 15:45:20 -06:00
|
|
|
Execute func(ctx context.Context, cmd *Command, args []string)
|
2024-03-27 02:11:46 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
var RootCmd = NewCommand("backup", "Main entry point for backup utility", nil)
|
|
|
|
|
2024-03-28 00:48:22 -06:00
|
|
|
func init() {
|
|
|
|
remoteCmd := NewCommand("interface", "Remote node management", nil)
|
|
|
|
|
|
|
|
triggerCmd := NewCommand("trigger", "Trigger an action on a node", handleTrigger)
|
|
|
|
getInfoCmd := NewCommand("getinfo", "Get information from a node", handleGetInfo)
|
|
|
|
addNodeCmd := NewCommand("addnode", "Add a new node to the cluster", handleAddNode)
|
|
|
|
genCertCmd := NewCommand("gencert", "Generate a certificate for a node", handleGenCert)
|
|
|
|
|
|
|
|
remoteCmd.AddSubCommand(triggerCmd)
|
|
|
|
remoteCmd.AddSubCommand(getInfoCmd)
|
|
|
|
remoteCmd.AddSubCommand(addNodeCmd)
|
|
|
|
remoteCmd.AddSubCommand(genCertCmd)
|
|
|
|
|
|
|
|
RootCmd.AddSubCommand(remoteCmd)
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func handleTrigger(ctx context.Context, cmd *Command, args []string) {
|
|
|
|
log := ctx.Value("logger").(*logger.Logger)
|
|
|
|
dbManager := ctx.Value("dbManager").(*backup.DBManager)
|
2024-03-28 00:48:22 -06:00
|
|
|
nodeFlag := cmd.FlagSet.String("node", "", "Specify the node hostname")
|
|
|
|
actionFlag := cmd.FlagSet.String("action", "", "Specify the action to trigger")
|
|
|
|
cmd.FlagSet.Parse(args)
|
|
|
|
|
|
|
|
if *nodeFlag == "" || *actionFlag == "" {
|
2024-03-28 15:45:20 -06:00
|
|
|
log.Println("Both node hostname and action are required")
|
2024-03-28 00:48:22 -06:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
cli := NewInterfaceCLI(*nodeFlag, dbManager)
|
|
|
|
if err := cli.TriggerCommand(*actionFlag, ""); err != nil {
|
|
|
|
log.Printf("Error triggering command on node %s: %v\n", *nodeFlag, err)
|
|
|
|
} else {
|
|
|
|
log.Printf("Command '%s' triggered successfully on node %s\n", *actionFlag, *nodeFlag)
|
|
|
|
}
|
2024-03-28 00:48:22 -06:00
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func handleGetInfo(ctx context.Context, cmd *Command, args []string) {
|
|
|
|
log := ctx.Value("logger").(*logger.Logger)
|
|
|
|
nodeFlag := cmd.FlagSet.String("node", "", "Specify the node address")
|
|
|
|
valueFlag := cmd.FlagSet.String("value", "", "Specify the value for get_info")
|
|
|
|
cmd.FlagSet.Parse(args)
|
|
|
|
|
|
|
|
if *nodeFlag == "" {
|
|
|
|
log.Println("Node address is required")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
dbManager := ctx.Value("dbManager").(*backup.DBManager)
|
|
|
|
cli := NewInterfaceCLI(*nodeFlag, dbManager)
|
|
|
|
if err := cli.GetInfo(*valueFlag); err != nil {
|
|
|
|
log.Printf("Error getting info from node %s: %v\n", *nodeFlag, err)
|
|
|
|
} else {
|
|
|
|
log.Printf("Successfully got info from node %s\n", *nodeFlag)
|
|
|
|
}
|
2024-03-28 00:48:22 -06:00
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func handleAddNode(ctx context.Context, cmd *Command, args []string) {
|
|
|
|
dbManager := ctx.Value("dbManager").(*backup.DBManager)
|
2024-03-28 00:48:22 -06:00
|
|
|
nodeName := cmd.FlagSet.String("node", "", "Specify the node name")
|
|
|
|
cmd.FlagSet.Parse(args)
|
|
|
|
|
|
|
|
if *nodeName == "" {
|
|
|
|
fmt.Println("Node name is required")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
token := "some_generated_token"
|
2024-03-28 00:48:22 -06:00
|
|
|
if err := dbManager.CreateToken(*nodeName, token); err != nil {
|
|
|
|
fmt.Printf("Error adding new node %s: %v\n", *nodeName, err)
|
2024-03-28 15:45:20 -06:00
|
|
|
} else {
|
|
|
|
fmt.Printf("New node %s added successfully with token %s\n", *nodeName, token)
|
2024-03-28 00:48:22 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func handleGenCert(ctx context.Context, cmd *Command, args []string) {
|
|
|
|
log := ctx.Value("logger").(*logger.Logger)
|
|
|
|
dbManager := ctx.Value("dbManager").(*backup.DBManager)
|
|
|
|
nodeNameFlag := cmd.FlagSet.String("node", "", "Specify the node name for which to generate a certificate")
|
|
|
|
cmd.FlagSet.Parse(args)
|
|
|
|
|
|
|
|
if *nodeNameFlag == "" {
|
|
|
|
log.Println("Node name is required")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
cli := NewInterfaceCLI(*nodeNameFlag, dbManager)
|
|
|
|
if err := cli.GenCert(*nodeNameFlag); err != nil {
|
|
|
|
log.Printf("Error generating certificate for node %s: %v\n", *nodeNameFlag, err)
|
|
|
|
} else {
|
|
|
|
log.Printf("Certificate generated successfully for node %s\n", *nodeNameFlag)
|
|
|
|
}
|
2024-03-28 00:48:22 -06:00
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func NewCommand(name, description string, execute func(ctx context.Context, cmd *Command, args []string)) *Command {
|
2024-03-27 02:11:46 -06:00
|
|
|
return &Command{
|
|
|
|
Name: name,
|
|
|
|
Description: description,
|
|
|
|
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
|
|
|
|
SubCommands: make(map[string]*Command),
|
|
|
|
Execute: execute,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Command) AddSubCommand(subCmd *Command) {
|
|
|
|
c.SubCommands[subCmd.Name] = subCmd
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Command) FindSubCommand(name string) (*Command, bool) {
|
|
|
|
subCmd, found := c.SubCommands[name]
|
|
|
|
return subCmd, found
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func ExecuteCommandWithContext(ctx context.Context, rootCmd *Command, args []string) error {
|
2024-03-27 02:11:46 -06:00
|
|
|
if len(args) < 1 {
|
|
|
|
fmt.Println("No command provided")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
cmdName := args[0]
|
|
|
|
subArgs := args[1:]
|
|
|
|
|
|
|
|
cmd, found := rootCmd.FindSubCommand(cmdName)
|
|
|
|
if !found {
|
|
|
|
fmt.Printf("Unknown command: %s\n", cmdName)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
if cmd.Execute != nil {
|
|
|
|
cmd.Execute(ctx, cmd, subArgs)
|
|
|
|
} else {
|
|
|
|
fmt.Println("No execute function provided for command:", cmdName)
|
2024-03-27 02:11:46 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|