Commit 58bbcde8 authored by Daniel Stan's avatar Daniel Stan

server: envoie un seul mail par session

parent 0cd30619
...@@ -13,6 +13,7 @@ import json ...@@ -13,6 +13,7 @@ import json
import datetime import datetime
import socket import socket
import subprocess import subprocess
import itertools
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
...@@ -121,7 +122,8 @@ def keepalive(): ...@@ -121,7 +122,8 @@ def keepalive():
@server_command('listroles') @server_command('listroles')
def listroles(): def listroles():
"""Liste des roles existant et de leurs membres. """Liste des roles existant et de leurs membres.
Renvoie également un rôle particulier ``"whoami"``, contenant l'username de l'utilisateur qui s'est connecté.""" Renvoie également un rôle particulier ``"whoami"``, contenant l'username
de l'utilisateur qui s'est connecté."""
d = serverconfig.ROLES d = serverconfig.ROLES
if d.has_key("whoami"): if d.has_key("whoami"):
raise ValueError('La rôle "whoami" ne devrait pas exister') raise ValueError('La rôle "whoami" ne devrait pas exister')
...@@ -166,7 +168,8 @@ def getfiles(filenames): ...@@ -166,7 +168,8 @@ def getfiles(filenames):
# TODO ça n'a rien à faire là, à placer plus haut dans le code # TODO ça n'a rien à faire là, à placer plus haut dans le code
def _putfile(filename, roles, contents): def _putfile(filename, roles, contents):
"""Écrit ``contents`` avec les roles ``roles`` dans le fichier ``filename``""" """Écrit ``contents`` avec les roles ``roles`` dans le fichier ``filename``
"""
gotit, old = getfile(filename) gotit, old = getfile(filename)
if not gotit: if not gotit:
old = u"[Création du fichier]" old = u"[Création du fichier]"
...@@ -178,7 +181,7 @@ def _putfile(filename, roles, contents): ...@@ -178,7 +181,7 @@ def _putfile(filename, roles, contents):
corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID) corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID)
backup(corps, filename, old) backup(corps, filename, old)
notification(u"Modification de %s" % filename, corps, filename, old) notification(u"Modification", filename, MYUID)
filepath = getpath(filename) filepath = getpath(filename)
if type(contents) != unicode: if type(contents) != unicode:
...@@ -201,7 +204,8 @@ def putfile(filename, parsed_stdin): ...@@ -201,7 +204,8 @@ def putfile(filename, parsed_stdin):
@server_command('putfiles', stdin_input=True, write=True) @server_command('putfiles', stdin_input=True, write=True)
def putfiles(parsed_stdin): def putfiles(parsed_stdin):
"""Écrit plusieurs fichiers. Lit les filenames sur l'entrée standard avec le reste.""" """Écrit plusieurs fichiers. Lit les filenames sur l'entrée standard avec le
reste."""
results = [] results = []
for fichier in parsed_stdin: for fichier in parsed_stdin:
try: try:
...@@ -224,7 +228,7 @@ def rmfile(filename): ...@@ -224,7 +228,7 @@ def rmfile(filename):
if validate(roles, 'w'): if validate(roles, 'w'):
corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID) corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID)
backup(corps, filename, old) backup(corps, filename, old)
notification(u"Suppression de %s" % filename, corps, filename, old) notification(u"Suppression", fname, MYUID)
os.remove(getpath(filename)) os.remove(getpath(filename))
else: else:
return u"Vous n'avez pas les droits d'écriture sur le fichier %s." % filename return u"Vous n'avez pas les droits d'écriture sur le fichier %s." % filename
...@@ -241,20 +245,33 @@ def backup(corps, fname, old): ...@@ -241,20 +245,33 @@ def backup(corps, fname, old):
back.write((u'* %s: %s\n' % (str(datetime.datetime.now()), corps)).encode("utf-8")) back.write((u'* %s: %s\n' % (str(datetime.datetime.now()), corps)).encode("utf-8"))
back.close() back.close()
def notification(subject, corps, fname, old): _notif_todo = []
def notification(action, fname, actor):
"""Enregistre une notification"""
_notif_todo.append((action, fname, actor))
def notification_mail():
"""Envoie par mail une notification de changement de fichier""" """Envoie par mail une notification de changement de fichier"""
if not _notif_todo:
return
frommail = serverconfig.CRANSP_MAIL frommail = serverconfig.CRANSP_MAIL
tomail = serverconfig.DEST_MAIL tomail = serverconfig.DEST_MAIL
actions = set( task[1] for task in _notif_todo )
msg = MIMEMultipart(_charset="utf-8") msg = MIMEMultipart(_charset="utf-8")
msg['Subject'] = subject msg['Subject'] = u"Modification de la base (%s)" % (', '.join(actions))
msg['X-Mailer'] = serverconfig.cmd_name.decode() msg['X-Mailer'] = serverconfig.cmd_name.decode()
msg['From'] = frommail msg['From'] = frommail
msg['To'] = tomail msg['To'] = tomail
msg.preamble = u"%s report" % (serverconfig.cmd_name.decode(),) msg.preamble = u"%s report" % (serverconfig.cmd_name.decode(),)
info = MIMEText(corps + liste = (u" * %s de %s par %s" % task for task in _notif_todo)
u"\nLa version précédente a été sauvegardée." +
info = MIMEText(u"Des modifications ont été faites:\n" +
u"\n".join(liste) +
u"\n\nDes sauvegardes ont été réalisées." +
u"\n\nModification effectuée sur %s." % socket.gethostname() + u"\n\nModification effectuée sur %s." % socket.gethostname() +
u"\n\n-- \nCranspasswords.py", _charset="utf-8") u"\n\n-- \nCranspasswords.py", _charset="utf-8")
msg.attach(info) msg.attach(info)
...@@ -277,3 +294,5 @@ if __name__ == "__main__": ...@@ -277,3 +294,5 @@ if __name__ == "__main__":
answer = command.decorated(*args) answer = command.decorated(*args)
if answer is not None: if answer is not None:
print(json.dumps(answer)) print(json.dumps(answer))
notification_mail()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment