From bb18319bdcaf408e822456c0ab2285bb01ae3e0a Mon Sep 17 00:00:00 2001
From: cheliequan <liequanche@126.com>
Date: 星期三, 24 五月 2023 17:42:29 +0800
Subject: [PATCH] 更新util

---
 src/util/util.go |  138 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 137 insertions(+), 1 deletions(-)

diff --git a/src/util/util.go b/src/util/util.go
index 05ef259..3da9a85 100644
--- a/src/util/util.go
+++ b/src/util/util.go
@@ -1,6 +1,15 @@
 package util
 
-import "os"
+import (
+	"context"
+	"crypto/tls"
+	"fmt"
+	"net/http"
+	"os"
+	"time"
+
+	"golang.org/x/crypto/ssh"
+)
 
 // homeDir 鑾峰彇褰撳墠鐢ㄦ埛鐨勫鐩綍璺緞
 func homeDir() string {
@@ -9,3 +18,130 @@
 	}
 	return os.Getenv("USERPROFILE") // Windows 鐜涓嬭幏鍙栫敤鎴风洰褰�
 }
+
+func sshExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int) (string, error) {
+	// SSH 杩炴帴閰嶇疆
+	config := &ssh.ClientConfig{
+		User: sshUsername,
+		Auth: []ssh.AuthMethod{
+			ssh.Password(sshPassword),
+		},
+		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
+	}
+
+	// 杩炴帴鍒拌繙绋嬫湇鍔″櫒
+	client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", nodeIP, sshPort), config)
+	if err != nil {
+		return "", fmt.Errorf("failed to connect to node %s: %v", nodeIP, err)
+	}
+	defer client.Close()
+
+	// 鍒涘缓浼氳瘽
+	session, err := client.NewSession()
+	if err != nil {
+		return "", fmt.Errorf("failed to create SSH session: %v", err)
+	}
+	defer session.Close()
+
+	// 鍒涘缓涓�涓叿鏈夎秴鏃剁殑涓婁笅鏂�
+	ctx, cancel := context.WithTimeout(context.Background(), 300*time.Second)
+	defer cancel()
+
+	// 閫氳繃浼氳瘽鎵ц杩滅▼鍛戒护
+	outputChan := make(chan string)
+	errorChan := make(chan error)
+	go func() {
+		// 鍒涘缓涓�涓繛鎺ユ爣鍑嗚緭鍏ョ殑绠¢亾
+		stdinPipe, err := session.StdinPipe()
+		if err != nil {
+			errorChan <- fmt.Errorf("failed to create stdin pipe: %v", err)
+			return
+		}
+
+		// 鍚姩浼氳瘽
+		if err := session.Start(fmt.Sprintf("sudo -SE %s", remoteSSHCommand)); err != nil {
+			errorChan <- fmt.Errorf("failed to start command: %v err锛�%v", remoteSSHCommand, err)
+			return
+		}
+
+		// 灏嗗瘑鐮佸啓鍏ユ爣鍑嗚緭鍏ョ閬�
+		_, err = fmt.Fprintf(stdinPipe, "%s\n", sshPassword)
+		if err != nil {
+			errorChan <- fmt.Errorf("failed to write password to stdin: %v", err)
+			return
+		}
+
+		// 绛夊緟浼氳瘽缁撴潫
+		if err := session.Wait(); err != nil {
+			errorChan <- fmt.Errorf("command execution failed: %v err锛�%v", remoteSSHCommand, err)
+			return
+		}
+
+		outputChan <- ""
+	}()
+
+	// 绛夊緟缁撴灉鎴栬秴鏃�
+	select {
+	case <-ctx.Done():
+		// 鍏抽棴浼氳瘽浠ョ粓姝㈣繙绋嬪懡浠�
+		session.Close()
+		// 绛夊緟浼氳瘽鍏抽棴鐨� goroutine 缁撴潫
+		<-outputChan
+		return "", fmt.Errorf("SSH command execution timed out")
+	case err := <-errorChan:
+		return "", err
+	case <-outputChan:
+		fmt.Printf("Command: %v executed on the remote server: %s\n", remoteSSHCommand, nodeIP)
+		return "", nil
+	}
+}
+
+// 瀹夎Docker
+func installDocker(nodeIP, sshUsername, sshPassword string, sshPort int) error {
+	// 妫�鏌ocker鏄惁宸插畨瑁�
+	checkCommand := "which docker"
+	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)
+	if err == nil {
+		fmt.Println("Docker is already installed on the remote server.")
+		return nil
+	}
+
+	// 瀹夎Docker
+	installCommand := "sudo curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh"
+	_, err = sshExec(nodeIP, sshUsername, sshPassword, installCommand, sshPort)
+	if err != nil {
+		return fmt.Errorf("failed to install Docker on the remote server: %v", err)
+	}
+
+	fmt.Println("Docker has been installed on the remote server.")
+	return nil
+}
+
+// Create an HTTP client with insecure TLS configuration
+func createHTTPClient() *http.Client {
+	transport := &http.Transport{
+		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
+	}
+	return &http.Client{Transport: transport}
+}
+
+// 瀹夎kubectl
+func installKubectl(nodeIP, sshUsername, sshPassword string, sshPort int) error {
+	// 妫�鏌ubectl鏄惁宸插畨瑁�
+	checkCommand := "which kubectl"
+	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)
+	if err == nil {
+		fmt.Println("kubectl is already installed on the remote server.")
+		return nil
+	}
+
+	// 瀹夎kubectl
+	installCommand := "sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && sudo chmod +x kubectl && sudo mv kubectl /usr/local/bin/"
+	_, err = sshExec(nodeIP, sshUsername, sshPassword, installCommand, sshPort)
+	if err != nil {
+		return fmt.Errorf("failed to install kubectl on the remote server: %v", err)
+	}
+
+	fmt.Println("kubectl has been installed on the remote server.")
+	return nil
+}

--
Gitblit v1.8.0