Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modularize monitor, reduce init usage #81

Merged
merged 4 commits into from
Nov 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .github/workflows/agent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,6 @@ jobs:
with:
go-version: "1.20.14"

# WARNING: This is temporary remove it after the next release of gopsutil
- name: Patch gopsutil
run: |
sudo rm -rf $(printf "%s%s" "$(go env GOMODCACHE)" "/github.com/shirou/gopsutil/[email protected]")
go mod tidy -v
curl -L https://github.com/shirou/gopsutil/pull/1722.patch | sudo patch -p1 -d $(printf "%s%s" "$(go env GOMODCACHE)" "/github.com/shirou/gopsutil/[email protected]")

- name: Build Test
if: github.event_name != 'push' || !contains(github.ref, 'refs/tags/')
uses: goreleaser/goreleaser-action@v6
Expand Down
143 changes: 76 additions & 67 deletions cmd/agent/main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"bytes"
"context"
"crypto/md5"
"crypto/tls"
Expand All @@ -12,7 +13,6 @@ import (
"net/http"
"net/url"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
Expand Down Expand Up @@ -45,10 +45,10 @@ import (
)

var (
version string
version = monitor.Version // 来自于 GoReleaser 的版本号
arch string
defaultConfigPath string
executablePath string
defaultConfigPath = loadDefaultConfigPath()
client pb.NezhaServiceClient
initialized bool
dnsResolver = &net.Resolver{PreferGo: true}
Expand All @@ -73,7 +73,7 @@ const (
networkTimeOut = time.Second * 5 // 普通网络超时
)

func init() {
func setEnv() {
resolver.SetDefaultScheme("passthrough")
net.DefaultResolver.PreferGo = true // 使用 Go 内置的 DNS 解析器解析域名
net.DefaultResolver.Dial = func(ctx context.Context, network, address string) (net.Conn, error) {
Expand Down Expand Up @@ -102,17 +102,67 @@ func init() {
utls.HelloChrome_Auto, new(utls.Config),
http.DefaultTransport, nil, &headers,
)
}

// 来自于 GoReleaser 的版本号
monitor.Version = version

func loadDefaultConfigPath() string {
var err error
executablePath, err = os.Executable()
if err != nil {
panic(err)
return ""
}
return filepath.Join(filepath.Dir(executablePath), "config.yml")
}

func preRun(configPath string) error {
// init
setEnv()

if configPath == "" {
configPath = defaultConfigPath
}

// windows环境处理
if runtime.GOOS == "windows" {
hostArch, err := host.KernelArch()
if err != nil {
return err
}
switch hostArch {
case "i386", "i686":
hostArch = "386"
case "x86_64":
hostArch = "amd64"
case "aarch64":
hostArch = "arm64"
}
if arch != hostArch {
return fmt.Errorf("与当前系统不匹配,当前运行 %s_%s, 需要下载 %s_%s", runtime.GOOS, arch, runtime.GOOS, hostArch)
}
}

defaultConfigPath = filepath.Join(filepath.Dir(executablePath), "config.yml")
if err := agentConfig.Read(configPath); err != nil {
return fmt.Errorf("打开配置文件失败:%v", err)
}

monitor.InitConfig(&agentConfig)

if agentConfig.ClientSecret == "" {
return errors.New("ClientSecret 不能为空")
}

if agentConfig.ReportDelay < 1 || agentConfig.ReportDelay > 4 {
return errors.New("report-delay 的区间为 1-4")
}

if agentConfig.UUID == "" {
if uuid, err := uuid.GenerateUUID(); err == nil {
agentConfig.UUID = uuid
return agentConfig.Save()
} else {
return fmt.Errorf("生成 UUID 失败:%v", err)
}
}
return nil
}

func main() {
Expand All @@ -129,9 +179,13 @@ func main() {
return nil
}
if path := c.String("config"); path != "" {
preRun(path)
if err := preRun(path); err != nil {
return err
}
} else {
preRun(defaultConfigPath)
if err := preRun(""); err != nil {
return err
}
}
runService("", "")
return nil
Expand Down Expand Up @@ -181,51 +235,6 @@ func main() {
}
}

func preRun(configPath string) {
// windows环境处理
if runtime.GOOS == "windows" {
hostArch, err := host.KernelArch()
if err != nil {
panic(err)
}
if hostArch == "i386" {
hostArch = "386"
}
if hostArch == "i686" || hostArch == "ia64" || hostArch == "x86_64" {
hostArch = "amd64"
}
if hostArch == "aarch64" {
hostArch = "arm64"
}
if arch != hostArch {
panic(fmt.Sprintf("与当前系统不匹配,当前运行 %s_%s, 需要下载 %s_%s", runtime.GOOS, arch, runtime.GOOS, hostArch))
}
}

if err := agentConfig.Read(configPath); err != nil {
log.Fatalf("打开配置文件失败:%v", err)
}

monitor.InitConfig(&agentConfig)

if agentConfig.ClientSecret == "" {
log.Fatal("ClientSecret 不能为空")
}

if agentConfig.ReportDelay < 1 || agentConfig.ReportDelay > 4 {
log.Fatal("report-delay 的区间为 1-4")
}

if agentConfig.UUID == "" {
if uuid, err := uuid.GenerateUUID(); err == nil {
agentConfig.UUID = uuid
agentConfig.Save()
} else {
log.Fatalf("生成 UUID 失败:%v", err)
}
}
}

func run() {
auth := model.AuthHandler{
ClientSecret: agentConfig.ClientSecret,
Expand Down Expand Up @@ -645,21 +654,22 @@ func handleCommandTask(task *pb.Task, result *pb.TaskResult) {
return
}
startedAt := time.Now()
var cmd *exec.Cmd
var endCh = make(chan struct{})
endCh := make(chan struct{})
pg, err := processgroup.NewProcessExitGroup()
if err != nil {
// 进程组创建失败,直接退出
result.Data = err.Error()
return
}
timeout := time.NewTimer(time.Hour * 2)
if util.IsWindows() {
cmd = exec.Command("cmd", "/c", task.GetData()) // #nosec
} else {
cmd = exec.Command("sh", "-c", task.GetData()) // #nosec
}
cmd := processgroup.NewCommand(task.GetData())
var b bytes.Buffer
cmd.Stdout = &b
cmd.Env = os.Environ()
if err = cmd.Start(); err != nil {
result.Data = err.Error()
return
}
pg.AddProcess(cmd)
go func() {
select {
Expand All @@ -671,12 +681,11 @@ func handleCommandTask(task *pb.Task, result *pb.TaskResult) {
timeout.Stop()
}
}()
output, err := cmd.Output()
if err != nil {
result.Data += fmt.Sprintf("%s\n%s", string(output), err.Error())
if err = cmd.Wait(); err != nil {
result.Data += fmt.Sprintf("%s\n%s", b.String(), err.Error())
} else {
close(endCh)
result.Data = string(output)
result.Data = b.String()
result.Successful = true
}
pg.Dispose()
Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ require (
github.com/UserExistsError/conpty v0.1.4
github.com/artdarek/go-unzip v1.0.0
github.com/blang/semver v3.5.1+incompatible
github.com/creack/pty v1.1.23
github.com/creack/pty v1.1.24
github.com/dean2021/goss v0.0.0-20230129073947-df90431348f1
github.com/ebi-yade/altsvc-go v0.1.1
github.com/ebitengine/purego v0.8.0
github.com/ebitengine/purego v0.8.1
github.com/hashicorp/go-uuid v1.0.3
github.com/iamacarpet/go-winpty v1.0.4
github.com/jaypipes/ghw v0.12.0
Expand All @@ -20,12 +20,12 @@ require (
github.com/prometheus-community/pro-bing v0.4.1
github.com/quic-go/quic-go v0.40.1
github.com/refraction-networking/utls v1.6.3
github.com/shirou/gopsutil/v4 v4.24.9
github.com/shirou/gopsutil/v4 v4.24.10
github.com/spf13/viper v1.19.0
github.com/tidwall/gjson v1.18.0
github.com/urfave/cli/v2 v2.27.5
golang.org/x/net v0.29.0
golang.org/x/sys v0.25.0
golang.org/x/sys v0.26.0
google.golang.org/grpc v1.64.1
google.golang.org/protobuf v1.34.2
sigs.k8s.io/yaml v1.4.0
Expand Down
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,17 @@ github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBS
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0=
github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/dean2021/goss v0.0.0-20230129073947-df90431348f1 h1:5UiJ324LiCdOF/3w/5IeXrKVjdnwHoalvLG2smb3wi4=
github.com/dean2021/goss v0.0.0-20230129073947-df90431348f1/go.mod h1:NiLueuVb3hYcdF4ta+2ezcKJh6BEjhrBz9Hts6XJ5Sc=
github.com/ebi-yade/altsvc-go v0.1.1 h1:HmZDNb5ZOPlkyXhi34LnRckawFCux7yPYw+dtInIixo=
github.com/ebi-yade/altsvc-go v0.1.1/go.mod h1:K/U20bLcsOVrbTeDhqRjp+e3tgNT5iAqSiQzPoU0/Q0=
github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE=
github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
Expand Down Expand Up @@ -140,8 +140,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/shirou/gopsutil/v4 v4.24.9 h1:KIV+/HaHD5ka5f570RZq+2SaeFsb/pq+fp2DGNWYoOI=
github.com/shirou/gopsutil/v4 v4.24.9/go.mod h1:3fkaHNeYsUFCGZ8+9vZVWtbyM1k2eRnlL+bWO8Bxa/Q=
github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM=
github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
Expand Down Expand Up @@ -229,8 +229,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
Expand Down
11 changes: 0 additions & 11 deletions pkg/gpu/gpu_fallback.go

This file was deleted.

26 changes: 26 additions & 0 deletions pkg/monitor/conn/conn_fallback.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//go:build !linux

package conn

import (
"context"
"syscall"

"github.com/shirou/gopsutil/v4/net"
)

func GetState(_ context.Context) ([]uint64, error) {
var tcpConnCount, udpConnCount uint64

conns, _ := net.Connections("all")
for i := 0; i < len(conns); i++ {
switch conns[i].Type {
case syscall.SOCK_STREAM:
tcpConnCount++
case syscall.SOCK_DGRAM:
udpConnCount++
}
}

return []uint64{tcpConnCount, udpConnCount}, nil
}
Loading