Browse Source

Solo panel and phantom rendering work

Torkel Ödegaard 11 years ago
parent
commit
4a73e2d0e9
3 changed files with 37 additions and 9 deletions
  1. 4 2
      _vendor/phantomjs/render.js
  2. 26 4
      pkg/api/api_auth.go
  3. 7 3
      pkg/api/api_render.go

+ 4 - 2
_vendor/phantomjs/render.js

@@ -1,10 +1,12 @@
 var page = require('webpage').create();
 var page = require('webpage').create();
 var args = require('system').args;
 var args = require('system').args;
 var params = {};
 var params = {};
+var regexp = /^([^=]+)=([^$]+)/;
 
 
 args.forEach(function(arg) {
 args.forEach(function(arg) {
-  var parts = arg.split('=');
-  params[parts[0]] = parts[1];
+  var parts = arg.match(regexp);
+  if (!parts) { return; }
+  params[parts[1]] = parts[2];
 });
 });
 
 
 var usage = "url=<url> png=<filename> width=<width> height=<height>";
 var usage = "url=<url> png=<filename> width=<width> height=<height>";

+ 26 - 4
pkg/api/api_auth.go

@@ -1,8 +1,13 @@
 package api
 package api
 
 
 import (
 import (
-	"github.com/gin-gonic/gin"
+	"errors"
+	"strconv"
+
 	"github.com/torkelo/grafana-pro/pkg/models"
 	"github.com/torkelo/grafana-pro/pkg/models"
+
+	"github.com/gin-gonic/gin"
+	"github.com/gorilla/sessions"
 )
 )
 
 
 type authContext struct {
 type authContext struct {
@@ -19,16 +24,34 @@ func (self *HttpServer) authDenied(c *gin.Context) {
 	c.Abort(302)
 	c.Abort(302)
 }
 }
 
 
+func authGetRequestAccountId(c *gin.Context, session *sessions.Session) (int, error) {
+	accountId := session.Values["accountId"]
+
+	urlQuery := c.Request.URL.Query()
+	if len(urlQuery["render"]) > 0 {
+		accId, _ := strconv.Atoi(urlQuery["accountId"][0])
+		session.Values["accountId"] = accId
+		accountId = accId
+	}
+
+	if accountId == nil {
+		return -1, errors.New("Auth: session account id not found")
+	}
+
+	return accountId.(int), nil
+}
+
 func (self *HttpServer) auth() gin.HandlerFunc {
 func (self *HttpServer) auth() gin.HandlerFunc {
 	return func(c *gin.Context) {
 	return func(c *gin.Context) {
 		session, _ := sessionStore.Get(c.Request, "grafana-session")
 		session, _ := sessionStore.Get(c.Request, "grafana-session")
+		accountId, err := authGetRequestAccountId(c, session)
 
 
-		if c.Request.URL.Path != "/login" && session.Values["accountId"] == nil {
+		if err != nil && c.Request.URL.Path != "/login" {
 			self.authDenied(c)
 			self.authDenied(c)
 			return
 			return
 		}
 		}
 
 
-		account, err := self.store.GetAccount(session.Values["accountId"].(int))
+		account, err := self.store.GetAccount(accountId)
 		if err != nil {
 		if err != nil {
 			self.authDenied(c)
 			self.authDenied(c)
 			return
 			return
@@ -42,7 +65,6 @@ func (self *HttpServer) auth() gin.HandlerFunc {
 
 
 		c.Set("userAccount", account)
 		c.Set("userAccount", account)
 		c.Set("usingAccount", usingAccount)
 		c.Set("usingAccount", usingAccount)
-
 		session.Save(c.Request, c.Writer)
 		session.Save(c.Request, c.Writer)
 	}
 	}
 }
 }

+ 7 - 3
pkg/api/api_render.go

@@ -1,20 +1,24 @@
 package api
 package api
 
 
 import (
 import (
+	"strconv"
+
 	log "github.com/alecthomas/log4go"
 	log "github.com/alecthomas/log4go"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 )
 )
 
 
 func init() {
 func init() {
 	addRoutes(func(self *HttpServer) {
 	addRoutes(func(self *HttpServer) {
-		self.router.GET("/api/render/*url", self.renderToPng)
+		self.addRoute("GET", "/api/render/*url", self.renderToPng)
 	})
 	})
 }
 }
 
 
-func (self *HttpServer) renderToPng(c *gin.Context) {
+func (self *HttpServer) renderToPng(c *gin.Context, auth *authContext) {
 	url := c.Params.ByName("url")
 	url := c.Params.ByName("url")
+	accountId := auth.getAccountId()
+
 	log.Info("Rendering url %v", url)
 	log.Info("Rendering url %v", url)
-	pngPath, err := self.renderer.RenderToPng("http://localhost:3000/" + url)
+	pngPath, err := self.renderer.RenderToPng("http://localhost:3000" + url + "?render&accountId=" + strconv.Itoa(accountId))
 	if err != nil {
 	if err != nil {
 		c.HTML(500, "error.html", nil)
 		c.HTML(500, "error.html", nil)
 	}
 	}