From 9ca2ae7fc5c9b58d7024372ff1a4c8358b5f4fed Mon Sep 17 00:00:00 2001 From: Juan Font Alonso Date: Sat, 17 Jul 2021 00:23:12 +0200 Subject: [PATCH] Implemented delete nodes (#52) --- cmd/headscale/cli/nodes.go | 35 +++++++++++++++++++++++++++++++++-- cmd/headscale/headscale.go | 1 + machine.go | 4 ++-- machine_test.go | 4 ++-- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/cmd/headscale/cli/nodes.go b/cmd/headscale/cli/nodes.go index 5115128c..80f93cc0 100644 --- a/cmd/headscale/cli/nodes.go +++ b/cmd/headscale/cli/nodes.go @@ -3,6 +3,7 @@ package cli import ( "fmt" "log" + "strconv" "strings" "time" @@ -71,7 +72,7 @@ var ListNodesCmd = &cobra.Command{ log.Fatalf("Error getting nodes: %s", err) } - fmt.Printf("name\t\tlast seen\t\tephemeral\n") + fmt.Printf("ID\tname\t\tlast seen\t\tephemeral\n") for _, m := range *machines { var ephemeral bool if m.AuthKey != nil && m.AuthKey.Ephemeral { @@ -81,8 +82,38 @@ var ListNodesCmd = &cobra.Command{ if m.LastSeen != nil { lastSeen = *m.LastSeen } - fmt.Printf("%s\t%s\t%t\n", m.Name, lastSeen.Format("2006-01-02 15:04:05"), ephemeral) + fmt.Printf("%d\t%s\t%s\t%t\n", m.ID, m.Name, lastSeen.Format("2006-01-02 15:04:05"), ephemeral) } }, } + +var DeleteCmd = &cobra.Command{ + Use: "delete ID", + Short: "Delete a node", + Args: func(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("Missing parameters") + } + return nil + }, + Run: func(cmd *cobra.Command, args []string) { + h, err := getHeadscaleApp() + if err != nil { + log.Fatalf("Error initializing: %s", err) + } + id, err := strconv.Atoi(args[0]) + if err != nil { + log.Fatalf("Error converting ID to integer: %s", err) + } + m, err := h.GetMachineByID(uint64(id)) + if err != nil { + log.Fatalf("Error getting node: %s", err) + } + err = h.DeleteMachine(m) + if err != nil { + log.Fatalf("Error deleting node: %s", err) + } + fmt.Printf("Node deleted\n") + }, +} diff --git a/cmd/headscale/headscale.go b/cmd/headscale/headscale.go index f16ac7e7..195cec00 100644 --- a/cmd/headscale/headscale.go +++ b/cmd/headscale/headscale.go @@ -73,6 +73,7 @@ func main() { cli.NodeCmd.AddCommand(cli.ListNodesCmd) cli.NodeCmd.AddCommand(cli.RegisterCmd) + cli.NodeCmd.AddCommand(cli.DeleteCmd) cli.RoutesCmd.AddCommand(cli.ListRoutesCmd) cli.RoutesCmd.AddCommand(cli.EnableRouteCmd) diff --git a/machine.go b/machine.go index 5dcd5714..9dc9be95 100644 --- a/machine.go +++ b/machine.go @@ -198,7 +198,7 @@ func (h *Headscale) GetMachineByID(id uint64) (*Machine, error) { } // DeleteMachine softs deletes a Machine from the database -func (h *Headscale) DeleteMachine(m Machine) error { +func (h *Headscale) DeleteMachine(m *Machine) error { if err := h.db.Delete(&m).Error; err != nil { return err } @@ -206,7 +206,7 @@ func (h *Headscale) DeleteMachine(m Machine) error { } // HardDeleteMachine hard deletes a Machine from the database -func (h *Headscale) HardDeleteMachine(m Machine) error { +func (h *Headscale) HardDeleteMachine(m *Machine) error { if err := h.db.Unscoped().Delete(&m).Error; err != nil { return err } diff --git a/machine_test.go b/machine_test.go index 2e6ae1f6..72d7512f 100644 --- a/machine_test.go +++ b/machine_test.go @@ -79,7 +79,7 @@ func (s *Suite) TestDeleteMachine(c *check.C) { AuthKeyID: uint(1), } h.db.Save(&m) - h.DeleteMachine(m) + h.DeleteMachine(&m) _, err = h.GetMachine(n.Name, "testmachine") c.Assert(err, check.NotNil) } @@ -99,7 +99,7 @@ func (s *Suite) TestHardDeleteMachine(c *check.C) { AuthKeyID: uint(1), } h.db.Save(&m) - h.HardDeleteMachine(m) + h.HardDeleteMachine(&m) _, err = h.GetMachine(n.Name, "testmachine3") c.Assert(err, check.NotNil) }