mirror of
https://github.com/grafana/grafana.git
synced 2025-02-14 09:33:34 -06:00
142 lines
3.9 KiB
Go
142 lines
3.9 KiB
Go
package envvars
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
|
|
"github.com/grafana/grafana-azure-sdk-go/azsettings"
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend/proxy"
|
|
|
|
"github.com/grafana/grafana/pkg/plugins"
|
|
"github.com/grafana/grafana/pkg/plugins/config"
|
|
)
|
|
|
|
type Provider interface {
|
|
Get(ctx context.Context, p *plugins.Plugin) ([]string, error)
|
|
}
|
|
|
|
type Service struct {
|
|
cfg *config.Cfg
|
|
license plugins.Licensing
|
|
}
|
|
|
|
func NewProvider(cfg *config.Cfg, license plugins.Licensing) *Service {
|
|
return &Service{
|
|
cfg: cfg,
|
|
license: license,
|
|
}
|
|
}
|
|
|
|
func (s *Service) Get(ctx context.Context, p *plugins.Plugin) ([]string, error) {
|
|
hostEnv := []string{
|
|
fmt.Sprintf("GF_VERSION=%s", s.cfg.BuildVersion),
|
|
}
|
|
|
|
if s.license != nil {
|
|
hostEnv = append(
|
|
hostEnv,
|
|
fmt.Sprintf("GF_EDITION=%s", s.license.Edition()),
|
|
fmt.Sprintf("GF_ENTERPRISE_LICENSE_PATH=%s", s.license.Path()),
|
|
fmt.Sprintf("GF_ENTERPRISE_APP_URL=%s", s.license.AppURL()),
|
|
)
|
|
hostEnv = append(hostEnv, s.license.Environment()...)
|
|
}
|
|
|
|
if p.ExternalService != nil {
|
|
hostEnv = append(
|
|
hostEnv,
|
|
fmt.Sprintf("GF_APP_URL=%s", s.cfg.GrafanaAppURL),
|
|
fmt.Sprintf("GF_PLUGIN_APP_CLIENT_ID=%s", p.ExternalService.ClientID),
|
|
fmt.Sprintf("GF_PLUGIN_APP_CLIENT_SECRET=%s", p.ExternalService.ClientSecret),
|
|
fmt.Sprintf("GF_PLUGIN_APP_PRIVATE_KEY=%s", p.ExternalService.PrivateKey),
|
|
)
|
|
}
|
|
|
|
hostEnv = append(hostEnv, s.awsEnvVars()...)
|
|
hostEnv = append(hostEnv, s.secureSocksProxyEnvVars()...)
|
|
hostEnv = append(hostEnv, azsettings.WriteToEnvStr(s.cfg.Azure)...)
|
|
hostEnv = append(hostEnv, s.tracingEnvVars(p)...)
|
|
|
|
ev := getPluginSettings(p.ID, s.cfg).asEnvVar("GF_PLUGIN", hostEnv)
|
|
return ev, nil
|
|
}
|
|
|
|
func (s *Service) tracingEnvVars(plugin *plugins.Plugin) []string {
|
|
var pluginTracingEnabled bool
|
|
if v, exists := s.cfg.PluginSettings[plugin.ID]["tracing"]; exists {
|
|
pluginTracingEnabled = v == "true"
|
|
}
|
|
if !s.cfg.Tracing.IsEnabled() || !pluginTracingEnabled {
|
|
return nil
|
|
}
|
|
|
|
vars := []string{
|
|
fmt.Sprintf("GF_INSTANCE_OTLP_ADDRESS=%s", s.cfg.Tracing.OpenTelemetry.Address),
|
|
fmt.Sprintf("GF_INSTANCE_OTLP_PROPAGATION=%s", s.cfg.Tracing.OpenTelemetry.Propagation),
|
|
}
|
|
if plugin.Info.Version != "" {
|
|
vars = append(vars, fmt.Sprintf("GF_PLUGIN_VERSION=%s", plugin.Info.Version))
|
|
}
|
|
return vars
|
|
}
|
|
|
|
func (s *Service) awsEnvVars() []string {
|
|
var variables []string
|
|
if s.cfg.AWSAssumeRoleEnabled {
|
|
variables = append(variables, awsds.AssumeRoleEnabledEnvVarKeyName+"=true")
|
|
}
|
|
if len(s.cfg.AWSAllowedAuthProviders) > 0 {
|
|
variables = append(variables, awsds.AllowedAuthProvidersEnvVarKeyName+"="+strings.Join(s.cfg.AWSAllowedAuthProviders, ","))
|
|
}
|
|
|
|
return variables
|
|
}
|
|
|
|
func (s *Service) secureSocksProxyEnvVars() []string {
|
|
if s.cfg.ProxySettings.Enabled {
|
|
return []string{
|
|
proxy.PluginSecureSocksProxyClientCert + "=" + s.cfg.ProxySettings.ClientCert,
|
|
proxy.PluginSecureSocksProxyClientKey + "=" + s.cfg.ProxySettings.ClientKey,
|
|
proxy.PluginSecureSocksProxyRootCACert + "=" + s.cfg.ProxySettings.RootCA,
|
|
proxy.PluginSecureSocksProxyProxyAddress + "=" + s.cfg.ProxySettings.ProxyAddress,
|
|
proxy.PluginSecureSocksProxyServerName + "=" + s.cfg.ProxySettings.ServerName,
|
|
proxy.PluginSecureSocksProxyEnabled + "=" + strconv.FormatBool(s.cfg.ProxySettings.Enabled),
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type pluginSettings map[string]string
|
|
|
|
func getPluginSettings(pluginID string, cfg *config.Cfg) pluginSettings {
|
|
ps := pluginSettings{}
|
|
for k, v := range cfg.PluginSettings[pluginID] {
|
|
if k == "path" || strings.ToLower(k) == "id" {
|
|
continue
|
|
}
|
|
ps[k] = v
|
|
}
|
|
|
|
return ps
|
|
}
|
|
|
|
func (ps pluginSettings) asEnvVar(prefix string, hostEnv []string) []string {
|
|
env := make([]string, 0, len(ps))
|
|
for k, v := range ps {
|
|
key := fmt.Sprintf("%s_%s", prefix, strings.ToUpper(k))
|
|
if value := os.Getenv(key); value != "" {
|
|
v = value
|
|
}
|
|
|
|
env = append(env, fmt.Sprintf("%s=%s", key, v))
|
|
}
|
|
|
|
env = append(env, hostEnv...)
|
|
|
|
return env
|
|
}
|