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, ())
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))