import os import sys import yaml import subprocess def generate_config(): # Base Configuration config = { 'database': { 'type': 'mysql', 'host': os.getenv('DB_HOST', 'localhost'), 'user': os.getenv('DB_USER', 'zabbix'), 'passwd': os.getenv('DB_PASSWORD', 'zabbix'), 'db': os.getenv('DB_NAME', 'zabbix'), 'port': int(os.getenv('DB_PORT', 3306)), 'socket': os.getenv('DB_SOCKET', '') }, 'logging': 'console', 'premake': int(os.getenv('PREMAKE', 10)), 'replicate_sql': os.getenv('REPLICATE_SQL', 'False').lower() == 'true', 'initial_partitioning_start': os.getenv('INITIAL_PARTITIONING_START', 'db_min'), 'partitions': { 'daily': [], 'weekly': [], 'monthly': [] } } # SSL Config if os.getenv('DB_SSL_CA'): config['database']['ssl'] = {'ca': os.getenv('DB_SSL_CA')} if os.getenv('DB_SSL_CERT'): config['database']['ssl']['cert'] = os.getenv('DB_SSL_CERT') if os.getenv('DB_SSL_KEY'): config['database']['ssl']['key'] = os.getenv('DB_SSL_KEY') # Retention Mapping retention_history = os.getenv('RETENTION_HISTORY', '14d') retention_trends = os.getenv('RETENTION_TRENDS', '365d') retention_audit = os.getenv('RETENTION_AUDIT', '365d') # Standard Zabbix Tables history_tables = ['history', 'history_uint', 'history_str', 'history_log', 'history_text', 'history_bin'] trends_tables = ['trends', 'trends_uint'] # Auditlog: Disabled by default because Zabbix 7.0+ 'auditlog' table lacks 'clock' in Primary Key. # Only enable if the user has manually altered the schema and explicitly requests it. # Collect overrides first to prevent duplicates overrides = set() for key in os.environ: if key.startswith(('PARTITION_DAILY_', 'PARTITION_WEEKLY_', 'PARTITION_MONTHLY_')): table = key.split('_', 2)[-1].lower() overrides.add(table) for table in history_tables: if table not in overrides: config['partitions']['daily'].append({table: retention_history}) for table in trends_tables: if table not in overrides: config['partitions']['monthly'].append({table: retention_trends}) if os.getenv('ENABLE_AUDITLOG_PARTITIONING', 'false').lower() == 'true': config['partitions']['weekly'].append({'auditlog': retention_audit}) # Custom/Generic Overrides # Look for env vars like PARTITION_DAILY_mytable=7d for key, value in os.environ.items(): if key.startswith('PARTITION_DAILY_'): table = key.replace('PARTITION_DAILY_', '').lower() config['partitions']['daily'].append({table: value}) elif key.startswith('PARTITION_WEEKLY_'): table = key.replace('PARTITION_WEEKLY_', '').lower() config['partitions']['weekly'].append({table: value}) elif key.startswith('PARTITION_MONTHLY_'): table = key.replace('PARTITION_MONTHLY_', '').lower() config['partitions']['monthly'].append({table: value}) # Filter empty lists config['partitions'] = {k: v for k, v in config['partitions'].items() if v} print("Generated Configuration:") print(yaml.dump(config, default_flow_style=False)) with open('/etc/zabbix/zabbix_partitioning.conf', 'w') as f: yaml.dump(config, f, default_flow_style=False) def main(): generate_config() cmd = [sys.executable, '/usr/local/bin/zabbix_partitioning.py', '-c', '/etc/zabbix/zabbix_partitioning.conf'] run_mode = os.getenv('RUN_MODE', 'maintenance') if run_mode == 'init': cmd.append('--init') elif run_mode == 'dry-run': cmd.append('--dry-run') if os.getenv('DRY_RUN_INIT') == 'true': cmd.append('--init') elif run_mode == 'discovery': cmd.append('--discovery') elif run_mode == 'check': target = os.getenv('CHECK_TARGET') if not target: print("Error: CHECK_TARGET env var required for check mode") sys.exit(1) cmd.append('--check-days') cmd.append(target) elif run_mode == 'stats': target = os.getenv('CHECK_TARGET') if not target: print("Error: CHECK_TARGET env var required for stats mode") sys.exit(1) cmd.append('--stats') cmd.append(target) print(f"Executing: {' '.join(cmd)}") result = subprocess.run(cmd) sys.exit(result.returncode) if __name__ == "__main__": main()