pull/109/head
Mr Chen 7 years ago
parent 08ac95a94f
commit 8855b7d907
  1. 7
      plugins/csvn/index.html
  2. 16
      plugins/csvn/index.py
  3. 60
      plugins/csvn/js/csvn.js
  4. 10
      plugins/webssh/index.html
  5. 10
      plugins/webssh/info.json
  6. 27
      plugins/webssh/install.sh
  7. 196
      plugins/webssh/js/webssh.js
  8. 1
      scripts/install.sh
  9. 6
      templates/default/firewall.html

@ -1,9 +1,10 @@
<div class="bt-form"> <div class="bt-form">
<div class="bt-w-main"> <div class="bt-w-main">
<div class="bt-w-menu"> <div class="bt-w-menu">
<p class="bgw" onclick="pluginService('csvn')">服务</p> <p class="bgw" onclick="pluginService('csvn');">服务</p>
<p onclick="pluginInitD('csvn')">自启动</p> <p onclick="pluginInitD('csvn');">自启动</p>
<p onclick="csvnUserList(1)">用户管理</p> <p onclick="csvnUserList(1);">用户管理</p>
<p onclick="csvnProjectList(1);">项目管理</p>
</div> </div>
<div class="bt-w-con pd15"> <div class="bt-w-con pd15">
<div class="soft-man-con"></div> <div class="soft-man-con"></div>

@ -150,6 +150,10 @@ def initdUinstall():
return 'ok' return 'ok'
def getAllUserList():
pass
def userList(): def userList():
import math import math
args = getArgs() args = getArgs()
@ -176,15 +180,21 @@ def userList():
tmp = auth_list[x].split(':') tmp = auth_list[x].split(':')
ulist.append(tmp[0]) ulist.append(tmp[0])
data['list'] = public.getPage({'count': auth_list_sum, 'p': page}) page_info = {'count': auth_list_sum, 'p': page,
'row': 10, 'tojs': 'csvnUserList'}
data['list'] = public.getPage(page_info)
data['page'] = page data['page'] = page
data['page_size'] = page_size data['page_size'] = page_size
data['page_count'] = int(math.ceil(auth_list_sum / page_size)) data['page_count'] = int(math.ceil(auth_list_sum / page_size))
start = (page - 1) * page_size start = (page - 1) * page_size
data['data'] = ulist[start:page_size] data['data'] = ulist[start:start + page_size]
return public.getJson(data) return public.getJson(data)
def projectList():
return []
if __name__ == "__main__": if __name__ == "__main__":
func = sys.argv[1] func = sys.argv[1]
if func == 'status': if func == 'status':
@ -211,5 +221,7 @@ if __name__ == "__main__":
print saveConf() print saveConf()
elif func == 'user_list': elif func == 'user_list':
print userList() print userList()
elif func == 'project_list':
print projectList()
else: else:
print 'fail' print 'fail'

@ -20,7 +20,7 @@ function csvnUserList(page) {
content = '<div class="finduser"><input class="bt-input-text mr5" type="text" placeholder="查找用户名" id="disable_function_val" style="height: 28px; border-radius: 3px;width: 410px;">'; content = '<div class="finduser"><input class="bt-input-text mr5" type="text" placeholder="查找用户名" id="disable_function_val" style="height: 28px; border-radius: 3px;width: 410px;">';
content += '<button class="btn btn-success btn-sm">查找</button></div>'; content += '<button class="btn btn-success btn-sm">查找</button></div>';
content += '<div class="divtable" style="margin-top:0px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">'; content += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
content += '<thead><tr>'; content += '<thead><tr>';
content += '<th>用户名</th>'; content += '<th>用户名</th>';
content += '<th>操作</th>'; content += '<th>操作</th>';
@ -32,7 +32,7 @@ function csvnUserList(page) {
for (i in ulist){ for (i in ulist){
content += '<tr><td>'+ulist[i]+'</td><td>'+ content += '<tr><td>'+ulist[i]+'</td><td>'+
'<a class="btlink" onclick="csvnDelUser(\''+ulist[i]+'\')">删除</a>|' + '<a class="btlink" onclick="csvnDelUser(\''+ulist[i]+'\')">删除</a>|' +
'<a class="btlink" onclick="csvnDelUser(\''+ulist[i]+'\')">改密</a></td></tr>'; '<a class="btlink" onclick="csvnModPwdUser(\''+ulist[i]+'\')">改密</a></td></tr>';
} }
content += '</tbody>'; content += '</tbody>';
@ -45,7 +45,61 @@ function csvnUserList(page) {
content += page; content += page;
$(".soft-man-con").html(content); $(".soft-man-con").html(content);
},'json');
}
function csvnDelUser(name){
console.log(name);
}
function csvnModPwdUser(name){
console.log(name);
}
function csvnProjectList(page){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
_data = {};
_data['page'] = page;
_data['page_size'] = 10;
$.post('/plugins/run', {name:'csvn', func:'project_list', args:JSON.stringify(_data)}, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
var rdata = $.parseJSON(data.data);
// console.log(rdata);
content = '<div class="finduser"><input class="bt-input-text mr5" type="text" placeholder="查找项目" id="disable_function_val" style="height: 28px; border-radius: 3px;width: 410px;">';
content += '<button class="btn btn-success btn-sm">查找</button></div>';
content += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
content += '<thead><tr>';
content += '<th>项目名</th>';
content += '<th>操作</th>';
content += '</tr></thead>';
content += '<tbody>';
ulist = rdata.data;
for (i in ulist){
content += '<tr><td>'+ulist[i]+'</td><td>'+
'<a class="btlink" onclick="csvnDelUser(\''+ulist[i]+'\')">删除</a>|' +
'<a class="btlink" onclick="csvnModUser(\''+ulist[i]+'\')">改密</a></td></tr>';
}
content += '</tbody>';
content += '</table></div>';
page = '<div class="dataTables_paginate paging_bootstrap pagination" style="margin-top:0px;"><ul id="softPage" class="page"><div>';
page += rdata.list;
page += '</div></ul></div>';
content += page;
$(".soft-man-con").html(content);
},'json'); },'json');
} }

@ -1,6 +1,14 @@
<script type="text/javascript"> <script type="text/javascript">
if ($(".term-box #term").text() != 'W') { $.getScript( "/plugins/file?name=webssh&f=js/webssh.js", function() {
if ($(".term-box #term").text() != 'W') {
layer.closeAll(); layer.closeAll();
web_shell(); web_shell();
} }
});
</script>
<script type="text/javascript">
// if ($(".term-box #term").text() != 'W') {
// layer.closeAll();
// web_shell();
// }
</script> </script>

@ -6,10 +6,10 @@
"type":"扩展", "type":"扩展",
"ps":"完整功能的SSH客户端,仅用于连接本服务器", "ps":"完整功能的SSH客户端,仅用于连接本服务器",
"versions":"1.0", "versions":"1.0",
"shell":"webssh.sh", "shell":"install.sh",
"checks":"/www/server/panel/plugin/webssh", "checks":"server/webssh",
"author":"宝塔", "author":"midoks",
"home":"http://www.bt.cn/bbs", "home":"",
"date":"2018-10-20", "date":"2018-12-20",
"pid":"4" "pid":"4"
} }

@ -1,31 +1,32 @@
#!/bin/bash #!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH export PATH
install_tmp='/tmp/bt_install.pl'
public_file=/www/server/panel/install/public.sh
if [ ! -f $public_file ];then
wget -O $public_file http://download.bt.cn/install/public.sh -T 5;
fi
. $public_file
download_Url=$NODE_URL
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/bt_install.pl
Install_webssh() Install_webssh()
{ {
mkdir -p /www/server/panel/plugin/webssh
echo '正在安装脚本文件...' > $install_tmp echo '正在安装脚本文件...' > $install_tmp
wget -O /www/server/panel/plugin/webssh/index.html $download_Url/install/plugin/webssh/index.html -T 5 mkdir -p $serverPath/webssh
wget -O /www/server/panel/plugin/webssh/info.json $download_Url/install/plugin/webssh/info.json -T 5 echo '1.0' > $serverPath/webssh/version.pl
wget -O /www/server/panel/plugin/webssh/icon.png $download_Url/install/plugin/webssh/icon.png -T 5
echo '安装完成' > $install_tmp echo '安装完成' > $install_tmp
} }
Uninstall_webssh() Uninstall_webssh()
{ {
rm -rf /www/server/panel/plugin/webssh rm -rf $serverPath/webssh
echo "卸载完成" > $install_tmp
} }
action=$1 action=$1
if [ "${1}" == 'install' ];then if [ "${1}" == 'install' ];then
Install_webssh Install_webssh

@ -0,0 +1,196 @@
function web_shell() {
var termCols = 100;
var termRows = 29;
var sendTotal = 0;
if(!socket)socket = io.connect();
var term = new Terminal({ cols: termCols, rows: termRows, screenKeys: true, useStyle: true});
term.open();
gterm = term
term.setOption('cursorBlink', true);
socket.on('server_response', function (data) {
term.write(data.data);
if (data.data == '\r\n登出\r\n' || data.data == '登出\r\n' || data.data == '\r\nlogout\r\n' || data.data == 'logout\r\n') {
setTimeout(function () {
layer.closeAll();
}, 500);
}
});
if (socket) {
socket.emit('connect_event', '');
interval = setInterval(function () {
socket.emit('connect_event', '');
}, 1000);
}
term.on('data', function (data) {
socket.emit('webssh', data);
});
var term_box = layer.open({
type: 1,
title: "宝塔终端",
area: ['920px','640px'],
closeBtn: 2,
shadeClose: false,
content: '<div class="term-box"><div id="term"></div></div>\
<div class="shell-text-input">\
<textarea type="text" class="bt-input-text-shell" placeholder="请将命令粘贴到此处.." value="" name="ssh_copy" />\
<div class="shell-btn-group">\
<button class="shellbutton btn btn-success btn-sm pull-right shell_btn_1">发送(Ctrl+Enter)</button>\
<button class="shellbutton btn btn-default btn-sm pull-right shell_btn_close">关闭</button>\
</div>\
</div>',
cancel: function () {
term.destroy();
clearInterval(interval)
}
});
$(".shell_btn_close").click(function(){
layer.close(term_box);
term.destroy();
clearInterval(interval)
})
setTimeout(function () {
$('.terminal').detach().appendTo('#term');
$("#term").show();
socket.emit('webssh', "\n");
term.focus();
// 鼠标右键事件
var can = $("#term");
can.contextmenu(function (e) {
var winWidth = can.width();
var winHeight = can.height();
var mouseX = e.pageX;
var mouseY = e.pageY;
var menuWidth = $(".contextmenu").width();
var menuHeight = $(".contextmenu").height();
var minEdgeMargin = 10;
if (mouseX + menuWidth + minEdgeMargin >= winWidth &&
mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
else if (mouseX + menuWidth + minEdgeMargin >= winWidth) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
}
else if (mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
else {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
};
var selectText = term.getSelection()
var style_str = '';
var paste_str = '';
if (!selectText) {
if (!getCookie('shell_copy_body')) {
paste_str = 'style="color: #bbb;" disable';
}
style_str = 'style="color: #bbb;" disable';
} else {
setCookie('ssh_selection', selectText);
}
var menudiv = '<ul class="contextmenu">\
<li>\
<a class="shell_copy_btn menu_ssh" data-clipboard-text="'+ selectText + '" ' + style_str + '>复制到剪切板</a>\
</li>\
<li>\
<a onclick="shell_paste_text()" '+ paste_str+'>粘贴选中项</a>\
</li>\
<li>\
<a onclick="shell_translate_text()" ' + style_str + '>翻译</a>\
</li>\
<li>\
<a onclick="shell_to_baidu()" ' + style_str + '>百度搜索</a>\
</li>\
</ul>';
$("body").append(menudiv);
$(".contextmenu").css({
"left": menuLeft,
"top": menuTop
});
return false;
});
can.click(function () {
remove_ssh_menu();
});
clipboard = new ClipboardJS('.shell_copy_btn');
clipboard.on('success', function (e) {
layer.msg('复制成功!');
setCookie('shell_copy_body', e.text)
remove_ssh_menu();
term.focus();
});
clipboard.on('error', function (e) {
layer.msg('复制失败,浏览器不兼容!');
setCookie('shell_copy_body', e.text)
remove_ssh_menu();
term.focus();
});
$(".shellbutton").click(function () {
var tobj = $("textarea[name='ssh_copy']");
var ptext = tobj.val();
tobj.val('');
if ($(this).text().indexOf('Alt') != -1) {
ptext +="\n";
}
socket.emit('webssh', ptext);
term.focus();
})
$("textarea[name='ssh_copy']").keydown(function (e) {
if (e.ctrlKey && e.keyCode == 13) {
$(".shell_btn_1").click();
} else if (e.altKey && e.keyCode == 13) {
$(".shell_btn_1").click();
}
});
}, 100)
}
function shell_translate_text() {
remove_ssh_menu();
var selectText = getCookie('ssh_selection');
var loadT = layer.msg('正在翻译...', { icon: 16, time: 1000 * 60, });
$.get('https://www.bt.cn/api/index/fanyi', { query: selectText }, function (rdata) {
layer.close(loadT);
layer.msg("原文: " + rdata.src + '<br>译文: ' + rdata.dst, { time: 1000 * 10, shadeClose: true, shade: 0.01 });
}, 'JSONP');
gterm.focus();
}
function shell_to_baidu() {
var selectText = getCookie('ssh_selection');
remove_ssh_menu();
window.open('https://www.baidu.com/s?wd=' + selectText)
gterm.focus();
}
function shell_paste_text(){
socket.emit('webssh', getCookie('ssh_selection'));
remove_ssh_menu();
gterm.focus();
}
function remove_ssh_menu() {
$(".contextmenu").remove();
}

@ -26,6 +26,7 @@ mv /tmp/mdserver-web-master /www/server/mdserver-web
yum groupinstall -y "Development Tools" yum groupinstall -y "Development Tools"
yum -y libevent libevent-devel pcre-devel zlib-devel openssl openssl-devel yum -y libevent libevent-devel pcre-devel zlib-devel openssl openssl-devel
yum -y libxml2 libxml2-devel
yum -y install epel-release python-pip python-devel yum -y install epel-release python-pip python-devel
pip install --upgrade pip pip install --upgrade pip

@ -30,9 +30,9 @@
<a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">系统安全</span> <a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">系统安全</span>
</div> </div>
<div class="search pull-right"> <div class="search pull-right">
<form target="hid" onsubmit='getLogs(1,$$("#SearchValue").prop("value"))'> <form target="hid" onsubmit='getLogs(1,$("#SearchValue").prop("value"))'>
<input type="text" id="SearchValue" class="ser-text pull-left" placeholder="搜索日志" /> <input type="text" id="SearchValue" class="ser-text pull-left" placeholder="搜索日志" />
<button type="button" class="ser-sub pull-left" onclick='getLogs(1,$$("#SearchValue").prop("value"))'></button> <button type="button" class="ser-sub pull-left" onclick='getLogs(1,$("#SearchValue").prop("value"))'></button>
</form> </form>
<iframe name='hid' id="hid" style="display:none"></iframe> <iframe name='hid' id="hid" style="display:none"></iframe>
</div> </div>
@ -127,5 +127,5 @@
</div> </div>
</div> </div>
</div> </div>
<script src="/static/js/firewall.js?v={{config.version}}"></script> <script src="/static/app/firewall.js?v={{config.version}}"></script>
{% endblock %} {% endblock %}
Loading…
Cancel
Save