Browse Source

rendering

Torkel Ödegaard 11 years ago
parent
commit
05f9e5eef1
5 changed files with 40 additions and 17 deletions
  1. 16 7
      _vendor/phantomjs/render.js
  2. 1 1
      grafana
  3. 12 5
      pkg/api/api_render.go
  4. 10 4
      pkg/components/phantom_renderer.go
  5. 1 0
      todo.txt

+ 16 - 7
_vendor/phantomjs/render.js

@@ -17,18 +17,27 @@ if (!params.url || !params.png) {
 }
 }
 
 
 page.viewportSize = {
 page.viewportSize = {
-  width: '800',
-  height: '400'
+  width: params.width || '800',
+  height: params.height || '400'
 };
 };
 
 
 page.open(params.url, function (status) {
 page.open(params.url, function (status) {
   console.log('Loading a web page: ' + params.url);
   console.log('Loading a web page: ' + params.url);
 
 
-  setTimeout(function() {
-    console.log('rendering panel to ' + params.png);
+  function checkIsReady() {
+    var canvas = page.evaluate(function() {
+      return $('canvas').length > 0;
+    });
 
 
-    page.render(params.png);
-    phantom.exit();
+    if (canvas) {
+      page.render(params.png);
+      phantom.exit();
+    }
+    else {
+      setTimeout(checkIsReady, 10);
+    }
+  }
+
+  setTimeout(checkIsReady, 200);
 
 
-  }, 2000);
 });
 });

+ 1 - 1
grafana

@@ -1 +1 @@
-Subproject commit de1de852fc130d6b5c75c28a93aab38bbbe726b8
+Subproject commit eb28e63c08a43ada747fbcdae9612301c9c7a531

+ 12 - 5
pkg/api/api_render.go

@@ -3,22 +3,29 @@ package api
 import (
 import (
 	"strconv"
 	"strconv"
 
 
-	log "github.com/alecthomas/log4go"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
+	"github.com/torkelo/grafana-pro/pkg/components"
 )
 )
 
 
 func init() {
 func init() {
 	addRoutes(func(self *HttpServer) {
 	addRoutes(func(self *HttpServer) {
-		self.addRoute("GET", "/api/render/*url", self.renderToPng)
+		self.addRoute("GET", "/render/*url", self.renderToPng)
 	})
 	})
 }
 }
 
 
 func (self *HttpServer) renderToPng(c *gin.Context, auth *authContext) {
 func (self *HttpServer) renderToPng(c *gin.Context, auth *authContext) {
-	url := c.Params.ByName("url")
 	accountId := auth.getAccountId()
 	accountId := auth.getAccountId()
+	query := c.Request.URL.Query()
+	queryParams := "?render&accountId=" + strconv.Itoa(accountId) + "&" + c.Request.URL.RawQuery
+	renderOpts := &components.RenderOpts{
+		Url:    c.Params.ByName("url") + queryParams,
+		Width:  query["width"][0],
+		Height: query["height"][0],
+	}
+
+	renderOpts.Url = "http://localhost:3000" + renderOpts.Url
 
 
-	log.Info("Rendering url %v", url)
-	pngPath, err := self.renderer.RenderToPng("http://localhost:3000" + url + "?render&accountId=" + strconv.Itoa(accountId))
+	pngPath, err := self.renderer.RenderToPng(renderOpts)
 	if err != nil {
 	if err != nil {
 		c.HTML(500, "error.html", nil)
 		c.HTML(500, "error.html", nil)
 	}
 	}

+ 10 - 4
pkg/components/phantom_renderer.go

@@ -17,14 +17,20 @@ type PhantomRenderer struct {
 	PhantomDir string
 	PhantomDir string
 }
 }
 
 
-func (self *PhantomRenderer) RenderToPng(url string) (string, error) {
-	log.Info("PhantomRenderer::renderToPng url %v", url)
+type RenderOpts struct {
+	Url    string
+	Width  string
+	Height string
+}
+
+func (self *PhantomRenderer) RenderToPng(params *RenderOpts) (string, error) {
+	log.Info("PhantomRenderer::renderToPng url %v", params.Url)
 	binPath, _ := filepath.Abs(filepath.Join(self.PhantomDir, "phantomjs"))
 	binPath, _ := filepath.Abs(filepath.Join(self.PhantomDir, "phantomjs"))
 	scriptPath, _ := filepath.Abs(filepath.Join(self.PhantomDir, "render.js"))
 	scriptPath, _ := filepath.Abs(filepath.Join(self.PhantomDir, "render.js"))
-	pngPath, _ := filepath.Abs(filepath.Join(self.ImagesDir, getHash(url)))
+	pngPath, _ := filepath.Abs(filepath.Join(self.ImagesDir, getHash(params.Url)))
 	pngPath = pngPath + ".png"
 	pngPath = pngPath + ".png"
 
 
-	cmd := exec.Command(binPath, scriptPath, "url="+url, "width=100", "height=100", "png="+pngPath)
+	cmd := exec.Command(binPath, scriptPath, "url="+params.Url, "width="+params.Width, "height="+params.Height, "png="+pngPath)
 	stdout, err := cmd.StdoutPipe()
 	stdout, err := cmd.StdoutPipe()
 
 
 	if err != nil {
 	if err != nil {

+ 1 - 0
todo.txt

@@ -2,3 +2,4 @@
 - OAuth and email, unique?
 - OAuth and email, unique?
 - Form authentication token
 - Form authentication token
 - Password hash
 - Password hash
+- Account security for png rendering