feat: 系统调优 Go 版后端完整源码

- 19 个接口全部实测验收通过 (2026-08-08)
- 结构: main.go + core/consts + gsysctl + gtuner + server
- 含 build_go.sh 官方部署结构构建脚本 (amd64/arm64 交叉编译)
- 数据无缝衔接 Python 版遗留 (快照/state/审计日志)
- 备份自 156:/root/goddhv (2026-08-09)
This commit is contained in:
shishi
2026-08-09 10:12:57 +08:00
commit 2f79b22936
12 changed files with 1256 additions and 0 deletions
+109
View File
@@ -0,0 +1,109 @@
// 主入口: GMSSH「系统调优」Go 版后端服务。
// 基于官方 simplejrpc-go SDK, JSON-RPC 2.0 over Unix Socket。
package main
import (
"fmt"
"log"
"os"
"path/filepath"
rpc "github.com/DemonZack/simplejrpc-go"
"github.com/DemonZack/simplejrpc-go/core"
"github.com/DemonZack/simplejrpc-go/core/config"
"github.com/DemonZack/simplejrpc-go/net/gsock"
"github.com/DemonZack/simplejrpc-go/os/gpath"
"github.com/user_TGPJp0KLpNsa5TAo/ddhv/core/consts"
"github.com/user_TGPJp0KLpNsa5TAo/ddhv/server"
)
// env 运行环境(test/prod),可通过环境变量 GMSSH_ENV 覆盖
func startupEnv() string {
if e := os.Getenv("GMSSH_ENV"); e == "prod" || e == "test" {
return e
}
// 平台通常以 prod 运行正式版
return "prod"
}
func main() {
// 确保数据目录存在
consts.EnsureDirs()
var socketPath string
// 1. 优先支持环境变量显式指定(本地测试用)
if env := os.Getenv("APP_SOCKET"); env != "" {
socketPath = env
} else {
// 2. 尝试按官方 SDK 规范从 config.json 读取 socket
func() {
defer func() {
if r := recover(); r != nil {
log.Printf("[*] config.json 读取失败(忽略): %v", r)
}
}()
env := startupEnv()
// 设置配置基础路径: 优先 main 所在目录(与 config.json 同目录), 兜底 consts
binDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err == nil {
gpath.GmCfgPath = binDir
} else {
gpath.GmCfgPath = consts.APP_BIN_PATH
}
if os.Getenv("CONFIG_PATH") != "" {
gpath.GmCfgPath = ""
}
core.InitContainer(config.WithConfigEnvFormatterOptionFunc(env))
val, err := core.Container.CfgFmt().GetValue("jsonrpc.sockets").String()
if err == nil && val != "" {
socketPath = val
// 若为相对路径, 从 app/bin 定位到部署根 tmp (bin -> ../.. -> /tmp)
if !filepath.IsAbs(socketPath) {
socketPath = filepath.Join(binDir, "..", "..", "tmp", filepath.Base(socketPath))
}
}
}()
// 3. 兜底用 consts 绝对路径
if socketPath == "" {
socketPath = consts.APP_SOCKET_FILE_PATH
}
}
fmt.Printf("Starting GMSSH system tuner backend, socket=%s\n", socketPath)
if err := ds0(socketPath); err != nil {
log.Fatalf("server error: %v", err)
}
}
// ds0 创建并启动 RPC 服务
func ds0(socketPath string) error {
ds := rpc.NewDefaultServer(
gsock.WithJsonRpcSimpleServiceHandler(gsock.NewJsonRpcSimpleServiceHandler()),
gsock.WithJsonRpcSimpleServiceMiddlewares(),
)
h := server.NewHandler()
ds.RegisterHandle("hello", h.Hello)
ds.RegisterHandle("ping", h.Ping)
ds.RegisterHandle("tuner_check_root", h.TunerCheckRoot)
ds.RegisterHandle("tuner_detect", h.TunerDetect)
ds.RegisterHandle("tuner_current_preset", h.TunerCurrentPreset)
ds.RegisterHandle("tuner_snapshots", h.TunerSnapshots)
ds.RegisterHandle("tuner_init_status", h.TunerInitStatus)
ds.RegisterHandle("tuner_init", h.TunerInit)
ds.RegisterHandle("tuner_create_snapshot", h.TunerCreateSnapshot)
ds.RegisterHandle("tuner_restore_snapshot", h.TunerRestoreSnapshot)
ds.RegisterHandle("tuner_presets", h.TunerPresets)
ds.RegisterHandle("tuner_apply_preset", h.TunerApplyPreset)
ds.RegisterHandle("tuner_set_swappiness", h.TunerSetSwappiness)
ds.RegisterHandle("tuner_enable_bbr", h.TunerEnableBBR)
ds.RegisterHandle("tuner_disable_bbr", h.TunerDisableBBR)
ds.RegisterHandle("tuner_get_param", h.TunerGetParam)
ds.RegisterHandle("tuner_set_param", h.TunerSetParam)
ds.RegisterHandle("tuner_dangerous_params", h.TunerDangerousParams)
ds.RegisterHandle("tuner_audit_logs", h.TunerAuditLogs)
return ds.StartServer(socketPath)
}