renderer.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package renderer
  2. import (
  3. "io"
  4. "os"
  5. "os/exec"
  6. "path/filepath"
  7. "runtime"
  8. "time"
  9. "github.com/grafana/grafana/pkg/log"
  10. "github.com/grafana/grafana/pkg/setting"
  11. "github.com/grafana/grafana/pkg/util"
  12. "strconv"
  13. )
  14. type RenderOpts struct {
  15. Url string
  16. Width string
  17. Height string
  18. SessionId string
  19. Timeout string
  20. }
  21. func RenderToPng(params *RenderOpts) (string, error) {
  22. log.Info("PhantomRenderer::renderToPng url %v", params.Url)
  23. var executable = "phantomjs"
  24. if runtime.GOOS == "windows" {
  25. executable = executable + ".exe"
  26. }
  27. binPath, _ := filepath.Abs(filepath.Join(setting.PhantomDir, executable))
  28. scriptPath, _ := filepath.Abs(filepath.Join(setting.PhantomDir, "render.js"))
  29. pngPath, _ := filepath.Abs(filepath.Join(setting.ImagesDir, util.GetRandomString(20)))
  30. pngPath = pngPath + ".png"
  31. cmd := exec.Command(binPath, "--ignore-ssl-errors=true", scriptPath, "url="+params.Url, "width="+params.Width,
  32. "height="+params.Height, "png="+pngPath, "cookiename="+setting.SessionOptions.CookieName,
  33. "domain="+setting.Domain, "sessionid="+params.SessionId)
  34. stdout, err := cmd.StdoutPipe()
  35. if err != nil {
  36. return "", err
  37. }
  38. stderr, err := cmd.StderrPipe()
  39. if err != nil {
  40. return "", err
  41. }
  42. err = cmd.Start()
  43. if err != nil {
  44. return "", err
  45. }
  46. go io.Copy(os.Stdout, stdout)
  47. go io.Copy(os.Stdout, stderr)
  48. done := make(chan error)
  49. go func() {
  50. cmd.Wait()
  51. close(done)
  52. }()
  53. timeout, err := strconv.Atoi(params.Timeout)
  54. if err != nil {
  55. timeout = 15
  56. }
  57. select {
  58. case <-time.After(time.Duration(timeout) * time.Second):
  59. if err := cmd.Process.Kill(); err != nil {
  60. log.Error(4, "failed to kill: %v", err)
  61. }
  62. case <-done:
  63. }
  64. return pngPath, nil
  65. }