checkpahekoldap

This commit is contained in:
2026-03-21 17:42:27 +01:00
parent 5b653b52f6
commit 99916e0475

View File

@@ -42,9 +42,15 @@ def test_quota(paheko_entry, ldap_entry):
is_orga = paheko_entry["admin_orga"].strip("'") == "Oui" is_orga = paheko_entry["admin_orga"].strip("'") == "Oui"
has_mail = ldap_entry[1]['mailEnabled'][0] == b"TRUE" has_mail = ldap_entry[1]['mailEnabled'][0] == b"TRUE"
has_nextcloud = ldap_entry[1]['nextcloudEnabled'][0] == b"TRUE" has_nextcloud = ldap_entry[1]['nextcloudEnabled'][0] == b"TRUE"
email = ldap_entry[1]["mail"][0].decode()
res = ""
if quota_paheko != quota_global: if quota_paheko != quota_global:
return False #print(f"{email}: bad quota Paheko/LDAP")
#ldap.update_user(email, "quota", str(quota_paheko).encode())
return "Quota paheko et ldap non égaux"
quota_allowed = quota_paheko + 1 # 1GB pour email
quota_given = 0 quota_given = 0
if has_mail: if has_mail:
@@ -52,23 +58,67 @@ def test_quota(paheko_entry, ldap_entry):
if has_nextcloud: if has_nextcloud:
quota_given += quota_nextcloud quota_given += quota_nextcloud
# if quota_mail > 1:
# localpart, domain = email.split('@',1)
# path = f"/var/lib/docker/volumes/postfix_mailData/_data/{domain}/{localpart}"
# size = get_disk_size(path)
# print(f"email space: {email} {size}")
# # if size < 973741824:
# # print(f"{email} {size}")
# # ldap.update_user(email, "mailQuota", b"1G")
if is_orga: if is_orga:
linked_emails = paheko_entry["emails_rattaches"] linked_emails = paheko_entry["emails_rattaches"]
if linked_emails: if linked_emails:
for linked_email in linked_emails.splitlines(): for linked_email in linked_emails.splitlines():
quota_allowed += 1 # 1GB par email rattaché
ldap_linked_entry = ldap.get_email(linked_email) ldap_linked_entry = ldap.get_email(linked_email)
if ldap_linked_entry: if ldap_linked_entry:
quota_given += int(ldap_linked_entry[0][1]['mailQuota'][0][:-1]) quota_given += int(ldap_linked_entry[0][1]['mailQuota'][0][:-1])
# beaucoup ont en fait xGO de mail et xGO de cloud pour xGO en tout, à corriger à terme. # beaucoup ont en fait xGO de mail et xGO de cloud pour xGO en tout, à corriger à terme.
if quota_global * 2 == quota_given or 1 + quota_global * 2 == quota_given: # if quota_global * 2 == quota_given or 1 + quota_global * 2 == quota_given:
return True # return True
# On laisse 1GO de rab' pour tous ceux qui ont 10 de cloud et 1 de mail. # On laisse 1GO de rab' pour tous ceux qui ont 10 de cloud et 1 de mail.
if quota_given <= quota_global + 1: #if quota_given <= quota_global + 1:
return True # return True
return False # Si cloud dédié, aller chercher la place utilisée sur le cloud dédié ! + wordpress
if is_orga and (paheko_entry["cloud"].strip("'") == "Oui"):
serveur_prod = paheko_entry["serveur_prod"]
if not serveur_prod:
return "Pas de serveur prod renseigné"
directory = f"/var/lib/docker/volumes/orga_{paheko_entry['nom_orga'].lower()}-cloudData"
with Ssh(serveur_prod) as ssh:
try:
nc_size = int(ssh.check_output(f"du -sm {directory} | cut -f1"))
# print(f"NC {paheko_entry['nom_orga']} - {nc_size}")
quota_given += nc_size // 1024
res += f", NC: {nc_size}Mo"
except ValueError:
return "erreur taille NC"
if is_orga and (paheko_entry["wordpress"].strip("'") == "Oui"):
serveur_prod = paheko_entry["serveur_prod"]
if not serveur_prod:
return "Pas de serveur prod renseigné"
directory = f"/var/lib/docker/volumes/orga_{paheko_entry['nom_orga'].lower()}-wordpress/_data/wp-content"
with Ssh(serveur_prod) as ssh:
try:
wp_size = int(ssh.check_output(f"du -sm {directory} | cut -f1"))
# print(f"WP {paheko_entry['nom_orga']} - {wp_size}")
quota_given += wp_size // 1024
res += f", WP: {wp_size}Mo"
except ValueError:
return "erreur taille WP"
if quota_given > quota_allowed:
# print(f"{ldap_entry[1]['mail'][0].decode()}: {quota_given}/{quota_allowed}")
res += f" -> utilise {quota_given} (max {quota_allowed})"
print(f"{email}: {res}")
return res
def test_mail_secours(paheko_entry, ldap_entry): def test_mail_secours(paheko_entry, ldap_entry):
@@ -100,7 +150,7 @@ def test_server_location(paheko_entry):
serveur_prod = paheko_entry["serveur_prod"] serveur_prod = paheko_entry["serveur_prod"]
if not serveur_prod: if not serveur_prod:
return False return False
directory = f"/kaz/dockers/{paheko_entry['nom_orga']}-orga" directory = f"/kaz/dockers/{paheko_entry['nom_orga'].lower()}-orga"
with Ssh(serveur_prod) as ssh: with Ssh(serveur_prod) as ssh:
return ssh.check_return_code(f"ls {directory}") == 0 return ssh.check_return_code(f"ls {directory}") == 0
return True return True
@@ -114,6 +164,7 @@ with Ldap() as ldap:
services = [] services = []
mails_orgas = [] mails_orgas = []
servers_locations = [] servers_locations = []
nextcloud_ldap_wrong = []
for membre in membres: for membre in membres:
ldap_entry = ldap.get_email(membre["email"]) ldap_entry = ldap.get_email(membre["email"])
if ldap_entry: if ldap_entry:
@@ -127,19 +178,20 @@ with Ldap() as ldap:
size = int(get_disk_size(path) / 1024 / 1024) size = int(get_disk_size(path) / 1024 / 1024)
services.append(f"{membre['email']}: Paheko {membre['cloud']}, LDAP {ldap_entry[1]['nextcloudEnabled'][0].decode()}, espace cloud commun {size}Mo") services.append(f"{membre['email']}: Paheko {membre['cloud']}, LDAP {ldap_entry[1]['nextcloudEnabled'][0].decode()}, espace cloud commun {size}Mo")
if not test_quota(membre, ldap_entry): quota_ko = test_quota(membre, ldap_entry)
if quota_ko :
suffix = "" suffix = ""
if membre['emails_rattaches']: if membre['emails_rattaches']:
suffix = " rattachés\n " + "\n ".join(membre['emails_rattaches'].splitlines()) suffix = " rattachés\n " + "\n ".join(membre['emails_rattaches'].splitlines())
quota.append(f"{membre['email']}: Paheko {membre['quota_disque']}, LDAP mail {ldap_entry[1]['mailQuota'][0].decode()} cloud {ldap_entry[1]['nextcloudQuota'][0].decode()} quotaGlobal {ldap_entry[1]['quota'][0].decode()}{suffix}") quota.append(f"{membre['email']}: Paheko {membre['quota_disque']}, LDAP mail {ldap_entry[1]['mailQuota'][0].decode()} cloud {ldap_entry[1]['nextcloudQuota'][0].decode()} quotaGlobal {ldap_entry[1]['quota'][0].decode()} diag {quota_ko} {suffix}")
mails_orga = test_mails_orga(membre) mails_orga = test_mails_orga(membre)
if mails_orga: if mails_orga:
suffix = '\n '.join(mails_orga) suffix = '\n '.join(mails_orga)
mails_orgas.append(f"{membre['email']}:\n {suffix}") mails_orgas.append(f"{membre['email']}:\n {suffix}")
# if not test_server_location(membre): if not test_server_location(membre):
# servers_locations.append(f"{membre['email']} - {membre['nom_orga']}, pas trouvé sur {membre['serveur_prod']}") servers_locations.append(f"{membre['email']} - {membre['nom_orga']}, pas trouvé sur {membre['serveur_prod']}")
else: else:
ldap_entry = ldap.get_mail_forwarding(membre["email"]) ldap_entry = ldap.get_mail_forwarding(membre["email"])
@@ -160,6 +212,19 @@ with Ldap() as ldap:
else: else:
not_in_paheko.append(ldap_user["mail"][0].decode()) not_in_paheko.append(ldap_user["mail"][0].decode())
paheko_member = [x for x in membres if x["email"] == ldap_user["mail"][0].decode()]
paheko_member = paheko_member[0] if len(paheko_member) else None
if paheko_member or ldap_user["nextcloudEnabled"][0].decode() != "TRUE":
pass
else:
path = f"/var/lib/docker/volumes/cloud_cloudData/_data/{ldap_user['identifiantKaz'][0].decode()}"
size = int(get_disk_size(path) / 1024 / 1024)
nextcloud_ldap_wrong.append(f"{ldap_user["mail"][0].decode()}: espace cloud commun {size}Mo")
#if size < 30:
#print(f"{ldap_user["mail"][0].decode()} {size}")
#ldap.update_user(ldap_user["mail"][0].decode(), "nextcloudEnabled", b"FALSE")
#sys.exit(0)
ldap_forwardings = ldap.get_mail_forwardings() ldap_forwardings = ldap.get_mail_forwardings()
for ldap_user in ldap_forwardings: for ldap_user in ldap_forwardings:
ldap_user = ldap_user[1] ldap_user = ldap_user[1]
@@ -191,3 +256,6 @@ print("\n".join(mails_orgas))
print("\nOrgas pas trouvées sur le serveur renseigné dans paheko :") print("\nOrgas pas trouvées sur le serveur renseigné dans paheko :")
print("\n".join(servers_locations)) print("\n".join(servers_locations))
print("Comptes LDAP ayant Nextcloud actif à tort :")
print("\n".join(nextcloud_ldap_wrong))