diff --git a/plugins/docker/index.py b/plugins/docker/index.py index 259f008ed..aed745b22 100755 --- a/plugins/docker/index.py +++ b/plugins/docker/index.py @@ -429,6 +429,92 @@ def dockerRemoveImage(): return mw.returnJson(False, '删除失败, 当前镜像正在使用!') +def getImageListFunc(dbname=''): + bkDir = mw.getRootDir() + '/backup/docker' + blist = os.listdir(bkDir) + r = [] + + bname = 'db_' + dbname + blen = len(bname) + for x in blist: + fbstr = x[0:blen] + if fbstr == bname: + r.append(x) + return r + + +def dockerImagePickDir(): + bkDir = mw.getRootDir() + '/backup/docker' + return mw.returnJson(True, 'ok', bkDir) + + +def dockerImagePickList(): + + bkDir = mw.getRootDir() + '/backup/docker' + if not os.path.exists(bkDir): + os.mkdir(bkDir) + + r = os.listdir(bkDir) + rr = [] + for x in range(0, len(r)): + p = bkDir + '/' + r[x] + data = {} + data['name'] = r[x] + + rsize = os.path.getsize(p) + data['size'] = mw.toSize(rsize) + + t = os.path.getctime(p) + t = time.localtime(t) + + data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t) + rr.append(data) + + data['file'] = p + + return mw.returnJson(True, 'ok', rr) + + +def dockerImagePickSave(): + # image 导出 + args = getArgs() + data = checkArgs(args, ['images']) + if not data[0]: + return data[1] + + bkDir = mw.getRootDir() + '/backup/docker/' + images = args['images'] + try: + file_name = bkDir + \ + str(time.strftime('%Y%m%d_%H%M%S', time.localtime())) + '.tar.gz' + mw.execShell('docker image save %s | gzip > %s' % + (images, file_name)) + return mw.returnJson(True, '导出镜像 {} 成功!'.format(file_name)) + except docker.errors.APIError as ex: + return mw.returnJson(False, '操作失败: ' + str(ex)) + + +def dockerImagePickLoad(): + # 镜像文件导入 + args = getArgs() + data = checkArgs(args, ['file']) + if not data[0]: + return data[1] + try: + file_path = args['file'] + if not os.path.exists(file_path): + return mw.returnJson(False, '文件不存在') + if file_path.endswith('.tar'): + mw.execShell('docker image load < %s' % file_path) + elif file_path.endswith('.tar.gz'): + mw.execShell('gunzip -c %s | docker image load' % file_path) + else: + return mw.returnJson(False, '不支持改文件类型!') + return mw.returnJson(True, '导入镜像文件成功!') + except docker.errors.APIError as ex: + return mw.returnJson(False, '操作失败: ' + str(ex)) + + def dockerLoginCheck(user_name, user_pass, registry): # 登陆验证 cmd = 'docker login -u=%s -p %s %s' % (user_name, user_pass, registry) @@ -703,6 +789,14 @@ if __name__ == "__main__": print(dockerPullReg()) elif func == 'image_list': print(imageListData()) + elif func == 'image_pick_dir': + print(dockerImagePickDir()) + elif func == 'image_pick_save': + print(dockerImagePickSave()) + elif func == 'image_pick_load': + print(dockerImagePickLoad()) + elif func == 'image_pick_list': + print(dockerImagePickList()) elif func == 'docker_get_iplist': print(getDockerIpList()) elif func == 'docker_del_ip': diff --git a/plugins/docker/info.json b/plugins/docker/info.json index 26949af08..cfc02fb21 100755 --- a/plugins/docker/info.json +++ b/plugins/docker/info.json @@ -1,6 +1,6 @@ { "sort": 7, - "ps": "Docker 是一个开源的应用容器引擎(开发测试中)", + "ps": "Docker是一个开源的应用容器引擎", "name": "docker", "title": "Docker", "shell": "install.sh", diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 1497c8b79..f764e525c 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -1,3 +1,10 @@ + +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 }); @@ -12,7 +19,7 @@ function dPost(method, version, args,callback){ req_data['args'] = JSON.stringify(args); } - $.post('/plugins/run', req_data, function(data) { + dPostOrgin(req_data, function(data){ layer.close(loadT); if (!data.status){ //错误展示10S @@ -23,7 +30,7 @@ function dPost(method, version, args,callback){ if(typeof(callback) == 'function'){ callback(data); } - },'json'); + }); } function dPostCallbak(method, version, args,callback){ @@ -634,13 +641,37 @@ function dockerImageList(){ 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_list', '', {}, function(rdata){ + dPost('image_pick_list', '', {}, function(rdata){ var rdata = $.parseJSON(rdata.data); - // console.log(rdata); if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); + layer.msg(rdata.msg,{icon:2,time:10000}); return; } @@ -649,24 +680,15 @@ function dockerImageOutputRender(){ 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 += '删除'; + op += '下载 | '; + op += '导入 | '; + op += '删除'; list += ''; - list += ''+rlist[i]['RepoTags']+''; - list += ''+tag+''; - list += ''+toSize(rlist[i]['Size'])+''; - list += ''+license+''; - list += ''+desc+''; + list += ''+rlist[i]['name']+''; + list += ''+rlist[i]['size']+''; + list += ''+rlist[i]['time']+''; list += ''+op+''; list += ''; } @@ -675,10 +697,117 @@ function dockerImageOutputRender(){ }); } +//上传文件 +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 = '
\ - \ - \ + \ + \
\
\ \ @@ -695,6 +824,19 @@ function dockerImageOutput(){ $(".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(); }