From cecd74d72d3872da3e8a69658d493842a71315da Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期五, 16 十月 2020 19:34:37 +0800
Subject: [PATCH] add clusterApi

---
 ClusterApi.go |  258 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 258 insertions(+), 0 deletions(-)

diff --git a/ClusterApi.go b/ClusterApi.go
new file mode 100644
index 0000000..6c3c8dc
--- /dev/null
+++ b/ClusterApi.go
@@ -0,0 +1,258 @@
+package esutil
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/spf13/viper"
+	"io/ioutil"
+	"net/http"
+	"os/exec"
+	"strings"
+	"time"
+)
+
+func InitYml(configPath string) (bool, error) {
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+		return false, err
+	}
+	if err := v.WriteConfig(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func StartServer(binPath string, ip string) bool {
+	resultMsg := CMDSC("sh " + binPath + "/elasticsearch -d")
+	if resultMsg == "杩愯澶辫触" {
+		return false
+	}
+	bool := VerifyNodeServer(ip, "9200")
+	return bool
+}
+
+func StopServer(binPath string) {
+
+}
+
+func UpdateNodeRole(configPath string, role string) (bool, error) {
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+		return false, err
+	}
+	if role == "master" {
+		v.Set("node.master", true)
+	} else if role == "slave" {
+		v.Set("node.master", false)
+	}
+	if err := v.WriteConfig(); err != nil {
+		return false, err
+	}
+	return true,nil
+}
+
+func VerifyCreated(configPath string, ip string) (bool, error) {
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+		return false, err
+	}
+	hosts := v.GetStringSlice("discovery.zen.ping.unicast.hosts")
+	for _, pick := range hosts {
+		if pick == ip {
+			return true, errors.New("璇ヨ妭鐐瑰凡缁忚鎵ц鈥滃垱寤洪泦缇も��")
+		}
+	}
+	if len(hosts) > 1 {
+		return true, errors.New("璇ヨ妭鐐瑰凡缁忚鎵ц鈥滃姞鍏ラ泦缇も��")
+	}
+	return false, nil
+}
+
+func VerifyNodeServer(ip string, port string) bool {
+	b := false
+	url := "http://" + ip + ":" + port
+	for i := 1; i < 3; i++ {
+		_, err := HttpRC("GET", url, nil)
+		if err != nil {
+			b = false
+			if i < 3 {
+				time.Sleep(time.Second * 10)
+				continue
+			}
+		} else {
+			b = true
+			break
+		}
+	}
+	return b
+}
+
+func VerifyNodeRole(configPath string, ) (string, error) {
+	role := "slave"
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+		return role, err
+	}
+	flag := v.GetBool("node.master")
+	if flag == true {
+		role = "master"
+	}
+	return role, nil
+}
+
+func UpdateDiscoveryZenPingUnicastHosts(configPath string, oldIp string, newIp string) (bool, error) {
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+		return false, err
+	}
+	flag := false
+	hosts := v.GetStringSlice("discovery.zen.ping.unicast.hosts")
+	for i, pick := range hosts {
+		if pick == oldIp {
+			hosts[i] = newIp
+			flag = true
+		}
+	}
+	if flag == false {
+		fmt.Println("瑕佷慨鏀圭殑ip涓嶅湪鍒楄〃涓�")
+	}
+	v.Set("discovery.zen.ping.unicast.hosts", hosts)
+	if err := v.WriteConfig(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func AddDiscoveryZenPingUnicastHosts(configPath string, ip string) []string {
+	v := viper.New()
+	v.SetConfigType("yml")
+	v.SetConfigName("elasticsearch")
+	v.AddConfigPath(configPath)
+	err := v.ReadInConfig()
+	if err != nil {
+
+	}
+	hosts := v.GetStringSlice("discovery.zen.ping.unicast.hosts")
+	hosts = append(hosts, ip)
+	return hosts
+}
+
+type NodeInfo struct {
+	NodeIp     string `json:"nodeIp"`
+	NodeRole   string `json:"nodeRole"`
+	NodeMaster bool   `json:"nodeMaster"`
+	NodeName   string `json:"nodeName"`
+}
+
+func GetClusterInfo(ip string, port string) ([]NodeInfo, error) {
+	url := "http://" + ip + ":" + port + "/_cat/nodes?v"
+	buf, err := HttpRC("GET", url, nil)
+	if err != nil {
+		return nil, err
+	}
+	var inf = []NodeInfo{}
+	res := strings.Split(string(buf), "\n")[1:]
+	for _, r := range res {
+		if r != "" {
+			inx := strings.Fields(r)
+			ip := inx[0]
+			role := "slave"
+			if find := strings.Contains(inx[7], "m"); find {
+				role = "master"
+			}
+			master := false
+			if find := strings.Contains(inx[8], "*"); find {
+				master = true
+			}
+			name := inx[9]
+			inf = append(inf, NodeInfo{
+				NodeName:   name,
+				NodeRole:   role,
+				NodeIp:     ip,
+				NodeMaster: master,
+			})
+		}
+	}
+	return inf, nil
+}
+
+func ExcludeNode(ip string, port string) (bool, error) {
+	flag := false
+	url := "http://" + ip + ":" + port + "/_cluster/settings"
+	body := `{
+    			"transient":{
+        			"cluster.routing.allocation.exclude._ip":"` + ip + `"
+    			}
+			}`
+	buf, err := HttpRC("PUT", url, []byte(body))
+	if err != nil {
+		return false, err
+	}
+	var inf map[string]interface{}
+	json.Unmarshal(buf, &inf)
+	if inf["acknowledged"] != nil {
+		flag = inf["acknowledged"].(bool)
+	}
+	return flag, nil
+}
+
+func CMDSC(scriptStr string) string {
+	cmd := exec.Command("sh", "-c", scriptStr)
+	var out bytes.Buffer
+	cmd.Stdout = &out
+	err := cmd.Run()
+	if err != nil {
+		return "杩愯澶辫触"
+	}
+	return out.String()
+}
+
+func HttpRC(method string, url string, parama []byte) (buf []byte, err error) {
+	timeout := time.Duration(10 * time.Second)
+	client := http.Client{
+		Timeout: timeout,
+	}
+	request, err := http.NewRequest(method, url, bytes.NewBuffer(parama))
+	request.Header.Set("Content-type", "application/json")
+
+	if err != nil {
+		fmt.Println("build request fail !")
+		return nil, err
+	}
+
+	resp, err := client.Do(request)
+	if err != nil {
+		fmt.Println("request error: ", err)
+		return nil, err
+	}
+
+	defer resp.Body.Close()
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println(err)
+		return nil, err
+	}
+	return body, nil
+}

--
Gitblit v1.8.0