Home Assistant Unofficial Reference 2024.12.1
helper.py
Go to the documentation of this file.
1 """Helper functions for the Cert Expiry platform."""
2 
3 import asyncio
4 import datetime
5 import socket
6 import ssl
7 from typing import Any
8 
9 from homeassistant.core import HomeAssistant
10 from homeassistant.util import dt as dt_util
11 from homeassistant.util.ssl import get_default_context
12 
13 from .const import TIMEOUT
14 from .errors import (
15  ConnectionRefused,
16  ConnectionTimeout,
17  ResolveFailed,
18  ValidationFailure,
19 )
20 
21 
22 async def async_get_cert(
23  hass: HomeAssistant,
24  host: str,
25  port: int,
26 ) -> dict[str, Any]:
27  """Get the certificate for the host and port combination."""
28  async with asyncio.timeout(TIMEOUT):
29  transport, _ = await hass.loop.create_connection(
30  asyncio.Protocol,
31  host,
32  port,
33  ssl=get_default_context(),
34  happy_eyeballs_delay=0.25,
35  server_hostname=host,
36  )
37  try:
38  return transport.get_extra_info("peercert") # type: ignore[no-any-return]
39  finally:
40  transport.close()
41 
42 
44  hass: HomeAssistant,
45  hostname: str,
46  port: int,
47 ) -> datetime.datetime:
48  """Return the certificate's expiration timestamp."""
49  try:
50  cert = await async_get_cert(hass, hostname, port)
51  except socket.gaierror as err:
52  raise ResolveFailed(f"Cannot resolve hostname: {hostname}") from err
53  except TimeoutError as err:
54  raise ConnectionTimeout(
55  f"Connection timeout with server: {hostname}:{port}"
56  ) from err
57  except ConnectionRefusedError as err:
58  raise ConnectionRefused(
59  f"Connection refused by server: {hostname}:{port}"
60  ) from err
61  except ssl.CertificateError as err:
62  raise ValidationFailure(err.verify_message) from err
63  except ssl.SSLError as err:
64  raise ValidationFailure(err.args[0]) from err
65 
66  ts_seconds = ssl.cert_time_to_seconds(cert["notAfter"])
67  return dt_util.utc_from_timestamp(ts_seconds)
datetime.datetime get_cert_expiry_timestamp(HomeAssistant hass, str hostname, int port)
Definition: helper.py:47
dict[str, Any] async_get_cert(HomeAssistant hass, str host, int port)
Definition: helper.py:26
ssl.SSLContext get_default_context()
Definition: ssl.py:118