Alias generation script: retry on connection error

Signed-off-by: Aurélien Bompard <aurelien@bompard.org>
This commit is contained in:
Aurélien Bompard
2026-01-06 13:59:35 +01:00
parent 1becdd9e81
commit e38fedb393

View File

@@ -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