scripts/surveillance/arpwatch/sendmail_server.py
2013-11-09 03:56:33 +01:00

75 lines
2 KiB
Python
Executable file

#!/bin/bash /usr/scripts/python.sh
# -*- 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()