app_plugin.go 2.2 KB

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