56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
# -----------------------------------------------------------------------------
|
|
# System Imports
|
|
# -----------------------------------------------------------------------------
|
|
|
|
from typing import Optional
|
|
import socket
|
|
import asyncio
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Public Imports
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
from httpx import URL
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Exports
|
|
# -----------------------------------------------------------------------------
|
|
|
|
__all__ = ["port_check_url"]
|
|
|
|
# -----------------------------------------------------------------------------
|
|
#
|
|
# CODE BEGINS
|
|
#
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
async def port_check_url(url: URL, timeout: Optional[int] = 5) -> bool:
|
|
"""
|
|
This function attempts to open the port designated by the URL given the
|
|
timeout in seconds. If the port is avaialble then return True; False
|
|
otherwise.
|
|
|
|
Parameters
|
|
----------
|
|
url:
|
|
The URL that provides the target system
|
|
|
|
timeout: optional, default is 5 seonds
|
|
Time to await for the port to open in seconds
|
|
"""
|
|
port = url.port or socket.getservbyname(url.scheme)
|
|
|
|
try:
|
|
wr: asyncio.StreamWriter
|
|
_, wr = await asyncio.wait_for(
|
|
asyncio.open_connection(host=url.host, port=port), timeout=timeout
|
|
)
|
|
|
|
# MUST close if opened!
|
|
wr.close()
|
|
return True
|
|
|
|
except Exception: # noqa
|
|
return False
|