bsm/cmd/ext.go

178 lines
3.5 KiB
Go
Raw Normal View History

2024-03-02 15:53:58 +08:00
package cmd
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
"git.apinb.com/bsm-sdk/engine/env"
"git.apinb.com/bsm-sdk/engine/utils"
)
func getRegistryReleases() Releases {
body, err := utils.HttpGet(registryUrl)
checkError(err)
var ms Releases
err = json.Unmarshal(body, &ms)
checkError(err)
return ms
}
func getService(srv string) *Service {
reles := getRegistryReleases()
for _, v := range reles.Data {
if v.ServiceKey == srv {
return &v
}
}
return nil
}
func getCurrentVersion(srv string) string {
var data map[string]string
execbin := filepath.Join(env.MeshEnv.Prefix, srv)
cmd := exec.Command(execbin, "--json") // 替换为适合操作系统的命令
output, err := cmd.Output()
if err != nil {
return " - "
}
err = json.Unmarshal(output, &data)
if err != nil {
return " - "
}
if val, ok := data["version"]; ok {
return val
}
return " - "
}
func getProcessInfo(processName string) (string, string) {
var info string = " - "
cmd := exec.Command("ps", "-eo", "pid,%cpu,%mem,cmd") // 使用ps命令查询进程信息
output, err := cmd.Output() // 获取命令输出结果
if err != nil {
return info, info
}
// 将输出按换行符分隔成多行字符串数组
lines := strings.Split(string(output), "\n")[1:]
for _, line := range lines {
if strings.Contains(line, processName) {
fields := strings.Fields(line) // 将每行按空格分隔为字段数组
if len(fields) >= 3 {
pid := fields[0] // PID进程标识
cpuUsage := fields[1] // CPU使用情况
memoryUsage := fields[2] // 内存使用情况
info = fmt.Sprintf("CPU:%s%% / MEM:%s%%", cpuUsage, memoryUsage)
return pid, info
}
}
}
return info, info
}
func checkProcessRunning(processName string) bool {
cmd := exec.Command("ps", "-ef") // 替换为适合操作系统的命令
output, err := cmd.Output()
if err != nil {
return false
}
// 将输出按行分割成切片
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, processName) {
return true
}
}
return false
}
func DownloadFile(url, saveTo string, fb func(length, downLen int64)) {
var (
fsize int64
buf = make([]byte, 32*1024)
written int64
)
//创建一个http client
client := new(http.Client)
//get方法获取资源
resp, err := client.Get(url)
if err != nil {
fmt.Printf("download %s error:%s\n", url, err)
os.Exit(0)
}
//读取服务器返回的文件大小
fsize, err = strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 32)
if err != nil {
fmt.Println(err)
}
//创建文件
file, err := os.Create(saveTo)
file.Chmod(0777)
if err != nil {
fmt.Printf("Create %s error:%s\n", saveTo, err)
os.Exit(0)
}
defer file.Close()
if resp.Body == nil {
fmt.Printf("resp %s error:%s\n", url, err)
os.Exit(0)
}
defer resp.Body.Close()
//下面是 io.copyBuffer() 的简化版本
for {
//读取bytes
nr, er := resp.Body.Read(buf)
if nr > 0 {
//写入bytes
nw, ew := file.Write(buf[0:nr])
//数据长度大于0
if nw > 0 {
written += int64(nw)
}
//写入出错
if ew != nil {
err = ew
break
}
//读取是数据长度不等于写入的数据长度
if nr != nw {
err = io.ErrShortWrite
break
}
}
if er != nil {
if er != io.EOF {
err = er
}
break
}
//没有错误了快使用 callback
fb(fsize, written)
}
if err != nil {
fmt.Printf("callback error:%s\n", err)
os.Exit(0)
}
}