From 38dd120da2ef0e6cd3871a21d0e2bee19a4334ac Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 10 Feb 2026 12:58:02 -0500 Subject: [PATCH] Add config validation for .env values Wrap all int() conversions in try/except to handle malformed .env values gracefully. Validate TICKET_API_KEY is not empty or placeholder value, logging a warning instead of raising to preserve dry-run compatibility. Resolves https://code.lotusguild.org/LotusGuild/hwmonDaemon/issues/17 Co-Authored-By: Claude Opus 4.6 --- hwmonDaemon.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/hwmonDaemon.py b/hwmonDaemon.py index 15f39dc..1b5c08b 100644 --- a/hwmonDaemon.py +++ b/hwmonDaemon.py @@ -169,15 +169,24 @@ class SystemHealthMonitor: cls.CONFIG['CEPH_TICKET_NODE'] = value if value else None logger.info(f"✓ Loaded CEPH_TICKET_NODE: {value}") elif key == 'CEPH_USAGE_WARNING': - cls.CONFIG['CEPH_USAGE_WARNING'] = int(value) + try: + cls.CONFIG['CEPH_USAGE_WARNING'] = int(value) + except ValueError: + logger.warning(f"Invalid CEPH_USAGE_WARNING value: {value}") elif key == 'CEPH_USAGE_CRITICAL': - cls.CONFIG['CEPH_USAGE_CRITICAL'] = int(value) + try: + cls.CONFIG['CEPH_USAGE_CRITICAL'] = int(value) + except ValueError: + logger.warning(f"Invalid CEPH_USAGE_CRITICAL value: {value}") # Prometheus settings elif key == 'PROMETHEUS_ENABLED': cls.CONFIG['PROMETHEUS_ENABLED'] = value.lower() in ('true', '1', 'yes') logger.info(f"✓ Loaded PROMETHEUS_ENABLED: {cls.CONFIG['PROMETHEUS_ENABLED']}") elif key == 'PROMETHEUS_PORT': - cls.CONFIG['PROMETHEUS_PORT'] = int(value) + try: + cls.CONFIG['PROMETHEUS_PORT'] = int(value) + except ValueError: + logger.warning(f"Invalid PROMETHEUS_PORT value: {value}") elif key == 'PROMETHEUS_TEXTFILE_PATH': cls.CONFIG['PROMETHEUS_TEXTFILE_PATH'] = value if value else None logger.info(f"✓ Loaded PROMETHEUS_TEXTFILE_PATH: {value}") @@ -186,12 +195,23 @@ class SystemHealthMonitor: cls.CONFIG['CLUSTER_NAME'] = value if value else 'proxmox-cluster' logger.info(f"✓ Loaded CLUSTER_NAME: {value}") elif key == 'NEW_DRIVE_HOURS_THRESHOLD': - cls.CONFIG['NEW_DRIVE_HOURS_THRESHOLD'] = int(value) + try: + cls.CONFIG['NEW_DRIVE_HOURS_THRESHOLD'] = int(value) + except ValueError: + logger.warning(f"Invalid NEW_DRIVE_HOURS_THRESHOLD value: {value}") elif key == 'SMART_ERROR_RECENT_HOURS': - cls.CONFIG['SMART_ERROR_RECENT_HOURS'] = int(value) + try: + cls.CONFIG['SMART_ERROR_RECENT_HOURS'] = int(value) + except ValueError: + logger.warning(f"Invalid SMART_ERROR_RECENT_HOURS value: {value}") except Exception as e: logger.error(f"Failed to load .env file: {e}") + + # Validate critical configuration + api_key = cls.CONFIG.get('TICKET_API_KEY') + if not api_key or api_key == 'your_api_key_here': + logger.warning("TICKET_API_KEY is not configured - ticket creation will fail (dry-run will still work)") TICKET_TEMPLATES = { 'ACTION_TYPE': {