def post(self): if self.debug and self.get_argument('error', u''): # for testing purpose only raise ValueError('Uncaught exception') ip, port = self.get_client_addr() workers = clients.get(ip, {}) if workers and len(workers) >= options.maxconn: raise tornado.web.HTTPError(403, 'Too many live connections.') self.check_origin() try: args = self.get_args() except InvalidValueError as exc: raise tornado.web.HTTPError(400, str(exc)) future = self.executor.submit(self.ssh_connect, args) try: worker = yield future except (ValueError, paramiko.SSHException) as exc: logging.error(traceback.format_exc()) self.result.update(status=str(exc)) else: if not workers: clients[ip] = workers worker.src_addr = (ip, port) workers[worker.id] = worker self.loop.call_later(DELAY, recycle_worker, worker) self.result.update(id=worker.id, encoding=worker.encoding) self.write(self.result)
def post(self): if self.debug and self.get_argument('error', u''): # for testing purpose only raise ValueError('Uncaught exception') self.src_addr = self.get_client_addr() if len(clients.get(self.src_addr[0], {})) >= options.maxconn: raise tornado.web.HTTPError(403, 'Too many connections.') future = Future() t = threading.Thread(target=self.ssh_connect_wrapped, args=(future,)) t.setDaemon(True) t.start() try: worker = yield future except (ValueError, paramiko.SSHException) as exc: self.result.update(status=str(exc)) else: workers = clients.setdefault(worker.src_addr[0], {}) workers[worker.id] = worker self.loop.call_later(DELAY, recycle_worker, worker) self.result.update(id=worker.id, encoding=worker.encoding) self.write(self.result)
def open(self): self.src_addr = self.get_client_addr() logging.info('Connected from {}:{}'.format(*self.src_addr)) workers = clients.get(self.src_addr[0]) if not workers: self.close(reason='Websocket authentication failed.') return try: worker_id = self.get_value('id') except (tornado.web.MissingArgumentError, InvalidValueError) as exc: self.close(reason=str(exc)) else: worker = workers.get(worker_id) if worker: workers[worker_id] = None try: self.set_nodelay(True) except AssertionError: # tornado 6.00 bug pass worker.set_handler(self) self.worker_ref = weakref.ref(worker) self.loop.add_handler(worker.fd, worker, IOLoop.READ) else: self.close(reason='Websocket authentication failed.')
def post(self): if self.debug and self.get_argument('error', u''): # for testing purpose only raise ValueError('Uncaught exception') now = (int(time.time())) ip, port = self.get_client_addr() workers = clients.get(ip, {}) x_real_ip = self.get_x_real_ip() client_ip = self.get_value("ip") logging.info('Client>>>> on {}:{} now time {}'.format( x_real_ip, port, now)) if self.check_remote_ip_trusted(x_real_ip): logging.info('Client {}:{} in trusted list; now time {}'.format( x_real_ip, port, now)) else: if self.check_remote_ip_blacklist(x_real_ip): raise tornado.web.HTTPError(403, 'IP in blacklist.') if client_ip != x_real_ip: raise tornado.web.HTTPError(403, 'IP fake.') tm = (int(self.get_value("tm"))) if now - tm > 30 * 60: raise tornado.web.HTTPError(403, 'connect timeout.') if now < tm: raise tornado.web.HTTPError(403, 'invalid time.') if workers and len(workers) >= options.maxconn: raise tornado.web.HTTPError(403, 'Too many live connections.') self.check_origin() try: args = self.get_args() except InvalidValueError as exc: raise tornado.web.HTTPError(400, str(exc)) future = self.executor.submit(self.ssh_connect, args) try: worker = yield future except (ValueError, paramiko.SSHException) as exc: logging.error(traceback.format_exc()) self.result.update(status=str(exc)) else: if not workers: clients[ip] = workers worker.src_addr = (ip, port) workers[worker.id] = worker self.loop.call_later(DELAY, recycle_worker, worker) self.result.update(id=worker.id, encoding=worker.encoding) self.write(self.result)