diff --git a/route/static/js/term.js b/route/static/js/term.js new file mode 100644 index 000000000..53cb7935d --- /dev/null +++ b/route/static/js/term.js @@ -0,0 +1,158 @@ +function Terms (el, config) { + if (typeof config == "undefined") config = {}; + this.el = el; + this.id = config.ssh_info.id || ''; + this.bws = null; //websocket对象 + this.route = '/webssh'; // 访问的方法 + this.term = null; //term对象 + this.info = null; // 请求数据 + this.last_body = null; + this.fontSize = 15; //终端字体大小 + this.ssh_info = config.ssh_info; + this.run(); +} +Terms.prototype = { + // websocket持久化连接 + connect: function (callback) { + var that = this; + // 判断当前websocket连接是否存在 + if (!this.bws || this.bws.readyState == 3 || this.bws.readyState == 2) { + this.bws = new WebSocket((window.location.protocol === 'http:' ? 'ws://' : 'wss://') + window.location.host + this.route); + this.bws.addEventListener('message', function (ev) { that.on_message(ev) }); + this.bws.addEventListener('close', function (ev) { that.on_close(ev) }); + this.bws.addEventListener('error', function (ev) { that.on_error(ev) }); + this.bws.addEventListener('open', function (ev) { that.on_open(ev) }); + if (callback) callback(this.bws) + } + }, + + //连接服务器成功 + on_open: function (ws_event) { + var http_token = $("#request_token_head").attr('token'); + this.ssh_info['x-http-token'] = http_token; + + this.send(JSON.stringify(this.ssh_info || { 'x-http-token': http_token })) + this.term.FitAddon.fit(); + this.resize({ cols: this.term.cols, rows: this.term.rows }); + }, + //服务器消息事件 + on_message: function (ws_event) { + result = ws_event.data; + if (!result) return; + that = this; + if ((result.indexOf("@127.0.0.1:") != -1 || result.indexOf("@localhost:") != -1) && result.indexOf('Authentication failed') != -1) { + that.term.write(result); + host_trem.localhost_login_form(result); + that.close(); + return; + } + if (result.length > 1 && that.last_body === false) { + that.last_body = true; + } + that.term.write(result); + that.set_term_icon(1); + if (result == '\r\n登出\r\n' || result == '登出\r\n' || result == '\r\nlogout\r\n' || result == 'logout\r\n') { + that.close(); + that.bws = null; + + } + }, + //websocket关闭事件 + on_close: function (ws_event) { + this.set_term_icon(0); + this.bws = null; + }, + + /** + * @name 设置终端标题状态 + * @author chudong<2020-08-10> + * @param {number} status 终端状态 + * @return void + */ + set_term_icon: function (status) { + var icon_list = ['icon-warning', 'icon-sucess', 'icon-info']; + if (status == 1) { + if ($("[data-id='" + this.id + "']").attr("class").indexOf('active') == -1) { + status = 2; + } + } + $("[data-id='" + this.id + "']").find('.icon').removeAttr('class').addClass(icon_list[status] + ' icon'); + if (status == 2) { + that = this; + setTimeout(function () { + $("[data-id='" + that.id + "']").find('.icon').removeAttr('class').addClass(icon_list[1] + ' icon'); + }, 200); + } + }, + + + //websocket错误事件 + on_error: function (ws_event) { + if (ws_event.target.readyState === 3) { + // var msg = '错误: 无法创建WebSocket连接,请在面板设置页面关闭【开发者模式】'; + // layer.msg(msg,{time:5000}) + // if(Term.state === 3) return + // Term.term.write(msg) + // Term.state = 3; + } else { + console.log(ws_event) + } + }, + //发送数据 + //@param event 唯一事件名称 + //@param data 发送的数据 + //@param callback 服务器返回结果时回调的函数,运行完后将被回收 + send: function (data, num) { + var that = this; + //如果没有连接,则尝试连接服务器 + if (!this.bws || this.bws.readyState == 3 || this.bws.readyState == 2) { + this.connect(); + } + //判断当前连接状态,如果!=1,则100ms后尝试重新发送 + if (this.bws.readyState === 1) { + this.bws.send(data); + } else { + if (this.state === 3) return; + if (!num) num = 0; + if (num < 5) { + num++; + setTimeout(function () { that.send(data, num++); }, 100) + } + } + }, + //关闭连接 + close: function () { + this.bws.close(); + this.set_term_icon(0); + }, + resize: function (size) { + if (this.bws) { + size['resize'] = 1; + this.send(JSON.stringify(size)); + } + + }, + run: function (ssh_info) { + var that = this; + this.term = new Terminal({ fontSize: this.fontSize, screenKeys: true, useStyle: true }); + this.term.setOption('cursorBlink', true); + this.last_body = false; + this.term.open($(this.el)[0]); + + // this.term.FitAddon = new window.FitAddon(); + // this.term.loadAddon(this.term.FitAddon); + // this.term.WebLinksAddon = new WebLinksAddon.WebLinksAddon(); + // this.term.loadAddon(this.term.WebLinksAddon); + if (ssh_info) this.ssh_info = ssh_info; + this.connect(); + that.term.onData(function (data) { + try { + that.bws.send(data); + } catch (e) { + that.term.write('\r\n连接丢失,正在尝试重新连接!\r\n'); + that.connect(); + } + }); + this.term.focus(); + } +}