services.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package services
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "net/url"
  10. "path"
  11. "time"
  12. "github.com/grafana/grafana/pkg/cmd/grafana-cli/logger"
  13. m "github.com/grafana/grafana/pkg/cmd/grafana-cli/models"
  14. )
  15. var (
  16. IoHelper m.IoUtil = IoUtilImp{}
  17. HttpClient http.Client
  18. grafanaVersion string
  19. )
  20. func Init(version string) {
  21. grafanaVersion = version
  22. tr := &http.Transport{
  23. Proxy: http.ProxyFromEnvironment,
  24. TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
  25. }
  26. HttpClient = http.Client{
  27. Timeout: time.Duration(10 * time.Second),
  28. Transport: tr,
  29. }
  30. }
  31. func ListAllPlugins(repoUrl string) (m.PluginRepo, error) {
  32. body, err := sendRequest(repoUrl, "repo")
  33. if err != nil {
  34. logger.Info("Failed to send request", "error", err)
  35. return m.PluginRepo{}, fmt.Errorf("Failed to send request. error: %v", err)
  36. }
  37. if err != nil {
  38. return m.PluginRepo{}, err
  39. }
  40. var data m.PluginRepo
  41. err = json.Unmarshal(body, &data)
  42. if err != nil {
  43. logger.Info("Failed to unmarshal graphite response error: %v", err)
  44. return m.PluginRepo{}, err
  45. }
  46. return data, nil
  47. }
  48. func ReadPlugin(pluginDir, pluginName string) (m.InstalledPlugin, error) {
  49. distPluginDataPath := path.Join(pluginDir, pluginName, "dist", "plugin.json")
  50. var data []byte
  51. var err error
  52. data, err = IoHelper.ReadFile(distPluginDataPath)
  53. if err != nil {
  54. pluginDataPath := path.Join(pluginDir, pluginName, "plugin.json")
  55. data, err = IoHelper.ReadFile(pluginDataPath)
  56. if err != nil {
  57. return m.InstalledPlugin{}, errors.New("Could not find dist/plugin.json or plugin.json on " + pluginName + " in " + pluginDir)
  58. }
  59. }
  60. res := m.InstalledPlugin{}
  61. json.Unmarshal(data, &res)
  62. if res.Info.Version == "" {
  63. res.Info.Version = "0.0.0"
  64. }
  65. if res.Id == "" {
  66. return m.InstalledPlugin{}, errors.New("could not find plugin " + pluginName + " in " + pluginDir)
  67. }
  68. return res, nil
  69. }
  70. func GetLocalPlugins(pluginDir string) []m.InstalledPlugin {
  71. result := make([]m.InstalledPlugin, 0)
  72. files, _ := IoHelper.ReadDir(pluginDir)
  73. for _, f := range files {
  74. res, err := ReadPlugin(pluginDir, f.Name())
  75. if err == nil {
  76. result = append(result, res)
  77. }
  78. }
  79. return result
  80. }
  81. func RemoveInstalledPlugin(pluginPath, pluginName string) error {
  82. logger.Infof("Removing plugin: %v\n", pluginName)
  83. pluginDir := path.Join(pluginPath, pluginName)
  84. _, err := IoHelper.Stat(pluginDir)
  85. if err != nil {
  86. return err
  87. }
  88. return IoHelper.RemoveAll(pluginDir)
  89. }
  90. func GetPlugin(pluginId, repoUrl string) (m.Plugin, error) {
  91. body, err := sendRequest(repoUrl, "repo", pluginId)
  92. if err != nil {
  93. logger.Info("Failed to send request", "error", err)
  94. return m.Plugin{}, fmt.Errorf("Failed to send request. error: %v", err)
  95. }
  96. if err != nil {
  97. return m.Plugin{}, err
  98. }
  99. var data m.Plugin
  100. err = json.Unmarshal(body, &data)
  101. if err != nil {
  102. logger.Info("Failed to unmarshal graphite response error: %v", err)
  103. return m.Plugin{}, err
  104. }
  105. return data, nil
  106. }
  107. func sendRequest(repoUrl string, subPaths ...string) ([]byte, error) {
  108. u, _ := url.Parse(repoUrl)
  109. for _, v := range subPaths {
  110. u.Path = path.Join(u.Path, v)
  111. }
  112. req, err := http.NewRequest(http.MethodGet, u.String(), nil)
  113. req.Header.Set("grafana-version", grafanaVersion)
  114. req.Header.Set("User-Agent", "grafana "+grafanaVersion)
  115. if err != nil {
  116. return []byte{}, err
  117. }
  118. res, err := HttpClient.Do(req)
  119. if err != nil {
  120. return []byte{}, err
  121. }
  122. if res.StatusCode/100 != 2 {
  123. return []byte{}, fmt.Errorf("Api returned invalid status: %s", res.Status)
  124. }
  125. body, err := ioutil.ReadAll(res.Body)
  126. defer res.Body.Close()
  127. return body, err
  128. }