75 lines
2 KiB
Python
Executable file
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()
|
|
|