plugins.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package api
  2. import (
  3. "sort"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/plugins"
  8. "github.com/grafana/grafana/pkg/setting"
  9. )
  10. func (hs *HTTPServer) GetPluginList(c *m.ReqContext) Response {
  11. typeFilter := c.Query("type")
  12. enabledFilter := c.Query("enabled")
  13. embeddedFilter := c.Query("embedded")
  14. coreFilter := c.Query("core")
  15. pluginSettingsMap, err := plugins.GetPluginSettings(c.OrgId)
  16. if err != nil {
  17. return Error(500, "Failed to get list of plugins", err)
  18. }
  19. result := make(dtos.PluginList, 0)
  20. for _, pluginDef := range plugins.Plugins {
  21. // filter out app sub plugins
  22. if embeddedFilter == "0" && pluginDef.IncludedInAppId != "" {
  23. continue
  24. }
  25. // filter out core plugins
  26. if coreFilter == "0" && pluginDef.IsCorePlugin {
  27. continue
  28. }
  29. // filter on type
  30. if typeFilter != "" && typeFilter != pluginDef.Type {
  31. continue
  32. }
  33. if pluginDef.State == plugins.PluginStateAlpha && !hs.Cfg.PluginsEnableAlpha {
  34. continue
  35. }
  36. listItem := dtos.PluginListItem{
  37. Id: pluginDef.Id,
  38. Name: pluginDef.Name,
  39. Type: pluginDef.Type,
  40. Category: pluginDef.Category,
  41. Info: &pluginDef.Info,
  42. LatestVersion: pluginDef.GrafanaNetVersion,
  43. HasUpdate: pluginDef.GrafanaNetHasUpdate,
  44. DefaultNavUrl: pluginDef.DefaultNavUrl,
  45. State: pluginDef.State,
  46. }
  47. if pluginSetting, exists := pluginSettingsMap[pluginDef.Id]; exists {
  48. listItem.Enabled = pluginSetting.Enabled
  49. listItem.Pinned = pluginSetting.Pinned
  50. }
  51. if listItem.DefaultNavUrl == "" || !listItem.Enabled {
  52. listItem.DefaultNavUrl = setting.AppSubUrl + "/plugins/" + listItem.Id + "/"
  53. }
  54. // filter out disabled
  55. if enabledFilter == "1" && !listItem.Enabled {
  56. continue
  57. }
  58. // filter out built in data sources
  59. if ds, exists := plugins.DataSources[pluginDef.Id]; exists {
  60. if ds.BuiltIn {
  61. continue
  62. }
  63. }
  64. result = append(result, listItem)
  65. }
  66. sort.Sort(result)
  67. return JSON(200, result)
  68. }
  69. func GetPluginSettingByID(c *m.ReqContext) Response {
  70. pluginID := c.Params(":pluginId")
  71. def, exists := plugins.Plugins[pluginID]
  72. if !exists {
  73. return Error(404, "Plugin not found, no installed plugin with that id", nil)
  74. }
  75. dto := &dtos.PluginSetting{
  76. Type: def.Type,
  77. Id: def.Id,
  78. Name: def.Name,
  79. Info: &def.Info,
  80. Dependencies: &def.Dependencies,
  81. Includes: def.Includes,
  82. BaseUrl: def.BaseUrl,
  83. Module: def.Module,
  84. DefaultNavUrl: def.DefaultNavUrl,
  85. LatestVersion: def.GrafanaNetVersion,
  86. HasUpdate: def.GrafanaNetHasUpdate,
  87. State: def.State,
  88. }
  89. query := m.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: c.OrgId}
  90. if err := bus.Dispatch(&query); err != nil {
  91. if err != m.ErrPluginSettingNotFound {
  92. return Error(500, "Failed to get login settings", nil)
  93. }
  94. } else {
  95. dto.Enabled = query.Result.Enabled
  96. dto.Pinned = query.Result.Pinned
  97. dto.JsonData = query.Result.JsonData
  98. }
  99. return JSON(200, dto)
  100. }
  101. func UpdatePluginSetting(c *m.ReqContext, cmd m.UpdatePluginSettingCmd) Response {
  102. pluginID := c.Params(":pluginId")
  103. cmd.OrgId = c.OrgId
  104. cmd.PluginId = pluginID
  105. if _, ok := plugins.Apps[cmd.PluginId]; !ok {
  106. return Error(404, "Plugin not installed.", nil)
  107. }
  108. if err := bus.Dispatch(&cmd); err != nil {
  109. return Error(500, "Failed to update plugin setting", err)
  110. }
  111. return Success("Plugin settings updated")
  112. }
  113. func GetPluginDashboards(c *m.ReqContext) Response {
  114. pluginID := c.Params(":pluginId")
  115. list, err := plugins.GetPluginDashboards(c.OrgId, pluginID)
  116. if err != nil {
  117. if notfound, ok := err.(plugins.PluginNotFoundError); ok {
  118. return Error(404, notfound.Error(), nil)
  119. }
  120. return Error(500, "Failed to get plugin dashboards", err)
  121. }
  122. return JSON(200, list)
  123. }
  124. func GetPluginMarkdown(c *m.ReqContext) Response {
  125. pluginID := c.Params(":pluginId")
  126. name := c.Params(":name")
  127. content, err := plugins.GetPluginMarkdown(pluginID, name)
  128. if err != nil {
  129. if notfound, ok := err.(plugins.PluginNotFoundError); ok {
  130. return Error(404, notfound.Error(), nil)
  131. }
  132. return Error(500, "Could not get markdown file", err)
  133. }
  134. // fallback try readme
  135. if len(content) == 0 {
  136. content, err = plugins.GetPluginMarkdown(pluginID, "readme")
  137. if err != nil {
  138. return Error(501, "Could not get markdown file", err)
  139. }
  140. }
  141. resp := Respond(200, content)
  142. resp.Header("Content-Type", "text/plain; charset=utf-8")
  143. return resp
  144. }
  145. func ImportDashboard(c *m.ReqContext, apiCmd dtos.ImportDashboardCommand) Response {
  146. cmd := plugins.ImportDashboardCommand{
  147. OrgId: c.OrgId,
  148. User: c.SignedInUser,
  149. PluginId: apiCmd.PluginId,
  150. Path: apiCmd.Path,
  151. Inputs: apiCmd.Inputs,
  152. Overwrite: apiCmd.Overwrite,
  153. FolderId: apiCmd.FolderId,
  154. Dashboard: apiCmd.Dashboard,
  155. }
  156. if err := bus.Dispatch(&cmd); err != nil {
  157. return Error(500, "Failed to import dashboard", err)
  158. }
  159. return JSON(200, cmd.Result)
  160. }