bsm/cmd/ps.go

174 lines
3.7 KiB
Go
Raw Normal View History

2024-03-01 17:34:57 +08:00
package cmd
import (
"encoding/json"
"fmt"
"os/exec"
2024-03-01 23:44:25 +08:00
"path/filepath"
2024-03-01 17:34:57 +08:00
"strings"
2024-03-01 18:05:16 +08:00
"time"
2024-03-01 17:34:57 +08:00
"git.apinb.com/bsm-sdk/engine/env"
"git.apinb.com/bsm-sdk/engine/utils"
"git.apinb.com/bsm-sdk/engine/vars"
"github.com/modood/table"
"github.com/spf13/cobra"
)
2024-03-01 18:05:16 +08:00
type JSONData struct {
Msg string `json:"msg"`
Code int `json:"code"`
Data []ActionsReleases `json:"data"`
}
2024-03-01 17:34:57 +08:00
type ActionsReleases struct {
2024-03-01 18:05:16 +08:00
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
2024-03-01 17:34:57 +08:00
Identity string
Origin string
ServiceKey string
Version string
FullName string
OssUrl string
EtcPath string
FilePath string
ImagePath string
}
type PsTable struct {
2024-03-02 00:05:57 +08:00
ServiceKey string `table:"Service Key"`
2024-03-01 17:34:57 +08:00
Origin string
Status string
Performance string
2024-03-02 00:05:57 +08:00
CurrentVersion string `table:"Current Version"`
RegisterVersion string `table:"Register Version"`
UpdatedAt string `table:"Updated At"`
2024-03-01 17:34:57 +08:00
}
var psCmd = &cobra.Command{
Use: "ps",
Short: "list restiry and local installed microservice.",
Run: func(cmd *cobra.Command, args []string) {
psExecute()
},
}
func psExecute() {
2024-03-01 18:05:16 +08:00
fmt.Println("Blocks Registry:", registryUrl)
2024-03-01 17:34:57 +08:00
pt := make([]PsTable, 0)
body, err := utils.HttpGet(registryUrl)
checkError(err)
2024-03-01 18:05:16 +08:00
var ms JSONData
2024-03-01 17:34:57 +08:00
err = json.Unmarshal(body, &ms)
checkError(err)
2024-03-01 23:12:35 +08:00
if len(ms.Data) == 0 {
pt = append(pt, PsTable{})
}
2024-03-01 18:05:16 +08:00
for _, v := range ms.Data {
2024-03-01 17:34:57 +08:00
srvLine := getSrvStatus(v.ServiceKey)
srvLine.ServiceKey = v.ServiceKey
srvLine.Origin = v.Origin
srvLine.RegisterVersion = v.Version
srvLine.UpdatedAt = v.UpdatedAt.Format(vars.YYYY_MM_DD_HH_MM_SS)
pt = append(pt, srvLine)
}
// Output to stdout
table.Output(pt)
}
func getSrvStatus(srv string) PsTable {
2024-03-01 23:12:35 +08:00
2024-03-01 17:34:57 +08:00
var status string = " - "
2024-03-01 23:12:35 +08:00
binExists := utils.PathExists(env.MeshEnv.Prefix + srv)
if binExists {
2024-03-01 23:17:19 +08:00
status = "\033[32mRunning\033[0m\n"
2024-03-01 17:34:57 +08:00
}
2024-03-01 23:12:35 +08:00
isRun := checkProcessRunning(srv)
if binExists && !isRun {
2024-03-01 23:17:19 +08:00
status = "\033[31mStop\033[0m\n"
2024-03-01 23:12:35 +08:00
}
2024-03-02 00:05:57 +08:00
_, cm := getProcessInfo(srv)
2024-03-01 23:53:20 +08:00
2024-03-01 17:34:57 +08:00
return PsTable{
Status: status,
CurrentVersion: getCurrentVersion(srv),
2024-03-01 23:53:20 +08:00
Performance: cm,
2024-03-01 17:34:57 +08:00
}
}
func getCurrentVersion(srv string) string {
var data map[string]string
2024-03-01 23:47:01 +08:00
execbin := filepath.Join(env.MeshEnv.Prefix, srv)
2024-03-01 23:44:25 +08:00
cmd := exec.Command(execbin, "--json") // 替换为适合操作系统的命令
2024-03-01 17:34:57 +08:00
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 " - "
}
2024-03-01 23:53:20 +08:00
func getProcessInfo(processName string) (string, string) {
2024-03-01 17:34:57 +08:00
var info string = " - "
2024-03-01 23:12:35 +08:00
cmd := exec.Command("ps", "-eo", "pid,%cpu,%mem,cmd") // 使用ps命令查询进程信息
output, err := cmd.Output() // 获取命令输出结果
2024-03-01 17:34:57 +08:00
if err != nil {
2024-03-01 23:53:20 +08:00
return info, info
2024-03-01 17:34:57 +08:00
}
// 将输出按换行符分隔成多行字符串数组
lines := strings.Split(string(output), "\n")[1:]
for _, line := range lines {
2024-03-01 23:12:35 +08:00
if strings.Contains(line, processName) {
fields := strings.Fields(line) // 将每行按空格分隔为字段数组
if len(fields) >= 3 {
pid := fields[0] // PID进程标识
cpuUsage := fields[1] // CPU使用情况
memoryUsage := fields[2] // 内存使用情况
2024-03-01 23:53:54 +08:00
info = fmt.Sprintf("CPU:%s%% / MEM:%s%%", cpuUsage, memoryUsage)
2024-03-01 23:53:20 +08:00
return pid, info
2024-03-01 23:12:35 +08:00
}
2024-03-01 17:34:57 +08:00
}
}
2024-03-01 23:53:20 +08:00
return info, info
2024-03-01 17:34:57 +08:00
}
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
}