// Get /api/orgs/name/:name func GetOrgByName(c *middleware.Context) Response { query := m.GetOrgByNameQuery{Name: c.Params(":name")} if err := bus.Dispatch(&query); err != nil { if err == m.ErrOrgNotFound { return ApiError(404, "Organization not found", err) } return ApiError(500, "Failed to get organization", err) } org := query.Result result := m.OrgDetailsDTO{ Id: org.Id, Name: org.Name, Address: m.Address{ Address1: org.Address1, Address2: org.Address2, City: org.City, ZipCode: org.ZipCode, State: org.State, Country: org.Country, }, } return Json(200, &result) }
func GraphiteProxy(c *middleware.Context) { proxyPath := c.Params("*") target, _ := url.Parse(setting.GraphiteUrl) // check if this is a special raintank_db requests if proxyPath == "metrics/find" { query := c.Query("query") if strings.HasPrefix(query, "raintank_db") { response, err := executeRaintankDbQuery(query, c.OrgId) if err != nil { c.JsonApiErr(500, "Failed to execute raintank_db query", err) return } c.JSON(200, response) return } } director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.Header.Add("X-Org-Id", strconv.FormatInt(c.OrgId, 10)) req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.RW(), c.Req.Request) }
func GetSubProcessByName(c *middleware.Context) Response { logger := log.New("main") logger.Info("Get Sub Process1 %s") processName := c.Params(":processName") logger.Info("Get Sub Process 2 %s", processName) return getSubProcessProfile(processName) }
func RevokeInvite(c *middleware.Context) Response { if ok, rsp := updateTempUserStatus(c.Params(":code"), m.TmpUserRevoked); !ok { return rsp } return ApiSuccess("Invite revoked") }
func GetDashboardSnapshot(c *middleware.Context) { key := c.Params(":key") query := &m.GetDashboardSnapshotQuery{Key: key} err := bus.Dispatch(query) if err != nil { c.JsonApiErr(500, "Failed to get dashboard snapshot", err) return } snapshot := query.Result // expired snapshots should also be removed from db if snapshot.Expires.Before(time.Now()) { c.JsonApiErr(404, "Snapshot not found", err) return } dto := dtos.DashboardFullWithMeta{ Dashboard: snapshot.Dashboard, Meta: dtos.DashboardMeta{ Type: m.DashTypeSnapshot, IsSnapshot: true, Created: snapshot.Created, Expires: snapshot.Expires, }, } metrics.M_Api_Dashboard_Snapshot_Get.Inc(1) c.Resp.Header().Set("Cache-Control", "public, max-age=3600") c.JSON(200, dto) }
func RenderToPng(c *middleware.Context) { queryReader := util.NewUrlQueryReader(c.Req.URL) queryParams := fmt.Sprintf("?%s", c.Req.URL.RawQuery) sessionId := c.Session.ID() // Handle api calls authenticated without session if sessionId == "" && c.ApiKeyId != 0 { c.Session.Start(c) c.Session.Set(middleware.SESS_KEY_APIKEY, c.ApiKeyId) // release will make sure the new session is persisted before // we spin up phantomjs c.Session.Release() // cleanup session after render is complete defer func() { c.Session.Destory(c) }() } renderOpts := &renderer.RenderOpts{ Url: c.Params("*") + queryParams, Width: queryReader.Get("width", "800"), Height: queryReader.Get("height", "400"), SessionId: c.Session.ID(), } renderOpts.Url = setting.ToAbsUrl(renderOpts.Url) pngPath, err := renderer.RenderToPng(renderOpts) if err != nil { c.Handle(500, "Failed to render to png", err) return } c.Resp.Header().Set("Content-Type", "image/png") http.ServeFile(c.Resp, c.Req.Request, pngPath) }
func ProxyDataSourceRequest(c *middleware.Context) { ds, err := getDatasource(c.ParamsInt64(":id"), c.OrgId) if err != nil { c.JsonApiErr(500, "Unable to load datasource meta data", err) return } targetUrl, _ := url.Parse(ds.Url) if len(setting.DataProxyWhiteList) > 0 { if _, exists := setting.DataProxyWhiteList[targetUrl.Host]; !exists { c.JsonApiErr(403, "Data proxy hostname and ip are not included in whitelist", nil) return } } keystoneAuth, _ := ds.JsonData["keystoneAuth"].(bool) if keystoneAuth { token, err := keystone.GetToken(c) if err != nil { c.JsonApiErr(500, "Failed to get keystone token", err) } c.Req.Request.Header["X-Auth-Token"] = []string{token} } if ds.Type == m.DS_CLOUDWATCH { cloudwatch.HandleRequest(c, ds) } else { proxyPath := c.Params("*") proxy := NewReverseProxy(ds, proxyPath, targetUrl) proxy.Transport = dataProxyTransport proxy.ServeHTTP(c.Resp, c.Req.Request) c.Resp.Header().Del("Set-Cookie") } }
//ProxyDataSourceRequest TODO need to cache datasources func ProxyDataSourceRequest(c *middleware.Context) { id := c.ParamsInt64(":id") query := m.GetDataSourceByIdQuery{Id: id, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { c.JsonApiErr(500, "Unable to load datasource meta data", err) return } ds := query.Result targetUrl, _ := url.Parse(ds.Url) if len(setting.DataProxyWhiteList) > 0 { if _, exists := setting.DataProxyWhiteList[targetUrl.Host]; !exists { c.JsonApiErr(403, "Data proxy hostname and ip are not included in whitelist", nil) return } } if query.Result.Type == m.DS_CLOUDWATCH { cloudwatch.HandleRequest(c) } else { proxyPath := c.Params("*") proxy := NewReverseProxy(&ds, proxyPath, targetUrl) proxy.Transport = dataProxyTransport proxy.ServeHTTP(c.RW(), c.Req.Request) } }
func ProxyGnetRequest(c *middleware.Context) { proxyPath := c.Params("*") proxy := ReverseProxyGnetReq(proxyPath) proxy.Transport = gNetProxyTransport proxy.ServeHTTP(c.Resp, c.Req.Request) c.Resp.Header().Del("Set-Cookie") }
func GetPluginSettingById(c *middleware.Context) Response { pluginId := c.Params(":pluginId") if def, exists := plugins.Plugins[pluginId]; !exists { return ApiError(404, "Plugin not found, no installed plugin with that id", nil) } else { dto := &dtos.PluginSetting{ Type: def.Type, Id: def.Id, Name: def.Name, Info: &def.Info, Dependencies: &def.Dependencies, Includes: def.Includes, BaseUrl: def.BaseUrl, Module: def.Module, DefaultNavUrl: def.DefaultNavUrl, LatestVersion: def.GrafanaNetVersion, HasUpdate: def.GrafanaNetHasUpdate, } query := m.GetPluginSettingByIdQuery{PluginId: pluginId, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { if err != m.ErrPluginSettingNotFound { return ApiError(500, "Failed to get login settings", nil) } } else { dto.Enabled = query.Result.Enabled dto.Pinned = query.Result.Pinned dto.JsonData = query.Result.JsonData } return Json(200, dto) } }
func ProxyDataSourceRequest(c *middleware.Context) { c.TimeRequest(metrics.M_DataSource_ProxyReq_Timer) ds, err := getDatasource(c.ParamsInt64(":id"), c.OrgId) if err != nil { c.JsonApiErr(500, "Unable to load datasource meta data", err) return } targetUrl, _ := url.Parse(ds.Url) if len(setting.DataProxyWhiteList) > 0 { if _, exists := setting.DataProxyWhiteList[targetUrl.Host]; !exists { c.JsonApiErr(403, "Data proxy hostname and ip are not included in whitelist", nil) return } } if ds.Type == m.DS_CLOUDWATCH { cloudwatch.HandleRequest(c, ds) } else { proxyPath := c.Params("*") proxy := NewReverseProxy(ds, proxyPath, targetUrl) proxy.Transport = dataProxyTransport proxy.ServeHTTP(c.Resp, c.Req.Request) c.Resp.Header().Del("Set-Cookie") } }
func GetDashboard(c *middleware.Context) { metrics.M_Api_Dashboard_Get.Inc(1) slug := strings.ToLower(c.Params(":slug")) query := m.GetDashboardQuery{Slug: slug, OrgId: c.OrgId} err := bus.Dispatch(&query) if err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return } isStarred, err := isDasboardStarredByUser(c, query.Result.Id) if err != nil { c.JsonApiErr(500, "Error while checking if dashboard was starred by user", err) return } dash := query.Result dto := dtos.DashboardFullWithMeta{ Dashboard: dash.Data, Meta: dtos.DashboardMeta{ IsStarred: isStarred, Slug: slug, Type: m.DashTypeDB, CanStar: c.IsSignedIn, CanSave: c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR, CanEdit: canEditDashboard(c.OrgRole), }, } c.JSON(200, dto) }
func ProxyDataSourceRequest(c *middleware.Context) { c.TimeRequest(metrics.M_DataSource_ProxyReq_Timer) ds, err := getDatasource(c.ParamsInt64(":id"), c.OrgId) if err != nil { c.JsonApiErr(500, "Unable to load datasource meta data", err) return } if ds.Type == m.DS_CLOUDWATCH { cloudwatch.HandleRequest(c, ds) return } if ds.Type == m.DS_INFLUXDB { if c.Query("db") != ds.Database { c.JsonApiErr(403, "Datasource is not configured to allow this database", nil) return } } targetUrl, _ := url.Parse(ds.Url) if len(setting.DataProxyWhiteList) > 0 { if _, exists := setting.DataProxyWhiteList[targetUrl.Host]; !exists { c.JsonApiErr(403, "Data proxy hostname and ip are not included in whitelist", nil) return } } proxyPath := c.Params("*") if ds.Type == m.DS_ES { if c.Req.Request.Method == "DELETE" { c.JsonApiErr(403, "Deletes not allowed on proxied Elasticsearch datasource", nil) return } if c.Req.Request.Method == "PUT" { c.JsonApiErr(403, "Puts not allowed on proxied Elasticsearch datasource", nil) return } if c.Req.Request.Method == "POST" && proxyPath != "_msearch" { c.JsonApiErr(403, "Posts not allowed on proxied Elasticsearch datasource except on /_msearch", nil) return } } proxy := NewReverseProxy(ds, proxyPath, targetUrl) proxy.Transport, err = ds.GetHttpTransport() if err != nil { c.JsonApiErr(400, "Unable to load TLS certificate", err) return } logProxyRequest(ds.Type, c) proxy.ServeHTTP(c.Resp, c.Req.Request) c.Resp.Header().Del("Set-Cookie") }
func DeleteDashboardSnapshot(c *middleware.Context) { key := c.Params(":key") cmd := &m.DeleteDashboardSnapshotCommand{DeleteKey: key} if err := bus.Dispatch(cmd); err != nil { c.JsonApiErr(500, "Failed to delete dashboard snapshot", err) return } c.JSON(200, util.DynMap{"message": "Snapshot deleted. It might take an hour before it's cleared from a CDN cache."}) }
func RevokeInvite(c *middleware.Context) Response { cmd := m.UpdateTempUserStatusCommand{ Code: c.Params(":code"), Status: m.TmpUserRevoked, } if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Failed to update invite status", err) } return ApiSuccess("Invite revoked") }
func GetPluginDashboards(c *middleware.Context) Response { pluginId := c.Params(":pluginId") if list, err := plugins.GetPluginDashboards(c.OrgId, pluginId); err != nil { if notfound, ok := err.(plugins.PluginNotFoundError); ok { return ApiError(404, notfound.Error(), nil) } return ApiError(500, "Failed to get plugin dashboards", err) } else { return Json(200, list) } }
// Get /api/datasources/name/:name func GetDataSourceByName(c *middleware.Context) Response { query := m.GetDataSourceByNameQuery{Name: c.Params(":name"), OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { if err == m.ErrDataSourceNotFound { return ApiError(404, "Data source not found", nil) } return ApiError(500, "Failed to query datasources", err) } dtos := convertModelToDtos(query.Result) return Json(200, &dtos) }
func GetPluginReadme(c *middleware.Context) Response { pluginId := c.Params(":pluginId") if content, err := plugins.GetPluginReadme(pluginId); err != nil { if notfound, ok := err.(plugins.PluginNotFoundError); ok { return ApiError(404, notfound.Error(), nil) } return ApiError(500, "Could not get readme", err) } else { return Respond(200, content) } }
func UpdateOrgQuota(c *middleware.Context, cmd m.UpdateQuotaCmd) Response { cmd.OrgId = c.ParamsInt64(":orgId") cmd.Target = m.QuotaTarget(c.Params(":target")) if !cmd.Target.IsValid() { return ApiError(404, "Invalid quota target", nil) } if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Failed to update org quotas", err) } return ApiSuccess("Organization quota updated") }
func GetDashboard(c *middleware.Context) { metrics.M_Api_Dashboard_Get.Inc(1) slug := strings.ToLower(c.Params(":slug")) query := m.GetDashboardQuery{Slug: slug, OrgId: c.OrgId} err := bus.Dispatch(&query) if err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return } isStarred, err := isDasboardStarredByUser(c, query.Result.Id) if err != nil { c.JsonApiErr(500, "Error while checking if dashboard was starred by user", err) return } dash := query.Result // Finding the last updater of the dashboard updater := "Anonymous" if dash.UpdatedBy != 0 { userQuery := m.GetUserByIdQuery{Id: dash.UpdatedBy} userErr := bus.Dispatch(&userQuery) if userErr != nil { updater = "Unknown" } else { user := userQuery.Result updater = user.Login } } dto := dtos.DashboardFullWithMeta{ Dashboard: dash.Data, Meta: dtos.DashboardMeta{ IsStarred: isStarred, Slug: slug, Type: m.DashTypeDB, CanStar: c.IsSignedIn, CanSave: c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR, CanEdit: canEditDashboard(c.OrgRole), Created: dash.Created, Updated: dash.Updated, UpdatedBy: updater, }, } c.JSON(200, dto) }
//ProxyDataSourceRequest TODO need to cache datasources func ProxyDataSourceRequest(c *middleware.Context) { id := c.ParamsInt64(":id") query := m.GetDataSourceByIdQuery{Id: id, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { c.JsonApiErr(500, "Unable to load datasource meta data", err) return } proxyPath := c.Params("*") proxy := NewReverseProxy(&query.Result, proxyPath) proxy.Transport = dataProxyTransport proxy.ServeHTTP(c.RW(), c.Req.Request) }
func GetDashboardFromJsonFile(c *middleware.Context) { file := c.Params(":file") dashboard := search.GetDashboardFromJsonIndex(file) if dashboard == nil { c.JsonApiErr(404, "Dashboard not found", nil) return } dash := dtos.DashboardFullWithMeta{Dashboard: dashboard.Data} dash.Meta.Type = m.DashTypeJson c.JSON(200, &dash) }
func GetAppSettingsById(c *middleware.Context) Response { appId := c.Params(":appId") if pluginDef, exists := plugins.Apps[appId]; !exists { return ApiError(404, "PluginId not found, no installed plugin with that id", nil) } else { orgApps, err := plugins.GetOrgAppSettings(c.OrgId) if err != nil { return ApiError(500, "Failed to get org app settings ", nil) } orgApp := orgApps[appId] return Json(200, dtos.NewAppSettingsDto(pluginDef, orgApp)) } }
func UpdateUserQuota(c *middleware.Context, cmd m.UpdateUserQuotaCmd) Response { if !setting.Quota.Enabled { return ApiError(404, "Quotas not enabled", nil) } cmd.UserId = c.ParamsInt64(":id") cmd.Target = c.Params(":target") if _, ok := setting.Quota.User.ToMap()[cmd.Target]; !ok { return ApiError(404, "Invalid quota target", nil) } if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Failed to update org quotas", err) } return ApiSuccess("Organization quota updated") }
func UpdatePluginSetting(c *middleware.Context, cmd m.UpdatePluginSettingCmd) Response { pluginId := c.Params(":pluginId") cmd.OrgId = c.OrgId cmd.PluginId = pluginId if _, ok := plugins.Apps[cmd.PluginId]; !ok { return ApiError(404, "Plugin not installed.", nil) } if err := bus.Dispatch(&cmd); err != nil { return ApiError(500, "Failed to update plugin setting", err) } return ApiSuccess("Plugin settings updated") }
func GetDashboard(c *middleware.Context) { slug := strings.ToLower(c.Params(":slug")) query := m.GetDashboardQuery{Slug: slug, OrgId: c.OrgId} err := bus.Dispatch(&query) if err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return } isStarred, err := isDashboardStarredByUser(c, query.Result.Id) if err != nil { c.JsonApiErr(500, "Error while checking if dashboard was starred by user", err) return } dash := query.Result // Finding creator and last updater of the dashboard updater, creator := "Anonymous", "Anonymous" if dash.UpdatedBy > 0 { updater = getUserLogin(dash.UpdatedBy) } if dash.CreatedBy > 0 { creator = getUserLogin(dash.CreatedBy) } dto := dtos.DashboardFullWithMeta{ Dashboard: dash.Data, Meta: dtos.DashboardMeta{ IsStarred: isStarred, Slug: slug, Type: m.DashTypeDB, CanStar: c.IsSignedIn, CanSave: c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR, CanEdit: canEditDashboard(c.OrgRole), Created: dash.Created, Updated: dash.Updated, UpdatedBy: updater, CreatedBy: creator, Version: dash.Version, }, } c.TimeRequest(metrics.M_Api_Dashboard_Get) c.JSON(200, dto) }
func UpdateAppSettings(c *middleware.Context, cmd m.UpdateAppSettingsCmd) Response { appId := c.Params(":appId") cmd.OrgId = c.OrgId cmd.AppId = appId if _, ok := plugins.Apps[cmd.AppId]; !ok { return ApiError(404, "App type not installed.", nil) } err := bus.Dispatch(&cmd) if err != nil { return ApiError(500, "Failed to update App Plugin", err) } return ApiSuccess("App updated") }
func DeleteDashboard(c *middleware.Context) { slug := c.Params(":slug") query := m.GetDashboardQuery{Slug: slug, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { c.JsonApiErr(404, "Dashboard not found", nil) return } cmd := m.DeleteDashboardCommand{Slug: slug, OrgId: c.OrgId} if err := bus.Dispatch(&cmd); err != nil { c.JsonApiErr(500, "Failed to delete dashboard", err) return } var resp = map[string]interface{}{"title": query.Result.Title} c.JSON(200, resp) }
func GetInviteInfoByCode(c *middleware.Context) Response { query := m.GetTempUserByCodeQuery{Code: c.Params(":code")} if err := bus.Dispatch(&query); err != nil { if err == m.ErrTempUserNotFound { return ApiError(404, "Invite not found", nil) } return ApiError(500, "Failed to get invite", err) } invite := query.Result return Json(200, dtos.InviteInfo{ Email: invite.Email, Name: invite.Name, Username: invite.Email, InvitedBy: util.StringsFallback3(invite.InvitedByName, invite.InvitedByLogin, invite.InvitedByEmail), }) }
func RenderToPng(c *middleware.Context) { queryReader := util.NewUrlQueryReader(c.Req.URL) queryParams := fmt.Sprintf("?%s", c.Req.URL.RawQuery) renderOpts := &renderer.RenderOpts{ Path: c.Params("*") + queryParams, Width: queryReader.Get("width", "800"), Height: queryReader.Get("height", "400"), OrgId: c.OrgId, Timeout: queryReader.Get("timeout", "30"), } pngPath, err := renderer.RenderToPng(renderOpts) if err != nil { c.Handle(500, "Failed to render to png", err) return } c.Resp.Header().Set("Content-Type", "image/png") http.ServeFile(c.Resp, c.Req.Request, pngPath) }