app_plugin.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. ReqRole models.RoleType `json:"reqRole"`
  23. Url string `json:"url"`
  24. Headers []AppPluginRouteHeader `json:"headers"`
  25. TokenAuth *JwtTokenAuth `json:"tokenAuth"`
  26. JwtTokenAuth *JwtTokenAuth `json:"jwtTokenAuth"`
  27. }
  28. type AppPluginRouteHeader struct {
  29. Name string `json:"name"`
  30. Content string `json:"content"`
  31. }
  32. // JwtTokenAuth struct is both for normal Token Auth and JWT Token Auth with
  33. // an uploaded JWT file.
  34. type JwtTokenAuth struct {
  35. Url string `json:"url"`
  36. Scopes []string `json:"scopes"`
  37. Params map[string]string `json:"params"`
  38. }
  39. func (app *AppPlugin) Load(decoder *json.Decoder, pluginDir string) error {
  40. if err := decoder.Decode(&app); err != nil {
  41. return err
  42. }
  43. if err := app.registerPlugin(pluginDir); err != nil {
  44. return err
  45. }
  46. Apps[app.Id] = app
  47. return nil
  48. }
  49. func (app *AppPlugin) initApp() {
  50. app.initFrontendPlugin()
  51. // check if we have child panels
  52. for _, panel := range Panels {
  53. if strings.HasPrefix(panel.PluginDir, app.PluginDir) {
  54. panel.setPathsBasedOnApp(app)
  55. app.FoundChildPlugins = append(app.FoundChildPlugins, &PluginInclude{
  56. Name: panel.Name,
  57. Id: panel.Id,
  58. Type: panel.Type,
  59. })
  60. }
  61. }
  62. // check if we have child datasources
  63. for _, ds := range DataSources {
  64. if strings.HasPrefix(ds.PluginDir, app.PluginDir) {
  65. ds.setPathsBasedOnApp(app)
  66. app.FoundChildPlugins = append(app.FoundChildPlugins, &PluginInclude{
  67. Name: ds.Name,
  68. Id: ds.Id,
  69. Type: ds.Type,
  70. })
  71. }
  72. }
  73. // slugify pages
  74. for _, include := range app.Includes {
  75. if include.Slug == "" {
  76. include.Slug = slug.Make(include.Name)
  77. }
  78. if include.Type == "page" && include.DefaultNav {
  79. app.DefaultNavUrl = setting.AppSubUrl + "/plugins/" + app.Id + "/page/" + include.Slug
  80. }
  81. if include.Type == "dashboard" && include.DefaultNav {
  82. app.DefaultNavUrl = setting.AppSubUrl + "/dashboard/db/" + include.Slug
  83. }
  84. }
  85. }