From 6c210bdf781ab73b98b1608577a053e79ecb2fc1 Mon Sep 17 00:00:00 2001 From: Felix Weiler-Detjen Date: Fri, 10 Jan 2025 14:43:46 +0000 Subject: [PATCH] Fix mqtt sender not sending any messages via ssl. --- .github/workflows/release.yml | 31 +++++++++++++++++++++ pyproject.toml | 2 ++ src/heisskleber/mqtt/sender.py | 16 +++++++++++ uv.lock | 49 ++++++++++++++++++++++++++++++++-- 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c5d0562 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: Release + +on: + push: + tags: + - "v*" + +jobs: + publish: + runs-on: ubuntu-latest + environment: production + permissions: + id-token: write + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v4 + with: + version: "0.5.10" + + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version-file: ".python-version" + + - name: Build dist + run: uv build + + - name: Build dist + run: uv publish diff --git a/pyproject.toml b/pyproject.toml index ec0ead9..d899a20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ dev-dependencies = [ "pytest-cov>=5.0.0", "coverage[toml]>=7.6.1", "pytest-asyncio>=0.24.0", + "pre-commit>=4.0.1", ] package = true @@ -125,6 +126,7 @@ convention = "google" [tool.hatch] version.source = "vcs" version.path = "src/heisskleber/__init__.py" +version.raw-options = { local_scheme = "no-local-version" } [tool.hatch.envs.default] features = ["test"] diff --git a/src/heisskleber/mqtt/sender.py b/src/heisskleber/mqtt/sender.py index 5cdc8c2..4bb315e 100644 --- a/src/heisskleber/mqtt/sender.py +++ b/src/heisskleber/mqtt/sender.py @@ -2,6 +2,7 @@ import asyncio import logging +import ssl from asyncio import CancelledError, create_task from typing import Any, TypeVar @@ -14,6 +15,7 @@ from .config import MqttConf T = TypeVar("T") + logger = logging.getLogger("heisskleber.mqtt") @@ -53,6 +55,19 @@ class MqttSender(Sender[T]): @retry(every=5, catch=aiomqtt.MqttError, logger_fn=logger.exception) async def _send_work(self) -> None: + tls_params = ( + aiomqtt.TLSParameters( + ca_certs=None, + certfile=None, + keyfile=None, + cert_reqs=ssl.CERT_REQUIRED, + tls_version=ssl.PROTOCOL_TLS, + ciphers=None, + ) + if self.config.ssl or self.config.port == 8883 # noqa: PLR2004 + else None + ) + async with aiomqtt.Client( hostname=self.config.host, port=self.config.port, @@ -61,6 +76,7 @@ class MqttSender(Sender[T]): timeout=float(self.config.timeout), keepalive=self.config.keep_alive, will=self.config.will, + tls_params=tls_params, ) as client: try: while True: diff --git a/uv.lock b/uv.lock index 82e4982..820e7b2 100644 --- a/uv.lock +++ b/uv.lock @@ -133,6 +133,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, ] +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, +] + [[package]] name = "charset-normalizer" version = "3.3.2" @@ -192,7 +201,7 @@ name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } wheels = [ @@ -370,7 +379,7 @@ wheels = [ [[package]] name = "heisskleber" -version = "1.0.0.dev6+g6b5270f.d20241118" +version = "1.0.1.dev0" source = { editable = "." } dependencies = [ { name = "aiomqtt" }, @@ -407,6 +416,7 @@ dev = [ { name = "deptry" }, { name = "mypy" }, { name = "nox" }, + { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-cov" }, @@ -442,6 +452,7 @@ dev = [ { name = "deptry", specifier = ">=0.20.0" }, { name = "mypy", specifier = ">=1.11.2" }, { name = "nox", specifier = ">=2024.4.15" }, + { name = "pre-commit", specifier = ">=4.0.1" }, { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-asyncio", specifier = ">=0.24.0" }, { name = "pytest-cov", specifier = ">=5.0.0" }, @@ -449,6 +460,15 @@ dev = [ { name = "xdoctest", specifier = ">=1.2.0" }, ] +[[package]] +name = "identify" +version = "2.6.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, +] + [[package]] name = "idna" version = "3.10" @@ -614,6 +634,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, +] + [[package]] name = "nox" version = "2024.4.15" @@ -726,6 +755,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] +[[package]] +name = "pre-commit" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, +] + [[package]] name = "pycparser" version = "2.22"