frontendsettings.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package api
  2. import (
  3. "strconv"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. "github.com/grafana/grafana/pkg/util"
  6. "github.com/grafana/grafana/pkg/bus"
  7. "github.com/grafana/grafana/pkg/log"
  8. m "github.com/grafana/grafana/pkg/models"
  9. "github.com/grafana/grafana/pkg/plugins"
  10. "github.com/grafana/grafana/pkg/setting"
  11. )
  12. // getFrontendSettingsMap returns a json object with all the settings needed for front end initialisation.
  13. func (hs *HTTPServer) getFrontendSettingsMap(c *m.ReqContext) (map[string]interface{}, error) {
  14. orgDataSources := make([]*m.DataSource, 0)
  15. if c.OrgId != 0 {
  16. query := m.GetDataSourcesQuery{OrgId: c.OrgId}
  17. err := bus.Dispatch(&query)
  18. if err != nil {
  19. return nil, err
  20. }
  21. dsFilterQuery := m.DatasourcesPermissionFilterQuery{
  22. User: c.SignedInUser,
  23. Datasources: query.Result,
  24. }
  25. if err := bus.Dispatch(&dsFilterQuery); err != nil {
  26. if err != bus.ErrHandlerNotFound {
  27. return nil, err
  28. }
  29. orgDataSources = query.Result
  30. } else {
  31. orgDataSources = dsFilterQuery.Result
  32. }
  33. }
  34. datasources := make(map[string]interface{})
  35. var defaultDatasource string
  36. enabledPlugins, err := plugins.GetEnabledPlugins(c.OrgId)
  37. if err != nil {
  38. return nil, err
  39. }
  40. pluginsToPreload := []string{}
  41. for _, app := range enabledPlugins.Apps {
  42. if app.Preload {
  43. pluginsToPreload = append(pluginsToPreload, app.Module)
  44. }
  45. }
  46. for _, ds := range orgDataSources {
  47. url := ds.Url
  48. if ds.Access == m.DS_ACCESS_PROXY {
  49. url = "/api/datasources/proxy/" + strconv.FormatInt(ds.Id, 10)
  50. }
  51. var dsMap = map[string]interface{}{
  52. "id": ds.Id,
  53. "type": ds.Type,
  54. "name": ds.Name,
  55. "url": url,
  56. }
  57. meta, exists := enabledPlugins.DataSources[ds.Type]
  58. if !exists {
  59. log.Error(3, "Could not find plugin definition for data source: %v", ds.Type)
  60. continue
  61. }
  62. if meta.Preload {
  63. pluginsToPreload = append(pluginsToPreload, meta.Module)
  64. }
  65. dsMap["meta"] = meta
  66. if ds.IsDefault {
  67. defaultDatasource = ds.Name
  68. }
  69. jsonData := ds.JsonData
  70. if jsonData == nil {
  71. jsonData = simplejson.New()
  72. }
  73. dsMap["jsonData"] = jsonData
  74. if ds.Access == m.DS_ACCESS_DIRECT {
  75. if ds.BasicAuth {
  76. dsMap["basicAuth"] = util.GetBasicAuthHeader(ds.BasicAuthUser, ds.DecryptedBasicAuthPassword())
  77. }
  78. if ds.WithCredentials {
  79. dsMap["withCredentials"] = ds.WithCredentials
  80. }
  81. if ds.Type == m.DS_INFLUXDB_08 {
  82. dsMap["username"] = ds.User
  83. dsMap["password"] = ds.DecryptedPassword()
  84. dsMap["url"] = url + "/db/" + ds.Database
  85. }
  86. if ds.Type == m.DS_INFLUXDB {
  87. dsMap["username"] = ds.User
  88. dsMap["password"] = ds.DecryptedPassword()
  89. dsMap["url"] = url
  90. }
  91. }
  92. if ds.Type == m.DS_ES {
  93. dsMap["index"] = ds.Database
  94. }
  95. if ds.Type == m.DS_INFLUXDB {
  96. dsMap["database"] = ds.Database
  97. }
  98. if ds.Type == m.DS_PROMETHEUS {
  99. // add unproxied server URL for link to Prometheus web UI
  100. jsonData.Set("directUrl", ds.Url)
  101. }
  102. datasources[ds.Name] = dsMap
  103. }
  104. // add datasources that are built in (meaning they are not added via data sources page, nor have any entry in datasource table)
  105. for _, ds := range plugins.DataSources {
  106. if ds.BuiltIn {
  107. datasources[ds.Name] = map[string]interface{}{
  108. "type": ds.Type,
  109. "name": ds.Name,
  110. "meta": plugins.DataSources[ds.Id],
  111. }
  112. }
  113. }
  114. if defaultDatasource == "" {
  115. defaultDatasource = "-- Grafana --"
  116. }
  117. panels := map[string]interface{}{}
  118. for _, panel := range enabledPlugins.Panels {
  119. if panel.State == plugins.PluginStateAlpha && !hs.Cfg.PluginsEnableAlpha {
  120. continue
  121. }
  122. if panel.Preload {
  123. pluginsToPreload = append(pluginsToPreload, panel.Module)
  124. }
  125. panels[panel.Id] = map[string]interface{}{
  126. "module": panel.Module,
  127. "baseUrl": panel.BaseUrl,
  128. "name": panel.Name,
  129. "id": panel.Id,
  130. "info": panel.Info,
  131. "hideFromList": panel.HideFromList,
  132. "sort": getPanelSort(panel.Id),
  133. "skipDataQuery": panel.SkipDataQuery,
  134. "state": panel.State,
  135. }
  136. }
  137. jsonObj := map[string]interface{}{
  138. "defaultDatasource": defaultDatasource,
  139. "datasources": datasources,
  140. "panels": panels,
  141. "appSubUrl": setting.AppSubUrl,
  142. "allowOrgCreate": (setting.AllowUserOrgCreate && c.IsSignedIn) || c.IsGrafanaAdmin,
  143. "authProxyEnabled": setting.AuthProxyEnabled,
  144. "ldapEnabled": setting.LdapEnabled,
  145. "alertingEnabled": setting.AlertingEnabled,
  146. "alertingErrorOrTimeout": setting.AlertingErrorOrTimeout,
  147. "alertingNoDataOrNullValues": setting.AlertingNoDataOrNullValues,
  148. "exploreEnabled": setting.ExploreEnabled,
  149. "googleAnalyticsId": setting.GoogleAnalyticsId,
  150. "disableLoginForm": setting.DisableLoginForm,
  151. "externalUserMngInfo": setting.ExternalUserMngInfo,
  152. "externalUserMngLinkUrl": setting.ExternalUserMngLinkUrl,
  153. "externalUserMngLinkName": setting.ExternalUserMngLinkName,
  154. "viewersCanEdit": setting.ViewersCanEdit,
  155. "editorsCanAdmin": hs.Cfg.EditorsCanAdmin,
  156. "disableSanitizeHtml": hs.Cfg.DisableSanitizeHtml,
  157. "pluginsToPreload": pluginsToPreload,
  158. "buildInfo": map[string]interface{}{
  159. "version": setting.BuildVersion,
  160. "commit": setting.BuildCommit,
  161. "buildstamp": setting.BuildStamp,
  162. "latestVersion": plugins.GrafanaLatestVersion,
  163. "hasUpdate": plugins.GrafanaHasUpdate,
  164. "env": setting.Env,
  165. "isEnterprise": setting.IsEnterprise,
  166. },
  167. }
  168. return jsonObj, nil
  169. }
  170. func getPanelSort(id string) int {
  171. sort := 100
  172. switch id {
  173. case "graph":
  174. sort = 1
  175. case "singlestat":
  176. sort = 2
  177. case "gauge":
  178. sort = 3
  179. case "bargauge":
  180. sort = 4
  181. case "table":
  182. sort = 5
  183. case "text":
  184. sort = 6
  185. case "heatmap":
  186. sort = 7
  187. case "alertlist":
  188. sort = 8
  189. case "dashlist":
  190. sort = 9
  191. }
  192. return sort
  193. }
  194. func (hs *HTTPServer) GetFrontendSettings(c *m.ReqContext) {
  195. settings, err := hs.getFrontendSettingsMap(c)
  196. if err != nil {
  197. c.JsonApiErr(400, "Failed to get frontend settings", err)
  198. return
  199. }
  200. c.JSON(200, settings)
  201. }