From 950b0ffcb32da751f1ee6f1737811af0f4f5f6e9 Mon Sep 17 00:00:00 2001 From: missytake Date: Tue, 26 Aug 2025 12:26:13 +0200 Subject: [PATCH] cmdeploy: print dots for every local DNS query --- cmdeploy/src/cmdeploy/dns.py | 4 ++-- cmdeploy/src/cmdeploy/remote/rdns.py | 19 ++++++++++--------- cmdeploy/src/cmdeploy/remote/rshell.py | 8 +++++++- cmdeploy/src/cmdeploy/sshexec.py | 6 +----- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/cmdeploy/src/cmdeploy/dns.py b/cmdeploy/src/cmdeploy/dns.py index 74537a62..c6aaee22 100644 --- a/cmdeploy/src/cmdeploy/dns.py +++ b/cmdeploy/src/cmdeploy/dns.py @@ -49,7 +49,7 @@ def check_full_zone(sshexec, remote_data, out, zonefile) -> int: and return (exitcode, remote_data) tuple.""" if sshexec in ["docker", "localhost"]: - required_diff, recommended_diff = remote.rdns.check_zonefile(zonefile, remote_data["mail_domain"]) + required_diff, recommended_diff = remote.rdns.check_zonefile(zonefile, remote_data["mail_domain"], verbose=False) else: required_diff, recommended_diff = sshexec.logged( remote.rdns.check_zonefile, @@ -58,7 +58,7 @@ def check_full_zone(sshexec, remote_data, out, zonefile) -> int: returncode = 0 if required_diff: - out.red("Please set required DNS entries at your DNS provider:\n") + out.red("\nPlease set required DNS entries at your DNS provider:\n") for line in required_diff: out(line) out("") diff --git a/cmdeploy/src/cmdeploy/remote/rdns.py b/cmdeploy/src/cmdeploy/remote/rdns.py index efa49141..d5bf4654 100644 --- a/cmdeploy/src/cmdeploy/remote/rdns.py +++ b/cmdeploy/src/cmdeploy/remote/rdns.py @@ -12,21 +12,21 @@ All functions of this module import re -from .rshell import CalledProcessError, shell +from .rshell import CalledProcessError, shell, log_progress def perform_initial_checks(mail_domain, pre_command=""): """Collecting initial DNS settings.""" assert mail_domain - if not shell("dig", fail_ok=True): - shell("apt-get update && apt-get install -y dnsutils") + if not shell("dig", fail_ok=True, print=log_progress): + shell("apt-get update && apt-get install -y dnsutils", print=log_progress) A = query_dns("A", mail_domain) AAAA = query_dns("AAAA", mail_domain) MTA_STS = query_dns("CNAME", f"mta-sts.{mail_domain}") WWW = query_dns("CNAME", f"www.{mail_domain}") res = dict(mail_domain=mail_domain, A=A, AAAA=AAAA, MTA_STS=MTA_STS, WWW=WWW) - res["acme_account_url"] = shell(pre_command + "acmetool account-url", fail_ok=True) + res["acme_account_url"] = shell(pre_command + "acmetool account-url", fail_ok=True, print=log_progress) res["dkim_entry"], res["web_dkim_entry"] = get_dkim_entry( mail_domain, pre_command, dkim_selector="opendkim" ) @@ -44,7 +44,8 @@ def get_dkim_entry(mail_domain, pre_command, dkim_selector): try: dkim_pubkey = shell( f"{pre_command} openssl rsa -in /etc/dkimkeys/{dkim_selector}.private " - "-pubout 2>/dev/null | awk '/-/{next}{printf(\"%s\",$0)}'" + "-pubout 2>/dev/null | awk '/-/{next}{printf(\"%s\",$0)}'", + print=log_progress ) except CalledProcessError: return @@ -61,7 +62,7 @@ def query_dns(typ, domain): # Get autoritative nameserver from the SOA record. soa_answers = [ x.split() - for x in shell(f"dig -r -q {domain} -t SOA +noall +authority +answer").split( + for x in shell(f"dig -r -q {domain} -t SOA +noall +authority +answer", print=log_progress).split( "\n" ) ] @@ -71,13 +72,13 @@ def query_dns(typ, domain): ns = soa[0][4] # Query authoritative nameserver directly to bypass DNS cache. - res = shell(f"dig @{ns} -r -q {domain} -t {typ} +short") + res = shell(f"dig @{ns} -r -q {domain} -t {typ} +short", print=log_progress) if res: return res.split("\n")[0] return "" -def check_zonefile(zonefile, mail_domain): +def check_zonefile(zonefile, mail_domain, verbose=True): """Check expected zone file entries.""" required = True required_diff = [] @@ -89,7 +90,7 @@ def check_zonefile(zonefile, mail_domain): continue if not zf_line.strip() or zf_line.startswith(";"): continue - print(f"dns-checking {zf_line!r}") + print(f"dns-checking {zf_line!r}") if verbose else log_progress("") zf_domain, zf_typ, zf_value = zf_line.split(maxsplit=2) zf_domain = zf_domain.rstrip(".") zf_value = zf_value.strip() diff --git a/cmdeploy/src/cmdeploy/remote/rshell.py b/cmdeploy/src/cmdeploy/remote/rshell.py index 042c5bf2..2937a999 100644 --- a/cmdeploy/src/cmdeploy/remote/rshell.py +++ b/cmdeploy/src/cmdeploy/remote/rshell.py @@ -1,7 +1,13 @@ from subprocess import DEVNULL, CalledProcessError, check_output +import sys -def shell(command, fail_ok=False): +def log_progress(data): + sys.stderr.write(".") + sys.stderr.flush() + + +def shell(command, fail_ok=False, print=print): print(f"$ {command}") args = dict(shell=True) if fail_ok: diff --git a/cmdeploy/src/cmdeploy/sshexec.py b/cmdeploy/src/cmdeploy/sshexec.py index 8a87e781..636b8abe 100644 --- a/cmdeploy/src/cmdeploy/sshexec.py +++ b/cmdeploy/src/cmdeploy/sshexec.py @@ -70,10 +70,6 @@ class SSHExec: raise self.FuncError(data) def logged(self, call, kwargs): - def log_progress(data): - sys.stderr.write(".") - sys.stderr.flush() - title = call.__doc__ if not title: title = call.__name__ @@ -82,6 +78,6 @@ class SSHExec: return self(call, kwargs, log_callback=print_stderr) else: print_stderr(title, end="") - res = self(call, kwargs, log_callback=log_progress) + res = self(call, kwargs, log_callback=remote.rshell.log_progress) print_stderr() return res