mirror of
https://github.com/luxfhe/workshop.git
synced 2026-10-30 17:06:44 +00:00
112 lines
3.2 KiB
Python
112 lines
3.2 KiB
Python
"""Utils.
|
|
|
|
- Check if connection possible
|
|
- Wait for connection to be available (with timeout)
|
|
"""
|
|
|
|
import subprocess
|
|
import time
|
|
from pathlib import Path
|
|
|
|
from tqdm import tqdm
|
|
|
|
|
|
def filter_logs(previous_logs: str, current_logs: str) -> str:
|
|
"""Filter logs based on previous logs.
|
|
|
|
Arguments:
|
|
previous_logs (str): previous logs
|
|
current_logs (str): current logs
|
|
|
|
Returns:
|
|
str: filtered logs
|
|
"""
|
|
current_splitted = current_logs.split("\n")
|
|
previous_splitted = set(previous_logs.split("\n"))
|
|
|
|
for current_index, current_line in enumerate(current_splitted):
|
|
if current_line not in previous_splitted:
|
|
return "\n".join(current_splitted[current_index:])
|
|
return ""
|
|
|
|
|
|
def wait_for_connection_to_be_available(
|
|
hostname: str,
|
|
ip_address: str,
|
|
path_to_private_key: Path,
|
|
timeout: int = 1,
|
|
wait_time: int = 1,
|
|
max_retries: int = 20,
|
|
wait_bar: bool = False,
|
|
):
|
|
"""Wait for connection to be available.
|
|
|
|
Arguments:
|
|
hostname (str): host name
|
|
ip_address (str): ip address
|
|
path_to_private_key (Path): path to private key
|
|
timeout (int): ssh timeout option
|
|
wait_time (int): time to wait between retries
|
|
max_retries (int): number of retries, if < 0 unlimited retries
|
|
wait_bar (bool): tqdm progress bar of retries
|
|
|
|
Raises:
|
|
TimeoutError: if it wasn't able connect to ssh with the given constraints
|
|
"""
|
|
with tqdm(disable=not wait_bar) as pbar:
|
|
# We can't cover infinite retry without risking an infinite loop
|
|
if max_retries < 0: # pragma: no cover
|
|
while True:
|
|
if is_connection_available(
|
|
hostname=hostname,
|
|
ip_address=ip_address,
|
|
timeout=timeout,
|
|
path_to_private_key=path_to_private_key,
|
|
):
|
|
return
|
|
time.sleep(wait_time)
|
|
pbar.update(1)
|
|
else:
|
|
for _ in range(max_retries):
|
|
if is_connection_available(
|
|
hostname=hostname,
|
|
ip_address=ip_address,
|
|
timeout=timeout,
|
|
path_to_private_key=path_to_private_key,
|
|
):
|
|
return
|
|
time.sleep(wait_time)
|
|
pbar.update(1)
|
|
|
|
raise TimeoutError(
|
|
"Timeout reached while trying to check for connection "
|
|
f"availability on {hostname}@{ip_address}"
|
|
)
|
|
|
|
|
|
def is_connection_available(
|
|
hostname: str, ip_address: str, path_to_private_key: Path, timeout: int = 1
|
|
):
|
|
"""Check if ssh connection is available.
|
|
|
|
Arguments:
|
|
hostname (str): host name
|
|
ip_address (str): ip address
|
|
path_to_private_key (Path): path to private key
|
|
timeout: ssh timeout option
|
|
|
|
Returns:
|
|
bool: True if connection succeeded
|
|
"""
|
|
|
|
command = (
|
|
f"ssh -i {path_to_private_key.resolve()} "
|
|
+ f"-q -o ConnectTimeout={timeout} -o BatchMode=yes -o "
|
|
+ f"\"StrictHostKeyChecking=no\" {hostname}@{ip_address} 'exit 0'"
|
|
)
|
|
try:
|
|
subprocess.check_output(command, shell=True)
|
|
return True
|
|
except subprocess.CalledProcessError:
|
|
return False
|