From 7d87cbf675bb7113bce87ff1a745b48e0b67f2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Ro=C3=9Fner?= <thorsten.rossner.extern@zendis.de> Date: Fri, 6 Sep 2024 12:31:22 +0200 Subject: [PATCH] fix: Improve logging and attribute cleanup. --- lib/import_user.py | 42 ++++++++++++++++++++++++++++++------------ lib/ucs.py | 2 +- template.ods | Bin 12992 -> 13096 bytes 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/import_user.py b/lib/import_user.py index 9599cc0..af8e776 100644 --- a/lib/import_user.py +++ b/lib/import_user.py @@ -25,26 +25,44 @@ class ImportUser: persons = pd.read_excel(self.input_file, engine='odf', skiprows=self.skip_rows) persons.rename(columns=self.columnnames_map, inplace=True) - logging.info(f"Going to process the following list:\n{persons.to_string()}") + logging.info(f"Cleaning up list") - # validate list + # cleanup list error_count = 0 - for _, person in persons.iterrows(): - if (person['email'] == 0): + for index, person in persons.iterrows(): + if person['email'] == 0: + persons.drop(index, inplace=True) continue - if (not isinstance(person['username'], str)): - logging.error(f"- missing username in '{person}'") + if not isinstance(person['username'], str): + logging.error(f"Missing username in '{person}'") error_count+=1 continue - if (not bool(re.match(r'^[\w\d\.-]+$', person['username'], flags=re.IGNORECASE))): - logging.error(f"- found invalid characters in username: '{person['username']}'") + if person['username'].strip() != person['username']: + logging.warning(f"Leading or trailing blank(s) found in username email: '{person['username']}'") + persons.at[index, 'username'] = person['username'].strip() + if person['email'].strip() != person['email']: + logging.warning(f"Leading or trailing blank(s) found in external email: '{person['email']}'") + persons.at[index, 'email'] = person['email'].strip() + if 'mailPrimaryAddress' in person and isinstance(person['mailPrimaryAddress'], str): + if person['mailPrimaryAddress'].strip() != person['mailPrimaryAddress']: + logging.warning(f"Leading or trailing blank(s) found in internal email: '{person['mailPrimaryAddress']}'") + persons.at[index, 'mailPrimaryAddress'] = person['mailPrimaryAddress'].strip() + + logging.info(f"Processing list with {len(persons.index)} lines.") + logging.debug(f"Going to process the following list:\n{persons.to_string()}") + + # validate list + for index, person in persons.iterrows(): + if not bool(re.match(r'^[\w\d\.-]+$', person['username'], flags=re.IGNORECASE)): + logging.error(f"Found invalid characters in username: '{person['username']}'") error_count+=1 - if (not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['email'], flags=re.IGNORECASE))): + if not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['email'], flags=re.IGNORECASE)): logging.error(f"Found invalid external email: '{person['email']}'") error_count+=1 - if ('mailPrimaryAddress' in person) and (isinstance(person['mailPrimaryAddress'], str)) and (not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['mailPrimaryAddress'], flags=re.IGNORECASE))): - logging.error(f"Found invalid primary email: '{person['mailPrimaryAddress']}'") - error_count+=1 + if 'mailPrimaryAddress' in person and isinstance(person['mailPrimaryAddress'], str): + if not bool(re.match(r'^[\w\d\.\-_]+@[\w\d\.\-_]+$', person['mailPrimaryAddress'], flags=re.IGNORECASE)): + logging.error(f"Found invalid primary email: '{person['mailPrimaryAddress']}'") + error_count+=1 if (error_count > 0): sys.exit("! Found errors, please fix and rerun the script") diff --git a/lib/ucs.py b/lib/ucs.py index 0854004..6ecf658 100644 --- a/lib/ucs.py +++ b/lib/ucs.py @@ -243,7 +243,7 @@ class Ucs: logging.debug(f"Reconcile {username} groups to: {person['groups']}") self.update_user(current_json, person) else: - logging.warning(f"User {dn} already exists.") + logging.info(f"User {dn} already exists.") else: logging.info(f"Creating user {username}") self.create_user(person) diff --git a/template.ods b/template.ods index 524ff6ea9ac09d30f6d032bd80c843a07838bfd3..e39536532b95a0e8e4e6a716bf56fe2f242c0d04 100644 GIT binary patch delta 8799 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 Rbcd4$TFOs`U%`DX`9IH2UM~Ou delta 8585 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 -- GitLab