74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package provisioning
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/services/provisioning/dashboards"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
type StubProvisioningService interface {
|
|
GetDashboardProvisionerResolvedPath(name string) string
|
|
GetAllowUIUpdatesFromConfig(name string) bool
|
|
}
|
|
|
|
func ProvideStubProvisioningService(cfg *setting.Cfg) (StubProvisioningService, error) {
|
|
return NewStubProvisioning(cfg.ProvisioningPath)
|
|
}
|
|
|
|
func NewStubProvisioning(path string) (StubProvisioningService, error) {
|
|
logger := log.New("provisioning.stub")
|
|
stub := &stubProvisioning{
|
|
path: make(map[string]string),
|
|
allowUIUpdates: make(map[string]bool),
|
|
log: logger,
|
|
}
|
|
|
|
cfgs, err := dashboards.ReadDashboardConfig(filepath.Join(path, "dashboards"))
|
|
if err != nil {
|
|
logger.Warn("can't read dashboard provisioning files from directory", "path", filepath.Join(path, "dashboards"), "error", err)
|
|
return stub, nil
|
|
}
|
|
|
|
for _, cfg := range cfgs {
|
|
stub.path[cfg.Name] = cfg.Options["path"].(string)
|
|
stub.allowUIUpdates[cfg.Name] = cfg.AllowUIUpdates
|
|
}
|
|
return stub, nil
|
|
}
|
|
|
|
type stubProvisioning struct {
|
|
path map[string]string // name > options.path
|
|
allowUIUpdates map[string]bool
|
|
log log.Logger
|
|
}
|
|
|
|
func (s *stubProvisioning) GetAllowUIUpdatesFromConfig(name string) bool {
|
|
return s.allowUIUpdates[name]
|
|
}
|
|
|
|
func (s *stubProvisioning) GetDashboardProvisionerResolvedPath(name string) string {
|
|
path := s.path[name]
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
s.log.Warn("Cannot read directory", "error", err)
|
|
}
|
|
|
|
path, err := filepath.Abs(path)
|
|
if err != nil {
|
|
s.log.Warn("Could not create absolute path", "path", path, "error", err)
|
|
}
|
|
|
|
path, err = filepath.EvalSymlinks(path)
|
|
if err != nil {
|
|
s.log.Warn("Failed to read content of symlinked path", "path", path, "error", err)
|
|
}
|
|
|
|
if path == "" {
|
|
path = s.path[name]
|
|
s.log.Info("falling back to original path due to EvalSymlink/Abs failure")
|
|
}
|
|
return path
|
|
}
|