Example #1
0
 def start(self):
     """ start the REST server. """
     self.name = calledfrom(sys._getframe(0))
     self.stop = False
     self.running = False
     self.handlers = {}
     self.webmods = {}
     self.state = ObjectState()
     self.state.define('whitelistenable', 0)
     self.state.define('whitelist', [])
     self.state.define('blacklist', [])
     self.state.define('disable', [])
     self.poll = select.poll()
     self.poll.register(self)
     start_new_thread(self.serve, ())
Example #2
0
class RestServerBase(HTTPServer):

    """ REST web server """

    allow_reuse_address = True
    daemon_thread = True

    def start(self):
        """ start the REST server. """
        self.name = calledfrom(sys._getframe(0))
        self.stop = False
        self.running = False
        self.handlers = {}
        self.webmods = {}
        self.state = ObjectState()
        self.state.define('whitelistenable', 0)
        self.state.define('whitelist', [])
        self.state.define('blacklist', [])
        self.state.define('disable', [])
        self.poll = select.poll()
        self.poll.register(self)
        start_new_thread(self.serve, ())

    def shutdown(self):
        """ shutdown the REST server. """
        try:
            self.stop = True
            time.sleep(0.2)
            self.server_close()
        except Exception, ex: handle_exception()

    def serve(self):
        """ serving loop. """
        logging.warn('rest.server - starting')
        time.sleep(1)
        while not self.stop:
            self.running = True
            try: got = self.poll.poll(100)
            except Exception, ex: handle_exception()
            if got and not self.stop:
                try: self.handle_request()
                except Exception, ex: handle_exception()
            time.sleep(0.01)
        self.running = False
        logging.warn('rest.server - stopping')

    def entrypoint(self, request):
        """ check lists whether request should be allowed. """
        ip = request.ip
        if not self.whitelistenable() and ip in self.blacklist():
            logging.warn('rest.server - denied %s' % ip)
            request.send_error(401)
            return False
        if  self.whitelistenable() and ip not in self.whitelist():
            logging.warn('rest.server - denied %s' % ip)
            request.send_error(401)
            return False
        return True

    def whitelistenable(self): 
        """ enable whitelist? """
        return self.state['whitelistenable']

    def whitelist(self):
        """ return the whitelist. """
        return self.state['whitelist']

    def blacklist(self): 
        """ return the black list. """
        return self.state['blacklist']

    def addhandler(self, path, type, handler):
        """ add a web handler """
        path = unquote_plus(path)
        splitted = []
        for i in path.split('/'):
            if i: splitted.append(i)
            else: splitted.append("/")
        splitted = tuple(splitted)
        if not self.handlers.has_key(splitted): self.handlers[splitted] = {}
        self.handlers[splitted][type] = handler
        logging.info('rest.server - %s %s handler added' % (splitted[0], type))

    def enable(self, what):
        """ enable an path. """
        try:
            self.state['disable'].remove(what)
            logging.info('rest.server - enabled %s' % str(what))
        except ValueError: pass

    def disable(self, what):
        """ disable an path. """
        self.state['disable'].append(what)
        logging.info('rest.server - disabled %s' % str(what))

    def do(self, request):
        """ do a request """
        path = unquote_plus(request.path.strip())
        path = path.split('?')[0]
        #if path.endswith('/'): path = path[:-1]
        splitted = []
        for i in path.split('/'):
            if i: splitted.append(i)
            else: splitted.append("/")
        splitted = tuple(splitted)
        logging.warn("rest.server - incoming - %s" % str(splitted))
        for i in self.state['disable']:
            if i in splitted:
                logging.warn('rest.server - %s - denied disabled %s' % (request.ip, i))
                request.send_error(404)
                return
        request.splitted = splitted
        request.value = None
        type = request.command
        try: func = self.handlers[splitted][type]
        except (KeyError, ValueError):
            try:
                func = self.handlers[splitted][type]
                request.value = splitted[-1]
            except (KeyError, ValueError):
                logging.error("rest.server - no handler found for %s" % str(splitted))
                request.send_error(404)
                return
        result = func(self, request)
        logging.info('rest.server - %s - result: %s' % (request.ip, str(result)))
        return result

    def handle_error(self, request, addr):
        """ log the error """
        ip = request.ip
        exctype, excvalue, tb = sys.exc_info()
        if exctype == socket.timeout:
            logging.warn('rest.server - %s - socket timeout' % (ip, ))
            return
        if exctype == socket.error:
            logging.warn('rest.server - %s - socket error: %s' % (ip, excvalue))
            return
        exceptstr = exceptionmsg()
        logging.warn('rest.server - %s - error %s %s => %s' % (ip, exctype, excvalue, exceptstr))