Skip to content

Commit 81fddaa

Browse files
committed
Add optional ssl config flag
1 parent e01645b commit 81fddaa

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

elementary/clients/slack/client.py

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import json
2+
import ssl
23
from abc import ABC, abstractmethod
34
from typing import Dict, List, Optional, Tuple
45

6+
import certifi
57
from ratelimit import limits, sleep_and_retry
68
from slack_sdk import WebClient, WebhookClient
79
from slack_sdk.errors import SlackApiError
@@ -24,8 +26,9 @@ class SlackClient(ABC):
2426
def __init__(
2527
self,
2628
tracking: Optional[Tracking] = None,
29+
ssl_context: Optional[ssl.SSLContext] = None,
2730
):
28-
self.client = self._initial_client()
31+
self.client = self._initial_client(ssl_context)
2932
self.tracking = tracking
3033
self._initial_retry_handlers()
3134
self.email_to_user_id_cache: Dict[str, str] = {}
@@ -37,15 +40,35 @@ def create_client(
3740
if not config.has_slack:
3841
return None
3942
if config.slack_token:
40-
logger.debug("Creating Slack client with token.")
41-
return SlackWebClient(token=config.slack_token, tracking=tracking)
43+
logger.debug(
44+
"Creating Slack client with token (system CA? = %s).",
45+
config.use_system_ca_files,
46+
)
47+
ssl_context = (
48+
None
49+
if config.use_system_ca_files
50+
else ssl.create_default_context(cafile=certifi.where())
51+
)
52+
return SlackWebClient(
53+
token=config.slack_token, tracking=tracking, ssl_context=ssl_context
54+
)
4255
elif config.slack_webhook:
43-
logger.debug("Creating Slack client with webhook.")
44-
return SlackWebhookClient(webhook=config.slack_webhook, tracking=tracking)
56+
logger.debug(
57+
"Creating Slack client with webhook (system CA? = %s).",
58+
config.use_system_ca_files,
59+
)
60+
ssl_context = (
61+
ssl.create_default_context(cafile=certifi.where())
62+
if not config.use_system_ca_files
63+
else None
64+
)
65+
return SlackWebhookClient(
66+
webhook=config.slack_webhook, tracking=tracking, ssl_context=ssl_context
67+
)
4568
return None
4669

4770
@abstractmethod
48-
def _initial_client(self):
71+
def _initial_client(self, ssl_context: Optional[ssl.SSLContext]):
4972
raise NotImplementedError
5073

5174
def _initial_retry_handlers(self):
@@ -79,12 +102,13 @@ def __init__(
79102
self,
80103
token: str,
81104
tracking: Optional[Tracking] = None,
105+
ssl_context: Optional[ssl.SSLContext] = None,
82106
):
83107
self.token = token
84-
super().__init__(tracking)
108+
super().__init__(tracking, ssl_context)
85109

86-
def _initial_client(self):
87-
return WebClient(token=self.token)
110+
def _initial_client(self, ssl_context: Optional[ssl.SSLContext]):
111+
return WebClient(token=self.token, ssl=ssl_context)
88112

89113
@sleep_and_retry
90114
@limits(calls=1, period=ONE_SECOND)
@@ -224,13 +248,16 @@ def __init__(
224248
self,
225249
webhook: str,
226250
tracking: Optional[Tracking] = None,
251+
ssl_context: Optional[ssl.SSLContext] = None,
227252
):
228253
self.webhook = webhook
229-
super().__init__(tracking)
254+
super().__init__(tracking, ssl_context)
230255

231-
def _initial_client(self):
256+
def _initial_client(self, ssl_context: Optional[ssl.SSLContext]):
232257
return WebhookClient(
233-
url=self.webhook, default_headers={"Content-type": "application/json"}
258+
url=self.webhook,
259+
default_headers={"Content-type": "application/json"},
260+
ssl=ssl_context,
234261
)
235262

236263
@sleep_and_retry

elementary/config/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def __init__(
7171
env: str = "dev",
7272
run_dbt_deps_if_needed: Optional[bool] = None,
7373
project_name: Optional[str] = None,
74+
use_system_ca_files: bool = True,
7475
):
7576
self.config_dir = config_dir
7677
self.profiles_dir = profiles_dir
@@ -202,6 +203,8 @@ def __init__(
202203
"disable_elementary_version_check", False
203204
)
204205

206+
self.use_system_ca_files = use_system_ca_files
207+
205208
def _load_configuration(self) -> dict:
206209
if not os.path.exists(self.config_dir):
207210
os.makedirs(self.config_dir)

elementary/monitor/cli.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@ def get_cli_properties() -> dict:
274274
default=None,
275275
help="A Microsoft Teams webhook URL for sending alerts to a specific channel in Teams.",
276276
)
277+
@click.option(
278+
"--use-system-ca-files/--no-use-system-ca-files",
279+
default=True,
280+
help="Whether to use the system CA files for SSL connections or the ones provided by certify (see https://pypi.org/project/certifi).",
281+
)
277282
@click.pass_context
278283
def monitor(
279284
ctx,
@@ -304,6 +309,7 @@ def monitor(
304309
report_url,
305310
filters,
306311
teams_webhook,
312+
use_system_ca_files,
307313
):
308314
"""
309315
Get alerts on failures in dbt jobs.
@@ -335,6 +341,7 @@ def monitor(
335341
slack_group_alerts_by=group_by,
336342
report_url=report_url,
337343
teams_webhook=teams_webhook,
344+
use_system_ca_files=use_system_ca_files,
338345
)
339346
anonymous_tracking = AnonymousCommandLineTracking(config)
340347
anonymous_tracking.set_env("use_select", bool(select))

0 commit comments

Comments
 (0)