Commit be260238 authored by ibuler's avatar ibuler

[Update] 增加websocket

parent 90ce603e
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
import eventlet import eventlet
from eventlet.debug import hub_prevent_multiple_readers from eventlet.debug import hub_prevent_multiple_readers
# eventlet.monkey_patch() eventlet.monkey_patch()
# hub_prevent_multiple_readers(False) hub_prevent_multiple_readers(False)
import datetime import datetime
import os import os
......
...@@ -6,7 +6,7 @@ from flask import Flask ...@@ -6,7 +6,7 @@ from flask import Flask
from coco.utils import get_logger from coco.utils import get_logger
from coco.config import config from coco.config import config
from coco.httpd.ws import ProxyNamespace from coco.httpd.ws import ProxyNamespace, ElfinderNamespace
logger = get_logger(__file__) logger = get_logger(__file__)
...@@ -14,10 +14,10 @@ app = Flask(__name__, template_folder='templates', static_folder='static') ...@@ -14,10 +14,10 @@ app = Flask(__name__, template_folder='templates', static_folder='static')
app.config.update(config) app.config.update(config)
socket_io = SocketIO() socket_io = SocketIO()
socket_io.on_namespace(ProxyNamespace('/ssh')) socket_io.on_namespace(ProxyNamespace('/ssh'))
socket_io.on_namespace(ProxyNamespace('/coco/ssh')) socket_io.on_namespace(ElfinderNamespace('/elfinder'))
# init_kwargs = {'async_mode': 'threading'} init_kwargs = {'async_mode': 'threading'}
init_kwargs = {'async_mode': 'eventlet'} # init_kwargs = {'async_mode': 'eventlet',}
socket_io.init_app(app, **init_kwargs) socket_io.init_app(app, **init_kwargs)
socket_io.on_error_default(lambda x: logger.exception(x)) socket_io.on_error_default(lambda x: logger.exception(x))
......
This diff is collapsed.
...@@ -6,8 +6,18 @@ ...@@ -6,8 +6,18 @@
<link rel="stylesheet" type="text/css" media="screen" href="{{ url_for('static', filename='elfinder/css/theme-gray.css') }}"> <link rel="stylesheet" type="text/css" media="screen" href="{{ url_for('static', filename='elfinder/css/theme-gray.css') }}">
<script type="text/javascript" src="{{ url_for('static', filename='elfinder/elfinder.full.js') }}"></script> <script type="text/javascript" src="{{ url_for('static', filename='elfinder/elfinder.full.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static', filename='elfinder/i18n/elfinder.pl.js') }}"></script> <script type="text/javascript" src="{{ url_for('static', filename='elfinder/i18n/elfinder.pl.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static', filename='js/socket.io.js') }}"></script>
<script type="text/javascript" charset="utf-8"> <script type="text/javascript" charset="utf-8">
$().ready(function () { var socket = io.connect('/elfinder');
socket.on('connect', function () {
console.log("Connect")
});
socket.on('data', function (msg) {
var sid = msg.sid;
init_elfinder(sid);
});
function init_elfinder(sid) {
var elf; var elf;
var opts = { var opts = {
uiOptions : { uiOptions : {
...@@ -20,6 +30,7 @@ ...@@ -20,6 +30,7 @@
['view'] ['view']
] ]
}, },
customData: {'sid': sid},
height: $(window).height(), height: $(window).height(),
url: '{{ url_for("sftp_host_connector_view", host=host) }}', url: '{{ url_for("sftp_host_connector_view", host=host) }}',
resizable: false, resizable: false,
...@@ -97,7 +108,8 @@ ...@@ -97,7 +108,8 @@
}, 200); }, 200);
} }
}); });
}); }
</script> </script>
<div id="elfinder"></div> <div id="elfinder"></div>
</body> </body>
......
# -*- coding: utf-8 -*-
#
__volume_cached = {}
def get_cache_volume(sid):
return __volume_cached.get(sid)
def set_cache_volume(sid, volume):
__volume_cached[sid] = volume
...@@ -8,26 +8,36 @@ from .elfinder import connector, volumes ...@@ -8,26 +8,36 @@ from .elfinder import connector, volumes
from ..models import Connection from ..models import Connection
from ..sftp import InternalSFTPClient from ..sftp import InternalSFTPClient
from .auth import login_required from .auth import login_required
from .utils import get_cache_volume, set_cache_volume
from ..service import app_service from ..service import app_service
@app.route('/coco/elfinder/sftp/connector/<host>/', methods=['GET', 'POST']) @app.route('/coco/elfinder/sftp/connector/<host>/', methods=['GET', 'POST'])
@login_required @login_required
def sftp_host_connector_view(host): def sftp_host_connector_view(host):
user = request.current_user sid = request.args.get("sid") or request.values.get('sid')
connection = Connection(addr=(request.real_ip, 0)) print("Get sid: {}".format(sid))
connection.user = user volume = None
sftp = InternalSFTPClient(connection) if sid:
volume = volumes.SFTPVolume(sftp) volume = get_cache_volume(sid)
if host != '_': if not volume:
asset = app_service.get_asset(host) print("New volume")
if not asset: user = request.current_user
return jsonify({'error': 'Not found this host'}) connection = Connection(addr=(request.real_ip, 0))
hostname = asset.hostname connection.user = user
if asset.org_id: sftp = InternalSFTPClient(connection)
hostname = "{}.{}".format(asset.hostname, asset.org_name) volume = volumes.SFTPVolume(sftp)
volume.root_name = hostname set_cache_volume(sid, volume)
volume.base_path = '/' + hostname if host != '_':
asset = app_service.get_asset(host)
if not asset:
return jsonify({'error': 'Not found this host'})
hostname = asset.hostname
if asset.org_id:
hostname = "{}.{}".format(asset.hostname, asset.org_name)
volume.root_name = hostname
volume.base_path = '/' + hostname
handler = connector.ElFinderConnector([volume]) handler = connector.ElFinderConnector([volume])
handler.run(request) handler.run(request)
...@@ -40,11 +50,12 @@ def sftp_host_connector_view(host): ...@@ -40,11 +50,12 @@ def sftp_host_connector_view(host):
@app.route('/coco/elfinder/sftp/<host>/') @app.route('/coco/elfinder/sftp/<host>/')
def sftp_host_finder(host): def sftp_host_finder(host):
return render_template('finder/file_manager.html', host=host) return render_template('elfinder/file_manager.html', host=host)
@app.route('/coco/elfinder/sftp/') @app.route('/coco/elfinder/sftp/')
def sftp_finder(): def sftp_finder():
return render_template('finder/file_manager.html', host='_') return render_template('elfinder/file_manager.html', host='_')
...@@ -3,14 +3,15 @@ ...@@ -3,14 +3,15 @@
import os import os
import uuid import uuid
from flask_socketio import SocketIO, Namespace, join_room from flask_socketio import join_room
from flask import Flask, request from flask import request
from ..models import Connection, WSProxy from ..models import Connection, WSProxy
from ..proxy import ProxyServer from ..proxy import ProxyServer
from ..utils import get_logger from ..utils import get_logger
from ..ctx import app_service from ..ctx import app_service
from .base import BaseNamespace from .base import BaseNamespace
from .utils import get_cache_volume
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) BASE_DIR = os.path.dirname(os.path.dirname(__file__))
logger = get_logger(__file__) logger = get_logger(__file__)
...@@ -192,4 +193,16 @@ class ProxyNamespace(BaseNamespace): ...@@ -192,4 +193,16 @@ class ProxyNamespace(BaseNamespace):
pass pass
def on_ping(self): def on_ping(self):
self.emit('pong') self.emit('pong')
\ No newline at end of file
class ElfinderNamespace(BaseNamespace):
def on_connect(self):
print("on connect")
self.emit('data', {"sid": str(request.sid)})
def on_disconnect(self):
print("On disconnect")
volume = get_cache_volume(request.sid)
if volume:
volume.close()
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