(hook *WebhookConfig, payload *WebhookPayload)
| 64 | } |
| 65 | |
| 66 | func (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 | |
| 123 | func (u *Unpackerr) logCmdhook() { |
no test coverage detected