| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | package renderer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-05-04 15:07:45 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	"io" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/exec" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2016-02-16 17:09:26 +08:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 17:37:13 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/log" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2015-04-08 14:59:12 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							| 
									
										
										
										
											2016-03-10 23:02:10 +08:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type RenderOpts struct { | 
					
						
							| 
									
										
										
										
											2015-03-21 07:14:13 +08:00
										 |  |  | 	Url       string | 
					
						
							|  |  |  | 	Width     string | 
					
						
							|  |  |  | 	Height    string | 
					
						
							|  |  |  | 	SessionId string | 
					
						
							| 
									
										
										
										
											2016-03-10 23:02:10 +08:00
										 |  |  | 	Timeout   string | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func RenderToPng(params *RenderOpts) (string, error) { | 
					
						
							|  |  |  | 	log.Info("PhantomRenderer::renderToPng url %v", params.Url) | 
					
						
							| 
									
										
										
										
											2016-02-16 17:09:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var executable = "phantomjs" | 
					
						
							|  |  |  | 	if runtime.GOOS == "windows" { | 
					
						
							|  |  |  | 		executable = executable + ".exe" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	binPath, _ := filepath.Abs(filepath.Join(setting.PhantomDir, executable)) | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	scriptPath, _ := filepath.Abs(filepath.Join(setting.PhantomDir, "render.js")) | 
					
						
							| 
									
										
										
										
											2015-04-08 14:59:12 +08:00
										 |  |  | 	pngPath, _ := filepath.Abs(filepath.Join(setting.ImagesDir, util.GetRandomString(20))) | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	pngPath = pngPath + ".png" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-13 22:07:03 +08:00
										 |  |  | 	cmd := exec.Command(binPath, "--ignore-ssl-errors=true", scriptPath, "url="+params.Url, "width="+params.Width, | 
					
						
							| 
									
										
										
										
											2015-03-21 07:14:13 +08:00
										 |  |  | 		"height="+params.Height, "png="+pngPath, "cookiename="+setting.SessionOptions.CookieName, | 
					
						
							|  |  |  | 		"domain="+setting.Domain, "sessionid="+params.SessionId) | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	stdout, err := cmd.StdoutPipe() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	stderr, err := cmd.StderrPipe() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = cmd.Start() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go io.Copy(os.Stdout, stdout) | 
					
						
							|  |  |  | 	go io.Copy(os.Stdout, stderr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	done := make(chan error) | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		cmd.Wait() | 
					
						
							|  |  |  | 		close(done) | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 23:02:10 +08:00
										 |  |  | 	timeout, err := strconv.Atoi(params.Timeout) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		timeout = 15 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	select { | 
					
						
							| 
									
										
										
										
											2016-03-10 23:02:10 +08:00
										 |  |  | 	case <-time.After(time.Duration(timeout) * time.Second): | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 		if err := cmd.Process.Kill(); err != nil { | 
					
						
							|  |  |  | 			log.Error(4, "failed to kill: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-04 15:07:45 +08:00
										 |  |  | 		return "", fmt.Errorf("PhantomRenderer::renderToPng timeout (>%vs)", timeout) | 
					
						
							| 
									
										
										
										
											2014-10-07 03:31:54 +08:00
										 |  |  | 	case <-done: | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return pngPath, nil | 
					
						
							|  |  |  | } |