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 }