MCPcopy Create free account
hub / github.com/Unpackerr/unpackerr / runCmdhook

Method runCmdhook

pkg/unpackerr/cmdhook.go:66–121  ·  view source on GitHub ↗
(hook *WebhookConfig, payload *WebhookPayload)

Source from the content-addressed store, hash-verified

64}
65
66func (u *Unpackerr) runCmdhook(hook *WebhookConfig, payload *WebhookPayload) (*bytes.Buffer, error) {
67 if hook.Command == "" {
68 return nil, ErrCmdhookNoCmd
69 }
70
71 payload.Config = hook
72
73 env, err := cnfg.MarshalENV(payload, "UN")
74 if err != nil {
75 return nil, fmt.Errorf("creating environment: %w", err)
76 }
77
78 ctx, cancel := context.WithTimeout(context.Background(), hook.Timeout.Duration)
79 defer cancel()
80
81 var cmd *exec.Cmd
82
83 args := strings.Fields(hook.Command)
84 if len(args) == 0 {
85 return nil, ErrCmdhookNoCmd
86 }
87
88 if args[0], err = filepath.Abs(args[0]); err != nil {
89 return nil, fmt.Errorf("finding command hook command: %w", err)
90 }
91
92 if hook.Shell {
93 if runtime.GOOS == windows {
94 args = append([]string{"cmd", "/C"}, args...)
95 } else {
96 args = append([]string{"/bin/sh", "-c"}, args...)
97 }
98 }
99
100 switch len(args) {
101 case 0:
102 return nil, ErrCmdhookNoCmd
103 case 1:
104 cmd = exec.CommandContext(ctx, args[0]) //nolint:gosec
105 default:
106 cmd = exec.CommandContext(ctx, args[0], args[1:]...) //nolint:gosec
107 }
108
109 var out bytes.Buffer
110
111 cmd.Stdout = &out
112 cmd.Stderr = &out
113 cmd.Env = env.Env()
114 cmd.Env = append(cmd.Env, "PATH="+os.Getenv("PATH"))
115
116 if err := cmd.Run(); err != nil {
117 return &out, fmt.Errorf("running cmd %q: %w", strings.Join(cmd.Args, " "), err)
118 }
119
120 return &out, nil
121}
122
123func (u *Unpackerr) logCmdhook() {

Callers 1

runCmdhookWithLogMethod · 0.95

Calls 3

RunMethod · 0.80
ErrorfMethod · 0.65
MarshalENVMethod · 0.45

Tested by

no test coverage detected