From e38fedb3932dd0c6d4e45fd69064d3a755ce1635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bompard?= Date: Tue, 6 Jan 2026 13:59:35 +0100 Subject: [PATCH] Alias generation script: retry on connection error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Aurélien Bompard --- roles/fasjson/templates/fasjson-aliases.j2 | 45 ++++++++++++++++------ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/roles/fasjson/templates/fasjson-aliases.j2 b/roles/fasjson/templates/fasjson-aliases.j2 index a19f1e9f82..48fdcafae2 100644 --- a/roles/fasjson/templates/fasjson-aliases.j2 +++ b/roles/fasjson/templates/fasjson-aliases.j2 @@ -1,18 +1,35 @@ #!/usr/bin/python3 import os import sys +import time import tempfile import subprocess +from functools import wraps from fasjson_client import Client, errors fasjson_url = "{{ fasjson_url }}" aliases_static_file = "/etc/aliases.static" aliases_file = "/etc/aliases" +max_retries = 3 + + +def retry(func): + @wraps(func) + def wrapper(*args, **kwargs): + for attempt in range(max_retries): + try: + return func(*args, **kwargs) + except ConnectionError: + if attempt < max_retries - 1: + time.sleep(1) + else: + raise + + return wrapper def gen_all_aliases(): - # API query try: client = Client(url=fasjson_url) @@ -30,7 +47,7 @@ def gen_all_aliases(): temp.write(line) for user in users: username = user['username'] - userinfo = client.get_user(username=username).result + userinfo = retry(client.get_user)(username=username).result email = userinfo['emails'][0] temp.write(f'{username}: {email} \n') @@ -41,7 +58,8 @@ def gen_all_aliases(): sponsor_list = ','.join( sponsor['username'] for sponsor in client.list_group_sponsors( - groupname=groupname).result + groupname=groupname + ).result ) if sponsor_list: temp.write( @@ -51,8 +69,9 @@ def gen_all_aliases(): member_list = ','.join( member['username'] - for member in client.list_group_members( - groupname=groupname).result + for member in retry(client.list_group_members)( + groupname=groupname + ).result ) if member_list: @@ -60,7 +79,9 @@ def gen_all_aliases(): rename(temporary_file.name, aliases_file) except errors.APIError as e: - print(f"Something went wrong querying the fasjson API. {e}", file=sys.stderr) + print( + f"Something went wrong querying the fasjson API. {e}", file=sys.stderr + ) raise except IOError as e: print(e, file=sys.stderr) @@ -102,18 +123,20 @@ def update_user(username): def rename(filename, aliases_file): try: os.rename(filename, aliases_file) - if (os.path.exists(filename)): + if os.path.exists(filename): os.remove(filename) except IOError as e: print(f"Error updating aliases file {e}", file=sys.stderr) raise + def selinux(): try: subprocess.check_call(['/usr/sbin/restorecon', '-R', aliases_file]) except IOError as e: print(f"Error restoring file context {e}", file=sys.stderr) + def main(): args = sys.argv[1:] @@ -121,10 +144,10 @@ def main(): os.environ["KRB5_CLIENT_KTNAME"] = "/etc/krb5.keytab" if not args: - gen_all_aliases() - selinux() - # call newaliases script so postfix gets updated - subprocess.check_call(['/usr/bin/newaliases']) + gen_all_aliases() + selinux() + # call newaliases script so postfix gets updated + subprocess.check_call(['/usr/bin/newaliases']) elif len(args) == 2 and args[0] == "update": update_user(args[1]) # call newaliases script so postfix gets updated