scripts/surveillance/arpwatch/sendmail_server.py
Daniel STAN c068df708d [arpwatch] ajout d'un serveur d'envoi
Celui-ci écoute au travers d'une socket unix. Il permet ainsi de garder
une connexion ldap (et pg et cie) en permanence ouverte. Ce qui accélère
le traitement des rapports de arpwatch.
Pour utiliser ce server, report.py (ancien arpwatch_sendmail.py)
tente de se connecter à cette socket et envoie le mail lui-même en cas
d'échec.
On rajoute également un initscript pour arpwatch_sendmail_server.
Il n'est pas parfait et si vous aimez pas, feel free to edit.
2013-07-21 20:08:53 +02:00

75 lines
2 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Serveur sendmail d'arpwatch.
Permet de ne charger qu'une fois le module report (et donc lc_ldap
et cie)
Ceci écoute sur une socket unix les rapports arpwatch (via report.py)
"""
from __future__ import print_function
import SocketServer
import sys, os, pwd, grp
import common
class Handler(SocketServer.StreamRequestHandler):
"""Gestion d'une requête"""
def handle(self):
self.server.reporter.report(self.request.recv(1024))
class MyServer(SocketServer.UnixStreamServer):
"""Un server, avec une instance du module report"""
reporter = None
def run():
"""Serveur permanent"""
import report
try:
os.remove(common.SOCKET_FILE)
print("Removed old socket", file=sys.stderr)
except OSError:
pass
# La socket ne doit pas être accessible pour tous: on garde adm
os.umask(007)
os.setgid(grp.getgrnam(common.GROUP).gr_gid)
serv = SocketServer.UnixStreamServer(common.SOCKET_FILE, Handler)
serv.reporter = report
serv.serve_forever()
# fork en arrière plan + pidfile
if __name__ == "__main__":
# do the UNIX double-fork magic, see Stevens' "Advanced
# Programming in the UNIX Environment" for details (ISBN 0201563177)
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# decouple from parent environment
os.chdir("/") #don't prevent unmounting....
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent, print eventual PID before
#print "Daemon PID %d" % pid
open(common.PIDFILE, 'w').write("%d" % pid)
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# start the daemon main loop
run()