//全局 var host_ssh_list = []; //刷新页面 $(window).unload(function(){ for (i in host_ssh_list) { host_ssh_list[i].close(); } return false; }); function appPost(method,args,callback){ var _args = null; if (typeof(args) == 'string'){ _args = JSON.stringify(toArrayObject(args)); } else { _args = JSON.stringify(args); } var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); $.post('/plugins/run', {name:'webssh', func:method, args:_args}, function(data) { layer.close(loadT); if (!data.status){ layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); return; } if(typeof(callback) == 'function'){ callback(data); } },'json'); } function appAsyncPost(method,args){ var _args = null; if (typeof(args) == 'string'){ _args = JSON.stringify(toArrayObject(args)); } else { _args = JSON.stringify(args); } return syncPost('/plugins/run', {name:'webssh', func:method, args:_args}); } function appPostCallbak(method, args, callback){ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'webssh'; req_data['func'] = method; args['version'] = '1.0'; if (typeof(args) == 'string'){ req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); } $.post('/plugins/callback', req_data, function(data) { layer.close(loadT); if (!data.status){ layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); return; } if(typeof(callback) == 'function'){ callback(data); } },'json'); } $(document).ready(function(){ var tag = $.getUrlParam('tag'); if(tag == 'webssh'){ webShell_Load(); } }); function webShell_Resize(){ var cur_ssh = $('.term_item_tab .list .active'); if (cur_ssh.length > 0){ var data = $(cur_ssh).data(); var item = host_ssh_list[data.id]; item.term.fit(); item.resize({ cols: item.term.cols, rows: item.term.rows}); item.term.focus(); } } function webShell_Load(){ changeDivH(); $(window).resize(function(){ changeDivH(); webShell_Resize(); }); $('.term_content_tab .term-tool-button').click(function(){ if ($(this).hasClass('tool-show')){ $('#term_box_view').css('margin-right',300); $('.term_tootls').css('display',"block"); $(this).removeClass('tool-show').addClass('tool-hide'); $(this).find('span').removeClass('glyphicon-menu-left').addClass('glyphicon-menu-right'); } else { $('#term_box_view').css('margin-right',0); $('.term_tootls').css('display',"none"); $(this).removeClass('tool-hide').addClass('tool-show'); $(this).find('span').removeClass('glyphicon-menu-right').addClass('glyphicon-menu-left'); } webShell_Resize(); }); $('.full_exit_screen').click(function(ele){ if($(this).hasClass('glyphicon-resize-full')){ requestFullScreen($('#term_box_view')[0]); $(this).removeClass('glyphicon-resize-full').addClass('glyphicon-resize-small'); } else{ exitFull(); $(this).removeClass('glyphicon-resize-small').addClass('glyphicon-resize-full'); } }); $('.addServer').click(function(){ webShell_addServer(); }); $('.tootls_host_btn').click(function(){ webShell_addServer(); }); $('.tootls_commonly_btn').click(function(){ webShell_cmd(); }); // 切换服务器终端视图 $('.term_item_tab .list').on('click', 'span.item', function (ev) { var index = $(this).index(); var data = $(this).data(); if ($(this).hasClass('addServer')) { } else if ($(this).hasClass('tab_tootls')) { } else { $(this).addClass('active').siblings().removeClass('active'); $('.term_content_tab .term_item:eq(' + index + ')').addClass('active').siblings().removeClass('active'); webShell_Resize(); } }); $('.term_item_tab').on('click', '.icon-trem-close', function () { var id = $(this).parent().data('id'); webShell_removeTermView(id); }) //服务器列表和常用命令 webShell_getHostList(); //服务器列表和命令切换 $('.term_tootls .tab-nav span').click(function(){ var list_type = $(this).attr('data-type'); if (!$(this).hasClass('on')){ $('.term_tootls .tab-nav span').removeClass('on'); $(this).addClass('on'); $('.term_tootls .tab-con .tab-block').removeClass('on') if (list_type == 'host'){ $('.term_tootls .tab-con .tab-block').eq(0).addClass('on'); webShell_getHostList(); } if (list_type == 'shell'){ $('.term_tootls .tab-con .tab-block').eq(1).addClass('on'); webShell_getCmdList(); } } }); webShell_Menu(); } function changeDivH(){ var l = $(window).height(); $('#term_box_view').parent().css('height',l-80); $('#xterm-viewport').css('height',l-80); $('.tootls_host_list').css('display','block').css('height',l-192); $('.tootls_commonly_list').css('display','block').css('height',l-192); } // 窗口状态改变 function fullScreenChange(el, callback) { el.addEventListener("fullscreenchange", function () { callback && callback(document.fullscreen); }); el.addEventListener("webkitfullscreenchange", function () { callback && callback(document.webkitIsFullScreen); }); el.addEventListener("mozfullscreenchange", function () { callback && callback(document.mozFullScreen); }); el.addEventListener("msfullscreenchange", function () { callback && callback(document.msFullscreenElement); }); } // 全屏 function requestFullScreen(element) { var requestMethod = element.requestFullScreen || //W3C element.webkitRequestFullScreen || //Chrome等 element.mozRequestFullScreen || //FireFox element.msRequestFullScreen; //IE11 if (requestMethod) { requestMethod.call(element); }else if (typeof window.ActiveXObject !== "undefined") {//for Internet Explorer var wscript = new ActiveXObject("WScript.Shell"); if (wscript !== null) { wscript.SendKeys("{F11}"); } } } //退出全屏 function exitFull() { var exitMethod = document.exitFullscreen || //W3C document.mozCancelFullScreen || //Chrome等 document.webkitExitFullscreen || //FireFox document.webkitExitFullscreen; //IE11 if (exitMethod) { exitMethod.call(document); }else if (typeof window.ActiveXObject !== "undefined") {//for Internet Explorer var wscript = new ActiveXObject("WScript.Shell"); if (wscript !== null) { wscript.SendKeys("{F11}"); } } } function webShell_getCmdList(){ appPost('get_cmd_list', {}, function(rdata){ var rdata = $.parseJSON(rdata.data); var alist = rdata.data; var tli = ''; for (var i = 0; i < alist.length; i++) { tli+='
  • \ \ '+alist[i]['title']+'\ \ \ \ \
  • '; } $('.tootls_commonly_list').html(tli); $('.data-cmd-list .glyphicon-edit').click(function(){ var index = $(this).parent().parent().attr('data-index'); var t = alist[index]; webShell_cmd(t['title'],t['cmd']); }); $('.data-cmd-list .glyphicon-trash').click(function(){ var index = $(this).parent().parent().attr('data-index'); var t = alist[index]; appPost('del_cmd', {title:t['title']}, function(rdata){ var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function(){ webShell_getCmdList(); },{ icon: rdata.status ? 1 : 2 }); }); }); $('.data-cmd-list .span_title').click(function(e){ copyText($(this).parent().attr('data-clipboard-text')); e.preventDefault(); }); }); } var n; function Terms_WebSocketIO_Create(ip, random){ n = new Terms_WebSocketIO('#'+random, { ssh_info: { host: ip, ps: "22", id: random } }); n.registerCloseCallBack(function(){ webShell_removeTermView(random); layer.msg('已经关闭【'+ip+'】', { icon: 1, time: 3000 }); }); n.registerConnectedCallBack(function(){ webShell_Resize(); }); return n; } function webShell_Menu(){ var random = 'localhost'; // host_ssh_list[random] = new Terms_WebSocketIO('#'+random, { ssh_info: { host: "38.6.224.67", ps: "22", id: random } }); host_ssh_list[random] = Terms_WebSocketIO_Create('127.0.0.1',random); } function webShell_openTermView(info) { if (typeof info === "undefined") { info = { host: '127.0.0.1', ps: '本地服务器' } } var random = getRandomString(9); var tab_content = $('.term_content_tab'); var item_list = $('.term_item_tab .list'); tab_content.find('.term_item').removeClass('active').siblings().removeClass('active'); tab_content.append('
    '); item_list.find('.item').removeClass('active'); if (info.ps == ''){ info.ps = info.host; } item_list.append('
    ' + info.ps + '
    '); host_ssh_list[random] = Terms_WebSocketIO_Create(info.host, random); } function webShell_removeTermView(id){ var item = $('[data-id="' + id + '"]'); var next = item.next(); var prev = item.prev(); $('#' + id).remove(); item.remove(); try { host_ssh_list[id].close(); } catch (error) { console.log(error); } delete host_ssh_list[id]; if (item.hasClass('active')) { if (next.length > 0) { next.click(); } else { prev.click(); } } } function webShell_getHostList(info){ appPost('get_server_list', {}, function(rdata){ var rdata = $.parseJSON(rdata.data); var alist = rdata.data; var tli = ''; for (var i = 0; i < alist.length; i++) { tli+='
  • \ \ '+alist[i]['host']+'\ \ \ \ \
  • '; } $('.tootls_host_list').html(tli); $('.data-host-list .glyphicon-edit').click(function(e){ var index = $(this).parent().parent().attr('data-index'); var info = alist[index]; webShell_addServer(info); }); $('.data-host-list .glyphicon-trash').click(function(e){ var index = $(this).parent().parent().attr('data-index'); var t = alist[index]; appPost('del_server', {host:t['host']}, function(rdata){ var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function(){ webShell_getHostList(); },{ icon: rdata.status ? 1 : 2 }); }); }); $('.tootls_host_list .host').on('click', function (e) { var _this = $(this).parent(); var index = $(_this).index(); var host = $(_this).data('host'); $(_this).find('i').addClass('active'); if ($('.item[data-host="' + host + '"]').length > 0) { layer.msg('已经打开!', { icon: 0, time: 3000 }); } else { webShell_openTermView(alist[index]); } e.preventDefault(); }); }); } function webShell_addServer(info=[]){ layer.open({ type: 1, title: '添加主机信息', area: '500px', btn:["确定","取消"], content:'
    \
    \ 服务器IP\
    \ \ \
    \
    \
    \ SSH账号\
    \ \
    \
    \
    \ 验证方式\
    \
    \ \ \
    \
    \
    \
    \ 密码\
    \ \
    \
    \
    \ 私钥\
    \ \
    \
    \
    \ 私钥密码\
    \ \
    \
    \
    \ 备注\
    \ \
    \
    \
    ', success:function(){ if (typeof(info['host'])!='undefined'){ $('input[name="host"]').val(info['host']); appPost('get_server_by_host',{host:info['host']},function(rdata){ var rdata = $.parseJSON(rdata.data); var jdata = rdata.data; if (jdata['type'] == 0){ $('input[name="password"]').val(jdata['password']); } else{ $('textarea[name="pkey"]').val(jdata['pkey']); $('input[name="pkey_passwd"]').val(jdata['pkey_passwd']); } $('input[name="ps"]').val(jdata['ps']); $('.auth_type_checkbox').each(function(){ if ($(this).data('ctype') == jdata['type']){ $(this).addClass('btn-success'); } else { $(this).removeClass('btn-success'); } }); if (jdata['type'] == 0){ $('.c_password_view').removeClass('show').addClass('show'); $('.c_pkey_view').removeClass('show').addClass('hide'); $('.key_pwd_line').removeClass('show').addClass('hide'); }else{ $('.c_password_view').removeClass('show').addClass('hide'); $('.c_pkey_view').removeClass('show').addClass('show'); $('.key_pwd_line').removeClass('show').addClass('show'); } }); } $('.auth_type_checkbox').click(function(){ var ctype = $(this).attr('data-ctype'); $('.auth_type_checkbox').removeClass('btn-success'); $(this).addClass('btn-success'); if (ctype == 0){ $('.c_password_view').removeClass('show').addClass('show'); $('.c_pkey_view').removeClass('show').addClass('hide'); $('.key_pwd_line').removeClass('show').addClass('hide'); }else{ $('.c_password_view').removeClass('show').addClass('hide'); $('.c_pkey_view').removeClass('show').addClass('show'); $('.key_pwd_line').removeClass('show').addClass('show'); } }); }, yes:function(l,layeror){ var host = $('input[name="host"]').val(); var port = $('input[name="port"]').val(); var username = $('input[name="username"]').val(); var password = ''; var pkey = ''; var pkey_passwd = ''; var type = $('.btn-group .btn-success').attr('data-ctype'); if (type == "0"){ password = $('input[name="password"]').val(); } else{ pkey = $('textarea[name="pkey"]').val(); pkey_passwd = $('input[name="pkey_passwd"]').val(); } var ps = $('input[name="ps"]').val(); var req_data = { type:type, host:host, port:port, username:username, password:password, pkey:pkey, pkey_passwd:pkey_passwd, ps:ps, }; console.log(req_data); appPost('add_server',req_data,function(rdata){ layer.close(l); var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function(){ webShell_getHostList(); },{ icon: rdata.status ? 1 : 2 }); }); }, }); } function webShell_cmd(title='', cmd=''){ layer.open({ type: 1, title: '添加常用命令信息', area: '500px', btn:["确定","取消"], content:'
    \
    \ 命令名称\
    \ \
    \
    \
    \ 命令内容\
    \ \
    \
    \
    ', success:function(){ }, yes:function(l,layer_id){ var title = $('input[name="title"]').val(); var cmd = $('textarea[name="cmd"]').val(); appPost('add_cmd', {title:title,cmd:cmd}, function(rdata){ layer.close(l); var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function(){ webShell_getCmdList(); },{ icon: rdata.status ? 1 : 2 }); }); return false; } }); }