diff --git a/cmd.json b/cmd.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/cmd.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/plugins/webssh/img/ico-cmd.png b/plugins/webssh/img/ico-cmd.png new file mode 100644 index 000000000..c88796d6b Binary files /dev/null and b/plugins/webssh/img/ico-cmd.png differ diff --git a/plugins/webssh/index.py b/plugins/webssh/index.py index d8270fdb3..20e359f1d 100755 --- a/plugins/webssh/index.py +++ b/plugins/webssh/index.py @@ -11,10 +11,103 @@ sys.path.append(os.getcwd() + "/class/core") import mw -def status(): - return 'start' +class App(): + + __cmd_file = 'cmd.json' + __cmd_path = '' + + def __init__(self): + self.__cmd_path = self.getServerDir() + '/' + self.__cmd_file + + if not os.path.exists(self.__cmd_path): + mw.writeFile(self.__cmd_path, '[]') + + def getPluginName(self): + return 'webssh' + + def getPluginDir(self): + return mw.getPluginDir() + '/' + self.getPluginName() + + def getServerDir(self): + return mw.getServerDir() + '/' + self.getPluginName() + + def getArgs(self): + args = sys.argv[2:] + tmp = {} + args_len = len(args) + + if args_len == 1: + t = args[0].strip('{').strip('}') + t = t.split(':') + tmp[t[0]] = t[1] + elif args_len > 1: + for i in range(len(args)): + t = args[i].split(':') + tmp[t[0]] = t[1] + + return tmp + + def checkArgs(self, data, ck=[]): + for i in range(len(ck)): + if not ck[i] in data: + return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, mw.returnJson(True, 'ok')) + + def status(self): + return 'start' + + def saveCmd(self, t): + data_tmp = json.loads(mw.readFile(self.__cmd_path)) + is_has = False + for x in range(0, len(data_tmp) - 1): + if data_tmp[x]['title'] == t['title']: + is_has = True + data_tmp[x]['cmd'] = t['cmd'] + if not is_has: + data_tmp.append(t) + mw.writeFile(self.__cmd_path, json.dumps(data_tmp)) + + def add_cmd(self): + args = self.getArgs() + check = self.checkArgs(args, ['title', 'cmd']) + if not check[0]: + return check[1] + + title = args['title'] + cmd = args['cmd'] + + t = { + 'title': title, + 'cmd': cmd + } + self.saveCmd(t) + + return mw.returnJson(True, '添加成功!') + + def del_cmd(self): + args = self.getArgs() + check = self.checkArgs(args, ['title']) + if not check[0]: + return check[1] + + title = args['title'] + data_tmp = json.loads(mw.readFile(self.__cmd_path)) + for x in range(0, len(data_tmp)): + if data_tmp[x]['title'] == title: + del(data_tmp[x]) + mw.writeFile(self.__cmd_path, json.dumps(data_tmp)) + return mw.returnJson(True, '删除成功') + return mw.returnJson(False, '删除无效') + + def get_cmd_list(self): + alist = json.loads(mw.readFile(self.__cmd_path)) + return mw.returnJson(True, 'ok', alist) if __name__ == "__main__": func = sys.argv[1] - if func == 'status': - print(status()) + classApp = App() + try: + data = eval("classApp." + func + "()") + print(data) + except Exception as e: + print(mw.getTracebackInfo()) diff --git a/plugins/webssh/js/webssh.js b/plugins/webssh/js/webssh.js index 54b82f66a..cd2b0ca29 100755 --- a/plugins/webssh/js/webssh.js +++ b/plugins/webssh/js/webssh.js @@ -1,5 +1,62 @@ -changeDivH(); +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(){ changeDivH(); @@ -21,10 +78,46 @@ $(document).ready(function(){ } }); - $('.glyphicon-resize-full').click(function(ele){ - const func = ele.requestFullscreen || ele.mozRequestFullScreen || ele.webkitRequestFullscreen || ele.msRequestFullscreen; - var e = $('#term_box_view').parent(); - func.call(e); + $('.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_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'); + } + + if (list_type == 'shell'){ + $('.term_tootls .tab-con .tab-block').eq(1).addClass('on'); + webShell_getCmdList(); + } + } }); webShell_Menu(); @@ -34,12 +127,114 @@ $(document).ready(function(){ 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+='