From 7d6f3e310763beda04739c0ad068bb1823910020 Mon Sep 17 00:00:00 2001
From: "Alex Ellis (OpenFaaS Ltd)" <alexellis2@gmail.com>
Date: Fri, 26 Aug 2022 11:26:58 +0100
Subject: [PATCH] Make data-dir configurable for getting node token

When using a different data-dir for K3s on a server, the
hard-coded node-token path fails to match a valid token file.

So this change allows the join command to override the value
for the path.

Closes: #373

Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>
---
 cmd/install.go | 28 +++++++++++++++++-----------
 cmd/join.go    | 23 ++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/cmd/install.go b/cmd/install.go
index e5ea8fc1..97e91b26 100644
--- a/cmd/install.go
+++ b/cmd/install.go
@@ -98,24 +98,30 @@ Provide the --local-path flag with --merge if a kubeconfig already exists in som
 	command.Flags().String("tls-san", "", "Use an additional IP or hostname for the API server")
 
 	command.PreRunE = func(command *cobra.Command, args []string) error {
-		_, err := command.Flags().GetIP("ip")
+		local, err := command.Flags().GetBool("local")
 		if err != nil {
 			return err
 		}
 
-		_, err = command.Flags().GetIP("host")
-		if err != nil {
-			return err
-		}
+		if !local {
+			_, err := command.Flags().GetIP("ip")
+			if err != nil {
+				return err
+			}
 
-		if _, err := command.Flags().GetIP("ip"); err != nil {
-			return err
-		}
+			_, err = command.Flags().GetIP("host")
+			if err != nil {
+				return err
+			}
 
-		if _, err := command.Flags().GetInt("ssh-port"); err != nil {
-			return err
-		}
+			if _, err := command.Flags().GetIP("ip"); err != nil {
+				return err
+			}
 
+			if _, err := command.Flags().GetInt("ssh-port"); err != nil {
+				return err
+			}
+		}
 		return nil
 	}
 
diff --git a/cmd/join.go b/cmd/join.go
index f5b44b13..faf5e60b 100644
--- a/cmd/join.go
+++ b/cmd/join.go
@@ -3,6 +3,7 @@ package cmd
 import (
 	"fmt"
 	"net"
+	"path/filepath"
 	"runtime"
 	"strings"
 
@@ -53,6 +54,8 @@ func MakeJoin() *cobra.Command {
 	command.Flags().String("k3s-version", "", "Set a version to install, overrides k3s-channel")
 	command.Flags().String("k3s-channel", PinnedK3sChannel, "Release channel: stable, latest, or i.e. v1.19")
 
+	command.Flags().String("server-data-dir", "/var/lib/rancher/k3s/", "Override the path used to fetch the node-token from the server")
+
 	command.RunE = func(command *cobra.Command, args []string) error {
 		fmt.Printf("Running: k3sup join\n")
 
@@ -69,6 +72,18 @@ func MakeJoin() *cobra.Command {
 			host = ip.String()
 		}
 
+		dataDir, err := command.Flags().GetString("server-data-dir")
+		if err != nil {
+			return err
+		}
+		if len(dataDir) == 0 {
+			return fmt.Errorf("--server-data-dir must be set")
+		}
+
+		if !strings.HasPrefix(dataDir, "/") {
+			return fmt.Errorf("--server-data-dir must begin with /")
+		}
+
 		serverIP, err := command.Flags().GetIP("server-ip")
 		if err != nil {
 			return err
@@ -189,7 +204,7 @@ func MakeJoin() *cobra.Command {
 
 		defer sshOperator.Close()
 
-		getTokenCommand := fmt.Sprintf(sudoPrefix + "cat /var/lib/rancher/k3s/server/node-token\n")
+		getTokenCommand := fmt.Sprintf("%scat %s\n", sudoPrefix, filepath.Join(dataDir, "/server/node-token"))
 		if printCommand {
 			fmt.Printf("ssh: %s\n", getTokenCommand)
 		}
@@ -226,26 +241,32 @@ func MakeJoin() *cobra.Command {
 	}
 
 	command.PreRunE = func(command *cobra.Command, args []string) error {
+
 		_, err := command.Flags().GetIP("ip")
 		if err != nil {
 			return err
 		}
+
 		_, err = command.Flags().GetIP("server-ip")
 		if err != nil {
 			return err
 		}
+
 		_, err = command.Flags().GetString("host")
 		if err != nil {
 			return err
 		}
+
 		_, err = command.Flags().GetString("server-host")
 		if err != nil {
 			return err
 		}
+
 		_, err = command.Flags().GetInt("ssh-port")
 		if err != nil {
 			return err
 		}
+
 		return nil
 	}