@topdatasec/probe 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/style.css +1 -1
- package/lib/t-probe-ui.es.js +397 -391
- package/lib/t-probe-ui.umd.js +1 -1
- package/package.json +3 -1
package/lib/t-probe-ui.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(N,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("topdatasec-ui"),require("element-plus")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","topdatasec-ui","element-plus"],e):(N=typeof globalThis<"u"?globalThis:N||self,e(N.TProbeUI={},N.Vue,N.IconsVue,N.TopdatasecUI,N.ElementPlus))})(this,function(N,e,U,F,D){"use strict";const K={key:0,class:"absolute right--13px text-#f56c6c hover:cursor-pointer"},W=e.defineComponent({__name:"IpPortList",props:{modelValue:{default:()=>[{ip:"",port:""}]},modelModifiers:{}},emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),{$t:l}=window;function s(){o.value=[...o.value,{ip:"",port:""}]}function p(u){const n=[...o.value];n.splice(u,1),o.value=n}return(u,n)=>{const m=e.resolveComponent("el-input"),w=e.resolveComponent("el-form-item"),g=e.resolveComponent("el-icon"),a=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,(d,x)=>(e.openBlock(),e.createElementBlock("div",{key:x,class:"flex form-m0 w-100% mb-5px"},[e.createVNode(w,{class:"w-70%"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:d.ip,"onUpdate:modelValue":V=>d.ip=V,class:"min-w-300px w-100%",placeholder:"IP"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e.createVNode(w,{class:"ml-auto w-30%"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:d.port,"onUpdate:modelValue":V=>d.port=V,class:"ml-10",placeholder:e.unref(l)("global.port")},null,8,["modelValue","onUpdate:modelValue","placeholder"])]),_:2},1024),o.value.length>1?(e.openBlock(),e.createElementBlock("div",K,[e.createVNode(g,{onClick:V=>p(x)},{default:e.withCtx(()=>[e.createVNode(e.unref(U.CircleClose))]),_:1},8,["onClick"])])):e.createCommentVNode("",!0)]))),128)),e.createVNode(a,{class:"w-100% mt-10px border-dashed!",icon:"Plus",onClick:s})])}}}),Fe="",A=(t,o)=>{const l=t.__vccOpts||t;for(const[s,p]of o)l[s]=p;return l},E=A(W,[["__scopeId","data-v-16fc9c64"]]),B=5*1024*1024;function G(t,o){return new Promise((l,s)=>{const p=new(void 0),u=new FileReader,n=Math.ceil(t.size/B);let m=0;u.onload=g=>{var a;if(p.append((a=g.target)==null?void 0:a.result),m++,o){const d=Math.floor(m/n*100);o(d)}if(m<n)w();else{const d=p.end();l(d)}},u.onerror=()=>{s(new Error("MD5计算失败"))};function w(){const g=m*B,a=Math.min(g+B,t.size);u.readAsArrayBuffer(t.slice(g,a))}w()})}async function J(t,o,l,s,p,u="/api/upload/chunk"){const n=o*B,m=Math.min(n+B,t.size),w=t.slice(n,m),g=m-n,a=new FormData;a.append("file",w,t.name),a.append("chunkIndex",String(o+1)),a.append("totalChunkNum",String(l)),a.append("fileMd5",s),a.append("tds_token",p),a.append("fileName",t.name),a.append("fileSize",String(t.size)),a.append("fileExt",t.name.substring(t.name.lastIndexOf(".")+1)),a.append("chunkSize",String(B)),a.append("currentChunkSize",String(g));try{const d=await fetch(u,{method:"POST",body:a});if(console.log(d,"upload response"),!d.ok)throw new Error(`分片 ${o+1} 上传失败,HTTP状态码: ${d.status}`);const x=await d.json();if(console.log(x,"upload result"),x.recode!==0)throw new Error(`上传失败: ${x.remsg||"未知错误"}`);return!0}catch(d){throw console.error(`上传分片 ${o+1} 时出错:`,d),d}}async function Z(t,o="/api/upload/merge"){try{if(!(await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).ok)throw new Error("文件合并失败");return!0}catch(l){return console.error("合并分片时出错:",l),!1}}async function Q(t){const{token:o,file:l,fileDesc:s="",uploadUrl:p="/api/upload/chunk",mergeUrl:u="/api/upload/merge",onProgress:n,onSuccess:m,onError:w}=t;try{n==null||n({progress:0,statusText:"正在计算文件MD5...",status:"preparing"});const a=await G(l,f=>{n==null||n({progress:Math.floor(f*.1),statusText:`正在计算文件MD5... ${f}%`,status:"preparing"})});n==null||n({progress:10,statusText:"MD5计算完成",status:"preparing",fileMd5:a});const d=Math.ceil(l.size/B);n==null||n({progress:10,statusText:`开始上传 (共${d}个分片)`,status:"uploading",fileMd5:a});for(let f=0;f<d;f++){const q=Math.floor(f/d*80);n==null||n({progress:10+q,statusText:`正在上传分片 ${f+1}/${d}`,status:"uploading",fileMd5:a}),await J(l,f,d,a,o,p)}n==null||n({progress:90,statusText:"正在合并文件...",status:"merging",fileMd5:a});const x=l.name.substring(l.name.lastIndexOf(".")+1),V={fileDesc:s,fileExt:x,fileMd5:a,fileName:l.name,fileSize:String(l.size),tds_token:o,totalChunkNum:String(d)};if(!await Z(V,u))throw new Error("文件合并失败");n==null||n({progress:100,statusText:"上传成功",status:"success",fileMd5:a}),D.ElMessage.success(`${l.name} 上传成功`),m==null||m(a)}catch(g){n==null||n({progress:0,statusText:g.message||"上传失败",status:"error"}),D.ElMessage.error(`${l.name} 上传失败: ${g.message}`),w==null||w(g)}}function X(t){if(t===0)return"0 B";const o=1024,l=["B","KB","MB","GB","TB"],s=Math.floor(Math.log(t)/Math.log(o));return Math.round(t/Math.pow(o,s)*100)/100+" "+l[s]}const k={get deployURL(){return window.$probeURL||""}},I=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/deploy`,method:"post",data:t}),Y=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/add`,method:"post",data:t}),P=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/packages/get`,method:"post",data:t,isError:!1}),z=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/get`,method:"post",data:t,isError:!1}),v=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/del`,method:"post",data:t}),ee=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/packages/del`,method:"post",data:t}),te=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/get_arch`,method:"post",data:t,isError:!1}),oe=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/deployment_history/get`,method:"post",data:t,isError:!1}),le=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/test_ssh`,method:"post",data:t}),re=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/check_env`,method:"post",data:t}),ne=(t={})=>window.$http.request({url:`${k.deployURL}/service_deploy/deployment/servers/install_env`,method:"post",data:t}),ae={class:"h-100%"},se={key:0,class:"upload-progress-list"},de={class:"file-info"},ie={class:"file-name"},ce={class:"file-size"},pe={class:"progress-text"},ue={class:"table-box h-[calc(100%-220px)]",style:{height:"calc(100% -220px)"}},me={key:0},_e={class:"flex flex-wrap gap-12px p-12px"},fe={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)]"},ye={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},ge={key:1,class:"font-bold text-center text-gray-500 py-20"},he=e.defineComponent({__name:"index",props:{token:{type:String,default:""}},setup(t){const o=e.ref(),l=e.ref(),s=e.ref("快速部署"),p=e.ref({}),{$t:u,$messageBox:n}=window;function m(i){p.value={id:i.id},l.value.open()}const w=e.ref([{ip:"",port:""}]),g=e.ref([{ip:"",port:""}]),a=e.ref([{ip:"",port:""}]),d=e.ref([{ip:"",port:""}]);async function x(i){const h=(r,c)=>{const _=Math.max(r.length,c.length);return Array.from({length:_},(y,b)=>{var T,$,L,M;return{src_ip:((T=r[b])==null?void 0:T.ip)||"",src_port:Number(($=r[b])==null?void 0:$.port)||0,dst_ip:((L=c[b])==null?void 0:L.ip)||"",dst_port:Number((M=c[b])==null?void 0:M.port)||0}})},C={packages_id:[p.value.id],server_id:i.server_id,service_type:window.$prodType,deploy_params:{probe_name:i.probe_name||"",collection_mode:i.collection_mode,interface:i.interface||"",engine_ip:i.engine_ip||"",engine_port:i.engine_port||"",filterWhitelist:h(w.value,g.value),filterBlacklist:h(a.value,d.value)}};await I({data:C}),o.value.getTableList(),l.value.close()}async function V(i){n(i,"file_name",u("button.delete"),"error").then(async()=>{await ee({data:[i.id]}),o.value.getTableList()})}const S=e.reactive([{field:"server_id",name:"选择服务器",enum:z,fieldNames:{value:"id",label:"server_name"},show:{type:"select",prop:{multiple:!0},dataType:"any"},hide:!0,rules:[{required:!0}]},{field:"file_name",name:"文件名称"},{field:"version",name:"版本"},{field:"file_size",name:"大小"},{field:"upload_time",name:"上传时间"},{field:"deployment_server",name:"已部署服务器数",render:i=>{var h;return((h=i.row.deployment_server)==null?void 0:h.length)||0}},{field:"upload_status",name:"状态",tag:!0,enum:[{label:"上传失败",value:0,tagType:"danger"},{label:"上传中",value:1,tagType:"warning"},{label:"上传成功",value:2,tagType:"success"}]},{field:"probe_name",name:"探针名称",show:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"collection_mode",name:"采集模式",show:{type:"input",value:"DPDK",disabled:!0},hide:!0,rules:[{required:!0}]},{field:"interface",name:"采集网卡",show:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"engine_ip",name:"流量接收引擎IP",show:{type:"input"},hide:!0},{field:"engine_port",name:"流量接收引擎端口",show:{type:"input",dataType:"number"},hide:!0,rules:[{required:!0,type:"any"}]},{field:"whitelist",name:"探针过滤白名单",show:{type:"input",tooltip:"白名单配置后,仅采集白名单内相关流量,如不填写,则采集所有流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(E,{modelValue:w.value,"onUpdate:modelValue":i=>w.value=i},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(E,{modelValue:g.value,"onUpdate:modelValue":i=>g.value=i},null)])},hide:!0},{field:"blacklist",name:"探针过滤黑名单",show:{type:"input",tooltip:"黑名单配置后,将不再采集黑名单内相关流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(E,{modelValue:a.value,"onUpdate:modelValue":i=>a.value=i},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(E,{modelValue:d.value,"onUpdate:modelValue":i=>d.value=i},null)])},hide:!0},{field:"operation",name:window.$t("global.operate"),width:140,fixed:"right",render:i=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>m(i.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"deployed",tip:"部署"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"danger",icon:"Delete",title:u("button.delete"),onClick:()=>V([i.row])},null)])}]),f=e.ref([]);function q(i){const h=i.raw;if(!h)return;const C={fileName:h.name,fileSize:h.size,progress:0,progressStatus:"",statusText:"准备上传..."};f.value.push(C);const r=f.value.length-1;Q({file:h,fileDesc:"探针安装包",uploadUrl:k.deployURL+"/service_deploy/deployment/packages/upload",mergeUrl:k.deployURL+"/service_deploy/deployment/packages/upload_merge",onProgress:c=>{const _=f.value[r];_&&(_.progress=c.progress,_.statusText=c.statusText,c.fileMd5&&(_.fileMd5=c.fileMd5),c.status==="error"?_.progressStatus="exception":c.status==="success"?_.progressStatus="success":_.progressStatus="")},onSuccess:()=>{var _;const c=f.value[r];c&&(c.progress=100,c.progressStatus="success",c.statusText="上传成功"),(_=o.value)==null||_.getTableList(),setTimeout(()=>{const y=f.value.findIndex(b=>b.fileName===h.name);y!==-1&&f.value.splice(y,1)},3e3)},onError:c=>{console.error("文件上传失败:",c);const _=f.value[r];_&&(_.progressStatus="exception",_.statusText=c.message||"上传失败")}})}return(i,h)=>{const C=e.resolveComponent("el-icon"),r=e.resolveComponent("el-upload"),c=e.resolveComponent("el-progress"),_=e.resolveComponent("el-table-column");return e.openBlock(),e.createElementBlock("div",ae,[e.createVNode(r,{class:"upload-demo mt-10px",drag:"",action:"","auto-upload":!1,accept:".tar.gz,.tgz","on-change":q,"show-file-list":!1,multiple:""},{default:e.withCtx(()=>[e.createVNode(C,{class:"el-icon--upload"},{default:e.withCtx(()=>[e.createVNode(e.unref(U.UploadFilled))]),_:1}),h[0]||(h[0]=e.createElementVNode("div",{class:"el-upload__text"},[e.createTextVNode(" 点击或拖拽文件到此处上传 "),e.createElementVNode("br"),e.createElementVNode("em",null,"支持的格式: tar.gz, tgz")],-1))]),_:1}),f.value.length>0?(e.openBlock(),e.createElementBlock("div",se,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,y=>(e.openBlock(),e.createElementBlock("div",{key:y.fileName,class:"upload-progress-item"},[e.createElementVNode("div",de,[e.createElementVNode("span",ie,e.toDisplayString(y.fileName),1),e.createElementVNode("span",ce,e.toDisplayString(e.unref(X)(y.fileSize)),1)]),e.createVNode(c,{percentage:y.progress,status:y.progressStatus},null,8,["percentage","status"]),e.createElementVNode("div",pe,e.toDisplayString(y.statusText),1)]))),128))])):e.createCommentVNode("",!0),e.createElementVNode("div",ue,[e.createVNode(e.unref(F.TdsTable),{ref_key:"refTdsTable",ref:o,columns:S,"request-api":e.unref(P),options:i.$tableOptions()},{default:e.withCtx(()=>[e.createVNode(_,{type:"expand"},{default:e.withCtx(y=>[y.row.deployment_server&&y.row.deployment_server.length>0?(e.openBlock(),e.createElementBlock("div",me,[h[1]||(h[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的服务器",-1)),e.createElementVNode("div",_e,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.row.deployment_server,b=>(e.openBlock(),e.createElementBlock("div",{key:b.id,class:"w-30% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-md transition-shadow"},[e.createElementVNode("div",fe,e.toDisplayString(b.server_name),1),e.createElementVNode("div",ye,[e.createElementVNode("p",null,"IP: "+e.toDisplayString(b.ip_address),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString(b.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",ge,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"])]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:l},i.$formBindProps({title:s.value,form:p.value,columns:S}),{onSubmit:x}),null,16)])}}}),we={class:"table-box"},be={class:"flex items-center"},xe={key:0},ke={class:"flex flex-wrap gap-12px p-12px"},Ve={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)]"},Ne={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},Te={key:1,class:"font-bold text-center text-gray-500 py-20"},Ee=e.defineComponent({__name:"index",setup(t){const{$t:o,$messageBox:l}=window,s=e.ref(),p=e.ref(),u=e.ref(""),n=e.ref({}),m=e.ref("show");function w(){n.value={},m.value="show",u.value="添加服务器",p.value.open()}const g=r=>{l(r,"server_name",o("button.delete"),"error").then(async()=>{await v({data:r.map(c=>c.id)}),s.value.getTableList()})};function a(r){n.value={id:r.id},m.value="deploy",u.value="快速部署",p.value.open()}const d=e.ref([{ip:"",port:""}]),x=e.ref([{ip:"",port:""}]),V=e.ref([{ip:"",port:""}]),S=e.ref([{ip:"",port:""}]);async function f(r){if(m.value==="show"){await Y({data:r}),s.value.getTableList(),p.value.close();return}const c=(y,b)=>{const T=Math.max(y.length,b.length);return Array.from({length:T},($,L)=>{var M,O,j,H;return{src_ip:((M=y[L])==null?void 0:M.ip)||"",src_port:Number((O=y[L])==null?void 0:O.port)||0,dst_ip:((j=b[L])==null?void 0:j.ip)||"",dst_port:Number((H=b[L])==null?void 0:H.port)||0}})},_={packages_id:[r.packages_id],server_id:[n.value.id],service_type:window.$prodType,deploy_params:{probe_name:r.probe_name||"",collection_mode:r.collection_mode,interface:r.interface||"",engine_ip:r.engine_ip||"",engine_port:r.engine_port||"",filterWhitelist:c(d.value,x.value),filterBlacklist:c(V.value,S.value)}};await I({data:_}),s.value.getTableList(),p.value.close()}function q(r){le({data:[r.id]}),s.value.getTableList()}function i(r){re({data:[r.id]}),s.value.getTableList()}function h(r){ne({data:[r.id]}),s.value.getTableList()}const C=e.reactive([{field:"server_name",name:"服务器名称",show:{type:"input"},rules:[{required:!0}]},{field:"ip_address",name:"IP地址",show:{type:"input"},rules:[{required:!0}]},{field:"ssh_port",name:"端口",show:{type:"input",dataType:"number"},rules:[{required:!0,type:"any"}]},{field:"ssh_username",name:"SSH用户",show:{type:"input"},rules:[{required:!0}]},{field:"ssh_password",name:"SSH登录密码",hide:!0,show:{type:"input",prop:{type:"password",showPassword:!0}},rules:[{required:!0}]},{field:"arch",name:"架构",enum:te,show:{type:"select"},rules:[{required:!0}]},{field:"deployed_count",name:"已部署探针数量",render:r=>e.createVNode("span",null,[r.row.deployment_packages.length])},{field:"status",name:"状态",tag:!0,enum:[{label:"在线",value:1,tagType:"success"},{label:"不在线",value:0,tagType:"danger"}]},{field:"ssh_status",name:"连通性检查",tag:!0,enum:[{label:"成功",value:1,tagType:"success"},{label:"失败",value:0,tagType:"danger"}]},{field:"check_env_ok",name:"安装环境",tag:!0,enum:[{label:"具备",value:1,tagType:"success"},{label:"不具备",value:0,tagType:"danger"}]},{field:"packages_id",name:"安装包",enum:P,fieldNames:{value:"id",label:"file_name"},deploy:{type:"select"},hide:!0,rules:[{required:!0}]},{field:"probe_name",name:"探针名称",deploy:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"collection_mode",name:"采集模式",deploy:{type:"input",value:"DPDK",disabled:!0},hide:!0,rules:[{required:!0}]},{field:"interface",name:"采集网卡",deploy:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"engine_ip",name:"流量接收引擎IP",deploy:{type:"input"},rules:[{required:!0,type:"any"}],hide:!0},{field:"engine_port",name:"流量接收引擎端口",deploy:{type:"input",dataType:"number"},hide:!0,rules:[{required:!0,type:"any"}]},{field:"whitelist",name:"探针过滤白名单",deploy:{type:"input",tooltip:"白名单配置后,仅采集白名单内相关流量,如不填写,则采集所有流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(E,{modelValue:d.value,"onUpdate:modelValue":r=>d.value=r},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(E,{modelValue:x.value,"onUpdate:modelValue":r=>x.value=r},null)])},hide:!0},{field:"blacklist",name:"探针过滤黑名单",deploy:{type:"input",tooltip:"黑名单配置后,将不再采集黑名单内相关流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(E,{modelValue:V.value,"onUpdate:modelValue":r=>V.value=r},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(E,{modelValue:S.value,"onUpdate:modelValue":r=>S.value=r},null)])},hide:!0},{field:"operation",name:window.$t("global.operate"),width:180,fixed:"right",render:r=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",icon:"Connection",title:"连通性检查",class:"custom-btn",onClick:()=>q(r.row)},null),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>i(r.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"install_env",tip:"测试安装环境"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>h(r.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"docker",tip:"自动安装docker环境"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>a(r.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"deployed",tip:"部署"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"danger",icon:"Delete",title:o("button.delete"),onClick:()=>g([r.row])},null)])}]);return(r,c)=>{const _=e.resolveComponent("el-button"),y=e.resolveComponent("el-table-column"),b=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",we,[e.createVNode(b,{ref_key:"refTdsTable",ref:s,columns:C,"request-api":e.unref(z),"search-col":4,options:r.$tableOptions(),"reserve-selection":""},{tableHeader:e.withCtx(()=>[e.createElementVNode("div",be,[e.createVNode(_,{class:"custom-btn",type:"primary",icon:"Plus",plain:"",onClick:c[0]||(c[0]=T=>w())},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(o)("button.add")),1)]),_:1})])]),default:e.withCtx(()=>[e.createVNode(y,{type:"expand"},{default:e.withCtx(T=>[T.row.deployment_packages&&T.row.deployment_packages.length>0?(e.openBlock(),e.createElementBlock("div",xe,[c[1]||(c[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的探针包",-1)),e.createElementVNode("div",ke,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.row.deployment_packages,$=>(e.openBlock(),e.createElementBlock("div",{key:$.id,class:"w-30% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-md transition-shadow"},[e.createElementVNode("div",Ve,e.toDisplayString($.file_name),1),e.createElementVNode("div",Ne,[e.createElementVNode("p",null,"版本: "+e.toDisplayString($.version),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString($.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",Te,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:p},r.$formBindProps({title:u.value,form:n.value,columns:C,formKey:m.value}),{onSubmit:f}),null,16)])}}}),Ce={class:"table-box"},$e={style:{padding:"0 50px"}},Be=e.defineComponent({__name:"index",setup(t){const o=e.reactive([{field:"packages_name",name:"探针包",render:l=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[l.row.packages_name]),e.createVNode("p",{class:"text-gray-400"},[l.row.packages_version])])},{field:"server_name",name:"服务器",render:l=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[l.row.server_name]),e.createVNode("p",{class:"text-gray-400"},[l.row.ip_address])])},{field:"deployment_time",name:"部署时间"},{field:"deployment_status",name:"状态",tag:!0,enum:[{label:"部署失败",value:0,tagType:"danger"},{label:"部署中",value:1,tagType:"warning"},{label:"部署成功",value:2,tagType:"success"}]}]);return(l,s)=>{const p=e.resolveComponent("el-table-column"),u=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",Ce,[e.createVNode(u,{ref:"refTdsTable",columns:o,"search-col":4,"request-api":e.unref(oe),options:l.$tableOptions(),"reserve-selection":""},{default:e.withCtx(()=>[e.createVNode(p,{type:"expand"},{default:e.withCtx(n=>[e.createElementVNode("div",$e,e.toDisplayString(n.row.deployment_log),1)]),_:1})]),_:1},8,["columns","request-api","options"])])}}}),Se={class:"main-wrapper"},Le=e.defineComponent({name:"TCProbe",__name:"index",props:{token:{type:String,default:""}},setup(t){const o=t,l=e.ref("package");return(s,p)=>{const u=e.resolveComponent("el-tab-pane"),n=e.resolveComponent("el-tabs");return e.openBlock(),e.createElementBlock("div",Se,[e.createVNode(n,{modelValue:l.value,"onUpdate:modelValue":p[0]||(p[0]=m=>l.value=m),class:"demo-tabs"},{default:e.withCtx(()=>[e.createVNode(u,{label:"安装包管理",name:"package"},{default:e.withCtx(()=>[l.value==="package"?(e.openBlock(),e.createBlock(he,{key:0,token:o.token},null,8,["token"])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(u,{label:"探针部署",name:"deploy"},{default:e.withCtx(()=>[l.value==="deploy"?(e.openBlock(),e.createBlock(Ee,{key:0})):e.createCommentVNode("",!0)]),_:1}),e.createVNode(u,{label:"部署历史",name:"history"},{default:e.withCtx(()=>[l.value==="history"?(e.openBlock(),e.createBlock(Be,{key:0})):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Ue="",De="",R=((t,o)=>{if(t.install=l=>{for(const s of[t,...Object.values(o??{})])l.component(s.name,s)},o)for(const[l,s]of Object.entries(o))t[l]=s;return t})(A(Le,[["__scopeId","data-v-628de145"]])),qe={TCProbe:R},Me={install(t,o){Object.entries(qe).forEach(([l,s])=>{t.component(l,s)}),o!=null&&o.prodType&&(window.$prodType=o.prodType),o!=null&&o.envURL&&(window.$probeURL=o.envURL)}};N.TCProbe=R,N.default=Me,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(T,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("topdatasec-ui"),require("spark-md5"),require("element-plus")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","topdatasec-ui","spark-md5","element-plus"],e):(T=typeof globalThis<"u"?globalThis:T||self,e(T.TProbeUI={},T.Vue,T.IconsVue,T.TopdatasecUI,T.SparkMD5,T.ElementPlus))})(this,function(T,e,D,F,K,A){"use strict";const Ue="",W={key:0,class:"absolute right--13px text-#f56c6c hover:cursor-pointer"},G=e.defineComponent({__name:"IpPortList",props:{modelValue:{default:()=>[{ip:"",port:""}]},modelModifiers:{}},emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),{$t:r}=window;function a(){o.value=[...o.value,{ip:"",port:""}]}function c(m){const l=[...o.value];l.splice(m,1),o.value=l}return(m,l)=>{const _=e.resolveComponent("el-input"),k=e.resolveComponent("el-form-item"),y=e.resolveComponent("el-icon"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,(d,b)=>(e.openBlock(),e.createElementBlock("div",{key:b,class:"flex form-m0 w-100% mb-5px"},[e.createVNode(k,{class:"w-70%"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:d.ip,"onUpdate:modelValue":E=>d.ip=E,class:"min-w-300px w-100%",placeholder:"IP"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e.createVNode(k,{class:"ml-auto w-30%"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:d.port,"onUpdate:modelValue":E=>d.port=E,class:"ml-10",placeholder:e.unref(r)("global.port")},null,8,["modelValue","onUpdate:modelValue","placeholder"])]),_:2},1024),o.value.length>1?(e.openBlock(),e.createElementBlock("div",W,[e.createVNode(y,{onClick:E=>c(b)},{default:e.withCtx(()=>[e.createVNode(e.unref(D.CircleClose))]),_:1},8,["onClick"])])):e.createCommentVNode("",!0)]))),128)),e.createVNode(s,{class:"w-100% mt-10px border-dashed!",icon:"Plus",onClick:a})])}}}),De="",I=(t,o)=>{const r=t.__vccOpts||t;for(const[a,c]of o)r[a]=c;return r},C=I(G,[["__scopeId","data-v-16fc9c64"]]),B=5*1024*1024;function J(t,o){return new Promise((r,a)=>{const c=new K.ArrayBuffer,m=new FileReader,l=Math.ceil(t.size/B);let _=0;m.onload=y=>{var s;if(c.append((s=y.target)==null?void 0:s.result),_++,o){const d=Math.floor(_/l*100);o(d)}if(_<l)k();else{const d=c.end();r(d)}},m.onerror=()=>{a(new Error("MD5计算失败"))};function k(){const y=_*B,s=Math.min(y+B,t.size);m.readAsArrayBuffer(t.slice(y,s))}k()})}async function Z(t,o,r,a,c,m="/api/upload/chunk"){const l=o*B,_=Math.min(l+B,t.size),k=t.slice(l,_),y=_-l,s=new FormData;s.append("file",k,t.name),s.append("chunkIndex",String(o+1)),s.append("totalChunkNum",String(r)),s.append("fileMd5",a),s.append("tds_token",c),s.append("fileName",t.name),s.append("fileSize",String(t.size)),s.append("fileExt",t.name.substring(t.name.lastIndexOf(".")+1)),s.append("chunkSize",String(B)),s.append("currentChunkSize",String(y));try{const d=await fetch(m,{method:"POST",body:s});if(console.log(d,"upload response"),!d.ok)throw new Error(`分片 ${o+1} 上传失败,HTTP状态码: ${d.status}`);const b=await d.json();if(console.log(b,"upload result"),b.recode!==0)throw new Error(`上传失败: ${b.remsg||"未知错误"}`);return!0}catch(d){throw console.error(`上传分片 ${o+1} 时出错:`,d),d}}async function Q(t,o="/api/upload/merge"){try{if(!(await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).ok)throw new Error("文件合并失败");return!0}catch(r){return console.error("合并分片时出错:",r),!1}}async function X(t){const{token:o,file:r,fileDesc:a="",uploadUrl:c="/api/upload/chunk",mergeUrl:m="/api/upload/merge",onProgress:l,onSuccess:_,onError:k}=t;try{l==null||l({progress:0,statusText:"正在计算文件MD5...",status:"preparing"});const s=await J(r,V=>{l==null||l({progress:Math.floor(V*.1),statusText:`正在计算文件MD5... ${V}%`,status:"preparing"})});l==null||l({progress:10,statusText:"MD5计算完成",status:"preparing",fileMd5:s});const d=Math.ceil(r.size/B);l==null||l({progress:10,statusText:`开始上传 (共${d}个分片)`,status:"uploading",fileMd5:s});for(let V=0;V<d;V++){const N=Math.floor(V/d*80);l==null||l({progress:10+N,statusText:`正在上传分片 ${V+1}/${d}`,status:"uploading",fileMd5:s}),await Z(r,V,d,s,o,c)}l==null||l({progress:90,statusText:"正在合并文件...",status:"merging",fileMd5:s});const b=r.name.substring(r.name.lastIndexOf(".")+1),E={fileDesc:a,fileExt:b,fileMd5:s,fileName:r.name,fileSize:String(r.size),tds_token:o,totalChunkNum:String(d)};if(!await Q(E,m))throw new Error("文件合并失败");l==null||l({progress:100,statusText:"上传成功",status:"success",fileMd5:s}),A.ElMessage.success(`${r.name} 上传成功`),_==null||_(s)}catch(y){l==null||l({progress:0,statusText:y.message||"上传失败",status:"error"}),A.ElMessage.error(`${r.name} 上传失败: ${y.message}`),k==null||k(y)}}function Y(t){if(t===0)return"0 B";const o=1024,r=["B","KB","MB","GB","TB"],a=Math.floor(Math.log(t)/Math.log(o));return Math.round(t/Math.pow(o,a)*100)/100+" "+r[a]}const x={get deployURL(){return window.$probeURL||""}},P=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/deploy`,method:"post",data:t}),v=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/add`,method:"post",data:t}),z=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/packages/get`,method:"post",data:t,isError:!1}),R=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/get`,method:"post",data:t,isError:!1}),ee=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/del`,method:"post",data:t}),te=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/packages/del`,method:"post",data:t}),oe=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/get_arch`,method:"post",data:t,isError:!1}),le=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/deployment_history/get`,method:"post",data:t,isError:!1}),re=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/test_ssh`,method:"post",data:t}),ne=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/check_env`,method:"post",data:t}),ae=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/install_env`,method:"post",data:t}),se={class:"h-100%"},de={key:0,class:"upload-progress-list"},ie={class:"file-info"},ce={class:"file-name"},pe={class:"file-size"},ue={class:"progress-text"},me={class:"table-box h-[calc(100%-220px)]",style:{height:"calc(100% - 220px)"}},_e={key:0},fe={class:"flex flex-wrap gap-12px p-12px"},ye={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)]"},ge={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},he={key:1,class:"font-bold text-center text-gray-500 py-20"},we=e.defineComponent({__name:"index",props:{token:{type:String,default:""}},setup(t){const o=e.ref(),r=e.ref(),a=e.ref("快速部署"),c=e.ref({}),{$t:m,$messageBox:l}=window,_=t;function k(i){c.value={id:i.id},r.value.open()}const y=e.ref([{ip:"",port:""}]),s=e.ref([{ip:"",port:""}]),d=e.ref([{ip:"",port:""}]),b=e.ref([{ip:"",port:""}]);async function E(i){const g=(h,p)=>{const u=Math.max(h.length,p.length);return Array.from({length:u},(f,w)=>{var $,S,L,M;return{src_ip:(($=h[w])==null?void 0:$.ip)||"",src_port:Number((S=h[w])==null?void 0:S.port)||0,dst_ip:((L=p[w])==null?void 0:L.ip)||"",dst_port:Number((M=p[w])==null?void 0:M.port)||0}})},n={packages_id:[c.value.id],server_id:i.server_id,service_type:window.$prodType,deploy_params:{probe_name:i.probe_name||"",collection_mode:i.collection_mode,interface:i.interface||"",engine_ip:i.engine_ip||"",engine_port:i.engine_port||"",filterWhitelist:g(y.value,s.value),filterBlacklist:g(d.value,b.value)}};await P({data:n}),o.value.getTableList(),r.value.close()}async function q(i){l(i,"file_name",m("button.delete"),"error").then(async()=>{await te({data:[i.id]}),o.value.getTableList()})}const V=e.reactive([{field:"server_id",name:"选择服务器",enum:R,fieldNames:{value:"id",label:"server_name"},show:{type:"select",prop:{multiple:!0},dataType:"any"},hide:!0,rules:[{required:!0}]},{field:"file_name",name:"文件名称"},{field:"version",name:"版本"},{field:"file_size",name:"大小"},{field:"upload_time",name:"上传时间"},{field:"deployment_server",name:"已部署服务器数",render:i=>{var g;return((g=i.row.deployment_server)==null?void 0:g.length)||0}},{field:"upload_status",name:"状态",tag:!0,enum:[{label:"上传失败",value:0,tagType:"danger"},{label:"上传中",value:1,tagType:"warning"},{label:"上传成功",value:2,tagType:"success"}]},{field:"probe_name",name:"探针名称",show:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"collection_mode",name:"采集模式",show:{type:"input",value:"DPDK",disabled:!0},hide:!0,rules:[{required:!0}]},{field:"interface",name:"采集网卡",show:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"engine_ip",name:"流量接收引擎IP",show:{type:"input"},hide:!0},{field:"engine_port",name:"流量接收引擎端口",show:{type:"input",dataType:"number"},hide:!0,rules:[{required:!0,type:"any"}]},{field:"whitelist",name:"探针过滤白名单",show:{type:"input",tooltip:"白名单配置后,仅采集白名单内相关流量,如不填写,则采集所有流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("div",{style:"width: 100%"},[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(C,{modelValue:y.value,"onUpdate:modelValue":i=>y.value=i},null)]),e.createVNode("div",{style:"width: 100%"},[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(C,{modelValue:s.value,"onUpdate:modelValue":i=>s.value=i},null)])])},hide:!0},{field:"blacklist",name:"探针过滤黑名单",show:{type:"input",tooltip:"黑名单配置后,将不再采集黑名单内相关流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(C,{modelValue:d.value,"onUpdate:modelValue":i=>d.value=i},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(C,{modelValue:b.value,"onUpdate:modelValue":i=>b.value=i},null)])},hide:!0},{field:"operation",name:window.$t("global.operate"),width:140,fixed:"right",render:i=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>k(i.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"deployed",tip:"部署"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"danger",icon:"Delete",title:m("button.delete"),onClick:()=>q([i.row])},null)])}]),N=e.ref([]);function U(i){const g=i.raw;if(!g)return;const n={fileName:g.name,fileSize:g.size,progress:0,progressStatus:"",statusText:"准备上传..."};N.value.push(n);const h=N.value.length-1;X({file:g,fileDesc:"探针安装包",uploadUrl:x.deployURL+"/service_deploy/deployment/packages/upload",mergeUrl:x.deployURL+"/service_deploy/deployment/packages/upload_merge",token:_.token,onProgress:p=>{const u=N.value[h];u&&(u.progress=p.progress,u.statusText=p.statusText,p.fileMd5&&(u.fileMd5=p.fileMd5),p.status==="error"?u.progressStatus="exception":p.status==="success"?u.progressStatus="success":u.progressStatus="")},onSuccess:()=>{var u;const p=N.value[h];p&&(p.progress=100,p.progressStatus="success",p.statusText="上传成功"),(u=o.value)==null||u.getTableList(),setTimeout(()=>{const f=N.value.findIndex(w=>w.fileName===g.name);f!==-1&&N.value.splice(f,1)},3e3)},onError:p=>{console.error("文件上传失败:",p);const u=N.value[h];u&&(u.progressStatus="exception",u.statusText=p.message||"上传失败")}})}return(i,g)=>{const n=e.resolveComponent("el-icon"),h=e.resolveComponent("el-upload"),p=e.resolveComponent("el-progress"),u=e.resolveComponent("el-table-column");return e.openBlock(),e.createElementBlock("div",se,[e.createVNode(h,{class:"upload-demo mt-10px",drag:"",action:"","auto-upload":!1,accept:".tar.gz,.tgz","on-change":U,"show-file-list":!1,multiple:""},{default:e.withCtx(()=>[e.createVNode(n,{class:"el-icon--upload"},{default:e.withCtx(()=>[e.createVNode(e.unref(D.UploadFilled))]),_:1}),g[0]||(g[0]=e.createElementVNode("div",{class:"el-upload__text"},[e.createTextVNode(" 点击或拖拽文件到此处上传 "),e.createElementVNode("br"),e.createElementVNode("em",null,"支持的格式: tar.gz, tgz")],-1))]),_:1}),N.value.length>0?(e.openBlock(),e.createElementBlock("div",de,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,f=>(e.openBlock(),e.createElementBlock("div",{key:f.fileName,class:"upload-progress-item"},[e.createElementVNode("div",ie,[e.createElementVNode("span",ce,e.toDisplayString(f.fileName),1),e.createElementVNode("span",pe,e.toDisplayString(e.unref(Y)(f.fileSize)),1)]),e.createVNode(p,{percentage:f.progress,status:f.progressStatus},null,8,["percentage","status"]),e.createElementVNode("div",ue,e.toDisplayString(f.statusText),1)]))),128))])):e.createCommentVNode("",!0),e.createElementVNode("div",me,[e.createVNode(e.unref(F.TdsTable),{ref_key:"refTdsTable",ref:o,columns:V,"request-api":e.unref(z),options:i.$tableOptions()},{default:e.withCtx(()=>[e.createVNode(u,{type:"expand"},{default:e.withCtx(f=>[f.row.deployment_server&&f.row.deployment_server.length>0?(e.openBlock(),e.createElementBlock("div",_e,[g[1]||(g[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的服务器",-1)),e.createElementVNode("div",fe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.row.deployment_server,w=>(e.openBlock(),e.createElementBlock("div",{key:w.id,class:"w-30% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-md transition-shadow"},[e.createElementVNode("div",ye,e.toDisplayString(w.server_name),1),e.createElementVNode("div",ge,[e.createElementVNode("p",null,"IP: "+e.toDisplayString(w.ip_address),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString(w.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",he,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"])]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:r},i.$formBindProps({title:a.value,form:c.value,columns:V}),{onSubmit:E}),null,16)])}}}),be={class:"table-box"},ke={class:"flex items-center"},xe={key:0},Ve={class:"flex flex-wrap gap-12px p-12px"},Ne={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)]"},Te={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},Ee={key:1,class:"font-bold text-center text-gray-500 py-20"},Ce=e.defineComponent({__name:"index",setup(t){const{$t:o,$messageBox:r}=window,a=e.ref(),c=e.ref(),m=e.ref(""),l=e.ref({}),_=e.ref("show");function k(){l.value={},_.value="show",m.value="添加服务器",c.value.open()}const y=n=>{r(n,"server_name",o("button.delete"),"error").then(async()=>{await ee({data:n.map(h=>h.id)}),a.value.getTableList()})};function s(n){l.value={id:n.id},_.value="deploy",m.value="快速部署",c.value.open()}const d=e.ref([{ip:"",port:""}]),b=e.ref([{ip:"",port:""}]),E=e.ref([{ip:"",port:""}]),q=e.ref([{ip:"",port:""}]);async function V(n){if(_.value==="show"){await v({data:n}),a.value.getTableList(),c.value.close();return}const h=(u,f)=>{const w=Math.max(u.length,f.length);return Array.from({length:w},($,S)=>{var L,M,j,H;return{src_ip:((L=u[S])==null?void 0:L.ip)||"",src_port:Number((M=u[S])==null?void 0:M.port)||0,dst_ip:((j=f[S])==null?void 0:j.ip)||"",dst_port:Number((H=f[S])==null?void 0:H.port)||0}})},p={packages_id:[n.packages_id],server_id:[l.value.id],service_type:window.$prodType,deploy_params:{probe_name:n.probe_name||"",collection_mode:n.collection_mode,interface:n.interface||"",engine_ip:n.engine_ip||"",engine_port:n.engine_port||"",filterWhitelist:h(d.value,b.value),filterBlacklist:h(E.value,q.value)}};await P({data:p}),a.value.getTableList(),c.value.close()}function N(n){re({data:[n.id]}),a.value.getTableList()}function U(n){ne({data:[n.id]}),a.value.getTableList()}function i(n){ae({data:[n.id]}),a.value.getTableList()}const g=e.reactive([{field:"server_name",name:"服务器名称",show:{type:"input"},rules:[{required:!0}]},{field:"ip_address",name:"IP地址",show:{type:"input"},rules:[{required:!0}]},{field:"ssh_port",name:"端口",show:{type:"input",dataType:"number"},rules:[{required:!0,type:"any"}]},{field:"ssh_username",name:"SSH用户",show:{type:"input"},rules:[{required:!0}]},{field:"ssh_password",name:"SSH登录密码",hide:!0,show:{type:"input",prop:{type:"password",showPassword:!0}},rules:[{required:!0}]},{field:"arch",name:"架构",enum:oe,show:{type:"select"},rules:[{required:!0}]},{field:"deployed_count",name:"已部署探针数量",render:n=>e.createVNode("span",null,[n.row.deployment_packages.length])},{field:"status",name:"状态",tag:!0,enum:[{label:"在线",value:1,tagType:"success"},{label:"不在线",value:0,tagType:"danger"}]},{field:"ssh_status",name:"连通性检查",tag:!0,enum:[{label:"成功",value:1,tagType:"success"},{label:"失败",value:0,tagType:"danger"}]},{field:"check_env_ok",name:"安装环境",tag:!0,enum:[{label:"具备",value:1,tagType:"success"},{label:"不具备",value:0,tagType:"danger"}]},{field:"packages_id",name:"安装包",enum:z,fieldNames:{value:"id",label:"file_name"},deploy:{type:"select"},hide:!0,rules:[{required:!0}]},{field:"probe_name",name:"探针名称",deploy:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"collection_mode",name:"采集模式",deploy:{type:"input",value:"DPDK",disabled:!0},hide:!0,rules:[{required:!0}]},{field:"interface",name:"采集网卡",deploy:{type:"input"},hide:!0,rules:[{required:!0}]},{field:"engine_ip",name:"流量接收引擎IP",deploy:{type:"input"},rules:[{required:!0,type:"any"}],hide:!0},{field:"engine_port",name:"流量接收引擎端口",deploy:{type:"input",dataType:"number"},hide:!0,rules:[{required:!0,type:"any"}]},{field:"whitelist",name:"探针过滤白名单",deploy:{type:"input",tooltip:"白名单配置后,仅采集白名单内相关流量,如不填写,则采集所有流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(C,{modelValue:d.value,"onUpdate:modelValue":n=>d.value=n},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(C,{modelValue:b.value,"onUpdate:modelValue":n=>b.value=n},null)])},hide:!0},{field:"blacklist",name:"探针过滤黑名单",deploy:{type:"input",tooltip:"黑名单配置后,将不再采集黑名单内相关流量",render:()=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("源ip端口:")]),e.createVNode(C,{modelValue:E.value,"onUpdate:modelValue":n=>E.value=n},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(C,{modelValue:q.value,"onUpdate:modelValue":n=>q.value=n},null)])},hide:!0},{field:"operation",name:window.$t("global.operate"),width:180,fixed:"right",render:n=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",icon:"Connection",title:"连通性检查",class:"custom-btn",onClick:()=>N(n.row)},null),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>U(n.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"install_env",tip:"测试安装环境"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>i(n.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"docker",tip:"自动安装docker环境"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>s(n.row)},{icon:()=>e.createVNode(e.resolveComponent("tds-svg-icon"),{name:"deployed",tip:"部署"},null)}),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"danger",icon:"Delete",title:o("button.delete"),onClick:()=>y([n.row])},null)])}]);return(n,h)=>{const p=e.resolveComponent("el-button"),u=e.resolveComponent("el-table-column"),f=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",be,[e.createVNode(f,{ref_key:"refTdsTable",ref:a,columns:g,"request-api":e.unref(R),"search-col":4,options:n.$tableOptions(),"reserve-selection":""},{tableHeader:e.withCtx(()=>[e.createElementVNode("div",ke,[e.createVNode(p,{class:"custom-btn",type:"primary",icon:"Plus",plain:"",onClick:h[0]||(h[0]=w=>k())},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(o)("button.add")),1)]),_:1})])]),default:e.withCtx(()=>[e.createVNode(u,{type:"expand"},{default:e.withCtx(w=>[w.row.deployment_packages&&w.row.deployment_packages.length>0?(e.openBlock(),e.createElementBlock("div",xe,[h[1]||(h[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的探针包",-1)),e.createElementVNode("div",Ve,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(w.row.deployment_packages,$=>(e.openBlock(),e.createElementBlock("div",{key:$.id,class:"w-30% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-md transition-shadow"},[e.createElementVNode("div",Ne,e.toDisplayString($.file_name),1),e.createElementVNode("div",Te,[e.createElementVNode("p",null,"版本: "+e.toDisplayString($.version),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString($.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",Ee,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:c},n.$formBindProps({title:m.value,form:l.value,columns:g,formKey:_.value}),{onSubmit:V}),null,16)])}}}),$e={class:"table-box"},Be={style:{padding:"0 50px"}},Se=e.defineComponent({__name:"index",setup(t){const o=e.reactive([{field:"packages_name",name:"探针包",render:r=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[r.row.packages_name]),e.createVNode("p",{class:"text-gray-400"},[r.row.packages_version])])},{field:"server_name",name:"服务器",render:r=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[r.row.server_name]),e.createVNode("p",{class:"text-gray-400"},[r.row.ip_address])])},{field:"deployment_time",name:"部署时间"},{field:"deployment_status",name:"状态",tag:!0,enum:[{label:"部署失败",value:0,tagType:"danger"},{label:"部署中",value:1,tagType:"warning"},{label:"部署成功",value:2,tagType:"success"}]}]);return(r,a)=>{const c=e.resolveComponent("el-table-column"),m=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",$e,[e.createVNode(m,{ref:"refTdsTable",columns:o,"search-col":4,"request-api":e.unref(le),options:r.$tableOptions(),"reserve-selection":""},{default:e.withCtx(()=>[e.createVNode(c,{type:"expand"},{default:e.withCtx(l=>[e.createElementVNode("div",Be,e.toDisplayString(l.row.deployment_log),1)]),_:1})]),_:1},8,["columns","request-api","options"])])}}}),qe={class:"main-wrapper"},Le=e.defineComponent({name:"TCProbe",__name:"index",props:{token:{type:String,default:""}},setup(t){const o=e.ref("package");return(r,a)=>{const c=e.resolveComponent("el-tab-pane"),m=e.resolveComponent("el-tabs");return e.openBlock(),e.createElementBlock("div",qe,[e.createVNode(m,{modelValue:o.value,"onUpdate:modelValue":a[0]||(a[0]=l=>o.value=l),class:"demo-tabs"},{default:e.withCtx(()=>[e.createVNode(c,{label:"安装包管理",name:"package"},{default:e.withCtx(()=>[o.value==="package"?(e.openBlock(),e.createBlock(we,{key:0,token:t.token},null,8,["token"])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(c,{label:"探针部署",name:"deploy"},{default:e.withCtx(()=>[o.value==="deploy"?(e.openBlock(),e.createBlock(Ce,{key:0})):e.createCommentVNode("",!0)]),_:1}),e.createVNode(c,{label:"部署历史",name:"history"},{default:e.withCtx(()=>[o.value==="history"?(e.openBlock(),e.createBlock(Se,{key:0})):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Ae="",O=((t,o)=>{if(t.install=r=>{for(const a of[t,...Object.values(o??{})])r.component(a.name,a)},o)for(const[r,a]of Object.entries(o))t[r]=a;return t})(I(Le,[["__scopeId","data-v-f99b9b23"]])),Me={TCProbe:O},Fe={install(t,o){Object.entries(Me).forEach(([r,a])=>{t.component(r,a)}),o!=null&&o.prodType&&(window.$prodType=o.prodType),o!=null&&o.envURL&&(window.$probeURL=o.envURL)}};T.TCProbe=O,T.default=Fe,Object.defineProperties(T,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topdatasec/probe",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "探针部署管理组件",
|
|
5
5
|
"author": "wangguiwang",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"prettier": "prettier --write \"packages/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\""
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
+
"unocss": "^0.58.0",
|
|
24
25
|
"@rollup/plugin-commonjs": "^28.0.3",
|
|
25
26
|
"@topdatasec/eslint-rc": "^1.0.4",
|
|
26
27
|
"@typescript-eslint/eslint-plugin": "^6.7.0",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"@element-plus/icons-vue": "^2.3.1",
|
|
53
54
|
"element-plus": "^2.9.0",
|
|
54
55
|
"pinia": "^2.1.6",
|
|
56
|
+
"spark-md5": "^3.0.2",
|
|
55
57
|
"topdatasec-ui": "^1.6.1",
|
|
56
58
|
"vue": "^3.4.35"
|
|
57
59
|
},
|