Netdata.cloud bot for Zulip

simplify config

Changed files
+34 -50
netdata_zulip_bot
+17 -39
netdata_zulip_bot/config.py
···
load_dotenv(env_file)
logger.info("Loaded configuration from .env file")
-
# Load Zulip configuration
+
# Load Zulip configuration (optional from env, main source should be zuliprc)
zulip_config = ZulipConfig(
-
site=os.getenv("ZULIP_SITE", ""),
-
email=os.getenv("ZULIP_EMAIL", ""),
-
api_key=os.getenv("ZULIP_API_KEY", ""),
+
site=os.getenv("ZULIP_SITE"),
+
email=os.getenv("ZULIP_EMAIL"),
+
api_key=os.getenv("ZULIP_API_KEY"),
stream=os.getenv("ZULIP_STREAM", "netdata-alerts"),
)
-
# Validate required Zulip settings
-
if not all([zulip_config.site, zulip_config.email, zulip_config.api_key]):
-
raise ValueError(
-
"Missing required Zulip configuration. Please set ZULIP_SITE, "
-
"ZULIP_EMAIL, and ZULIP_API_KEY environment variables."
-
)
-
# Load server configuration
server_config = ServerConfig(
host=os.getenv("SERVER_HOST", "0.0.0.0"),
-
port=int(os.getenv("SERVER_PORT", "8443")),
-
domain=os.getenv("SERVER_DOMAIN", ""),
-
cert_path=os.getenv("SERVER_CERT_PATH", "./certs"),
-
enable_mtls=os.getenv("SERVER_ENABLE_MTLS", "true").lower() == "true",
-
auto_cert=os.getenv("SERVER_AUTO_CERT", "false").lower() == "true",
-
cert_email=os.getenv("SERVER_CERT_EMAIL", ""),
-
cert_staging=os.getenv("SERVER_CERT_STAGING", "false").lower() == "true",
-
acme_port=int(os.getenv("SERVER_ACME_PORT", "80")),
+
port=int(os.getenv("SERVER_PORT", "8080")),
)
-
# Validate required server settings
-
if not server_config.domain:
-
raise ValueError(
-
"Missing required server configuration. Please set SERVER_DOMAIN "
-
"environment variable."
-
)
-
-
# Validate auto-cert specific settings
-
if server_config.auto_cert and not server_config.cert_email:
-
raise ValueError(
-
"When SERVER_AUTO_CERT is enabled, SERVER_CERT_EMAIL must be set "
-
"for Let's Encrypt account registration."
-
)
-
logger.info(
"Configuration loaded",
-
zulip_site=zulip_config.site,
-
zulip_email=zulip_config.email,
+
zulip_site=zulip_config.site or "(from zuliprc)",
+
zulip_email=zulip_config.email or "(from zuliprc)",
zulip_stream=zulip_config.stream,
server_host=server_config.host,
server_port=server_config.port,
-
server_domain=server_config.domain,
-
mtls_enabled=server_config.enable_mtls,
-
auto_cert=server_config.auto_cert,
-
cert_staging=server_config.cert_staging,
)
return zulip_config, server_config
···
api_key=config.get('key', ''),
stream=config.get('stream', 'netdata-alerts'),
)
+
+
# Validate required fields from zuliprc
+
if not all([zulip_config.site, zulip_config.email, zulip_config.api_key]):
+
missing = []
+
if not zulip_config.site: missing.append('site')
+
if not zulip_config.email: missing.append('email')
+
if not zulip_config.api_key: missing.append('key')
+
raise ValueError(
+
f"Missing required Zulip configuration in {zuliprc_path}: {', '.join(missing)}"
+
)
logger.info(
"Loaded Zulip configuration from zuliprc",
+13 -7
netdata_zulip_bot/main.py
···
"""Create sample configuration files."""
# Sample .env file
-
env_content = """# Zulip Configuration
-
ZULIP_SITE=https://yourorg.zulipchat.com
-
ZULIP_EMAIL=netdata-bot@yourorg.zulipchat.com
-
ZULIP_API_KEY=your-api-key-here
-
ZULIP_STREAM=netdata-alerts
-
-
# Server Configuration (HTTP only, TLS handled by reverse proxy)
+
env_content = """# Server Configuration (HTTP only, TLS handled by reverse proxy)
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
+
+
# Optional: Override Zulip stream (default: netdata-alerts)
+
# ZULIP_STREAM=custom-alerts-stream
"""
with open(".env.sample", 'w') as f:
···
# Load configuration
if args.env_config:
zulip_config, server_config = load_config()
+
# Validate that required Zulip fields are provided via environment
+
if not all([zulip_config.site, zulip_config.email, zulip_config.api_key]):
+
missing = []
+
if not zulip_config.site: missing.append('ZULIP_SITE')
+
if not zulip_config.email: missing.append('ZULIP_EMAIL')
+
if not zulip_config.api_key: missing.append('ZULIP_API_KEY')
+
raise ValueError(
+
f"When using --env-config, these environment variables are required: {', '.join(missing)}"
+
)
else:
zulip_config = load_zuliprc_config(args.zuliprc)
# Still need server config from environment
+4 -4
netdata_zulip_bot/models.py
···
class ZulipConfig(BaseModel):
"""Zulip bot configuration."""
-
site: str
-
email: str
-
api_key: str
-
stream: str
+
site: Optional[str] = None
+
email: Optional[str] = None
+
api_key: Optional[str] = None
+
stream: str = "netdata-alerts"
model_config = ConfigDict(env_prefix="ZULIP_")