package esutil
|
|
import (
|
"bufio"
|
"bytes"
|
"errors"
|
"fmt"
|
"io"
|
"io/ioutil"
|
"net/http"
|
"os"
|
"strings"
|
"time"
|
)
|
|
//启动服务
|
func StartSServer(binPath string) bool {
|
resultMsg := CMDSC("sh " + binPath + "/seaweedfs_start.sh")
|
if resultMsg == "运行失败" {
|
return false
|
}
|
return true
|
}
|
|
//关闭服务
|
func StopSServer(binPath string) bool {
|
resultMsg := CMDSC("sh " + binPath + "/seaweedfs_stop.sh")
|
if resultMsg == "运行失败" {
|
return false
|
}
|
return true
|
}
|
|
type SWFSInfo struct {
|
Ip string
|
DefaultReplication string
|
Peers []string
|
}
|
|
//验证服务
|
func VerifyServer(ip string) (bool, error) {
|
masterUrl := "http://" + ip + ":6333/ui/index.html"
|
volumeUrl := "http://" + ip + ":6700/ui/index.html"
|
_, mErr := HttpRC("GET", masterUrl, nil)
|
if mErr != nil {
|
return false, errors.New("master 启动失败")
|
}
|
_, vErr := HttpRC("GET", volumeUrl, nil)
|
if vErr != nil {
|
return false, errors.New("volume 启动失败")
|
}
|
return true, nil
|
|
}
|
|
//读取配置文件
|
func GetConfig(configPath string) (SWFSInfo, error) {
|
var info SWFSInfo
|
cp := configPath + "/seaweedfs_start.sh"
|
file, err := os.OpenFile(cp, os.O_RDWR, 0666)
|
if err != nil {
|
fmt.Println("open config file fail, err: ", err)
|
return info, err
|
}
|
defer file.Close()
|
|
buf := bufio.NewReader(file)
|
peers := make([]string, 0)
|
ip := ""
|
defaultReplication := ""
|
for {
|
line, _, c := buf.ReadLine()
|
if c == io.EOF {
|
break
|
}
|
if strings.Contains(string(line), "peers=") {
|
rt := strings.Split(string(line), "=")[1]
|
if len(rt) < 1 {
|
continue
|
}
|
p := strings.Split(rt, ",")
|
peers = append(peers, p...)
|
}
|
if strings.Contains(string(line), "ip=") {
|
ip = strings.Split(string(line), "=")[1]
|
continue
|
}
|
if strings.Contains(string(line), "defaultReplication=") {
|
defaultReplication = strings.Split(string(line), "=")[1]
|
continue
|
}
|
}
|
info.Ip = ip
|
info.DefaultReplication = defaultReplication
|
info.Peers = peers
|
return info, nil
|
}
|
|
//设置配置文件
|
func SetConfig(configPath string, ip string, peers []string, defaultReplication string) bool {
|
cp := configPath + "/seaweedfs_start.sh"
|
file, err := os.OpenFile(cp, os.O_RDWR, 0666)
|
if err != nil {
|
fmt.Println("open config file fail, err: ", err)
|
return false
|
}
|
defer file.Close()
|
|
buf := bufio.NewReader(file)
|
output := make([]byte, 0)
|
for {
|
line, _, c := buf.ReadLine()
|
if c == io.EOF {
|
break
|
}
|
if strings.Contains(string(line), "ip=") {
|
newline := "ip=" + ip
|
line = []byte(newline)
|
}
|
if strings.Contains(string(line), "peers=") {
|
newline := "peers=" + strings.Replace(strings.Trim(fmt.Sprint(peers), "[]"), " ", ",", -1)
|
line = []byte(newline)
|
}
|
if strings.Contains(string(line), "defaultReplication=") {
|
newline := "defaultReplication=" + defaultReplication
|
line = []byte(newline)
|
}
|
output = append(output, line...)
|
output = append(output, []byte("\n")...)
|
}
|
|
if err := writeToFile(cp, output); err != nil {
|
fmt.Println("write config file err: ", err)
|
return false
|
}
|
return true
|
}
|
|
//设置配置文件ip以及peer
|
func SetConfigByIpAndPeer(configPath string, ip string, peers []string) bool {
|
cp := configPath + "/seaweedfs_start.sh"
|
file, err := os.OpenFile(cp, os.O_RDWR, 0666)
|
if err != nil {
|
fmt.Println("open config file fail, err: ", err)
|
return false
|
}
|
defer file.Close()
|
|
buf := bufio.NewReader(file)
|
output := make([]byte, 0)
|
for {
|
line, _, c := buf.ReadLine()
|
if c == io.EOF {
|
break
|
}
|
if strings.Contains(string(line), "ip=") {
|
newline := "ip=" + ip
|
line = []byte(newline)
|
}
|
if strings.Contains(string(line), "peers=") {
|
newline := "peers=" + strings.Replace(strings.Trim(fmt.Sprint(peers), "[]"), " ", ",", -1)
|
line = []byte(newline)
|
}
|
output = append(output, line...)
|
output = append(output, []byte("\n")...)
|
}
|
|
if err := writeToFile(cp, output); err != nil {
|
fmt.Println("write config file err: ", err)
|
return false
|
}
|
return true
|
}
|
|
func writeToFile(filePath string, outPut []byte) error {
|
f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0600)
|
defer f.Close()
|
if err != nil {
|
return err
|
}
|
writer := bufio.NewWriter(f)
|
_, err = writer.Write(outPut)
|
if err != nil {
|
return err
|
}
|
writer.Flush()
|
return nil
|
}
|
|
func HttpRCT(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")
|
request.Header.Add("x-auth-token", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3ND"+
|
"UwMjU5MjMsInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW"+
|
"9uc1wiOltcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJjb2RlTWFuZ2U6dmlld1wiLFwiZGV2aWNlTWFuYWdlOmFkZFwiLFwiYW"+
|
"RtaW5NYW5hZ2VcIixcIm9yZGVyTWFuZ2VcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJwcm9kdWN0TWFuZ2U6YWRkXCIsXCJhZG"+
|
"1pbk1hbmFnZTp2aWV3XCIsXCJjb2RlTWFuZ2U6YWRkXCIsXCJwcm9kdWN0TWFuZ2U6b2ZmU2FsZVwiLFwib3JkZXJNYW5nZTpjYW"+
|
"5jZWxcIixcInByb2R1Y3RDZW50ZXI6ZG93bmxvYWRcIixcInByb2R1Y3RDZW50ZXI6YnV5XCIsXCJwcm9kdWN0TWFuZ2U6dmlld1"+
|
"wiLFwiYXBpXCIsXCJob21lXCIsXCJvcmRlck1hbmdlOnBheVwiLFwiYWRtaW5NYW5hZ2U6YWRkXCIsXCJvcmRlck1hbmdlOmRvd2"+
|
"5sb2FkXCIsXCJwcm9kdWN0Q2VudGVyXCIsXCJkZXZpY2VNYW5hZ2U6dW5iaW5kXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImFkbW"+
|
"luTWFuYWdlOmVkaXRcIixcImRldmljZU1hbmFnZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwidmlwTWFuYWdlOnZpZXdcIixcInByb2"+
|
"R1Y3RDZW50ZXI6dmlld1wiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcIm"+
|
"NvZGVNYW5nZVwiLFwicHJvZHVjdE1hbmdlXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.vwjAFkWuEyadRLvIOGK8LFE3Mj"+
|
"pY3SQ7j6AlTXnQDG8")
|
|
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
|
}
|