2021-08-02 01:10:41 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
2022-01-18 13:13:20 +00:00
|
|
|
"context"
|
2021-11-03 07:34:36 +00:00
|
|
|
"fmt"
|
2021-10-22 10:01:17 +00:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
|
2021-08-03 11:57:12 +00:00
|
|
|
"coopcloud.tech/abra/cli/internal"
|
2021-09-05 19:37:03 +00:00
|
|
|
"coopcloud.tech/abra/pkg/client"
|
2021-10-22 10:01:17 +00:00
|
|
|
"coopcloud.tech/abra/pkg/config"
|
2021-12-28 00:24:23 +00:00
|
|
|
"coopcloud.tech/abra/pkg/formatter"
|
2021-11-03 07:34:36 +00:00
|
|
|
"github.com/AlecAivazis/survey/v2"
|
|
|
|
"github.com/hetznercloud/hcloud-go/hcloud"
|
2021-08-02 01:10:41 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2022-01-18 13:13:20 +00:00
|
|
|
"github.com/urfave/cli"
|
2021-08-02 01:10:41 +00:00
|
|
|
)
|
|
|
|
|
2021-10-22 10:01:17 +00:00
|
|
|
var rmServer bool
|
|
|
|
var rmServerFlag = &cli.BoolFlag{
|
2022-01-18 13:13:20 +00:00
|
|
|
Name: "server, s",
|
2021-11-03 07:34:36 +00:00
|
|
|
Usage: "remove the actual server also",
|
2021-10-22 10:01:17 +00:00
|
|
|
Destination: &rmServer,
|
|
|
|
}
|
|
|
|
|
|
|
|
func rmHetznerCloudVPS(c *cli.Context) error {
|
2021-11-03 07:34:36 +00:00
|
|
|
if internal.HetznerCloudName == "" && !internal.NoInput {
|
|
|
|
prompt := &survey.Input{
|
|
|
|
Message: "specify hetzner cloud VPS name",
|
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &internal.HetznerCloudName); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if internal.HetznerCloudAPIToken == "" && !internal.NoInput {
|
|
|
|
token, ok := os.LookupEnv("HCLOUD_TOKEN")
|
|
|
|
if !ok {
|
|
|
|
prompt := &survey.Input{
|
|
|
|
Message: "specify hetzner cloud API token",
|
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &internal.HetznerCloudAPIToken); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
internal.HetznerCloudAPIToken = token
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
client := hcloud.NewClient(hcloud.WithToken(internal.HetznerCloudAPIToken))
|
|
|
|
|
2022-01-18 13:13:20 +00:00
|
|
|
server, _, err := client.Server.Get(context.Background(), internal.HetznerCloudName)
|
2021-11-03 07:34:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if server == nil {
|
|
|
|
logrus.Fatalf("library provider reports that %s doesn't exist?", internal.HetznerCloudName)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(fmt.Sprintf(`
|
|
|
|
You have requested that Abra delete the following server (%s). Please be
|
|
|
|
absolutely sure that this is indeed the server that you would like to have
|
|
|
|
removed. There will be no going back once you confirm, the server will be
|
|
|
|
destroyed.
|
|
|
|
`, server.Name))
|
|
|
|
|
|
|
|
tableColumns := []string{"name", "type", "image", "location"}
|
|
|
|
table := formatter.CreateTable(tableColumns)
|
|
|
|
table.Append([]string{
|
|
|
|
server.Name,
|
|
|
|
server.ServerType.Name,
|
|
|
|
server.Image.Name,
|
|
|
|
server.Datacenter.Name,
|
|
|
|
})
|
|
|
|
table.Render()
|
|
|
|
|
|
|
|
response := false
|
|
|
|
prompt := &survey.Confirm{
|
|
|
|
Message: "continue with hetzner cloud VPS removal?",
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := survey.AskOne(prompt, &response); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if !response {
|
|
|
|
logrus.Fatal("exiting as requested")
|
|
|
|
}
|
|
|
|
|
2022-01-18 13:13:20 +00:00
|
|
|
_, err = client.Server.Delete(context.Background(), server)
|
2021-11-03 07:34:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Infof("%s has been deleted from your hetzner cloud account", internal.HetznerCloudName)
|
|
|
|
|
2021-10-22 10:01:17 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-01-18 13:13:20 +00:00
|
|
|
var serverRemoveCommand = cli.Command{
|
2021-11-03 07:34:36 +00:00
|
|
|
Name: "remove",
|
|
|
|
Aliases: []string{"rm"},
|
2022-01-02 00:52:49 +00:00
|
|
|
ArgsUsage: "[<server>]",
|
2021-11-03 07:34:36 +00:00
|
|
|
Usage: "Remove a managed server",
|
2021-09-04 23:34:56 +00:00
|
|
|
Description: `
|
2021-11-03 07:34:36 +00:00
|
|
|
This command removes a server from Abra management.
|
2021-10-22 10:01:17 +00:00
|
|
|
|
|
|
|
Depending on whether you used a 3rd party provider to create this server ("abra
|
|
|
|
server new"), you can also destroy the virtual server as well. Pass
|
|
|
|
"--server/-s" to tell Abra to try to delete this VPS.
|
|
|
|
|
|
|
|
Otherwise, Abra will remove the internal bookkeeping (~/.abra/servers/...) and
|
|
|
|
underlying client connection context. This server will then be lost in time,
|
|
|
|
like tears in rain.
|
2021-09-04 23:34:56 +00:00
|
|
|
`,
|
2021-10-22 10:01:17 +00:00
|
|
|
Flags: []cli.Flag{
|
2022-01-18 13:13:20 +00:00
|
|
|
internal.DebugFlag,
|
|
|
|
internal.NoInputFlag,
|
2021-10-22 10:01:17 +00:00
|
|
|
rmServerFlag,
|
2022-01-02 00:52:49 +00:00
|
|
|
internal.ServerProviderFlag,
|
2021-11-03 07:34:36 +00:00
|
|
|
|
|
|
|
// Hetzner
|
|
|
|
internal.HetznerCloudNameFlag,
|
|
|
|
internal.HetznerCloudAPITokenFlag,
|
2021-10-22 10:01:17 +00:00
|
|
|
},
|
2022-01-18 13:13:20 +00:00
|
|
|
Before: internal.SubCommandBefore,
|
2021-08-02 01:10:41 +00:00
|
|
|
Action: func(c *cli.Context) error {
|
2022-02-24 14:57:52 +00:00
|
|
|
serverName := internal.ValidateServer(c)
|
|
|
|
|
|
|
|
warnMsg := `Did not pass -s/--server for actual server deletion, prompting!
|
|
|
|
|
|
|
|
Abra doesn't currently know if it helped you create this server with one of the
|
|
|
|
3rd party integrations (e.g. Capsul). You have a choice here to actually,
|
|
|
|
really and finally destroy this server using those integrations. If you want to
|
|
|
|
do this, choose Yes.
|
|
|
|
|
|
|
|
If you just want to remove the server config files & context, choose No.
|
|
|
|
`
|
2021-09-10 13:04:01 +00:00
|
|
|
|
2021-12-05 00:39:25 +00:00
|
|
|
if !rmServer {
|
2022-02-24 14:57:52 +00:00
|
|
|
logrus.Warn(fmt.Sprintf(warnMsg))
|
2021-12-05 00:39:25 +00:00
|
|
|
|
|
|
|
response := false
|
|
|
|
prompt := &survey.Confirm{
|
2022-02-24 14:57:52 +00:00
|
|
|
Message: "delete actual live server?",
|
2021-12-05 00:39:25 +00:00
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &response); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
if response {
|
|
|
|
logrus.Info("setting -s/--server and attempting to remove actual server")
|
|
|
|
rmServer = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-22 10:01:17 +00:00
|
|
|
if rmServer {
|
|
|
|
if err := internal.EnsureServerProvider(); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
switch internal.ServerProvider {
|
|
|
|
case "capsul":
|
|
|
|
logrus.Warn("capsul provider does not support automatic removal yet, sorry!")
|
|
|
|
case "hetzner-cloud":
|
|
|
|
if err := rmHetznerCloudVPS(c); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-24 14:57:52 +00:00
|
|
|
if err := client.DeleteContext(serverName); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
2021-10-22 10:01:17 +00:00
|
|
|
|
2022-02-24 14:57:52 +00:00
|
|
|
if err := os.RemoveAll(filepath.Join(config.SERVERS_DIR, serverName)); err != nil {
|
|
|
|
logrus.Fatal(err)
|
2022-01-02 00:52:49 +00:00
|
|
|
}
|
2021-09-10 13:04:01 +00:00
|
|
|
|
2022-02-24 14:57:52 +00:00
|
|
|
logrus.Infof("server at %s has been lost in time, like tears in rain", serverName)
|
|
|
|
|
2021-08-02 01:10:41 +00:00
|
|
|
return nil
|
|
|
|
},
|
|
|
|
}
|