mirror of
https://github.com/pyMC-dev/pyMC_Repeater.git
synced 2026-08-07 17:33:16 +02:00
feat: Enhance MQTT configuration with TLS/SSL support and update logging
This commit is contained in:
+38
-20
@@ -164,28 +164,49 @@ duty_cycle:
|
||||
max_airtime_per_minute: 3600
|
||||
|
||||
|
||||
# MQTT Publishing Configuration (Optional)
|
||||
mqtt:
|
||||
# Enable/disable MQTT publishing
|
||||
enabled: false
|
||||
|
||||
# MQTT broker settings
|
||||
broker: "localhost"
|
||||
port: 1883 # Use 8883 for TLS/SSL
|
||||
|
||||
# Authentication (optional)
|
||||
username: null
|
||||
password: null
|
||||
|
||||
# TLS/SSL configuration (optional)
|
||||
# For public brokers with trusted certificates, just enable TLS:
|
||||
# tls:
|
||||
# enabled: true
|
||||
tls:
|
||||
enabled: false
|
||||
|
||||
# Advanced TLS options (usually not needed for public brokers):
|
||||
|
||||
# Custom CA certificate for server verification
|
||||
# Leave null to use system default CA certificates (recommended)
|
||||
ca_cert: null # e.g., "/etc/ssl/certs/ca-certificates.crt"
|
||||
|
||||
# Client certificate and key for mutual TLS (rarely needed)
|
||||
client_cert: null # e.g., "/etc/pymc/client.crt"
|
||||
client_key: null # e.g., "/etc/pymc/client.key"
|
||||
|
||||
# Skip certificate verification (insecure, not recommended)
|
||||
insecure: false
|
||||
|
||||
# Base topic for publishing
|
||||
# Messages will be published to: {base_topic}/{node_name}/{packet|advert}
|
||||
base_topic: "meshcore/repeater"
|
||||
|
||||
|
||||
# Storage Configuration
|
||||
storage:
|
||||
# Directory for persistent storage files (SQLite, RRD)
|
||||
storage_dir: "/var/lib/pymc_repeater"
|
||||
|
||||
# MQTT publishing configuration (optional)
|
||||
mqtt:
|
||||
# Enable/disable MQTT publishing
|
||||
enabled: false
|
||||
|
||||
# MQTT broker settings
|
||||
broker: "localhost"
|
||||
port: 1883
|
||||
|
||||
# Authentication (optional)
|
||||
username: null
|
||||
password: null
|
||||
|
||||
# Base topic for publishing
|
||||
# Messages will be published to: {base_topic}/{node_name}/{packet|advert}
|
||||
base_topic: "meshcore/repeater"
|
||||
|
||||
# Data retention settings
|
||||
retention:
|
||||
# Clean up SQLite records older than this many days
|
||||
@@ -197,9 +218,6 @@ storage:
|
||||
# - 1 hour resolution for 1 year
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
letsmesh:
|
||||
enabled: false
|
||||
iata_code: "Test" # e.g., "SFO", "LHR", "Test"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import json
|
||||
import logging
|
||||
import ssl
|
||||
from typing import Dict, Any, Optional
|
||||
|
||||
try:
|
||||
@@ -30,6 +31,38 @@ class MQTTHandler:
|
||||
try:
|
||||
self.client = mqtt.Client()
|
||||
|
||||
# Configure TLS/SSL if enabled
|
||||
tls_config = self.mqtt_config.get("tls", {})
|
||||
if tls_config.get("enabled", False):
|
||||
tls_params = {
|
||||
"cert_reqs": ssl.CERT_REQUIRED,
|
||||
"tls_version": ssl.PROTOCOL_TLS,
|
||||
}
|
||||
|
||||
# CA certificate for server verification (optional - uses system certs if not specified)
|
||||
ca_cert = tls_config.get("ca_cert")
|
||||
if ca_cert:
|
||||
tls_params["ca_certs"] = ca_cert
|
||||
logger.info("Using custom CA certificate for MQTT TLS")
|
||||
else:
|
||||
logger.info("Using system default CA certificates for MQTT TLS")
|
||||
|
||||
# Client certificate and key (for mutual TLS)
|
||||
client_cert = tls_config.get("client_cert")
|
||||
client_key = tls_config.get("client_key")
|
||||
if client_cert:
|
||||
tls_params["certfile"] = client_cert
|
||||
if client_key:
|
||||
tls_params["keyfile"] = client_key
|
||||
|
||||
# Allow insecure connections (skip cert verification)
|
||||
if tls_config.get("insecure", False):
|
||||
tls_params["cert_reqs"] = ssl.CERT_NONE
|
||||
logger.warning("MQTT TLS certificate verification disabled (insecure mode)")
|
||||
|
||||
self.client.tls_set(**tls_params)
|
||||
logger.info("MQTT TLS/SSL configured")
|
||||
|
||||
username = self.mqtt_config.get("username")
|
||||
password = self.mqtt_config.get("password")
|
||||
if username:
|
||||
@@ -41,7 +74,8 @@ class MQTTHandler:
|
||||
self.client.connect(broker, port, 60)
|
||||
self.client.loop_start()
|
||||
|
||||
logger.info(f"MQTT client connected to {broker}:{port}")
|
||||
secure = "(TLS)" if tls_config.get("enabled", False) else ""
|
||||
logger.info(f"MQTT client connected to {broker}:{port} {secure}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to initialize MQTT: {e}")
|
||||
|
||||
Reference in New Issue
Block a user