diff --git a/conf/defaults.ini b/conf/defaults.ini
index a9b1b285971..5022515212c 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -972,6 +972,8 @@ allow_loading_unsigned_plugins =
plugin_admin_enabled = true
plugin_admin_external_manage_enabled = false
plugin_catalog_url = https://grafana.com/grafana/plugins/
+# Enter a comma-separated list of plugin identifiers to hide in the plugin catalog.
+plugin_catalog_hidden_plugins =
#################################### Grafana Live ##########################################
[live]
diff --git a/conf/sample.ini b/conf/sample.ini
index dd2b3f72c05..87089311c7e 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -945,6 +945,8 @@
;plugin_admin_enabled = false
;plugin_admin_external_manage_enabled = false
;plugin_catalog_url = https://grafana.com/grafana/plugins/
+# Enter a comma-separated list of plugin identifiers to hide in the plugin catalog.
+;plugin_catalog_hidden_plugins =
#################################### Grafana Live ##########################################
[live]
diff --git a/docs/sources/administration/configuration.md b/docs/sources/administration/configuration.md
index 19eaa6cad3f..2939b94e448 100644
--- a/docs/sources/administration/configuration.md
+++ b/docs/sources/administration/configuration.md
@@ -1594,6 +1594,10 @@ Set to `true` if you want to enable external management of plugins. Default is `
Custom install/learn more URL for enterprise plugins. Defaults to https://grafana.com/grafana/plugins/.
+### plugin_catalog_hidden_plugins
+
+Enter a comma-separated list of plugin identifiers to hide in the plugin catalog.
+
## [live]
diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go
index 2cb1d4539b3..b5cc24de00c 100644
--- a/pkg/api/frontendsettings.go
+++ b/pkg/api/frontendsettings.go
@@ -298,7 +298,8 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *models.ReqContext) (map[string]i
"caching": map[string]bool{
"enabled": hs.Cfg.SectionWithEnvOverrides("caching").Key("enabled").MustBool(true),
},
- "unifiedAlertingEnabled": hs.Cfg.UnifiedAlerting.Enabled,
+ "unifiedAlertingEnabled": hs.Cfg.UnifiedAlerting.Enabled,
+ "pluginCatalogHiddenPlugins": hs.Cfg.PluginCatalogHiddenPlugins,
}
if hs.Cfg.GeomapDefaultBaseLayerConfig != nil {
diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go
index 0e9a3d699bc..4dd0c197461 100644
--- a/pkg/setting/setting.go
+++ b/pkg/setting/setting.go
@@ -258,6 +258,7 @@ type Cfg struct {
PluginSettings PluginSettings
PluginsAllowUnsigned []string
PluginCatalogURL string
+ PluginCatalogHiddenPlugins []string
PluginAdminEnabled bool
PluginAdminExternalManageEnabled bool
DisableSanitizeHtml bool
@@ -923,18 +924,9 @@ func (cfg *Cfg) Load(args CommandLineArgs) error {
panelsSection := iniFile.Section("panels")
cfg.DisableSanitizeHtml = panelsSection.Key("disable_sanitize_html").MustBool(false)
- pluginsSection := iniFile.Section("plugins")
- cfg.PluginsEnableAlpha = pluginsSection.Key("enable_alpha").MustBool(false)
- cfg.PluginsAppsSkipVerifyTLS = pluginsSection.Key("app_tls_skip_verify_insecure").MustBool(false)
- cfg.PluginSettings = extractPluginSettings(iniFile.Sections())
- pluginsAllowUnsigned := pluginsSection.Key("allow_loading_unsigned_plugins").MustString("")
- for _, plug := range strings.Split(pluginsAllowUnsigned, ",") {
- plug = strings.TrimSpace(plug)
- cfg.PluginsAllowUnsigned = append(cfg.PluginsAllowUnsigned, plug)
+ if err := cfg.readPluginSettings(iniFile); err != nil {
+ return err
}
- cfg.PluginCatalogURL = pluginsSection.Key("plugin_catalog_url").MustString("https://grafana.com/grafana/plugins/")
- cfg.PluginAdminEnabled = pluginsSection.Key("plugin_admin_enabled").MustBool(true)
- cfg.PluginAdminExternalManageEnabled = pluginsSection.Key("plugin_admin_external_manage_enabled").MustBool(false)
if err := cfg.readFeatureToggles(iniFile); err != nil {
return err
diff --git a/pkg/setting/setting_plugins.go b/pkg/setting/setting_plugins.go
index 0430f630cd7..760c4762bf1 100644
--- a/pkg/setting/setting_plugins.go
+++ b/pkg/setting/setting_plugins.go
@@ -23,3 +23,25 @@ func extractPluginSettings(sections []*ini.Section) PluginSettings {
return psMap
}
+
+func (cfg *Cfg) readPluginSettings(iniFile *ini.File) error {
+ pluginsSection := iniFile.Section("plugins")
+ cfg.PluginsEnableAlpha = pluginsSection.Key("enable_alpha").MustBool(false)
+ cfg.PluginsAppsSkipVerifyTLS = pluginsSection.Key("app_tls_skip_verify_insecure").MustBool(false)
+ cfg.PluginSettings = extractPluginSettings(iniFile.Sections())
+ pluginsAllowUnsigned := pluginsSection.Key("allow_loading_unsigned_plugins").MustString("")
+ for _, plug := range strings.Split(pluginsAllowUnsigned, ",") {
+ plug = strings.TrimSpace(plug)
+ cfg.PluginsAllowUnsigned = append(cfg.PluginsAllowUnsigned, plug)
+ }
+ cfg.PluginCatalogURL = pluginsSection.Key("plugin_catalog_url").MustString("https://grafana.com/grafana/plugins/")
+ cfg.PluginAdminEnabled = pluginsSection.Key("plugin_admin_enabled").MustBool(true)
+ cfg.PluginAdminExternalManageEnabled = pluginsSection.Key("plugin_admin_external_manage_enabled").MustBool(false)
+
+ catalogHiddenPlugins := pluginsSection.Key("plugin_catalog_hidden_plugins").MustString("")
+ for _, plug := range strings.Split(catalogHiddenPlugins, ",") {
+ plug = strings.TrimSpace(plug)
+ cfg.PluginCatalogHiddenPlugins = append(cfg.PluginCatalogHiddenPlugins, plug)
+ }
+ return nil
+}