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 }