plugins.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. type PluginMeta struct {
  12. Type string `json:"type"`
  13. Name string `json:"name"`
  14. }
  15. var (
  16. DataSources map[string]interface{}
  17. )
  18. type PluginScanner struct {
  19. pluginPath string
  20. errors []error
  21. }
  22. func Init() {
  23. scan(path.Join(setting.StaticRootPath, "app/plugins"))
  24. }
  25. func scan(pluginDir string) error {
  26. DataSources = make(map[string]interface{})
  27. scanner := &PluginScanner{
  28. pluginPath: pluginDir,
  29. }
  30. if err := filepath.Walk(pluginDir, scanner.walker); err != nil {
  31. return err
  32. }
  33. if len(scanner.errors) > 0 {
  34. return errors.New("Some plugins failed to load")
  35. }
  36. return nil
  37. }
  38. func (scanner *PluginScanner) walker(path string, f os.FileInfo, err error) error {
  39. if err != nil {
  40. return err
  41. }
  42. if f.IsDir() {
  43. return nil
  44. }
  45. if f.Name() == "plugin.json" {
  46. err := scanner.loadPluginJson(path)
  47. if err != nil {
  48. log.Error(3, "Failed to load plugin json file: %v, err: %v", path, err)
  49. scanner.errors = append(scanner.errors, err)
  50. }
  51. }
  52. return nil
  53. }
  54. func (scanner *PluginScanner) loadPluginJson(path string) error {
  55. reader, err := os.Open(path)
  56. if err != nil {
  57. return err
  58. }
  59. defer reader.Close()
  60. jsonParser := json.NewDecoder(reader)
  61. pluginJson := make(map[string]interface{})
  62. if err := jsonParser.Decode(&pluginJson); err != nil {
  63. return err
  64. }
  65. pluginType, exists := pluginJson["pluginType"]
  66. if !exists {
  67. return errors.New("Did not find pluginType property in plugin.json")
  68. }
  69. if pluginType == "datasource" {
  70. datasourceType, exists := pluginJson["type"]
  71. if !exists {
  72. return errors.New("Did not find type property in plugin.json")
  73. }
  74. DataSources[datasourceType.(string)] = pluginJson
  75. }
  76. return nil
  77. }