Commit a1217de8 authored by zheng liu's avatar zheng liu

Merged in dev (pull request #9)

Dev
parents b0a6cbd1 5d07be79
...@@ -10,7 +10,7 @@ pre version. ...@@ -10,7 +10,7 @@ pre version.
## Install ## Install
$ git clone http://xxxx $ git clone https://github.com/jumpserver/coco.git
## Setting ## Setting
...@@ -31,7 +31,7 @@ Also some config you need kown: ...@@ -31,7 +31,7 @@ Also some config you need kown:
## Start ## Start
# python ssh_server.py # python run_server.py
When your start ssh server, It will register with jumpserver api, When your start ssh server, It will register with jumpserver api,
......
...@@ -150,10 +150,10 @@ class Coco: ...@@ -150,10 +150,10 @@ class Coco:
for s in self.sessions: for s in self.sessions:
if not s.stop_evt.is_set(): if not s.stop_evt.is_set():
continue continue
if s.date_finished is None: if s.date_end is None:
self.remove_session(s) self.remove_session(s)
continue continue
delta = datetime.datetime.now() - s.date_finished delta = datetime.datetime.now() - s.date_end
if delta > datetime.timedelta(seconds=interval*5): if delta > datetime.timedelta(seconds=interval*5):
self.remove_session(s) self.remove_session(s)
time.sleep(interval) time.sleep(interval)
......
...@@ -172,7 +172,7 @@ class HttpServer: ...@@ -172,7 +172,7 @@ class HttpServer:
port = self.app.config["HTTPD_PORT"] port = self.app.config["HTTPD_PORT"]
print('Starting websocket server at {}:{}'.format(host, port)) print('Starting websocket server at {}:{}'.format(host, port))
self.socketio.on_namespace(SSHws('/ssh').app(self.app)) self.socketio.on_namespace(SSHws('/ssh').app(self.app))
self.socketio.init_app(self.flask) self.socketio.init_app(self.flask, async_mode="threading")
self.socketio.run(self.flask, port=port, host=host) self.socketio.run(self.flask, port=port, host=host)
def shutdown(self): def shutdown(self):
......
...@@ -28,7 +28,7 @@ class InteractiveServer: ...@@ -28,7 +28,7 @@ class InteractiveServer:
self.client = client self.client = client
self.request = client.request self.request = client.request
self.assets = None self.assets = None
self.search_result = None self._search_result = None
self.asset_groups = None self.asset_groups = None
self.get_user_assets_async() self.get_user_assets_async()
self.get_user_asset_groups_async() self.get_user_asset_groups_async()
...@@ -37,6 +37,18 @@ class InteractiveServer: ...@@ -37,6 +37,18 @@ class InteractiveServer:
def app(self): def app(self):
return self._app() return self._app()
@property
def search_result(self):
if self._search_result:
return self._search_result
else:
return None
@search_result.setter
def search_result(self, value):
value = self.filter_system_users(value)
self._search_result = value
def display_banner(self): def display_banner(self):
self.client.send(char.CLEAR_CHAR) self.client.send(char.CLEAR_CHAR)
logo_path = os.path.join(self.app.root_path, "logo.txt") logo_path = os.path.join(self.app.root_path, "logo.txt")
...@@ -219,14 +231,13 @@ class InteractiveServer: ...@@ -219,14 +231,13 @@ class InteractiveServer:
def filter_system_users(assets): def filter_system_users(assets):
for asset in assets: for asset in assets:
system_users_granted = asset.system_users_granted system_users_granted = asset.system_users_granted
high_priority = max([s.priority for s in system_users_granted]) high_priority = max([s.priority for s in system_users_granted]) if system_users_granted else 1
system_users_cleaned = [s for s in system_users_granted if s.priority == high_priority] system_users_cleaned = [s for s in system_users_granted if s.priority == high_priority]
asset.system_users_granted = system_users_cleaned asset.system_users_granted = system_users_cleaned
return assets return assets
def get_user_assets(self): def get_user_assets(self):
assets = self.app.service.get_user_assets(self.client.user) self.assets = self.app.service.get_user_assets(self.client.user)
self.assets = self.filter_system_users(assets)
logger.debug("Get user {} assets total: {}".format(self.client.user, len(self.assets))) logger.debug("Get user {} assets total: {}".format(self.client.user, len(self.assets)))
def get_user_assets_async(self): def get_user_assets_async(self):
......
...@@ -7,8 +7,8 @@ import threading ...@@ -7,8 +7,8 @@ import threading
import logging import logging
import time import time
import weakref import weakref
import paramiko import paramiko
from paramiko.ssh_exception import SSHException
from .session import Session from .session import Session
from .models import Server from .models import Server
...@@ -130,7 +130,10 @@ class ProxyServer: ...@@ -130,7 +130,10 @@ class ProxyServer:
width = self.request.meta.get('width', 80) width = self.request.meta.get('width', 80)
height = self.request.meta.get('height', 24) height = self.request.meta.get('height', 24)
logger.debug("Change win size: %s - %s" % (width, height)) logger.debug("Change win size: %s - %s" % (width, height))
try:
self.server.chan.resize_pty(width=width, height=height) self.server.chan.resize_pty(width=width, height=height)
except SSHException:
break
def watch_win_size_change_async(self): def watch_win_size_change_async(self):
thread = threading.Thread(target=self.watch_win_size_change) thread = threading.Thread(target=self.watch_win_size_change)
......
...@@ -9,6 +9,8 @@ import threading ...@@ -9,6 +9,8 @@ import threading
import paramiko import paramiko
import sys import sys
import time
from .utils import ssh_key_gen from .utils import ssh_key_gen
from .interface import SSHInterface from .interface import SSHInterface
from .interactive import InteractiveServer from .interactive import InteractiveServer
...@@ -48,13 +50,13 @@ class SSHServer: ...@@ -48,13 +50,13 @@ class SSHServer:
try: try:
sock, addr = self.sock.accept() sock, addr = self.sock.accept()
logger.info("Get ssh request from {}: {}".format(addr[0], addr[1])) logger.info("Get ssh request from {}: {}".format(addr[0], addr[1]))
thread = threading.Thread(target=self.handle, args=(sock, addr)) thread = threading.Thread(target=self.handle_connection, args=(sock, addr))
thread.daemon = True thread.daemon = True
thread.start() thread.start()
except Exception as e: except Exception as e:
logger.error("Start SSH server error: {}".format(e)) logger.error("Start SSH server error: {}".format(e))
def handle(self, sock, addr): def handle_connection(self, sock, addr):
transport = paramiko.Transport(sock, gss_kex=False) transport = paramiko.Transport(sock, gss_kex=False)
try: try:
transport.load_server_moduli() transport.load_server_moduli()
...@@ -73,17 +75,23 @@ class SSHServer: ...@@ -73,17 +75,23 @@ class SSHServer:
logger.warning("Handle EOF Error") logger.warning("Handle EOF Error")
return return
chan = transport.accept(10) while True:
chan = transport.accept()
if chan is None: if chan is None:
logger.warning("No ssh channel get") continue
return
server.event.wait(5) server.event.wait(5)
if not server.event.is_set(): if not server.event.is_set():
logger.warning("Client not request a valid request, exiting") logger.warning("Client not request a valid request, exiting")
return return
t = threading.Thread(target=self.handle_chan, args=(chan, request))
t.daemon = True
t.start()
def handle_chan(self, chan, request):
client = Client(chan, request) client = Client(chan, request)
print(chan)
print(request)
self.app.add_client(client) self.app.add_client(client)
self.dispatch(client) self.dispatch(client)
......
# coding: utf-8 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
import weakref import weakref
import logging import logging
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment