plugins.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package plugins
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "os"
  6. "path"
  7. "path/filepath"
  8. "github.com/grafana/grafana/pkg/log"
  9. "github.com/grafana/grafana/pkg/setting"
  10. )
  11. var (
  12. DataSources map[string]DataSourcePlugin
  13. ExternalPlugins []ExternalPlugin
  14. )
  15. type PluginScanner struct {
  16. pluginPath string
  17. errors []error
  18. }
  19. func Init() {
  20. DataSources = make(map[string]DataSourcePlugin)
  21. ExternalPlugins = make([]ExternalPlugin, 0)
  22. scan(path.Join(setting.StaticRootPath, "app/plugins"))
  23. scan(path.Join(setting.DataPath, "plugins"))
  24. }
  25. func scan(pluginDir string) error {
  26. scanner := &PluginScanner{
  27. pluginPath: pluginDir,
  28. }
  29. if err := filepath.Walk(pluginDir, scanner.walker); err != nil {
  30. return err
  31. }
  32. if len(scanner.errors) > 0 {
  33. return errors.New("Some plugins failed to load")
  34. }
  35. return nil
  36. }
  37. func (scanner *PluginScanner) walker(path string, f os.FileInfo, err error) error {
  38. if err != nil {
  39. return err
  40. }
  41. if f.IsDir() {
  42. return nil
  43. }
  44. if f.Name() == "plugin.json" {
  45. err := scanner.loadPluginJson(path)
  46. if err != nil {
  47. log.Error(3, "Failed to load plugin json file: %v, err: %v", path, err)
  48. scanner.errors = append(scanner.errors, err)
  49. }
  50. }
  51. return nil
  52. }
  53. func (scanner *PluginScanner) loadPluginJson(path string) error {
  54. reader, err := os.Open(path)
  55. if err != nil {
  56. return err
  57. }
  58. defer reader.Close()
  59. jsonParser := json.NewDecoder(reader)
  60. pluginJson := make(map[string]interface{})
  61. if err := jsonParser.Decode(&pluginJson); err != nil {
  62. return err
  63. }
  64. pluginType, exists := pluginJson["pluginType"]
  65. if !exists {
  66. return errors.New("Did not find pluginType property in plugin.json")
  67. }
  68. if pluginType == "datasource" {
  69. p := DataSourcePlugin{}
  70. reader.Seek(0, 0)
  71. if err := jsonParser.Decode(&p); err != nil {
  72. return err
  73. }
  74. if p.Type == "" {
  75. return errors.New("Did not find type property in plugin.json")
  76. }
  77. DataSources[p.Type] = p
  78. }
  79. if pluginType == "externalPlugin" {
  80. p := ExternalPlugin{}
  81. reader.Seek(0, 0)
  82. if err := jsonParser.Decode(&p); err != nil {
  83. return err
  84. }
  85. ExternalPlugins = append(ExternalPlugins, p)
  86. }
  87. return nil
  88. }