123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package metabase
- import (
- "encoding/json"
- "fmt"
- "path/filepath"
- "strings"
- "github.com/crowdsecurity/crowdsec/pkg/csconfig"
- )
- type Database struct {
- DBUrl string
- Model *Model
- Config *csconfig.DatabaseCfg
- Client *MBClient
- Details *Details
- // in case mysql host is 127.0.0.1 the ip address of mysql/pgsql host will be the docker gateway since metabase run in a container
- }
- type Details struct {
- Db string `json:"db"`
- Host string `json:"host"`
- Port int `json:"port"`
- Dbname string `json:"dbname"`
- User string `json:"user"`
- Password string `json:"password"`
- Ssl bool `json:"ssl"`
- AdditionalOptions interface{} `json:"additional-options"`
- TunnelEnabled bool `json:"tunnel-enabled"`
- }
- type Model struct {
- Engine string `json:"engine"`
- Name string `json:"name"`
- Details *Details `json:"details"`
- AutoRunQueries bool `json:"auto_run_queries"`
- IsFullSync bool `json:"is_full_sync"`
- IsOnDemand bool `json:"is_on_demand"`
- Schedules map[string]interface{} `json:"schedules"`
- }
- func NewDatabase(config *csconfig.DatabaseCfg, client *MBClient, remoteDBAddr string) (*Database, error) {
- var details *Details
- database := Database{}
- switch config.Type {
- case "mysql":
- return nil, fmt.Errorf("database '%s' is not supported yet", config.Type)
- case "sqlite":
- database.DBUrl = metabaseSQLiteDBURL
- localFolder := filepath.Dir(config.DbPath)
- // replace /var/lib/crowdsec/data/ with /metabase-data/
- dbPath := strings.Replace(config.DbPath, localFolder, containerSharedFolder, 1)
- details = &Details{
- Db: dbPath,
- }
- case "postgresql", "postgres", "pgsql":
- return nil, fmt.Errorf("database '%s' is not supported yet", config.Type)
- default:
- return nil, fmt.Errorf("database '%s' not supported", config.Type)
- }
- database.Details = details
- database.Client = client
- database.Config = config
- return &database, nil
- }
- func (d *Database) Update() error {
- success, errormsg, err := d.Client.Do("GET", routes[databaseEndpoint], nil)
- if err != nil {
- return err
- }
- if errormsg != nil {
- return fmt.Errorf("update sqlite db http error: %+v", errormsg)
- }
- data, err := json.Marshal(success)
- if err != nil {
- return fmt.Errorf("update sqlite db response (marshal): %w", err)
- }
- model := Model{}
- if err := json.Unmarshal(data, &model); err != nil {
- return fmt.Errorf("update sqlite db response (unmarshal): %w", err)
- }
- model.Details = d.Details
- _, errormsg, err = d.Client.Do("PUT", routes[databaseEndpoint], model)
- if err != nil {
- return err
- }
- if errormsg != nil {
- return fmt.Errorf("update sqlite db http error: %+v", errormsg)
- }
- return nil
- }
|