@topdatasec/probe 1.0.5 → 1.0.7

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(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"}})});
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"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topdatasec/probe",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "探针部署管理组件",
5
5
  "author": "wangguiwang",
6
6
  "license": "MIT",