app_plugin.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package plugins
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "github.com/gosimple/slug"
  6. "github.com/grafana/grafana/pkg/models"
  7. )
  8. type AppPluginPage struct {
  9. Name string `json:"name"`
  10. Slug string `json:"slug"`
  11. Component string `json:"component"`
  12. Role models.RoleType `json:"role"`
  13. SuppressNav bool `json:"suppressNav"`
  14. }
  15. type AppPluginCss struct {
  16. Light string `json:"light"`
  17. Dark string `json:"dark"`
  18. }
  19. type AppPlugin struct {
  20. FrontendPluginBase
  21. Pages []*AppPluginPage `json:"pages"`
  22. Routes []*AppPluginRoute `json:"routes"`
  23. FoundChildPlugins []*PluginInclude `json:"-"`
  24. Pinned bool `json:"-"`
  25. }
  26. type AppPluginRoute struct {
  27. Path string `json:"path"`
  28. Method string `json:"method"`
  29. ReqGrafanaAdmin bool `json:"reqGrafanaAdmin"`
  30. ReqRole models.RoleType `json:"reqRole"`
  31. Url string `json:"url"`
  32. Headers []AppPluginRouteHeader `json:"headers"`
  33. }
  34. type AppPluginRouteHeader struct {
  35. Name string `json:"name"`
  36. Content string `json:"content"`
  37. }
  38. func (app *AppPlugin) Load(decoder *json.Decoder, pluginDir string) error {
  39. if err := decoder.Decode(&app); err != nil {
  40. return err
  41. }
  42. if err := app.registerPlugin(pluginDir); err != nil {
  43. return err
  44. }
  45. Apps[app.Id] = app
  46. return nil
  47. }
  48. func (app *AppPlugin) initApp() {
  49. app.initFrontendPlugin()
  50. // check if we have child panels
  51. for _, panel := range Panels {
  52. if strings.HasPrefix(panel.PluginDir, app.PluginDir) {
  53. panel.setPathsBasedOnApp(app)
  54. app.FoundChildPlugins = append(app.FoundChildPlugins, &PluginInclude{
  55. Name: panel.Name,
  56. Id: panel.Id,
  57. Type: panel.Type,
  58. })
  59. }
  60. }
  61. // check if we have child datasources
  62. for _, ds := range DataSources {
  63. if strings.HasPrefix(ds.PluginDir, app.PluginDir) {
  64. ds.setPathsBasedOnApp(app)
  65. app.FoundChildPlugins = append(app.FoundChildPlugins, &PluginInclude{
  66. Name: ds.Name,
  67. Id: ds.Id,
  68. Type: ds.Type,
  69. })
  70. }
  71. }
  72. // slugify pages
  73. for _, page := range app.Pages {
  74. if page.Slug == "" {
  75. page.Slug = slug.Make(page.Name)
  76. }
  77. }
  78. }