diff --git a/cmd/server/init.go b/cmd/server/init.go index 851afba..2043e22 100644 --- a/cmd/server/init.go +++ b/cmd/server/init.go @@ -12,4 +12,6 @@ func init() { probersCmd.AddCommand(deleteProbersCmd) listProbersCmd.Flags().StringP("sort-by", "s", "last_submit_ts", "Sort by column name, can be id or last_submit_ts") listProbersCmd.Flags().StringP("sort-dir", "d", "desc", "Sort direction, can be asc or desc") + cmd.Root.AddCommand(nodeCmd) + nodeCmd.AddCommand(deleteNodeCmd) } diff --git a/cmd/server/node.go b/cmd/server/node.go new file mode 100644 index 0000000..ba8e78c --- /dev/null +++ b/cmd/server/node.go @@ -0,0 +1,59 @@ +package server + +import ( + "fmt" + "log/slog" + "os" + "strconv" + + "github.com/ditatompel/xmr-remote-nodes/internal/database" + "github.com/ditatompel/xmr-remote-nodes/internal/monero" + + "github.com/spf13/cobra" +) + +var nodeCmd = &cobra.Command{ + Use: "node", + Short: "[Server] Administer monitored nodes", + Long: `Command to administer monitored nodes. + +This command should only be run on the server which directly connect to the MySQL database. + `, + Run: func(cmd *cobra.Command, _ []string) { + if err := cmd.Help(); err != nil { + slog.Error(err.Error()) + os.Exit(1) + } + }, +} + +var deleteNodeCmd = &cobra.Command{ + Use: "delete", + Short: "Delete node", + Long: `Delete node identified by ID. + +This command delete node and it's associated probe logs (if exists). + +To find out the node ID, visit frontend UI or from "/api/v1/nodes" endpoint. + `, + Run: func(_ *cobra.Command, _ []string) { + if err := database.ConnectDB(); err != nil { + fmt.Println(err) + return + } + nodeID, err := strconv.Atoi(stringPrompt("Node ID:")) + if err != nil { + fmt.Println("Invalid ID:", err) + return + } + + moneroRepo := monero.New() + err = moneroRepo.Delete(uint(nodeID)) + if err != nil { + fmt.Println("Failed to delete node:", err) + return + } + + fmt.Printf("Node ID %d deleted\n", nodeID) + }, +}