From 654400aa37735ec257e5bc6696ec2e357813f3f6 Mon Sep 17 00:00:00 2001 From: Nathanael DEMACON Date: Fri, 5 Jul 2024 15:20:52 +0200 Subject: [PATCH] feat(cscli): add env variable flag for dashboard setup Signed-off-by: Nathanael DEMACON --- cmd/crowdsec-cli/dashboard.go | 12 ++++++---- pkg/metabase/container.go | 44 ++++++++++++++++++----------------- pkg/metabase/metabase.go | 43 +++++++++++++++++----------------- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/cmd/crowdsec-cli/dashboard.go b/cmd/crowdsec-cli/dashboard.go index beff06d478a..ec8e1836037 100644 --- a/cmd/crowdsec-cli/dashboard.go +++ b/cmd/crowdsec-cli/dashboard.go @@ -32,10 +32,11 @@ var ( metabaseConfigFile = "metabase.yaml" metabaseImage = "metabase/metabase:v0.46.6.1" /**/ - metabaseListenAddress = "127.0.0.1" - metabaseListenPort = "3000" - metabaseContainerID = "crowdsec-metabase" - crowdsecGroup = "crowdsec" + metabaseListenAddress = "127.0.0.1" + metabaseListenPort = "3000" + metabaseContainerID = "crowdsec-metabase" + metabaseContainerEnvironmentVariables []string + crowdsecGroup = "crowdsec" forceYes bool @@ -154,7 +155,7 @@ cscli dashboard setup -l 0.0.0.0 -p 443 --password if err = cli.chownDatabase(dockerGroup.Gid); err != nil { return err } - mb, err := metabase.SetupMetabase(cli.cfg().API.Server.DbConfig, metabaseListenAddress, metabaseListenPort, metabaseUser, metabasePassword, metabaseDBPath, dockerGroup.Gid, metabaseContainerID, metabaseImage) + mb, err := metabase.SetupMetabase(cli.cfg().API.Server.DbConfig, metabaseListenAddress, metabaseListenPort, metabaseUser, metabasePassword, metabaseDBPath, dockerGroup.Gid, metabaseContainerID, metabaseImage, metabaseContainerEnvironmentVariables) if err != nil { return err } @@ -181,6 +182,7 @@ cscli dashboard setup -l 0.0.0.0 -p 443 --password flags.BoolVarP(&forceYes, "yes", "y", false, "force yes") // flags.StringVarP(&metabaseUser, "user", "u", "crowdsec@crowdsec.net", "metabase user") flags.StringVar(&metabasePassword, "password", "", "metabase password") + flags.StringSliceVarP(&metabaseContainerEnvironmentVariables, "env", "e", nil, "Additional environment variables to pass to the metabase container") return cmd } diff --git a/pkg/metabase/container.go b/pkg/metabase/container.go index 8b3dd4084c0..aece7b509a1 100644 --- a/pkg/metabase/container.go +++ b/pkg/metabase/container.go @@ -16,31 +16,33 @@ import ( ) type Container struct { - ListenAddr string - ListenPort string - SharedFolder string - Image string - Name string - ID string - CLI *client.Client - MBDBUri string - DockerGroupID string + ListenAddr string + ListenPort string + SharedFolder string + Image string + Name string + ID string + CLI *client.Client + MBDBUri string + DockerGroupID string + EnvironmentVariables []string } -func NewContainer(listenAddr string, listenPort string, sharedFolder string, containerName string, image string, mbDBURI string, dockerGroupID string) (*Container, error) { +func NewContainer(listenAddr string, listenPort string, sharedFolder string, containerName string, image string, mbDBURI string, dockerGroupID string, environmentVariables []string) (*Container, error) { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return nil, fmt.Errorf("failed to create docker client : %s", err) } return &Container{ - ListenAddr: listenAddr, - ListenPort: listenPort, - SharedFolder: sharedFolder, - Image: image, - Name: containerName, - CLI: cli, - MBDBUri: mbDBURI, - DockerGroupID: dockerGroupID, + ListenAddr: listenAddr, + ListenPort: listenPort, + SharedFolder: sharedFolder, + Image: image, + Name: containerName, + CLI: cli, + MBDBUri: mbDBURI, + DockerGroupID: dockerGroupID, + EnvironmentVariables: environmentVariables, }, nil } @@ -79,9 +81,9 @@ func (c *Container) Create() error { }, } - env := []string{ - fmt.Sprintf("MB_DB_FILE=%s/metabase.db", containerSharedFolder), - } + env := c.EnvironmentVariables + + env = append(env, fmt.Sprintf("MB_DB_FILE=%s/metabase.db", containerSharedFolder)) if c.MBDBUri != "" { env = append(env, c.MBDBUri) } diff --git a/pkg/metabase/metabase.go b/pkg/metabase/metabase.go index 837bab796d5..f05c9799dff 100644 --- a/pkg/metabase/metabase.go +++ b/pkg/metabase/metabase.go @@ -30,15 +30,16 @@ type Metabase struct { } type Config struct { - Database *csconfig.DatabaseCfg `yaml:"database"` - ListenAddr string `yaml:"listen_addr"` - ListenPort string `yaml:"listen_port"` - ListenURL string `yaml:"listen_url"` - Username string `yaml:"username"` - Password string `yaml:"password"` - DBPath string `yaml:"metabase_db_path"` - DockerGroupID string `yaml:"-"` - Image string `yaml:"image"` + Database *csconfig.DatabaseCfg `yaml:"database"` + ListenAddr string `yaml:"listen_addr"` + ListenPort string `yaml:"listen_port"` + ListenURL string `yaml:"listen_url"` + Username string `yaml:"username"` + Password string `yaml:"password"` + DBPath string `yaml:"metabase_db_path"` + DockerGroupID string `yaml:"-"` + Image string `yaml:"image"` + EnvironmentVariables []string `yaml:"environment_variables"` } var ( @@ -88,7 +89,7 @@ func (m *Metabase) Init(containerName string, image string) error { if err != nil { return err } - m.Container, err = NewContainer(m.Config.ListenAddr, m.Config.ListenPort, m.Config.DBPath, containerName, image, DBConnectionURI, m.Config.DockerGroupID) + m.Container, err = NewContainer(m.Config.ListenAddr, m.Config.ListenPort, m.Config.DBPath, containerName, image, DBConnectionURI, m.Config.DockerGroupID, m.Config.EnvironmentVariables) if err != nil { return fmt.Errorf("container init: %w", err) } @@ -137,21 +138,21 @@ func (m *Metabase) LoadConfig(configPath string) error { m.Config = config return nil - } -func SetupMetabase(dbConfig *csconfig.DatabaseCfg, listenAddr string, listenPort string, username string, password string, mbDBPath string, dockerGroupID string, containerName string, image string) (*Metabase, error) { +func SetupMetabase(dbConfig *csconfig.DatabaseCfg, listenAddr string, listenPort string, username string, password string, mbDBPath string, dockerGroupID string, containerName string, image string, environmentVariables []string) (*Metabase, error) { metabase := &Metabase{ Config: &Config{ - Database: dbConfig, - ListenAddr: listenAddr, - ListenPort: listenPort, - Username: username, - Password: password, - ListenURL: fmt.Sprintf("http://%s:%s", listenAddr, listenPort), - DBPath: mbDBPath, - DockerGroupID: dockerGroupID, - Image: image, + Database: dbConfig, + ListenAddr: listenAddr, + ListenPort: listenPort, + Username: username, + Password: password, + ListenURL: fmt.Sprintf("http://%s:%s", listenAddr, listenPort), + DBPath: mbDBPath, + DockerGroupID: dockerGroupID, + Image: image, + EnvironmentVariables: environmentVariables, }, } if err := metabase.Init(containerName, image); err != nil {