package util
|
|
import (
|
"bufio"
|
"bytes"
|
"errors"
|
"fmt"
|
"io"
|
"io/ioutil"
|
"net/http"
|
"os"
|
"os/exec"
|
"strings"
|
"time"
|
|
"basic.com/valib/logger.git"
|
)
|
|
//启动服务
|
func StartServer(binPath string) bool {
|
resultMsg := CMDSC("sh " + binPath + "/seaweedfs_start.sh")
|
if resultMsg == "运行失败" {
|
return false
|
}
|
return true
|
}
|
|
//关闭服务
|
func StopServer(binPath string) bool {
|
resultMsg := CMDSC("sh " + binPath + "/seaweedfs_stop.sh")
|
time.Sleep(time.Second * 11)
|
if resultMsg == "运行失败" {
|
return false
|
}
|
return true
|
}
|
|
//验证服务
|
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 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 {
|
logger.Error("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 {
|
logger.Error("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 {
|
logger.Error("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 {
|
logger.Error("write config file err: ", err)
|
return false
|
}
|
return true
|
}
|
|
//始化存储(删除数据)
|
func InitStore(storePath []string) (bool, error) {
|
if len(storePath) < 1 {
|
return false, errors.New("未指定存储路径")
|
}
|
for _, p := range storePath {
|
logger.Debug(p)
|
}
|
return true, nil
|
}
|
|
type SWFSInfo struct {
|
Ip string
|
DefaultReplication string
|
Peers []string
|
}
|
|
//读取配置文件
|
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 {
|
logger.Error("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 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 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 {
|
logger.Error("build request fail !")
|
return nil, err
|
}
|
|
resp, err := client.Do(request)
|
if err != nil {
|
logger.Error("request error: ", err)
|
return nil, err
|
}
|
|
defer resp.Body.Close()
|
body, err := ioutil.ReadAll(resp.Body)
|
if err != nil {
|
logger.Error(err)
|
return nil, err
|
}
|
return body, nil
|
}
|