github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/worker/mails/exec.go (about)

     1  package mails
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/cozy/cozy-stack/model/job"
     9  	"github.com/cozy/cozy-stack/pkg/assets"
    10  	"github.com/cozy/cozy-stack/pkg/config/config"
    11  	"github.com/cozy/cozy-stack/pkg/utils"
    12  	"github.com/cozy/cozy-stack/worker/exec"
    13  	"github.com/spf13/afero"
    14  )
    15  
    16  func execMjml(ctx *job.TaskContext, template []byte) ([]byte, error) {
    17  	log := ctx.Logger()
    18  
    19  	workDir, cleanDir, err := prepareWorkDir()
    20  	defer cleanDir()
    21  	if err != nil {
    22  		log.Errorf("PrepareWorkDir: %s", err)
    23  		return nil, err
    24  	}
    25  
    26  	cmdStr, env := prepareCmdEnv(ctx)
    27  	cmd := exec.CreateCmd(cmdStr, workDir)
    28  	cmd.Env = env
    29  
    30  	// Send the template on cozy-mjml stdin
    31  	cmd.Stdin = bytes.NewReader(template)
    32  
    33  	// Log out all things printed in stderr
    34  	var stderrBuf bytes.Buffer
    35  	cmd.Stderr = utils.LimitWriterDiscard(&stderrBuf, 256*1024)
    36  
    37  	out, err := cmd.Output()
    38  	if stderrBuf.Len() > 0 {
    39  		log.Errorf("Stderr: %s", stderrBuf.String())
    40  	}
    41  	if err != nil {
    42  		log.Errorf("Run: %s", err)
    43  		return nil, err
    44  	}
    45  
    46  	return out, nil
    47  }
    48  
    49  func prepareWorkDir() (string, func(), error) {
    50  	cleanDir := func() {}
    51  	osFS := afero.NewOsFs()
    52  	workDir, err := afero.TempDir(osFS, "", "mjml")
    53  	if err != nil {
    54  		return "", cleanDir, err
    55  	}
    56  	cleanDir = func() {
    57  		_ = os.RemoveAll(workDir)
    58  	}
    59  	workFS := afero.NewBasePathFs(osFS, workDir)
    60  	dst, err := workFS.OpenFile("index.js", os.O_CREATE|os.O_WRONLY, 0640)
    61  	if err != nil {
    62  		return "", cleanDir, err
    63  	}
    64  	f, err := assets.Open("/js/cozy-mjml.js", config.DefaultInstanceContext)
    65  	if err != nil {
    66  		return "", cleanDir, err
    67  	}
    68  	_, _ = io.Copy(dst, f)
    69  	if err = dst.Close(); err != nil {
    70  		return "", cleanDir, err
    71  	}
    72  	return workDir, cleanDir, err
    73  }
    74  
    75  func prepareCmdEnv(ctx *job.TaskContext) (string, []string) {
    76  	cmd := config.GetConfig().Konnectors.Cmd
    77  	env := []string{
    78  		"COZY_URL=" + ctx.Instance.PageURL("/", nil),
    79  		"COZY_LANGUAGE=node",
    80  		"COZY_LOCALE=" + ctx.Instance.Locale,
    81  		"COZY_TIME_LIMIT=60",
    82  		"COZY_JOB_ID=" + ctx.ID(),
    83  	}
    84  	return cmd, env
    85  }