2024-03-15 09:51:15 +08:00
|
|
|
|
package commands
|
2024-03-02 15:53:58 +08:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
}
|