#!/usr/bin/env python3 """ Configuration management for ACH file processing pipeline. Loads and validates environment variables. """ import os from pathlib import Path from logging_config import get_logger logger = get_logger(__name__) class Config: """Application configuration from environment variables.""" def __init__(self): """Initialize configuration from environment.""" self._validate_env_file() self._load_database_config() self._load_sftp_config() self._load_processing_config() def _validate_env_file(self): """Check if .env file exists.""" if not Path('.env').exists(): logger.warning(".env file not found. Using environment variables or defaults.") def _load_database_config(self): """Load database configuration.""" self.db_user = os.getenv('DB_USER', 'pacs_db') self.db_password = os.getenv('DB_PASSWORD', 'pacs_db') self.db_host = os.getenv('DB_HOST', 'testipksdb.c7q7defafeea.ap-south-1.rds.amazonaws.com') self.db_port = int(os.getenv('DB_PORT', '1521')) self.db_service_name = os.getenv('DB_SERVICE_NAME', 'IPKSDB') self.db_pool_min = int(os.getenv('DB_POOL_MIN', '2')) self.db_pool_max = int(os.getenv('DB_POOL_MAX', '10')) def _load_sftp_config(self): """Load SFTP configuration.""" self.sftp_host = os.getenv('SFTP_HOST', 'localhost') self.sftp_port = int(os.getenv('SFTP_PORT', '22')) self.sftp_username = os.getenv('SFTP_USERNAME', 'ipks') self.sftp_password = os.getenv('SFTP_PASSWORD', '') self.sftp_base_path = os.getenv('SFTP_BASE_PATH', '/home/ipks/IPKS_FILES/REPORTS') def _load_processing_config(self): """Load processing configuration.""" self.poll_interval_minutes = int(os.getenv('POLL_INTERVAL_MINUTES', '30')) self.batch_size = int(os.getenv('BATCH_SIZE', '100')) self.bank_codes = self._parse_bank_codes() self.log_level = os.getenv('LOG_LEVEL', 'INFO') def _parse_bank_codes(self): """Parse bank codes from comma-separated environment variable.""" codes_str = os.getenv('BANK_CODES', '0015,0002') return [code.strip() for code in codes_str.split(',') if code.strip()] def get_db_connection_string(self): """Generate Oracle connection string.""" return f"{self.db_user}/{self.db_password}@{self.db_host}:{self.db_port}/{self.db_service_name}" def validate(self): """Validate critical configuration.""" if not self.db_user or not self.db_password: raise ValueError("Database credentials not configured") if not self.sftp_username: logger.warning("SFTP username not configured") if not self.bank_codes: raise ValueError("No bank codes configured") logger.info(f"Configuration validated. Bank codes: {', '.join(self.bank_codes)}") # Global config instance config = None def get_config(): """Get or create global config instance.""" global config if config is None: config = Config() return config if __name__ == '__main__': cfg = get_config() cfg.validate() print(f"Bank Codes: {cfg.bank_codes}") print(f"SFTP Host: {cfg.sftp_host}:{cfg.sftp_port}") print(f"Database: {cfg.db_host}:{cfg.db_port}/{cfg.db_service_name}") print(f"Poll Interval: {cfg.poll_interval_minutes} minutes")