zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/util/seaweedfs.go
@@ -1,240 +1,240 @@
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
}
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
}