Skip to content

Commit d6bddf7

Browse files
committed
```
feat(vms): 添加日志装饰器并优化chroot执行流程 - 新增LogDone函数用于统一处理开始/结束日志记录 - 将chroot函数重构为闭包形式,添加更完整的错误处理和日志记录 - 在VMS执行过程中统一使用LogDone进行状态跟踪 - 调整日志前缀从"boot"改为"vms",将"exec"作为命令执行前缀 - 重构web运行逻辑,使用PreStart和OnStarted钩子替代旧的webStart函数 ```
1 parent 0536335 commit d6bddf7

5 files changed

Lines changed: 79 additions & 66 deletions

File tree

cmd/xlp/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func main() {
4646
slog.InfoContext(ctx, fmt.Sprintf("force_download: %t", cfg.ForceDownload))
4747

4848
err := vms.Exec(
49-
log.Prefix(ctx, "boot"),
49+
log.Prefix(ctx, "vms"),
5050

5151
vms.Before(xunlei.Before(cfg)),
5252
vms.Run(xunlei.Run(cfg)),

pkg/log/std.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,17 @@ func (w *stdWriter) Write(buf []byte) (int, error) {
5656
r := slog.NewRecord(time.Now(), level, string(buf), pc)
5757
return origLen, w.h.Handle(w.ctx, r)
5858
}
59+
60+
func LogDone(ctx context.Context, level slog.Level, module string, err *error, args ...any) (fDefer func()) {
61+
if module != "" {
62+
module += " "
63+
}
64+
slog.Log(ctx, level, module+"start", args...)
65+
return func() {
66+
if err != nil && *err != nil {
67+
slog.LogAttrs(ctx, level, module+"begin", slog.String("err", (*err).Error()))
68+
} else {
69+
slog.Log(ctx, level, module+"done")
70+
}
71+
}
72+
}

pkg/vms/sys/chroot.go

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,46 @@ import (
1313

1414
// chroot & run
1515
func Chroot(ctx context.Context, newRoot string, run func(ctx context.Context) error, debug ...bool) (err error) {
16-
var wd string
17-
if wd, err = os.Getwd(); err != nil {
16+
err = func() (err error) {
17+
var wd string
18+
if wd, err = os.Getwd(); err != nil {
19+
return
20+
}
21+
defer log.LogDone(ctx, slog.LevelDebug, "chroot ", &err, "root", newRoot, "wd", wd)
22+
23+
if err = syscall.Chdir(newRoot); err != nil {
24+
return
25+
}
26+
defer syscall.Chdir(wd)
27+
28+
var rfd int
29+
if rfd, err = syscall.Open("/", syscall.O_RDONLY, 0); err != nil {
30+
return
31+
}
32+
defer syscall.Close(rfd)
33+
34+
if err = syscall.Chroot("."); err != nil {
35+
return
36+
}
37+
38+
defer func() {
39+
err = utils.SeqExec(
40+
func() error { return syscall.Fchdir(rfd) },
41+
func() error { return syscall.Chroot(".") },
42+
func() error { return syscall.Chdir(wd) },
43+
)
44+
slog.Log(ctx, log.WarnDebug(err), "back to old root", "fd", rfd, "wd", wd, "err", err)
45+
}()
46+
47+
if err = syscall.Chdir("/"); err != nil {
48+
return
49+
}
50+
51+
slog.DebugContext(ctx, "run start")
52+
err = run(ctx)
1853
return
19-
}
20-
slog.DebugContext(ctx, "chroot", "root", newRoot, "wd", wd)
21-
22-
if err = syscall.Chdir(newRoot); err != nil {
23-
return
24-
}
25-
defer syscall.Chdir(wd)
26-
27-
var rfd int
28-
if rfd, err = syscall.Open("/", syscall.O_RDONLY, 0); err != nil {
29-
return
30-
}
31-
defer syscall.Close(rfd)
32-
33-
if err = syscall.Chroot("."); err != nil {
34-
return
35-
}
36-
37-
defer func() {
38-
err = utils.SeqExec(
39-
func() error { return syscall.Fchdir(rfd) },
40-
func() error { return syscall.Chroot(".") },
41-
func() error { return syscall.Chdir(wd) },
42-
)
43-
slog.Log(ctx, log.WarnDebug(err), "back to old root", "fd", rfd, "wd", wd, "err", err)
4454
}()
4555

46-
if err = syscall.Chdir("/"); err != nil {
47-
return
48-
}
49-
50-
slog.DebugContext(ctx, "run start")
51-
if err = run(ctx); err != nil {
52-
slog.DebugContext(ctx, "run done", "err", err.Error())
53-
}
54-
5556
if cmp.Or(debug...) {
5657
<-ctx.Done()
5758
}

pkg/vms/vms.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"log/slog"
66

7+
"github.com/cnk3x/xunlei/pkg/log"
78
"github.com/cnk3x/xunlei/pkg/utils"
89
"github.com/cnk3x/xunlei/pkg/vms/sys"
910
)
@@ -32,8 +33,7 @@ type options struct {
3233
// - chroot + seteuid 实现权限最小化(临时降权)
3334
// - 执行顺序 root 启动 → 准备 chroot 监狱 → chroot 切换 → setegid/seteuid 降权 → 执行核心任务 → 恢复 root 权限
3435
func Exec(ctx context.Context, execOpts ...Option) (err error) {
35-
slog.InfoContext(ctx, "vms start")
36-
defer slog.InfoContext(ctx, "vms done")
36+
defer log.LogDone(ctx, slog.LevelInfo, "vms", &err)
3737

3838
var opts options
3939
for _, option := range execOpts {
@@ -58,15 +58,15 @@ func Exec(ctx context.Context, execOpts ...Option) (err error) {
5858
defer beforeUndo()
5959
}
6060

61-
run := func(ctx context.Context) error {
62-
slog.InfoContext(ctx, "runner start")
63-
defer slog.InfoContext(ctx, "runner done")
64-
return sys.RunAs(ctx, opts.uid, opts.gid, func() error {
61+
run := func(ctx context.Context) (err error) {
62+
defer log.LogDone(ctx, slog.LevelInfo, "runner", &err)
63+
err = sys.RunAs(ctx, opts.uid, opts.gid, func() error {
6564
if opts.run == nil {
6665
return nil
6766
}
6867
return opts.run(ctx)
6968
})
69+
return
7070
}
7171

7272
if opts.root == "" || opts.root == "/" {

xlp.go

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ func Before(cfg Config) func(ctx context.Context) (func(), error) {
9696

9797
func Run(cfg Config) func(ctx context.Context) error {
9898
return func(ctx context.Context) (err error) {
99-
slog.InfoContext(ctx, "app start")
100-
defer slog.InfoContext(ctx, "app done")
99+
defer log.LogDone(ctx, slog.LevelInfo, "xlp", &err)
101100

102101
ctx, cancel := context.WithCancelCause(ctx)
103102
defer cancel(fmt.Errorf("done"))
@@ -114,27 +113,8 @@ func Run(cfg Config) func(ctx context.Context) error {
114113

115114
envs := mockEnv(dirData[0], strings.Join(dirDownload, ":"))
116115

117-
webStart := func(c *cmdx.Cmd) error {
118-
if cfg.Debug {
119-
cmdx.Exec(ctx,
120-
FILE_PAN_XUNLEI_CLI,
121-
cmdx.Dir(DIR_SYNOPKG_WORK),
122-
cmdx.Env(append(os.Environ(), "LD_TRACE_LOADED_OBJECTS=1")),
123-
cmdx.LineErr(logPan(ctx, "[test] ")), cmdx.LineOut(logPan(ctx, "[test]* ")),
124-
)
125-
}
126-
utils.BackExec(func() {
127-
if err := webRun(ctx, envs, cfg); err != nil {
128-
cancel(err)
129-
} else {
130-
cancel(fmt.Errorf("web done"))
131-
}
132-
})
133-
return nil
134-
}
135-
136116
return cmdx.Exec(
137-
log.Prefix(ctx, "vms"),
117+
log.Prefix(ctx, "exec"),
138118
FILE_PAN_XUNLEI_CLI,
139119
cmdx.Flags(
140120
"-launcher_listen", "unix://"+SOCK_LAUNCHER_LISTEN,
@@ -146,14 +126,32 @@ func Run(cfg Config) func(ctx context.Context) error {
146126
cmdx.Env(envs),
147127
cmdx.LineErr(logPan(ctx, "[stderr] ")),
148128
cmdx.LineOut(logPan(ctx, "[stdout] ")),
149-
cmdx.OnStarted(webStart),
129+
cmdx.PreStart(func(c *cmdx.Cmd) error {
130+
return cmdx.Exec(ctx,
131+
FILE_PAN_XUNLEI_CLI,
132+
cmdx.Dir(DIR_SYNOPKG_WORK),
133+
cmdx.Env(append(os.Environ(), "LD_TRACE_LOADED_OBJECTS=1")),
134+
cmdx.LineErr(logPan(ctx, "[test] ")), cmdx.LineOut(logPan(ctx, "[test]* ")),
135+
)
136+
}),
137+
cmdx.OnStarted(func(c *cmdx.Cmd) error {
138+
done := utils.BackExec(func() {
139+
if err := webRun(ctx, envs, cfg); err != nil {
140+
cancel(err)
141+
}
142+
})
143+
utils.After(done, func() { cancel(fmt.Errorf("web done")) })
144+
return nil
145+
}),
150146
cmdx.OnExit(func(c *cmdx.Cmd) error { return cleanExit(DIR_VAR) }),
151147
)
152148
}
153149
}
154150

155151
func webRun(ctx context.Context, env []string, cfg Config) (err error) {
156152
ctx = log.Prefix(ctx, "web")
153+
defer log.LogDone(ctx, slog.LevelInfo, "web", &err)
154+
157155
mux := web.NewMux()
158156
mux.Recoverer()
159157

0 commit comments

Comments
 (0)