// Package tools provides configuration and utility functions. // Mirrors: odoo/tools/config.py package tools import ( "fmt" "os" "strconv" "strings" ) // Config holds the server configuration. // Mirrors: odoo/tools/config.py configmanager type Config struct { // Database DBHost string DBPort int DBUser string DBPassword string DBName string DBSSLMode string // Server HTTPInterface string HTTPPort int Workers int DataDir string // Modules AddonsPath []string OdooAddonsPath []string // Paths to Odoo source addon directories (for static files) BuildDir string // Directory for compiled assets (SCSS→CSS) WithoutDemo bool // Logging LogLevel string // Limits LimitMemorySoft int64 LimitTimeReal int } // DefaultConfig returns a configuration with default values. // Mirrors: odoo/tools/config.py _default_options func DefaultConfig() *Config { return &Config{ DBHost: "localhost", DBPort: 5432, DBUser: "odoo", DBPassword: "odoo", DBName: "odoo", DBSSLMode: "disable", HTTPInterface: "0.0.0.0", HTTPPort: 8069, Workers: 0, DataDir: "/var/lib/odoo", LogLevel: "info", } } // LoadFromEnv overrides config values from environment variables. // Mirrors: odoo/tools/config.py _env_options (ODOO_* prefix) func (c *Config) LoadFromEnv() { if v := os.Getenv("ODOO_DB_HOST"); v != "" { c.DBHost = v } // Also support Docker-style env vars (HOST, USER, PASSWORD) if v := os.Getenv("HOST"); v != "" { c.DBHost = v } if v := os.Getenv("ODOO_DB_PORT"); v != "" { if port, err := strconv.Atoi(v); err == nil { c.DBPort = port } } if v := os.Getenv("ODOO_DB_USER"); v != "" { c.DBUser = v } if v := os.Getenv("USER"); v != "" && os.Getenv("ODOO_DB_USER") == "" { c.DBUser = v } if v := os.Getenv("ODOO_DB_PASSWORD"); v != "" { c.DBPassword = v } if v := os.Getenv("PASSWORD"); v != "" && os.Getenv("ODOO_DB_PASSWORD") == "" { c.DBPassword = v } if v := os.Getenv("ODOO_DB_NAME"); v != "" { c.DBName = v } if v := os.Getenv("ODOO_HTTP_PORT"); v != "" { if port, err := strconv.Atoi(v); err == nil { c.HTTPPort = port } } if v := os.Getenv("ODOO_DATA_DIR"); v != "" { c.DataDir = v } if v := os.Getenv("ODOO_LOG_LEVEL"); v != "" { c.LogLevel = v } if v := os.Getenv("ODOO_ADDONS_PATH"); v != "" { c.OdooAddonsPath = strings.Split(v, ",") } if v := os.Getenv("ODOO_BUILD_DIR"); v != "" { c.BuildDir = v } } // DSN returns the PostgreSQL connection string. func (c *Config) DSN() string { return fmt.Sprintf( "postgres://%s:%s@%s:%d/%s?sslmode=%s", c.DBUser, c.DBPassword, c.DBHost, c.DBPort, c.DBName, c.DBSSLMode, ) }