Commit be260238 authored by ibuler's avatar ibuler

[Update] 增加websocket

parent 90ce603e
......@@ -4,8 +4,8 @@
import eventlet
from eventlet.debug import hub_prevent_multiple_readers
# eventlet.monkey_patch()
# hub_prevent_multiple_readers(False)
eventlet.monkey_patch()
hub_prevent_multiple_readers(False)
import datetime
import os
......
......@@ -6,7 +6,7 @@ from flask import Flask
from coco.utils import get_logger
from coco.config import config
from coco.httpd.ws import ProxyNamespace
from coco.httpd.ws import ProxyNamespace, ElfinderNamespace
logger = get_logger(__file__)
......@@ -14,10 +14,10 @@ app = Flask(__name__, template_folder='templates', static_folder='static')
app.config.update(config)
socket_io = SocketIO()
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': 'eventlet'}
init_kwargs = {'async_mode': 'threading'}
# init_kwargs = {'async_mode': 'eventlet',}
socket_io.init_app(app, **init_kwargs)
socket_io.on_error_default(lambda x: logger.exception(x))
......
This diff is collapsed.
......@@ -6,8 +6,18 @@
<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/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">
$().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 opts = {
uiOptions : {
......@@ -20,6 +30,7 @@
['view']
]
},
customData: {'sid': sid},
height: $(window).height(),
url: '{{ url_for("sftp_host_connector_view", host=host) }}',
resizable: false,
......@@ -97,7 +108,8 @@
}, 200);
}
});
});
}
</script>
<div id="elfinder"></div>
</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
from ..models import Connection
from ..sftp import InternalSFTPClient
from .auth import login_required
from .utils import get_cache_volume, set_cache_volume
from ..service import app_service
@app.route('/coco/elfinder/sftp/connector/<host>/', methods=['GET', 'POST'])
@login_required
def sftp_host_connector_view(host):
user = request.current_user
connection = Connection(addr=(request.real_ip, 0))
connection.user = user
sftp = InternalSFTPClient(connection)
volume = volumes.SFTPVolume(sftp)
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
sid = request.args.get("sid") or request.values.get('sid')
print("Get sid: {}".format(sid))
volume = None
if sid:
volume = get_cache_volume(sid)
if not volume:
print("New volume")
user = request.current_user
connection = Connection(addr=(request.real_ip, 0))
connection.user = user
sftp = InternalSFTPClient(connection)
volume = volumes.SFTPVolume(sftp)
set_cache_volume(sid, volume)
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.run(request)
......@@ -40,11 +50,12 @@ def sftp_host_connector_view(host):
@app.route('/coco/elfinder/sftp/<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/')
def sftp_finder():
return render_template('finder/file_manager.html', host='_')
return render_template('elfinder/file_manager.html', host='_')
......@@ -3,14 +3,15 @@
import os
import uuid
from flask_socketio import SocketIO, Namespace, join_room
from flask import Flask, request
from flask_socketio import join_room
from flask import request
from ..models import Connection, WSProxy
from ..proxy import ProxyServer
from ..utils import get_logger
from ..ctx import app_service
from .base import BaseNamespace
from .utils import get_cache_volume
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
logger = get_logger(__file__)
......@@ -192,4 +193,16 @@ class ProxyNamespace(BaseNamespace):
pass
def on_ping(self):
self.emit('pong')
\ No newline at end of file
self.emit('pong')
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