package main import ( "context" "fmt" "log" "os" "time" "geoip-rest/internal/userprogram" ) const defaultTimeout = 30 * time.Minute func main() { logger := log.New(os.Stdout, "[sync] ", log.LstdFlags) dbURL, err := databaseURL() if err != nil { logger.Fatalf("database config: %v", err) } mysqlCfg, err := userprogram.NewMySQLConfigFromEnv() if err != nil { logger.Fatalf("mysql config: %v", err) } paths, err := userprogram.NewPathsFromEnv() if err != nil { logger.Fatalf("paths config: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() if err := userprogram.Sync(ctx, userprogram.SyncConfig{ MySQL: mysqlCfg, DatabaseURL: dbURL, Backend: userprogram.BackendFromEnv(), LookupQuery: os.Getenv("GEOIP_LOOKUP_QUERY"), MMDBPath: os.Getenv("GEOIP_DB_PATH"), InitialCSV: paths.InitialCSV, UpdateDir: paths.UpdateDir, LogDir: paths.LogDir, Schema: paths.Schema, Logger: logger, }); err != nil { logger.Fatalf("sync failed: %v", err) } } func databaseURL() (string, error) { if url := os.Getenv("DATABASE_URL"); url != "" { return url, nil } user := os.Getenv("POSTGRES_USER") pass := os.Getenv("POSTGRES_PASSWORD") host := os.Getenv("POSTGRES_HOST") if host == "" { host = "localhost" } port := os.Getenv("POSTGRES_PORT") if port == "" { port = "5432" } db := os.Getenv("POSTGRES_DB") if user == "" || pass == "" || db == "" { return "", fmt.Errorf("DATABASE_URL or POSTGRES_{USER,PASSWORD,DB} is required") } return fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, db), nil }