function dPostOrgin(args, callback) { $.post('/plugins/run', args, function(data) { callback(data); }, 'json'); } function dPost(method, version, args, callback) { var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'docker'; req_data['func'] = method; req_data['version'] = version; if (typeof(args) == 'string') { req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); } dPostOrgin(req_data, function(data) { layer.close(loadT); if (!data.status) { //错误展示10S layer.msg(data.msg, { icon: 0, time: 2000, shade: [10, '#000'] }); return; } if (typeof(callback) == 'function') { callback(data); } }); } function dPostCallbak(method, version, args, callback) { var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'docker'; req_data['func'] = method; args['version'] = version; 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'); } function logsCon(id) { dPost('docker_con_log', '', { Hostname: id }, function(rdata) { var rdata = $.parseJSON(rdata.data); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2 }); return; }; layer.open({ type: 1, title: 'Docker日志', area: '600px', closeBtn: 2, content: '
' + '
' + (rdata.msg == '' ? 'No logs' : rdata.msg) + '
' + '
', success: function(index, layers) { $(".crontab-log").scrollTop(1000000); } }); }); } function deleteCon(Hostname) { // 删除容器 safeMessage('删除容器 ', '删除容器 [' + Hostname + '], 确定?', function() { dPost('docker_remove_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { dockerConListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); } function startCon(Hostname) { dPost('docker_run_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { dockerConListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); } function stopCon(Hostname) { dPost('docker_stop_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { dockerConListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); } function execCon(Hostname) { webShell(); var pdata_socket = {}; var shell = setInterval(function() { if ($('.term-box').length == 0) { pdata_socket['data'] = 'exit\n'; socket.emit('webssh', pdata_socket); setTimeout(function() { socket.emit('webssh', pdata_socket['data']); }, 1000); clearInterval(shell); } }, 500); setTimeout(function() { dPost('docker_exec', '', { Hostname: Hostname }, function(res) { var res = $.parseJSON(res.data); if (!res.status) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); } else { pdata_socket['data'] = 'clear && ' + res.msg + '\n' socket.emit('webssh', pdata_socket); setTimeout(function() { socket.emit('webssh', pdata_socket['data']); }, 1000); } }); }); } function dockerConListRender() { dPost('con_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2, time: 2000 }); return; } var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var docker_status = 'stop'; var status = ''; if (rlist[i]['State']['Status'] == 'running') { docker_status = 'start'; status = ''; } var op = ''; op += '终端 | '; op += '日志 | '; op += '删除'; list += ''; list += '' + rlist[i]['Name'].substring(1) + ''; list += '' + rlist[i]['Config']['Image'] + ''; list += '' + getFormatTime(rlist[i]['Created']) + ''; if (docker_status == 'start') { list += '' + status + ''; } else { list += '' + status + ''; } list += '' + op + ''; list += ''; } $('#con_list tbody').html(list); }); } function createConTemplate() { dPost('get_docker_create_info', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); // console.log(rdata); var rdata = rdata.data; var imageOpt = ''; for (var i = 0; i < rdata.images.length; i++) { var imageName = rdata.images[i].RepoTags.indexOf('panel') == -1 ? rdata.images[i].RepoTags : 'aaPanel:' + rdata.images[i].RepoTags.split(':')[1]; imageOpt += ''; } var iplistOpt = ''; for (var i = 0; i < rdata.iplist.length; i++) { iplistOpt += ''; } var layer_index = layer.open({ type: 1, title: "创建容器", area: '556', closeBtn: 2, shadeClose: false, btn: ['确定', '取消'], content: '
\
\ 镜像\
\
\
\ 绑定IP\
\
\
\ 端口映射\
\
\ \ \ \ \
\
\ \ \
当前未添加端口映射
\
\
\
\
\ 目录映射\
\
\ \ \ \ \
\
\ \ \
当前未添加目录映射
\
\
\
\
\ 环境变量
(每行一个)
\
\
\ \
\
\
\
\ 内存配额\
\ MB不超过, ' + rdata.memSize + 'MB
\
\
\ CPU配额\
\ \ 越大,占用的CPU越多
\
\
\ 执行命令\
\
\ \
', success: function() { $(".plus").click(function() { var name1 = $(".type-port input[name='name1']").val(); var name2 = $(".type-port input[name='name2']").val(); if (name1 < 1 || name1 > 65535 || name2 < 1 || name2 > 65535 || isNaN(name1) || isNaN(name2)) { layer.msg('端口设置值范围无效,范围 [1-65535]', { icon: 2 }); return; } var portval = $('#portabletr')[0].childNodes; for (var i = 0; i < portval.length; i++) { if (portval[i].childNodes[0].innerText == '当前未添加端口映射') continue; var sport = portval[i].childNodes[2].innerText; if (name2 == sport) { layer.msg('端口 [' + name2 + '] 已在映射列表中!', { icon: 2 }); return; } } var address = $('.docker-address').val(); if (address == '0.0.0.0') { address = '*'; } var port = address + ':' + name2; var loadT = layer.msg('正在检测中... ', { icon: 16, time: 0, shade: [0.3, "#000"] }); dPost('docker_port_check', '',{port:port}, function(rdata){ layer.close(loadT); var rdata = $.parseJSON(rdata.data); if (rdata.status){ layer.msg('端口 [' + name2 + ']已在映射列表中!', { icon: 2 }); return; } var selecttype = $(".type-port select").val(); var portable = '\ ' + name1 + '\ ' + selecttype + '\ ' + name2 + '\ 删除\ '; $("#portabletr").append(portable); $(".more1").remove(); $(".minus").click(function() { $(this).parents("tr").remove(); }); }); }); $(".plus2").click(function() { var path1 = $(".type-volumes input[name='path1']").val(); var path2 = $(".type-volumes input[name='path2']").val(); var notPath = ['/boot', '/bin', '/sbin', '/etc', '/usr/bin', '/usr/sbin', '/dev'] if ($.inArray(path2, notPath) != -1) { layer.msg('Cannot map' + path2, { icon: 2 }); return; } var portval = $('#portabletr2')[0].childNodes; for (var i = 0; i < portval.length; i++) { if (portval[i].childNodes[0].innerText == '当前未添加端口映射') continue; var sport = portval[i].childNodes[2].innerText; if (path2 == sport) { layer.msg('目录 [' + path2 + '] 已在映射列表中!', { icon: 2 }); return; } } var selecttype = $(".type-volumes select").val(); var portable = '\ ' + path1 + '\ ' + selecttype + '' + path2 + '\ 删除\ '; $("#portabletr2").append(portable); $(".more2").remove(); $(".minus2").click(function() { $(this).parents("tr").remove(); }); }); }, yes: function(layero, layer_id) { var ports = {}; var volumes = {}; var portval = $('#portabletr')[0].childNodes; var address = $('.docker-address').val(); var portval2 = $('#portabletr2')[0].childNodes; var command = $('.docker-command').val() var entrypoint = $('.docker-entrypoint').val() var accept = []; //遍历端口映射 for (var i = 0; i < portval.length; i++) { if (portval[i].childNodes[0].innerText == '当前未添加端口映射') { continue; } // console.log(i,portval[i].children[0].innerText); // console.log(i,portval[i].childNodes[0].innerText); var port = portval[i].children[0].innerText.replace(/\s/g, ''); var dport = port + '/' + portval[i].children[1].innerText.toLowerCase().replace(/\s/g, ''); var sport = [address, parseInt(portval[i].children[2].innerText.replace(/\s/g, ''))]; ports[dport] = sport accept.push(port); } //遍历目录映射 volumes['/sys/fs/cgroup'] = { 'bind': '/sys/fs/cgroup', 'mode': 'rw' }; for (var i = 0; i < portval2.length; i++) { if (portval2[i].childNodes[0].innerText.replace(/\s/g, ' ') == '当前未添加目录映射') { continue; } var dpath = portval2[i].childNodes[2].innerText.replace(/\s/g, ''); var spath = { 'bind': portval2[i].childNodes[0].innerText.replace(/\s/g, ''), 'mode': portval2[i].childNodes[1].innerText.toLowerCase().replace(/\s/g, '') }; volumes[dpath] = spath; } var data = { image: $('.docker-image').val(), ports: JSON.stringify(ports), accept: JSON.stringify(accept), volumes: JSON.stringify(volumes), environments: $('.docker-environments').val(), mem_limit: $('.docker-mem').val(), cpu_shares: $('.docker-cpu').val(), command: command, entrypoint: entrypoint } if (data.mem_limit > rdata.memSize) { layer.msg('内存配额不能大于物理内存 [' + rdata.memSize + ']!', { icon: 2 }); return; } if (data.cpu_shares > 100 || data.cpu_shares < 1) { layer.msg('CPU配额设置值范围应为 [1-100]!', { icon: 2 }); return; } // console.log(data); dPost('docker_create_con','', data, function(rdata){ var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg,function(){ if(rdata.status) { layer.close(layer_index); dockerConListRender(); } },{ icon: rdata.status ? 1 : 2 }); }); } }); }); } function dockerConList() { var con = '
\ \
\
\ \ \ \ \ \ \ \
名称镜像创建时间状态操作
\
\
\
'; $(".soft-man-con").html(con); dockerConListRender(); } function deleteImages(tag, id) { safeMessage('删除镜像', '删除镜像[' + tag + '],确定?', function() { dPost('docker_remove_image', '', { imageId: id, repoTags: tag }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { dockerImageListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); } function pullImages(tag, id) { console.log(tag, id); layer.msg('开发中!', { icon: 2 }); } function dockerImageListRender() { dPost('image_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); // console.log(rdata); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2, time: 2000 }); return; } var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var tag = rlist[i]['RepoTags'].split(":")[1]; var license = 'null'; var desc = 'null'; if (rlist[i]['Labels'] == null) { license = 'free'; } var op = ''; op += '拉取 | '; op += '删除'; list += ''; list += '' + rlist[i]['RepoTags'] + ''; list += '' + tag + ''; list += '' + toSize(rlist[i]['Size']) + ''; list += '' + license + ''; list += '' + desc + ''; list += '' + op + ''; list += ''; } $('#con_list tbody').html(list); }); } function dockerPullImagesFileTemplate() { // 拉取镜像文件模板 var layer_index = layer.open({ type: 1, title: "获取镜像", area: '500px', closeBtn: 2, shadeClose: false, content: '
' + '
' + '官方库' + '公共库' + '私有库' + '
' + '
' + '
' + '镜像名:\
\ \ \
' + '
' + '' + '\
\
', success: function(layero, layer_id) { $('.docker-sub span').click(function() { var index = $(this).index(); $(this).addClass('on').siblings().removeClass('on'); $(this).parent().next().find('.conter').eq(index).show().siblings().hide(); }); $('.official_pull_btn').click(function() { var name = $('[name="official_pull_name"]').val(); if (name == '') { layer.msg('镜像名不能为空!'); return; } dPost('docker_pull', '', { images: name }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { layer.close(layer_index); dockerImageListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); $('.public_pull_btn').click(function() { var path = $('[name="public_pull_path"]').val(); if (path == '') { layer.msg('公共网络镜像地址不能为空。'); return; } dPost('docker_pull_reg', '', { path: path }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { layer.close(layer_index); dockerImageListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); $('.private_pull_btn').click(function() { var path = $('[name="private_pull_path"]').val(); if (path == '') { layer.msg('专用镜像地址不能为空!'); return } dPost('docker_pull_private_new', '', { path: path }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { layer.close(layer_index); dockerImageListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); } }); } function dockerImageList() { var con = '
\ \
\
\ \ \ \ \ \ \ \ \
名称版本大小证书描述操作
\
\
\
\
'; $(".soft-man-con").html(con); dockerImageListRender(); } //获取文件数据 function dockerGetFileBytes(fileName) { window.open('/files/download?filename=' + encodeURIComponent(fileName)); } //删除文件 function dockerDeleteFile(fileName) { layer.confirm(lan.get('recycle_bin_confirm', [fileName]), { title: '删除文件', closeBtn: 2, icon: 3 }, function() { layer.msg('正在处理,请稍候...', { icon: 16, time: 0, shade: [0.3, '#000'] }); $.post('/files/delete', 'path=' + encodeURIComponent(fileName), function(rdata) { showMsg(rdata.msg, function() { dockerImageOutputRender(); }, { icon: rdata.status ? 1 : 2 }); }, 'json'); }); } function dockerLoadFile(fileName) { dPost('image_pick_load', '', { file: fileName }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { dockerImageOutputRender(); }, { icon: rdata.status ? 1 : 2 }); }); } function dockerImageOutputRender() { dPost('image_pick_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2, time: 10000 }); return; } var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var op = ''; op += '下载 | '; op += '导入 | '; op += '删除'; list += ''; list += '' + rlist[i]['name'] + ''; list += '' + rlist[i]['size'] + ''; list += '' + rlist[i]['time'] + ''; list += '' + op + ''; list += ''; } $('#con_list tbody').html(list); }); } //上传文件 function uploadImageFiles(upload_dir) { var image_layer = layer.open({ type: 1, closeBtn: 1, title: "上传导入文件[" + upload_dir + ']', area: ['500px', '300px'], shadeClose: false, content: '
\ \ \ \ \ \ \ 文件编码:\ \ \ \ \
', success: function() { $('#filesClose').click(function() { layer.close(image_layer); }); } }); uploadStart(function() { showMsg('上传成功!', function() { dockerImageOutputRender(); layer.close(image_layer); }, { icon: 1, time: 2000 }); }); } function dockerImagePick() { dPost('image_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); var imageList = rdata.data; // console.log(imageList); var _tbody = ''; for (var i = 0; i < imageList.length; i++) { if (imageList[i] == null) { _tbody = '当前无镜像'; continue; } var versionData = imageList[i].RepoTags, version, reg = new RegExp('((?<=:)[0-9A-z/.-]*)$'); version = versionData.match(reg); _tbody += "\ " + imageList[i].RepoTags + "\ " + version[0] + "\ " + toSize(imageList[i].Size) + ""; } var layerS = layer.open({ type: 1, title: "选择镜像", area: '500px', closeBtn: 2, btn: ['打包', '取消'], shadeClose: false, content: '
\ \ \ \ \ \ \ \ ' + _tbody + '\
名称版本大小
\
', success: function() { readerTableChecked(); tableFixed('images_table'); }, yes: function(layers, index) { var data = '', tit = '\xa0', choose_num = $(".images_pull tbody [name=images]:checked").length; for (var i = 0; i < choose_num; i++) { if (choose_num == 0) { layer.msg('Please choose the images which need to pack', { icon: 2 }); return false; } data += $(".images_pull tbody [name=images]:checked").eq(i).attr('data-name'); if (i != (choose_num - 1)) data += ' '; } dPost('image_pick_save', '', { images: data }, function(rdata) { var rdata = $.parseJSON(rdata['data']); showMsg(rdata.msg, function() { dockerImageOutputRender(); layer.close(layerS); }, { icon: rdata.status ? 1 : 2, time: 2000 }); }); } }); }); } function dockerImageOutput() { var con = '
\ \ \
\
\ \ \ \ \ \ \
名称大小时间操作
\
\
\
\
'; $(".soft-man-con").html(con); $('#btn_image_upload').click(function() { dPostOrgin({ name: 'docker', func: 'image_pick_dir', version: '', }, function(rdata) { var rdata = $.parseJSON(rdata['data']); var upload_dir = rdata['data']; uploadImageFiles(upload_dir); }); }); dockerImageOutputRender(); } function deleteIpList(address) { safeMessage('删除IP', '你将删除从IP地址池[' + address + '],确定?', function() { dPost('docker_del_ip', '', { address: address }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { if (rdata.status) { dockerIpListRender(); } }, { icon: rdata.status ? 1 : 2 }); }); }); } function dockerIpListRender() { dPost('docker_get_iplist', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); // console.log(rdata); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2, time: 2000 }); return; } var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var op = ''; op += '删除'; list += ''; list += '' + rlist[i]['address'] + ''; list += '' + rlist[i]['netmask'] + ''; list += '' + rlist[i]['gateway'] + ''; list += '' + op + ''; list += ''; } $('#ip_list tbody').html(list); }); } function dockerAddIpPool() { var address = $('input[name="address"]').val(); var netmask = $('input[name="netmask"]').val(); var gateway = $('input[name="gateway"]').val(); dPost('docker_add_ip', '', { address: address, netmask: netmask, gateway: gateway }, function(rdata) { var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg, function() { dockerIpListRender(); }, { icon: rdata.status ? 1 : 2 }) }); } function dockerIpList() { var con = '
\
\ \ \ \ \
\
\
\ \ \ \ \ \ \
IP地址子网掩码网关操作
\
\
\
\
'; $(".soft-man-con").html(con); dockerIpListRender(); } // login function repoLogin() { var _option1 = ""; var obj = { hub_name: "", namespace: "", name: "", registry: "", user_pass: "", user_name: "", arry: ['Docker Repository', 'Other Repository'] }; for (var i = 0; i < obj.arry.length; i++) { _option1 += ''; } var layer_index = layer.open({ type: 1, title: "登录到存储库", area: '450px', closeBtn: 2, shadeClose: false, content: '
' + '' + '
' + '
Repository Type
' + '
Name:
' + '
Username:
' + '
Password:
' + '
Repository Name:
' + '
Namespaces:
' + '' + '
' + '
' + '
', success: function() { $('[name="dtype"]').change(function(e) { var docker_type = $(this).val(); if (docker_type == 'Other Repository') { $('.docker_content .line').show(); } else { $('.docker_content .line').filter(":lt(3)").show().end().filter(":gt(4)").hide(); } }); $('.login_aliyun').click(function() { var user = $('[name="user"]').val(), passwd = $('[name="passwd"]').val(), registry = $('[name="registry"]').val(), name = $('[name="ctm_name"]').val(), hub_name = $('[name="hub_name"]').val(), namespace = $('[name="namespace"]').val(); var args = { user: user, passwd: passwd, registry: '', repository_name: name, hub_name: hub_name, namespace: namespace }; if ($('[name="dtype"]').val() == 'Docker Repository') { args.registry = ''; } else { args.registry = registry; } console.log(obj); dPost('docker_login', '', args, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); if (res.status) { repoListRender(); layer.close(layer_index); } }); }); } }); } function delRepo(address) { safeMessage('退出', '你将退出 [' + address + '],确定?', function() { dPost('docker_logout', '', { registry: address }, function(rdata) { var rdata = $.parseJSON(rdata.data); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); if (rdata.status) { repoListRender(); } } ); }); } function repoListRender() { dPost('repo_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); if (!rdata.status) { layer.msg(rdata.msg, { icon: 2, time: 2000 }); return; } var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { list += ''; list += '' + rlist[i]['hub_name'] + ''; list += '' + rlist[i]['repository_name'] + ''; list += '' + rlist[i]['namespace'] + ''; list += '' + rlist[i]['registry'] + ''; list += '删除'; list += ''; } $('#con_list tbody').html(list); }); } function repoList() { var con = '
\ \
\
\ \ \ \ \ \ \ \ \ ' + '
NameRepository NameNameSpace地址操作
\
\
\
\
'; $(".soft-man-con").html(con); //login $('#docker_login').click(function() { repoLogin(); }); repoListRender(); }