Browse Source

ajout outil fcn-report

Guillaume 7 years ago
parent
commit
92dfdca5fb
2 changed files with 144 additions and 0 deletions
  1. 127 0
      fcn-report
  2. 17 0
      fcn-report.format

+ 127 - 0
fcn-report

@@ -0,0 +1,127 @@
+#!/usr/bin/python3
+# Style Guide: https://www.python.org/dev/peps/pep-0008/
+
+import argparse
+import configparser
+import pprint
+import psycopg2
+
+# fcntoolbox package
+import fcntoolbox.dolibarr as dolibarr
+import fcntoolbox.mail as mail
+import fcntoolbox.sympa as sympa
+
+# network imports
+import smtplib
+from email.mime.text import MIMEText
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument("-c", "--config", type=str,
+                    default="/etc/fcntoolbox/config.ini",
+                    help="specify a configuration file")
+args = parser.parse_args()
+
+config = configparser.RawConfigParser()
+config.sections()
+config.read(args.config)
+confdoli = config['dolibarr']
+confsympa = config['sympa']
+
+conn = psycopg2.connect(host=confdoli['host'], database=confdoli['database'], 
+  user=confdoli['user'], password=confdoli['password'])
+
+doli = dolibarr.Instance(conn)
+
+fields = ["rowid", "firstname", "lastname", "email"]
+fieldsextra = ['email_second']
+
+# Filter out missing extra fields
+#cur.execute("SELECT * FROM llx_adherent_extrafields LIMIT 1")
+#columns_extra = map(lambda col : col.name, cur.description)
+#rows_extra = filter(lambda r : r in columns_extra, fieldsextra)
+
+cur = doli.get_adherent(fields, fieldsextra)
+
+aliases = mail.Aliases('/etc/aliases', 'franciliens.net')
+raliases = dict((val, key) for key, val in aliases.items())
+
+adherents = set() # set(email)
+adherents_alt = dict() # dict(email => set(email))
+radherents_alt = dict() # dict(email => email)
+for record in cur:
+  columns = map(lambda col : col.name, cur.description)
+  adh = dict(zip(columns, record))
+  adh_email = adh['email'].lower()
+  adherents.add(adh_email)
+  adh_alt = set()
+  if 'email_second' in adh and adh['email_second'] != None:
+    adh_alt.add(adh['email_second'])
+    radherents_alt[adh['email_second']] = adh_email
+  if adh_email in aliases:
+    adh_alt.add(aliases[adh_email])
+    radherents_alt[aliases[adh_email]] = adh_email
+  if adh_email in raliases:
+    adh_alt.add(raliases[adh_email])
+    radherents_alt[raliases[adh_email]] = adh_email
+  adherents_alt[adh_email] = adh_alt
+
+sympaconn = psycopg2.connect(host=confsympa['host'], database=confsympa['database'], 
+  user=confsympa['user'], password=confsympa['password'])
+sympaIns = sympa.Instance(sympaconn)
+list = 'adherents'
+francisubs = set(sympaIns.get_subscribers(list, confsympa['robot']))
+list2 = 'admin'
+adminsubs = set(sympaIns.get_subscribers(list2, confsympa['robot']))
+
+tosubscribe = set()
+for adh in adherents:
+  adh_alt = adherents_alt[adh]
+  if adh in francisubs or len(adh_alt.intersection(francisubs)) > 0:
+    pass
+  else:
+    tosubscribe.add(adh)
+
+tounsubscribe = set()
+for sub in francisubs:
+  if sub in adherents \
+      or (sub in radherents_alt and radherents_alt[sub] in adherents):
+    pass
+  else:
+    tounsubscribe.add(sub)
+
+tounsubscribe2 = set()
+for sub in adminsubs:
+  if sub in adherents \
+      or (sub in radherents_alt and radherents_alt[sub] in adherents):
+    pass
+  else:
+    tounsubscribe2.add(sub)
+
+reportFormat = open('fcn-report.format', 'r').read()
+
+s = smtplib.SMTP('localhost')
+
+pp = pprint.PrettyPrinter()
+
+def sendReport(listname, tosubscribe, tounsubscribe):
+  body = reportFormat.format(
+    list = listname,
+    tosubscribe = pp.pformat(tosubscribe),
+    tounsubscribe = pp.pformat(tounsubscribe))
+  msg = MIMEText(body)
+  msg['Subject'] = "Rapport de la liste [%s]" % listname
+  msg['From'] = confsympa['mail_from']
+  if 'mail_cc' in confsympa:
+    msg['Cc'] = confsympa['mail_cc']
+  msg['To'] = "%s-request@%s" % (listname, confsympa['robot'])
+  print(msg)
+  s.send_message(msg)
+
+if len(adherents) > 0 and (len(tosubscribe) > 0 or len(tounsubscribe) > 0) :
+  sendReport(list, tosubscribe, tounsubscribe)
+
+if len(adherents) > 0 and len(tounsubscribe2) > 0 :
+  sendReport(list2, {}, tounsubscribe2)
+
+s.quit()

+ 17 - 0
fcn-report.format

@@ -0,0 +1,17 @@
+Cher responsable(s) de liste,
+
+Il existe des incohérences entre nos adhérents et les abonnés à la liste de diffusion, qui devraient être résolues. 
+
+Des faux positifs peuvent exister, les cas échéant merci de rectifier l'adresse des adhérents concernés dans Dolibarr. 
+
+Ces membres devraient être abonnés à la liste '{list}' : 
+
+{tosubscribe}
+
+Ces membres devraient être désabonnés de la liste '{list}' : 
+
+{tounsubscribe}
+
+Automatiquement,
+
+Le script python divin