X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=flashpolicy%2Fsfa_flashpolicy.py;h=6d266c2752b8d8092a0f8084f47e35c64d7f5799;hb=04a3f20dc71bf8b3f96b1e3172623aa346a638a7;hp=8ccdc00ef11a993f4c10eec363a58b4ade1e4eb8;hpb=3c9b4d0e434d536c471d225e01723a61af544cb1;p=sfa.git diff --git a/flashpolicy/sfa_flashpolicy.py b/flashpolicy/sfa_flashpolicy.py index 8ccdc00e..6d266c27 100644 --- a/flashpolicy/sfa_flashpolicy.py +++ b/flashpolicy/sfa_flashpolicy.py @@ -19,20 +19,26 @@ import contextlib VERSION = 0.1 + def daemon(): """Daemonize the current process.""" - if os.fork() != 0: os._exit(0) + if os.fork() != 0: + os._exit(0) os.setsid() - if os.fork() != 0: os._exit(0) + if os.fork() != 0: + os._exit(0) os.umask(0) devnull = os.open(os.devnull, os.O_RDWR) os.dup2(devnull, 0) - # xxx fixme - this is just to make sure that nothing gets stupidly lost - should use devnull + # xxx fixme - this is just to make sure that nothing gets stupidly lost - + # should use devnull crashlog = os.open('/var/log/sfa_flashpolicy.log', os.O_RDWR | os.O_APPEND | os.O_CREAT, 0644) os.dup2(crashlog, 1) os.dup2(crashlog, 2) + class policy_server(object): + def __init__(self, port, path): self.port = port self.path = path @@ -49,8 +55,9 @@ class policy_server(object): self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sock.bind(('', port)) self.sock.listen(5) + def read_policy(self, path): - with file(path, 'rb') as f: + with open(path, 'rb') as f: policy = f.read(10001) if len(policy) > 10000: raise exceptions.RuntimeError('File probably too large to be a policy file', @@ -59,42 +66,46 @@ class policy_server(object): raise exceptions.RuntimeError('Not a valid policy file', path) return policy + def run(self): try: while True: thread.start_new_thread(self.handle, self.sock.accept()) - except socket.error, e: - self.log('Error accepting connection: %s' % (e[1],)) + except socket.error as e: + self.log('Error accepting connection: %s' % e[1]) + def handle(self, conn, addr): - addrstr = '%s:%s' % (addr[0],addr[1]) + addrstr = '%s:%s' % (addr[0], addr[1]) try: - self.log('Connection from %s' % (addrstr,)) + self.log('Connection from %s' % addrstr) with contextlib.closing(conn): # It's possible that we won't get the entire request in # a single recv, but very unlikely. request = conn.recv(1024).strip() - if request != '\0': - self.log('Unrecognized request from %s: %s' % (addrstr, request)) - return - self.log('Valid request received from %s' % (addrstr,)) + # if request != '\0': + # self.log('Unrecognized request from %s: %s' % (addrstr, request)) + # return + self.log('Valid request received from %s' % addrstr) conn.sendall(self.policy) - self.log('Sent policy file to %s' % (addrstr,)) - except socket.error, e: + self.log('Sent policy file to %s' % addrstr) + except socket.error as e: self.log('Error handling connection from %s: %s' % (addrstr, e[1])) - except Exception, e: + except Exception as e: self.log('Error handling connection from %s: %s' % (addrstr, e[1])) + def log(self, str): print >>sys.stderr, str + def main(): - parser = optparse.OptionParser(usage = '%prog [--port=PORT] --file=FILE', + parser = optparse.OptionParser(usage='%prog [--port=PORT] --file=FILE', version='%prog ' + str(VERSION)) parser.add_option('-p', '--port', dest='port', type=int, default=843, help='listen on port PORT', metavar='PORT') parser.add_option('-f', '--file', dest='path', help='server policy file FILE', metavar='FILE') parser.add_option("-d", "--daemon", dest="daemon", action="store_true", - help="Run as daemon.", default=False) + help="Run as daemon.", default=False) opts, args = parser.parse_args() if args: parser.error('No arguments are needed. See help.') @@ -105,7 +116,7 @@ def main(): if opts.daemon: daemon() policy_server(opts.port, opts.path).run() - except Exception, e: + except Exception as e: print >> sys.stderr, e sys.exit(1) except KeyboardInterrupt: