server: envoie un seul mail par session
This commit is contained in:
parent
0cd30619ed
commit
58bbcde8ee
1 changed files with 28 additions and 9 deletions
37
server.py
37
server.py
|
@ -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():
|
||||||
@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):
|
||||||
|
|
||||||
# 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):
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
@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):
|
||||||
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):
|
||||||
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__":
|
||||||
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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue