|
@@ -5,24 +5,21 @@ import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "io/ioutil"
|
|
"log"
|
|
"log"
|
|
"net"
|
|
"net"
|
|
"net/http"
|
|
"net/http"
|
|
"os"
|
|
"os"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
- nodepb "github.com/gravitl/netmaker/grpc"
|
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/models"
|
|
"github.com/gravitl/netmaker/models"
|
|
- "github.com/gravitl/netmaker/netclient/auth"
|
|
|
|
"github.com/gravitl/netmaker/netclient/config"
|
|
"github.com/gravitl/netmaker/netclient/config"
|
|
"github.com/gravitl/netmaker/netclient/daemon"
|
|
"github.com/gravitl/netmaker/netclient/daemon"
|
|
"github.com/gravitl/netmaker/netclient/local"
|
|
"github.com/gravitl/netmaker/netclient/local"
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
"github.com/gravitl/netmaker/netclient/wireguard"
|
|
"github.com/gravitl/netmaker/netclient/wireguard"
|
|
"golang.zx2c4.com/wireguard/wgctrl"
|
|
"golang.zx2c4.com/wireguard/wgctrl"
|
|
- "google.golang.org/grpc"
|
|
|
|
- "google.golang.org/grpc/metadata"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
// LINUX_APP_DATA_PATH - linux path
|
|
// LINUX_APP_DATA_PATH - linux path
|
|
@@ -158,46 +155,25 @@ func LeaveNetwork(network string, force bool) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- servercfg := cfg.Server
|
|
|
|
node := cfg.Node
|
|
node := cfg.Node
|
|
- if node.NetworkSettings.IsComms == "yes" && !force {
|
|
|
|
- return errors.New("COMMS_NET - You are trying to leave the comms network. This will break network updates. Unless you re-join. If you really want to leave, run with --force=yes.")
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if node.IsServer != "yes" {
|
|
if node.IsServer != "yes" {
|
|
- var wcclient nodepb.NodeServiceClient
|
|
|
|
- conn, err := grpc.Dial(cfg.Server.GRPCAddress,
|
|
|
|
- ncutils.GRPCRequestOpts(cfg.Server.GRPCSSL))
|
|
|
|
|
|
+ token, err := Authenticate(cfg)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Printf("Unable to establish client connection to "+servercfg.GRPCAddress+": %v", err)
|
|
|
|
|
|
+ return fmt.Errorf("unable to authenticate %w", err)
|
|
}
|
|
}
|
|
- defer conn.Close()
|
|
|
|
- wcclient = nodepb.NewNodeServiceClient(conn)
|
|
|
|
-
|
|
|
|
- ctx, err := auth.SetJWT(wcclient, network)
|
|
|
|
|
|
+ url := "https://" + cfg.Server.API + "/api/nodes/" + cfg.Network + "/" + cfg.Node.ID
|
|
|
|
+ response, err := API("", http.MethodDelete, url, token)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Printf("Failed to authenticate: %v", err)
|
|
|
|
- } else { // handle client side
|
|
|
|
- var header metadata.MD
|
|
|
|
- nodeData, err := json.Marshal(&node)
|
|
|
|
- if err == nil {
|
|
|
|
- _, err = wcclient.DeleteNode(
|
|
|
|
- ctx,
|
|
|
|
- &nodepb.Object{
|
|
|
|
- Data: string(nodeData),
|
|
|
|
- Type: nodepb.NODE_TYPE,
|
|
|
|
- },
|
|
|
|
- grpc.Header(&header),
|
|
|
|
- )
|
|
|
|
- if err != nil {
|
|
|
|
- logger.Log(1, "encountered error deleting node: ", err.Error())
|
|
|
|
- } else {
|
|
|
|
- logger.Log(1, "removed machine from ", node.Network, " network on remote server")
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ return fmt.Errorf("error deleting node on server %w", err)
|
|
|
|
+ }
|
|
|
|
+ if response.StatusCode == http.StatusOK {
|
|
|
|
+ logger.Log(0, "deleted node", cfg.Node.Name, " on network ", cfg.Network)
|
|
|
|
+ } else {
|
|
|
|
+ bodybytes, _ := ioutil.ReadAll(response.Body)
|
|
|
|
+ defer response.Body.Close()
|
|
|
|
+ return fmt.Errorf("error deleting node on server %s %s", response.Status, string(bodybytes))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
wgClient, wgErr := wgctrl.New()
|
|
wgClient, wgErr := wgctrl.New()
|
|
if wgErr == nil {
|
|
if wgErr == nil {
|
|
removeIface := cfg.Node.Interface
|
|
removeIface := cfg.Node.Interface
|