diff --git a/impression/digicode_server2.py b/impression/digicode_server2.py new file mode 100755 index 00000000..71d29527 --- /dev/null +++ b/impression/digicode_server2.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import time +import os +import sys +import SocketServer +import requests + +sys.path.append('/etc/crans/secrets') +from secrets import digicode_pass + +CODES = "/var/impression/codes" +PIDFILE = "/var/run/digicode.pid" +HOST, PORT = "zamok.adm.crans.org", 1200 +DIGICODE_LINK = "https://intranet2.crans.org/digicode/delete/" +CERTIFICATE = "/etc/ssl/certs/cacert.org.pem" + +def log(message = "", logfile = "/var/log/crans/digicode.log"): + """Log a message to the default logfile""" + log = open(logfile, "a") + if message: + log.write("%s %s\n" % (time.strftime("%b %d %H:%M:%S"), message)) + log.flush() + log.close() + +def runme(): + os.chdir(CODES) + + #lpadmin + os.setegid(108) + #freerad + os.seteuid(120) + + log("Starting server!") + server = SocketServer.UDPServer((HOST, PORT), VigileHandler) + server.serve_forever() + + +class VigileHandler(SocketServer.BaseRequestHandler): + """Handler class for SocketServers, answering to door requests""" + def handle(self): + """Handle the request the door sent us""" + data = self.request[0].lower() + socket = self.request[1] + log("%s wrote: %s" % (self.client_address[0], data)) + + # if data starts with o, opened door validation, else should + # be a code + if not data.startswith("o"): + response = requests.post(DIGICODE_LINK, data = {'password' : digicode_pass, 'code' : data}, verify = CERTIFICATE) + if response.content == u'Code Successfully Deleted': + socket.sendto("passoir,o=1", self.client_address) + + log("%s -- %s" % (data, response.content)) + +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(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 + runme()