json_index.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package search
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/grafana/grafana/pkg/log"
  8. m "github.com/grafana/grafana/pkg/models"
  9. )
  10. type JsonDashIndex struct {
  11. path string
  12. orgsIds []int64
  13. items []*JsonDashIndexItem
  14. }
  15. type JsonDashIndexItem struct {
  16. TitleLower string
  17. TagsCsv string
  18. Path string
  19. Dashboard *m.Dashboard
  20. }
  21. func NewJsonDashIndex(path string, orgIds string) *JsonDashIndex {
  22. index := JsonDashIndex{}
  23. index.path = path
  24. // if orgIds != "" || orgIds != "*" {
  25. // }
  26. index.updateIndex()
  27. return &index
  28. }
  29. func (index *JsonDashIndex) Search(query *Query) ([]*m.DashboardSearchHit, error) {
  30. results := make([]*m.DashboardSearchHit, 0)
  31. for _, item := range index.items {
  32. if strings.Contains(item.TitleLower, query.Title) {
  33. results = append(results, &m.DashboardSearchHit{
  34. Title: item.Dashboard.Title,
  35. Tags: item.Dashboard.GetTags(),
  36. Uri: "file/" + item.Path,
  37. })
  38. }
  39. }
  40. return results, nil
  41. }
  42. func (index *JsonDashIndex) GetDashboard(path string) *m.Dashboard {
  43. for _, item := range index.items {
  44. if item.Path == path {
  45. return item.Dashboard
  46. }
  47. }
  48. return nil
  49. }
  50. func (index *JsonDashIndex) updateIndex() error {
  51. log.Info("Updating JSON dashboard index, path: %v", index.path)
  52. index.items = make([]*JsonDashIndexItem, 0)
  53. visitor := func(path string, f os.FileInfo, err error) error {
  54. if err != nil {
  55. return err
  56. }
  57. if f.IsDir() {
  58. return nil
  59. }
  60. if strings.HasSuffix(f.Name(), ".json") {
  61. err = index.loadDashboardIntoCache(path)
  62. if err != nil {
  63. return err
  64. }
  65. }
  66. return nil
  67. }
  68. if err := filepath.Walk(index.path, visitor); err != nil {
  69. return err
  70. }
  71. return nil
  72. }
  73. func (index *JsonDashIndex) loadDashboardIntoCache(filename string) error {
  74. dash, err := loadDashboardFromFile(filename)
  75. if err != nil {
  76. return err
  77. }
  78. index.items = append(index.items, dash)
  79. return nil
  80. }
  81. func loadDashboardFromFile(filename string) (*JsonDashIndexItem, error) {
  82. reader, err := os.Open(filename)
  83. if err != nil {
  84. return nil, err
  85. }
  86. defer reader.Close()
  87. jsonParser := json.NewDecoder(reader)
  88. var data map[string]interface{}
  89. if err := jsonParser.Decode(&data); err != nil {
  90. return nil, err
  91. }
  92. stat, _ := os.Stat(filename)
  93. item := &JsonDashIndexItem{}
  94. item.Dashboard = m.NewDashboardFromJson(data)
  95. item.TitleLower = strings.ToLower(item.Dashboard.Title)
  96. item.TagsCsv = strings.Join(item.Dashboard.GetTags(), ",")
  97. item.Path = stat.Name()
  98. return item, nil
  99. }