@topdatasec/probe 1.0.8 → 1.0.10

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.
@@ -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("spark-md5"),require("element-plus")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","topdatasec-ui","spark-md5","element-plus"],e):(N=typeof globalThis<"u"?globalThis:N||self,e(N.TProbeUI={},N.Vue,N.IconsVue,N.TopdatasecUI,N.SparkMD5,N.ElementPlus))})(this,function(N,e,D,F,W,A){"use strict";const De="",G={key:0,class:"absolute right--13px text-#f56c6c hover:cursor-pointer"},J=e.defineComponent({__name:"IpPortList",props:{modelValue:{default:()=>[{ip:"",port:""}]},modelModifiers:{}},emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),{$t:a}=window;function n(){o.value=[...o.value,{ip:"",port:""}]}function p(_){const l=[...o.value];l.splice(_,1),o.value=l}return(_,l)=>{const u=e.resolveComponent("el-input"),b=e.resolveComponent("el-form-item"),h=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,(c,w)=>(e.openBlock(),e.createElementBlock("div",{key:w,class:"flex form-m0 w-100% mb-5px"},[e.createVNode(b,{class:"w-70%"},{default:e.withCtx(()=>[e.createVNode(u,{modelValue:c.ip,"onUpdate:modelValue":T=>c.ip=T,class:"min-w-300px w-100%",placeholder:"IP"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e.createVNode(b,{class:"ml-auto w-30%"},{default:e.withCtx(()=>[e.createVNode(u,{modelValue:c.port,"onUpdate:modelValue":T=>c.port=T,class:"ml-10",placeholder:e.unref(a)("global.port")},null,8,["modelValue","onUpdate:modelValue","placeholder"])]),_:2},1024),o.value.length>1?(e.openBlock(),e.createElementBlock("div",G,[e.createVNode(h,{onClick:T=>p(w)},{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:n})])}}}),Ae="",P=(t,o)=>{const a=t.__vccOpts||t;for(const[n,p]of o)a[n]=p;return a},$=P(J,[["__scopeId","data-v-16fc9c64"]]),S=5*1024*1024;function Z(t,o){return new Promise((a,n)=>{const p=new W.ArrayBuffer,_=new FileReader,l=Math.ceil(t.size/S);let u=0;_.onload=h=>{var s;if(p.append((s=h.target)==null?void 0:s.result),u++,o){const c=Math.floor(u/l*100);o(c)}if(u<l)b();else{const c=p.end();a(c)}},_.onerror=()=>{n(new Error("MD5计算失败"))};function b(){const h=u*S,s=Math.min(h+S,t.size);_.readAsArrayBuffer(t.slice(h,s))}b()})}async function Q(t,o,a,n,p,_="/api/upload/chunk"){const l=o*S,u=Math.min(l+S,t.size),b=t.slice(l,u),h=u-l,s=new FormData;s.append("file",b,t.name),s.append("chunkIndex",String(o+1)),s.append("totalChunkNum",String(a)),s.append("fileMd5",n),s.append("tds_token",p),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(S)),s.append("currentChunkSize",String(h));try{const c=await fetch(_,{method:"POST",body:s});if(console.log(c,"upload response"),!c.ok)throw new Error(`分片 ${o+1} 上传失败,HTTP状态码: ${c.status}`);const w=await c.json();if(console.log(w,"upload result"),w.recode!==0)throw new Error(`上传失败: ${w.remsg||"未知错误"}`);return!0}catch(c){throw console.error(`上传分片 ${o+1} 时出错:`,c),c}}async function X(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(a){return console.error("合并分片时出错:",a),!1}}async function Y(t){const{token:o,file:a,fileDesc:n="",uploadUrl:p="/api/upload/chunk",mergeUrl:_="/api/upload/merge",onProgress:l,onSuccess:u,onError:b}=t;try{l==null||l({progress:0,statusText:"正在计算文件MD5...",status:"preparing"});const s=await Z(a,k=>{l==null||l({progress:Math.floor(k*.1),statusText:`正在计算文件MD5... ${k}%`,status:"preparing"})});l==null||l({progress:10,statusText:"MD5计算完成",status:"preparing",fileMd5:s});const c=Math.ceil(a.size/S);l==null||l({progress:10,statusText:`开始上传 (共${c}个分片)`,status:"uploading",fileMd5:s});for(let k=0;k<c;k++){const V=Math.floor(k/c*80);l==null||l({progress:10+V,statusText:`正在上传分片 ${k+1}/${c}`,status:"uploading",fileMd5:s}),await Q(a,k,c,s,o,p)}l==null||l({progress:90,statusText:"正在合并文件...",status:"merging",fileMd5:s});const w=a.name.substring(a.name.lastIndexOf(".")+1),T={fileDesc:n,fileExt:w,fileMd5:s,fileName:a.name,fileSize:String(a.size),tds_token:o,totalChunkNum:String(c)};if(!await X(T,_))throw new Error("文件合并失败");l==null||l({progress:100,statusText:"上传成功",status:"success",fileMd5:s}),A.ElMessage.success(`${a.name} 上传成功`),u==null||u(s)}catch(h){l==null||l({progress:0,statusText:h.message||"上传失败",status:"error"}),A.ElMessage.error(`${a.name} 上传失败: ${h.message}`),b==null||b(h)}}function v(t){if(t===0)return"0 B";const o=1024,a=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(o));return Math.round(t/Math.pow(o,n)*100)/100+" "+a[n]}const x={get deployURL(){return window.$probeURL||""}},I=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/deploy`,method:"post",data:t}),ee=(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}),te=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/del`,method:"post",data:t}),oe=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/packages/del`,method:"post",data:t}),re=(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}),ne=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/test_ssh`,method:"post",data:t}),ae=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/check_env`,method:"post",data:t}),se=(t={})=>window.$http.request({url:`${x.deployURL}/service_deploy/deployment/servers/install_env`,method:"post",data:t}),de={class:"h-100%"},ie={key:0,class:"upload-progress-list"},ce={class:"file-info"},pe={class:"file-name"},ue={class:"file-size"},me={class:"progress-text"},_e={class:"table-box h-[calc(100%-220px)]",style:{height:"calc(100% - 220px)"}},fe={key:0},ye={class:"flex flex-wrap gap-12px p-12px"},he={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"},we={key:1,class:"font-bold text-center text-gray-500 py-20"},be=e.defineComponent({__name:"index",props:{token:{type:String,default:""}},setup(t){const o=e.ref(),a=e.ref(),n=e.ref("快速部署"),p=e.ref({}),{$t:_,$messageBox:l}=window,u=t;function b(d){p.value={id:d.id},a.value.open()}const h=e.ref([{ip:"",port:""}]),s=e.ref([{ip:"",port:""}]),c=e.ref([{ip:"",port:""}]),w=e.ref([{ip:"",port:""}]);async function T(d){const f=(r,i)=>{const m=Math.max(r.length,i.length);return Array.from({length:m},(y,g)=>{var C,B,q,M;return{src_ip:((C=r[g])==null?void 0:C.ip)||"",src_port:Number((B=r[g])==null?void 0:B.port)||0,dst_ip:((q=i[g])==null?void 0:q.ip)||"",dst_port:Number((M=i[g])==null?void 0:M.port)||0}})},E={packages_id:[p.value.id],server_id:d.server_id,service_type:window.$prodType,deploy_params:{probe_name:d.probe_name||"",collection_mode:d.collection_mode,interface:d.interface||"",engine_ip:d.engine_ip||"",engine_port:d.engine_port||"",filterWhitelist:f(h.value,s.value),filterBlacklist:f(c.value,w.value)}};await I({data:E}),o.value.getTableList(),a.value.close()}async function L(d){l(d,"file_name",_("button.delete"),"error").then(async()=>{const f=d.map(E=>E.id);await oe({data:f}),o.value.getTableList()})}const k=e.reactive([{field:"server_id",name:"选择服务器",enum:()=>R({service_type:window.$prodType}),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:d=>{var f;return((f=d.row.deployment_server)==null?void 0:f.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($,{modelValue:h.value,"onUpdate:modelValue":d=>h.value=d},null)]),e.createVNode("div",{style:"width: 100%"},[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode($,{modelValue:s.value,"onUpdate:modelValue":d=>s.value=d},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($,{modelValue:c.value,"onUpdate:modelValue":d=>c.value=d},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode($,{modelValue:w.value,"onUpdate:modelValue":d=>w.value=d},null)])},hide:!0},{field:"operation",name:window.$t("global.operate"),width:140,fixed:"right",render:d=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>b(d.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:_("button.delete"),onClick:()=>L([d.row])},null)])}]),V=e.ref([]);function U(d){const f=d.raw;if(!f)return;const E={fileName:f.name,fileSize:f.size,progress:0,progressStatus:"",statusText:"准备上传..."};V.value.push(E);const r=V.value.length-1;Y({file:f,fileDesc:"探针安装包",uploadUrl:x.deployURL+"/service_deploy/deployment/packages/upload",mergeUrl:x.deployURL+"/service_deploy/deployment/packages/upload_merge",token:u.token,onProgress:i=>{const m=V.value[r];m&&(m.progress=i.progress,m.statusText=i.statusText,i.fileMd5&&(m.fileMd5=i.fileMd5),i.status==="error"?m.progressStatus="exception":i.status==="success"?m.progressStatus="success":m.progressStatus="")},onSuccess:()=>{var m;const i=V.value[r];i&&(i.progress=100,i.progressStatus="success",i.statusText="上传成功"),(m=o.value)==null||m.getTableList(),setTimeout(()=>{const y=V.value.findIndex(g=>g.fileName===f.name);y!==-1&&V.value.splice(y,1)},3e3)},onError:i=>{console.error("文件上传失败:",i);const m=V.value[r];m&&(m.progressStatus="exception",m.statusText=i.message||"上传失败")}})}return(d,f)=>{const E=e.resolveComponent("el-icon"),r=e.resolveComponent("el-upload"),i=e.resolveComponent("el-progress"),m=e.resolveComponent("el-table-column");return e.openBlock(),e.createElementBlock("div",de,[e.createVNode(r,{class:"upload-demo mt-10px",drag:"",action:"","auto-upload":!1,accept:".tar.gz,.zip","on-change":U,"show-file-list":!1,multiple:""},{default:e.withCtx(()=>[e.createVNode(E,{class:"el-icon--upload"},{default:e.withCtx(()=>[e.createVNode(e.unref(D.UploadFilled))]),_:1}),f[0]||(f[0]=e.createElementVNode("div",{class:"el-upload__text"},[e.createTextVNode(" 点击或拖拽文件到此处上传  "),e.createElementVNode("br"),e.createElementVNode("em",null,"支持的格式: tar.gz, zip")],-1))]),_:1}),V.value.length>0?(e.openBlock(),e.createElementBlock("div",ie,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,y=>(e.openBlock(),e.createElementBlock("div",{key:y.fileName,class:"upload-progress-item"},[e.createElementVNode("div",ce,[e.createElementVNode("span",pe,e.toDisplayString(y.fileName),1),e.createElementVNode("span",ue,e.toDisplayString(e.unref(v)(y.fileSize)),1)]),e.createVNode(i,{percentage:y.progress,status:y.progressStatus},null,8,["percentage","status"]),e.createElementVNode("div",me,e.toDisplayString(y.statusText),1)]))),128))])):e.createCommentVNode("",!0),e.createElementVNode("div",_e,[e.createVNode(e.unref(F.TdsTable),{ref_key:"refTdsTable",ref:o,columns:k,"request-api":e.unref(z),options:d.$tableOptions()},{default:e.withCtx(()=>[e.createVNode(m,{type:"expand"},{default:e.withCtx(y=>[y.row.deployment_server&&y.row.deployment_server.length>0?(e.openBlock(),e.createElementBlock("div",fe,[f[1]||(f[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的服务器",-1)),e.createElementVNode("div",ye,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.row.deployment_server,g=>(e.openBlock(),e.createElementBlock("div",{key:g.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",he,e.toDisplayString(g.server_name),1),e.createElementVNode("div",ge,[e.createElementVNode("p",null,"IP: "+e.toDisplayString(g.ip_address),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString(g.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",we,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"])]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:a},d.$formBindProps({title:n.value,form:p.value,columns:k}),{onSubmit:T}),null,16)])}}}),ke={class:"table-box"},xe={class:"flex items-center"},Ve={key:0},Ne={class:"flex flex-wrap gap-12px p-12px"},Te={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)]"},Ee={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},Ce={key:1,class:"font-bold text-center text-gray-500 py-20"},$e=e.defineComponent({__name:"index",setup(t){const{$t:o,$messageBox:a}=window,n=e.ref(),p=e.ref(),_=e.ref(""),l=e.ref({}),u=e.ref("show"),b=e.reactive({service_type:window.$prodType});function h(){l.value={},u.value="show",_.value="添加服务器",p.value.open()}const s=r=>{a(r,"server_name",o("button.delete"),"error").then(async()=>{await te({data:r.map(i=>i.id),service_type:window.$prodType}),n.value.getTableList()})};function c(r){l.value={id:r.id},u.value="deploy",_.value="快速部署",p.value.open()}const w=e.ref([{ip:"",port:""}]),T=e.ref([{ip:"",port:""}]),L=e.ref([{ip:"",port:""}]),k=e.ref([{ip:"",port:""}]);async function V(r){if(u.value==="show"){await ee({data:r}),n.value.getTableList(),p.value.close();return}const i=(y,g)=>{const C=Math.max(y.length,g.length);return Array.from({length:C},(B,q)=>{var M,j,H,K;return{src_ip:((M=y[q])==null?void 0:M.ip)||"",src_port:Number((j=y[q])==null?void 0:j.port)||0,dst_ip:((H=g[q])==null?void 0:H.ip)||"",dst_port:Number((K=g[q])==null?void 0:K.port)||0}})},m={packages_id:[r.packages_id],server_id:[l.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:i(w.value,T.value),filterBlacklist:i(L.value,k.value)}};await I({data:m}),n.value.getTableList(),p.value.close()}function U(r){ne({data:[r.id]}),n.value.getTableList()}function d(r){ae({data:[r.id]}),n.value.getTableList()}function f(r){se({data:[r.id]}),n.value.getTableList()}const E=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:re,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: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($,{modelValue:w.value,"onUpdate:modelValue":r=>w.value=r},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode($,{modelValue:T.value,"onUpdate:modelValue":r=>T.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($,{modelValue:L.value,"onUpdate:modelValue":r=>L.value=r},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode($,{modelValue:k.value,"onUpdate:modelValue":r=>k.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:()=>U(r.row)},null),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>d(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:()=>f(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:()=>c(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:()=>s([r.row])},null)])}]);return(r,i)=>{const m=e.resolveComponent("el-button"),y=e.resolveComponent("el-table-column"),g=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",ke,[e.createVNode(g,{ref_key:"refTdsTable",ref:n,columns:E,"request-api":e.unref(R),"search-col":4,"init-param":b,options:r.$tableOptions(),"reserve-selection":""},{tableHeader:e.withCtx(()=>[e.createElementVNode("div",xe,[e.createVNode(m,{class:"custom-btn",type:"primary",icon:"Plus",plain:"",onClick:i[0]||(i[0]=C=>h())},{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(C=>[C.row.deployment_packages&&C.row.deployment_packages.length>0?(e.openBlock(),e.createElementBlock("div",Ve,[i[1]||(i[1]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的探针包",-1)),e.createElementVNode("div",Ne,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.row.deployment_packages,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",Te,e.toDisplayString(B.file_name),1),e.createElementVNode("div",Ee,[e.createElementVNode("p",null,"版本: "+e.toDisplayString(B.version),1),e.createElementVNode("p",null,"部署时间: "+e.toDisplayString(B.deployment_time),1)])]))),128))])])):(e.openBlock(),e.createElementBlock("div",Ce,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","init-param","options"]),e.createVNode(e.unref(F.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:p},r.$formBindProps({title:_.value,form:l.value,columns:E,formKey:u.value}),{onSubmit:V}),null,16)])}}}),Be={class:"table-box"},Se={style:{padding:"0 50px"}},qe=e.defineComponent({__name:"index",setup(t){const o=e.reactive({service_type:window.$prodType}),a=e.reactive([{field:"packages_name",name:"探针包",render:n=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[n.row.packages_name]),e.createVNode("p",{class:"text-gray-400"},[n.row.packages_version])])},{field:"server_name",name:"服务器",render:n=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[n.row.server_name]),e.createVNode("p",{class:"text-gray-400"},[n.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(n,p)=>{const _=e.resolveComponent("el-table-column"),l=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",Be,[e.createVNode(l,{ref:"refTdsTable",columns:a,"search-col":4,"request-api":e.unref(le),options:n.$tableOptions(),"init-param":o,"reserve-selection":""},{default:e.withCtx(()=>[e.createVNode(_,{type:"expand"},{default:e.withCtx(u=>[e.createElementVNode("div",Se,e.toDisplayString(u.row.deployment_log),1)]),_:1})]),_:1},8,["columns","request-api","options","init-param"])])}}}),Le={class:"main-wrapper"},Me=e.defineComponent({name:"TCProbe",__name:"index",props:{token:{type:String,default:""}},setup(t){const o=e.ref("package");return(a,n)=>{const p=e.resolveComponent("el-tab-pane"),_=e.resolveComponent("el-tabs");return e.openBlock(),e.createElementBlock("div",Le,[e.createVNode(_,{modelValue:o.value,"onUpdate:modelValue":n[0]||(n[0]=l=>o.value=l),class:"demo-tabs"},{default:e.withCtx(()=>[e.createVNode(p,{label:"安装包管理",name:"package"},{default:e.withCtx(()=>[o.value==="package"?(e.openBlock(),e.createBlock(be,{key:0,token:t.token},null,8,["token"])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(p,{label:"探针部署",name:"deploy"},{default:e.withCtx(()=>[o.value==="deploy"?(e.openBlock(),e.createBlock($e,{key:0})):e.createCommentVNode("",!0)]),_:1}),e.createVNode(p,{label:"部署历史",name:"history"},{default:e.withCtx(()=>[o.value==="history"?(e.openBlock(),e.createBlock(qe,{key:0})):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Pe="",O=((t,o)=>{if(t.install=a=>{for(const n of[t,...Object.values(o??{})])a.component(n.name,n)},o)for(const[a,n]of Object.entries(o))t[a]=n;return t})(P(Me,[["__scopeId","data-v-f99b9b23"]])),Fe={TCProbe:O},Ue={install(t,o){Object.entries(Fe).forEach(([a,n])=>{t.component(a,n)}),o!=null&&o.prodType&&(window.$prodType=o.prodType),o!=null&&o.envURL&&(window.$probeURL=o.envURL)}};N.TCProbe=O,N.default=Ue,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(V,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):(V=typeof globalThis<"u"?globalThis:V||self,e(V.TProbeUI={},V.Vue,V.IconsVue,V.TopdatasecUI,V.SparkMD5,V.ElementPlus))})(this,function(V,e,P,M,J,z){"use strict";const Ge="",Z={key:0,class:"absolute right--13px text-#f56c6c hover:cursor-pointer"},Q=e.defineComponent({__name:"IpPortList",props:{modelValue:{default:()=>[{ip:"",port:""}]},modelModifiers:{}},emits:["update:modelValue"],setup(o){const r=e.useModel(o,"modelValue"),{$t:n}=window;function a(){r.value=[...r.value,{ip:"",port:""}]}function c(m){const l=[...r.value];l.splice(m,1),r.value=l}return(m,l)=>{const y=e.resolveComponent("el-input"),h=e.resolveComponent("el-form-item"),f=e.resolveComponent("el-icon"),d=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,(u,x)=>(e.openBlock(),e.createElementBlock("div",{key:x,class:"flex form-m0 w-100% mb-5px"},[e.createVNode(h,{class:"w-70%"},{default:e.withCtx(()=>[e.createVNode(y,{modelValue:u.ip,"onUpdate:modelValue":T=>u.ip=T,class:"min-w-300px w-100%",placeholder:"IP"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e.createVNode(h,{class:"ml-auto w-30%"},{default:e.withCtx(()=>[e.createVNode(y,{modelValue:u.port,"onUpdate:modelValue":T=>u.port=T,class:"ml-10",placeholder:e.unref(n)("global.port")},null,8,["modelValue","onUpdate:modelValue","placeholder"])]),_:2},1024),r.value.length>1?(e.openBlock(),e.createElementBlock("div",Z,[e.createVNode(f,{onClick:T=>c(x)},{default:e.withCtx(()=>[e.createVNode(e.unref(P.CircleClose))]),_:1},8,["onClick"])])):e.createCommentVNode("",!0)]))),128)),e.createVNode(d,{class:"w-100% mt-10px border-dashed!",icon:"Plus",onClick:a})])}}}),Je="",I=(o,r)=>{const n=o.__vccOpts||o;for(const[a,c]of r)n[a]=c;return n},L=I(Q,[["__scopeId","data-v-16fc9c64"]]),D=4*1024*1024;function X(o,r){return new Promise((n,a)=>{const c=new J.ArrayBuffer,m=new FileReader,l=Math.ceil(o.size/D);let y=0;m.onload=f=>{var d;if(c.append((d=f.target)==null?void 0:d.result),y++,r){const u=Math.floor(y/l*100);r(u)}if(y<l)h();else{const u=c.end();n(u)}},m.onerror=()=>{a(new Error("MD5计算失败"))};function h(){const f=y*D,d=Math.min(f+D,o.size);m.readAsArrayBuffer(o.slice(f,d))}h()})}async function Y(o,r,n,a,c,m="/api/upload/chunk"){const l=r*D,y=Math.min(l+D,o.size),h=o.slice(l,y),f=y-l,d=new FormData;d.append("file",h,o.name),d.append("chunkIndex",String(r+1)),d.append("totalChunkNum",String(n)),d.append("fileMd5",a),d.append("tds_token",c),d.append("fileName",o.name),d.append("fileSize",String(o.size)),d.append("fileExt",o.name.substring(o.name.lastIndexOf(".")+1)),d.append("chunkSize",String(D)),d.append("currentChunkSize",String(f));try{const u=await fetch(m,{method:"POST",body:d});if(console.log(u,"upload response"),!u.ok)throw new Error(`分片 ${r+1} 上传失败,HTTP状态码: ${u.status}`);const x=await u.json();if(console.log(x,"upload result"),x.recode!==0)throw new Error(`上传失败: ${x.remsg||"未知错误"}`);return!0}catch(u){throw console.error(`上传分片 ${r+1} 时出错:`,u),u}}async function ee(o,r="/api/upload/merge"){try{if(!(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).ok)throw new Error("文件合并失败");return!0}catch(n){return console.error("合并分片时出错:",n),!1}}async function te(o){const{token:r,file:n,fileDesc:a="",uploadUrl:c="/api/upload/chunk",mergeUrl:m="/api/upload/merge",onProgress:l,onSuccess:y,onError:h}=o;try{l==null||l({progress:0,statusText:"正在计算文件MD5...",status:"preparing"});const d=await X(n,k=>{l==null||l({progress:Math.floor(k*.1),statusText:`正在计算文件MD5... ${k}%`,status:"preparing"})});l==null||l({progress:10,statusText:"MD5计算完成",status:"preparing",fileMd5:d});const u=Math.ceil(n.size/D);l==null||l({progress:10,statusText:`开始上传 (共${u}个分片)`,status:"uploading",fileMd5:d});for(let k=0;k<u;k++){const U=Math.floor(k/u*80);l==null||l({progress:10+U,statusText:`正在上传分片 ${k+1}/${u}`,status:"uploading",fileMd5:d}),await Y(n,k,u,d,r,c)}l==null||l({progress:90,statusText:"正在合并文件...",status:"merging",fileMd5:d});const x=n.name.substring(n.name.lastIndexOf(".")+1),T={fileDesc:a,fileExt:x,fileMd5:d,fileName:n.name,fileSize:String(n.size),tds_token:r,totalChunkNum:String(u)};if(!await ee(T,m))throw new Error("文件合并失败");l==null||l({progress:100,statusText:"上传成功",status:"success",fileMd5:d}),z.ElMessage.success(`${n.name} 上传成功`),y==null||y(d)}catch(f){l==null||l({progress:0,statusText:f.message||"上传失败",status:"error"}),z.ElMessage.error(`${n.name} 上传失败: ${f.message}`),h==null||h(f)}}function oe(o){if(o===0)return"0 B";const r=1024,n=["B","KB","MB","GB","TB"],a=Math.floor(Math.log(o)/Math.log(r));return Math.round(o/Math.pow(r,a)*100)/100+" "+n[a]}const g={get deployURL(){return window.$probeURL||""},get dockerURL(){return window.$dockerURL||""}},O=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/deploy`,method:"post",data:o}),re=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/add`,method:"post",data:o}),le=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/update`,method:"post",data:o}),j=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/packages/get`,method:"post",data:o,isError:!1}),v=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/get`,method:"post",data:o,isError:!1}),ne=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/del`,method:"post",data:o}),ae=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/packages/del`,method:"post",data:o}),se=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/get_arch`,method:"post",data:o,isError:!1}),de=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/deployment_history/get`,method:"post",data:o,isError:!1}),ie=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/test_ssh`,method:"post",data:o}),pe=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/check_env`,method:"post",data:o}),ce=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/servers/install_env`,method:"post",data:o}),K=(o={})=>window.$http.request({url:`${g.deployURL}/service_deploy/deployment/deploy/del`,method:"post",data:o}),ue=(o={})=>window.$http.request({url:`${g.dockerURL}/api/auth`,method:"post",data:o,isError:!1}),me=(o={})=>window.$http.request({url:`${g.dockerURL}/api/endpoints`,method:"post",data:o.data,headers:o.headers}),_e={class:"h-100%"},ye={key:0,class:"upload-progress-list"},fe={class:"file-info"},ge={class:"file-name"},he={class:"file-size"},be={class:"progress-text"},we={class:"table-box h-[calc(100%-220px)]",style:{height:"calc(100% - 220px)"}},xe={key:0},ke={class:"flex flex-wrap gap-12px p-12px"},Ne={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)] pr-12"},Ve={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},Te={class:"flex items-center"},Ce={class:"flex items-center"},Ee={class:"absolute inset-0 bg-black/60 backdrop-blur-[2px] flex flex-col items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10"},$e={key:1,class:"font-bold text-center text-gray-500 py-20"},Be=e.defineComponent({__name:"index",props:{token:{type:String,default:""}},setup(o){const r=e.ref(),n=e.ref(),a=e.ref("快速部署"),c=e.ref({}),{$t:m,$messageBox:l}=window,y=o;function h(i){c.value={id:i.id},n.value.open()}const f=e.ref([{ip:"",port:""}]),d=e.ref([{ip:"",port:""}]),u=e.ref([{ip:"",port:""}]),x=e.ref([{ip:"",port:""}]);async function T(i){const _=(C,t)=>{const s=Math.max(C.length,t.length);return Array.from({length:s},(S,w)=>{var p,b,F,E;return{src_ip:((p=C[w])==null?void 0:p.ip)||"",src_port:Number((b=C[w])==null?void 0:b.port)||0,dst_ip:((F=t[w])==null?void 0:F.ip)||"",dst_port:Number((E=t[w])==null?void 0:E.port)||0}})},B={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:_(f.value,d.value),filterBlacklist:_(u.value,x.value)}};await O({data:B}),r.value.getTableList(),n.value.close()}async function q(i){l(i,"file_name",m("button.delete"),"error").then(async()=>{const _=i.map(B=>B.id);await ae({data:_}),r.value.getTableList()})}async function k(i){l("是否卸载该探针","","卸载","error").then(async()=>{await K({deploy_id:[i.id],service_type:window.$prodType}),r.value.getTableList()})}const U=e.reactive([{field:"server_id",name:"选择服务器",enum:()=>v({service_type:window.$prodType}),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 _;return((_=i.row.deployment_server)==null?void 0:_.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,rules:[{required:!0,type:"any"}]},{field:"engine_port",name:"流量接收引擎端口",show:{type:"input",dataType:"number",value:6379},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(L,{modelValue:f.value,"onUpdate:modelValue":i=>f.value=i},null)]),e.createVNode("div",{style:"width: 100%"},[e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(L,{modelValue:d.value,"onUpdate:modelValue":i=>d.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(L,{modelValue:u.value,"onUpdate:modelValue":i=>u.value=i},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(L,{modelValue:x.value,"onUpdate:modelValue":i=>x.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:()=>h(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)])}]),$=e.ref([]);function A(i){const _=i.raw;if(!_)return;const B={fileName:_.name,fileSize:_.size,progress:0,progressStatus:"",statusText:"准备上传..."};$.value.push(B);const C=$.value.length-1;te({file:_,fileDesc:"探针安装包",uploadUrl:g.deployURL+"/service_deploy/deployment/packages/upload",mergeUrl:g.deployURL+"/service_deploy/deployment/packages/upload_merge",token:y.token,onProgress:t=>{const s=$.value[C];s&&(s.progress=t.progress,s.statusText=t.statusText,t.fileMd5&&(s.fileMd5=t.fileMd5),t.status==="error"?s.progressStatus="exception":t.status==="success"?s.progressStatus="success":s.progressStatus="")},onSuccess:()=>{var s;const t=$.value[C];t&&(t.progress=100,t.progressStatus="success",t.statusText="上传成功"),(s=r.value)==null||s.getTableList(),setTimeout(()=>{const S=$.value.findIndex(w=>w.fileName===_.name);S!==-1&&$.value.splice(S,1)},3e3)},onError:t=>{console.error("文件上传失败:",t);const s=$.value[C];s&&(s.progressStatus="exception",s.statusText=t.message||"上传失败")}})}return(i,_)=>{const B=e.resolveComponent("el-icon"),C=e.resolveComponent("el-upload"),t=e.resolveComponent("el-progress"),s=e.resolveComponent("Delete"),S=e.resolveComponent("el-button"),w=e.resolveComponent("el-table-column");return e.openBlock(),e.createElementBlock("div",_e,[e.createVNode(C,{class:"upload-demo mt-10px",drag:"",action:"","auto-upload":!1,accept:".tar.gz,.zip","on-change":A,"show-file-list":!1,multiple:""},{default:e.withCtx(()=>[e.createVNode(B,{class:"el-icon--upload"},{default:e.withCtx(()=>[e.createVNode(e.unref(P.UploadFilled))]),_:1}),_[0]||(_[0]=e.createElementVNode("div",{class:"el-upload__text"},[e.createTextVNode(" 点击或拖拽文件到此处上传  "),e.createElementVNode("br"),e.createElementVNode("em",null,"支持的格式: tar.gz, zip")],-1))]),_:1}),$.value.length>0?(e.openBlock(),e.createElementBlock("div",ye,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.value,p=>(e.openBlock(),e.createElementBlock("div",{key:p.fileName,class:"upload-progress-item"},[e.createElementVNode("div",fe,[e.createElementVNode("span",ge,e.toDisplayString(p.fileName),1),e.createElementVNode("span",he,e.toDisplayString(e.unref(oe)(p.fileSize)),1)]),e.createVNode(t,{percentage:p.progress,status:p.progressStatus},null,8,["percentage","status"]),e.createElementVNode("div",be,e.toDisplayString(p.statusText),1)]))),128))])):e.createCommentVNode("",!0),e.createElementVNode("div",we,[e.createVNode(e.unref(M.TdsTable),{ref_key:"refTdsTable",ref:r,columns:U,"request-api":e.unref(j),options:i.$tableOptions()},{default:e.withCtx(()=>[e.createVNode(w,{type:"expand"},{default:e.withCtx(p=>[p.row.deployment_server&&p.row.deployment_server.length>0?(e.openBlock(),e.createElementBlock("div",xe,[_[4]||(_[4]=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(p.row.deployment_server,b=>(e.openBlock(),e.createElementBlock("div",{key:b.id,class:"group w-25% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-lg transition-all duration-300 relative overflow-hidden"},[e.createElementVNode("div",{class:e.normalizeClass(["absolute top-0 right-0 px-2 py-1 text-12px font-medium border-b border-l rounded-bl-8px",{"text-green-600 bg-green-50 border-green-200":b.deploy_type===0,"text-amber-600 bg-amber-50 border-amber-200":b.deploy_type===1,"text-red-600 bg-red-50 border-red-200":b.deploy_type===2}])},e.toDisplayString(b.deploy_type===0?"第一次安装":b.deploy_type===1?"升级":"卸载"),3),e.createElementVNode("div",Ne,e.toDisplayString(b.server_name),1),e.createElementVNode("div",Ve,[e.createElementVNode("p",Te,[_[1]||(_[1]=e.createElementVNode("span",{class:"opacity-70 mr-2"},"IP:",-1)),e.createTextVNode(" "+e.toDisplayString(b.ip_address),1)]),e.createElementVNode("p",Ce,[_[2]||(_[2]=e.createElementVNode("span",{class:"opacity-70 mr-2"},"时间:",-1)),e.createTextVNode(" "+e.toDisplayString(b.deployment_time),1)])]),e.createElementVNode("div",Ee,[e.createVNode(S,{type:"danger",circle:"",class:"mb-2 transform scale-90 group-hover:scale-100 transition-transform duration-300",onClick:e.withModifiers(F=>k(b),["stop"])},{default:e.withCtx(()=>[e.createVNode(B,{size:"20"},{default:e.withCtx(()=>[e.createVNode(s)]),_:1})]),_:1},8,["onClick"]),_[3]||(_[3]=e.createElementVNode("span",{class:"text-white text-12px font-medium tracking-wide"},"卸载",-1))])]))),128))])])):(e.openBlock(),e.createElementBlock("div",$e,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","options"])]),e.createVNode(e.unref(M.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:n},i.$formBindProps({title:a.value,form:c.value,columns:U}),{onSubmit:T}),null,16)])}}}),Se={class:"table-box"},Le={class:"flex items-center"},Ue={key:0},De={class:"flex flex-wrap gap-12px p-12px"},qe={class:"font-bold text-14px mb-8px text-[var(--el-text-color-primary)] pr-12"},Fe={class:"text-12px text-[var(--el-text-color-regular)] space-y-4px"},Me={class:"flex items-center"},Ae={class:"flex items-center"},Re={class:"absolute inset-0 bg-black/60 backdrop-blur-[2px] flex flex-col items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-10"},Pe={key:1,class:"font-bold text-center text-gray-500 py-20"},ze=e.defineComponent({__name:"index",setup(o){const{$t:r,$messageBox:n}=window,a=e.ref(),c=e.ref(),m=e.ref(""),l=e.ref({}),y=e.ref("show"),h=e.reactive({service_type:window.$prodType});function f(t){l.value=t?Object.assign({},t):{},y.value="show",m.value=t?"修改服务器":"添加服务器",c.value.open()}const d=t=>{n(t,"server_name",r("button.delete"),"error").then(async()=>{await ne({data:t.map(s=>s.id),service_type:window.$prodType}),a.value.getTableList()})};function u(t){l.value={id:t.id},y.value="deploy",m.value="快速部署",c.value.open()}async function x(t){n("是否卸载该探针","","卸载","error").then(async()=>{await K({deploy_id:[t.id],service_type:window.$prodType}),a.value.getTableList()})}const T=e.ref([{ip:"",port:""}]),q=e.ref([{ip:"",port:""}]),k=e.ref([{ip:"",port:""}]),U=e.ref([{ip:"",port:""}]);async function $(t){if(y.value==="show"){l.value.id?(await le({data:{...t,id:l.value.id}}),a.value.getTableList(),c.value.close()):(await re({data:t}),a.value.getTableList(),c.value.close());return}if(y.value==="docker"){const w=await ue({password:"Tds@12345",username:"admin"}),p=new FormData;p.append("Name",t.Name),p.append("EndpointType","1"),p.append("URL","tcp://"+t.URL),p.append("PublicURL",t.URL),p.append("GroupID","1"),p.append("TagIds","[]"),p.append("TLS","false"),p.append("TLSSkipVerify","false"),p.append("TLSSkipClientVerify","false"),p.append("TLSCACertFile",""),p.append("TLSCertFile",""),p.append("TLSKeyFile",""),await me({data:p,headers:{Authorization:`${w.jwt}`}}),c.value.close();return}const s=(w,p)=>{const b=Math.max(w.length,p.length);return Array.from({length:b},(F,E)=>{var N,R,W,G;return{src_ip:((N=w[E])==null?void 0:N.ip)||"",src_port:Number((R=w[E])==null?void 0:R.port)||0,dst_ip:((W=p[E])==null?void 0:W.ip)||"",dst_port:Number((G=p[E])==null?void 0:G.port)||0}})},S={packages_id:[t.packages_id],server_id:[l.value.id],service_type:window.$prodType,deploy_params:{probe_name:t.probe_name||"",collection_mode:t.collection_mode,interface:t.interface||"",engine_ip:t.engine_ip||"",engine_port:t.engine_port||"",filterWhitelist:s(T.value,q.value),filterBlacklist:s(k.value,U.value)}};await O({data:S}),a.value.getTableList(),c.value.close()}async function A(t){await ie({data:[t.id]}),a.value.getTableList()}async function i(t){await pe({data:[t.id]}),a.value.getTableList()}async function _(t){await ce({data:[t.id]}),a.value.getTableList()}function B(t){y.value="docker",m.value="添加容器监控",l.value={URL:`${t.ip_address}:2375`},c.value.open()}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用户",hide:!0,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:se,hide:!0,show:{type:"select"},rules:[{required:!0}]},{field:"deployed_count",name:"已部署探针数量",render:t=>e.createVNode("span",null,[t.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:3,tagType:"danger"},{label:"成功",value:2,tagType:"success"},{label:"检测中",value:1,tagType:"warning"},{label:"未检测",value:0,tagType:"default"}]},{field:"check_ssh_msg",name:"连通性检查失败原因",width:150},{field:"check_env_ok",name:"安装环境",tag:!0,enum:[{label:"失败",value:3,tagType:"danger"},{label:"成功",value:2,tagType:"success"},{label:"检测中",value:1,tagType:"warning"},{label:"未检测",value:0,tagType:"default"}]},{field:"check_env_msg",name:"环境检查失败原因",width:150},{field:"packages_id",name:"安装包",enum:j,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",value:6379},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(L,{modelValue:T.value,"onUpdate:modelValue":t=>T.value=t},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(L,{modelValue:q.value,"onUpdate:modelValue":t=>q.value=t},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(L,{modelValue:k.value,"onUpdate:modelValue":t=>k.value=t},null),e.createVNode("p",{class:"color-[var(--el-text-color-regular)]"},[e.createTextVNode("目的ip端口:")]),e.createVNode(L,{modelValue:U.value,"onUpdate:modelValue":t=>U.value=t},null)])},hide:!0},{field:"Name",name:"名称",hide:!0,docker:{type:"input"},rules:[{required:!0}]},{field:"URL",name:"端点 URL ",hide:!0,docker:{type:"input"}},{field:"status_monitorning",name:"状态监控",render:t=>e.createVNode(e.Fragment,null,[e.createVNode(e.resolveComponent("el-button"),{class:"custom-btn",type:"primary",icon:"Plus",link:!0,onClick:()=>B(t.row)},{default:()=>[e.createTextVNode("添加")]})])},{field:"operation",name:window.$t("global.operate"),width:180,fixed:"right",render:t=>e.createVNode("div",null,[e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",icon:"Edit",title:"修改",class:"custom-btn",onClick:()=>f(t.row)},null),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",icon:"Connection",title:"连通性检查",class:"custom-btn",onClick:()=>A(t.row)},null),e.createVNode(e.resolveComponent("el-button"),{link:!0,type:"primary",class:"custom-btn",onClick:()=>i(t.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:()=>_(t.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:()=>u(t.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:r("button.delete"),onClick:()=>d([t.row])},null)])}]);return(t,s)=>{const S=e.resolveComponent("el-button"),w=e.resolveComponent("Delete"),p=e.resolveComponent("el-icon"),b=e.resolveComponent("el-table-column"),F=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",Se,[e.createVNode(F,{ref_key:"refTdsTable",ref:a,columns:C,"request-api":e.unref(v),"search-col":4,"init-param":h,options:t.$tableOptions({refresh:{ssh_status:[1],check_env_ok:[1]}}),"reserve-selection":""},{tableHeader:e.withCtx(()=>[e.createElementVNode("div",Le,[e.createVNode(S,{class:"custom-btn",type:"primary",icon:"Plus",plain:"",onClick:s[0]||(s[0]=E=>f())},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(r)("button.add")),1)]),_:1})])]),default:e.withCtx(()=>[e.createVNode(b,{type:"expand"},{default:e.withCtx(E=>[E.row.deployment_packages&&E.row.deployment_packages.length>0?(e.openBlock(),e.createElementBlock("div",Ue,[s[4]||(s[4]=e.createElementVNode("div",{class:"font-bold text-14px mt-12px"},"已部署的探针包",-1)),e.createElementVNode("div",De,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.row.deployment_packages,N=>(e.openBlock(),e.createElementBlock("div",{key:N.id,class:"group w-25% px-20px py-10px rounded-8px bg-[var(--el-fill-color-light)] border border-solid border-[var(--el-border-color-lighter)] hover:shadow-lg transition-all duration-300 relative overflow-hidden"},[e.createElementVNode("div",{class:e.normalizeClass(["absolute top-0 right-0 px-2 py-1 text-12px font-medium border-b border-l rounded-bl-8px",{"text-green-600 bg-green-50 border-green-200":N.deploy_type===0,"text-amber-600 bg-amber-50 border-amber-200":N.deploy_type===1,"text-red-600 bg-red-50 border-red-200":N.deploy_type===2}])},e.toDisplayString(N.deploy_type===0?"第一次安装":N.deploy_type===1?"升级":"卸载"),3),e.createElementVNode("div",qe,e.toDisplayString(N.file_name),1),e.createElementVNode("div",Fe,[e.createElementVNode("p",Me,[s[1]||(s[1]=e.createElementVNode("span",{class:"opacity-70 mr-2"},"版本:",-1)),e.createTextVNode(" "+e.toDisplayString(N.version),1)]),e.createElementVNode("p",Ae,[s[2]||(s[2]=e.createElementVNode("span",{class:"opacity-70 mr-2"},"部署时间:",-1)),e.createTextVNode(" "+e.toDisplayString(N.deployment_time),1)])]),e.createElementVNode("div",Re,[e.createVNode(S,{type:"danger",circle:"",class:"mb-2 transform scale-90 group-hover:scale-100 transition-transform duration-300",onClick:e.withModifiers(R=>x(N),["stop"])},{default:e.withCtx(()=>[e.createVNode(p,{size:"20"},{default:e.withCtx(()=>[e.createVNode(w)]),_:1})]),_:1},8,["onClick"]),s[3]||(s[3]=e.createElementVNode("span",{class:"text-white text-12px font-medium tracking-wide"},"卸载",-1))])]))),128))])])):(e.openBlock(),e.createElementBlock("div",Pe,"暂无部署服务器记录"))]),_:1})]),_:1},8,["columns","request-api","init-param","options"]),e.createVNode(e.unref(M.TdsForm),e.mergeProps({ref_key:"refTdsForm",ref:c},t.$formBindProps({title:m.value,form:l.value,columns:C,formKey:y.value}),{onSubmit:$}),null,16)])}}}),Ie={class:"table-box"},Oe={class:"whitespace-pre-wrap font-mono py-20px px-10px bg-gray-100 rounded text-sm text-gray-800"},je=e.defineComponent({__name:"index",setup(o){const r=e.reactive({service_type:window.$prodType}),n=e.ref(),a=e.reactive([{field:"packages_name",name:"探针包",render:m=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[m.row.packages_name]),e.createVNode("p",{class:"text-gray-400"},[m.row.packages_version])])},{field:"server_name",name:"服务器",render:m=>e.createVNode(e.Fragment,null,[e.createVNode("p",{class:"font-bold"},[m.row.server_name]),e.createVNode("p",{class:"text-gray-400"},[m.row.ip_address])])},{field:"deployment_time",name:"部署时间"},{field:"deployment_status",name:"状态",tag:!0,enum:[{label:"未知",value:-1,tagType:"default"},{label:"待执行",value:0,tagType:"default"},{label:"部署中",value:1,tagType:"warning"},{label:"部署成功",value:2,tagType:"success"},{label:"部署失败",value:3,tagType:"danger"}]}]),c=setInterval(()=>{n.value&&n.value.getTableList()},5e3);return e.onUnmounted(()=>{clearInterval(c)}),(m,l)=>{const y=e.resolveComponent("el-table-column"),h=e.resolveComponent("TdsTable");return e.openBlock(),e.createElementBlock("div",Ie,[e.createVNode(h,{ref_key:"refTdsTable",ref:n,columns:a,"search-col":4,"request-api":e.unref(de),options:m.$tableOptions(),"init-param":r,"reserve-selection":""},{default:e.withCtx(()=>[e.createVNode(y,{type:"expand"},{default:e.withCtx(f=>[e.createElementVNode("div",Oe,e.toDisplayString(f.row.deployment_log),1)]),_:1})]),_:1},8,["columns","request-api","options","init-param"])])}}}),ve={class:"main-wrapper"},Ke=e.defineComponent({name:"TCProbe",__name:"index",props:{token:{type:String,default:""}},setup(o){const r=e.ref("package");return(n,a)=>{const c=e.resolveComponent("el-tab-pane"),m=e.resolveComponent("el-tabs");return e.openBlock(),e.createElementBlock("div",ve,[e.createVNode(m,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=l=>r.value=l),class:"demo-tabs"},{default:e.withCtx(()=>[e.createVNode(c,{label:"安装包管理",name:"package"},{default:e.withCtx(()=>[r.value==="package"?(e.openBlock(),e.createBlock(Be,{key:0,token:o.token},null,8,["token"])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(c,{label:"探针部署",name:"deploy"},{default:e.withCtx(()=>[r.value==="deploy"?(e.openBlock(),e.createBlock(ze,{key:0})):e.createCommentVNode("",!0)]),_:1}),e.createVNode(c,{label:"部署历史",name:"history"},{default:e.withCtx(()=>[r.value==="history"?(e.openBlock(),e.createBlock(je,{key:0})):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Ze="",H=((o,r)=>{if(o.install=n=>{for(const a of[o,...Object.values(r??{})])n.component(a.name,a)},r)for(const[n,a]of Object.entries(r))o[n]=a;return o})(I(Ke,[["__scopeId","data-v-f99b9b23"]])),He={TCProbe:H},We={install(o,r){Object.entries(He).forEach(([n,a])=>{o.component(n,a)}),r!=null&&r.prodType&&(window.$prodType=r.prodType),r!=null&&r.envURL&&(window.$probeURL=r.envURL),r!=null&&r.dockerURL&&(window.$dockerURL=r.dockerURL)}};V.TCProbe=H,V.default=We,Object.defineProperties(V,{__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.8",
3
+ "version": "1.0.10",
4
4
  "description": "探针部署管理组件",
5
5
  "author": "wangguiwang",
6
6
  "license": "MIT",