Files
aiops/backend/static/assets/kubernetes-J8O09fK7.js
T
attacker 77c234b060 feat(audit): F1+F2 告警静默规则标记完成 + 审计日志CSV导出实现
F1 告警静默规则 [done]:
- 后端 alert_silence.go: CRUD + Toggle (onetime/daily/weekly 三模式)
- 告警引擎 isSilenced 集成 (alert_engine.go)
- 前端 SilenceRuleTab + SilenceDialog
- 路由 /alerts/silences 已注册

F2 审计日志导出 [done]:
- 重写 ExportAuditLogs: 真正的 CSV 导出 (encoding/csv + UTF-8 BOM)
- 支持 module/action/username/startTime/endTime 筛选
- 导出限制 10000 条防溢出,自动记录审计日志
- JSON 格式向后兼容 (format=json)
- 前端 exportLogs 传递查询参数

同时包含累积的前期工作:
- 目录重构 internal/ -> controller/model/router (v0.55-v0.57)
- 后端分层架构 dto/repository/service/utils
- 审计模块全功能 (终端审计/操作审计/登录日志)
- asciicast v2 录制格式
- SFTP 文件浏览器
- StatStrip 紧凑统计条
- 在线会话自动刷新
- LiveMonitor WebSocket 诊断修复

验证: go build ✅ | npm run build ✅ | Docker 部署 ✅ | 10 回归端点 ✅ | CSV 导出 ✅ | 静默 CRUD ✅
2026-06-25 20:16:30 +08:00

3 lines
8.7 KiB
JavaScript

import{h as n,W as i}from"./index-DfyorCky.js";const m={getClusters:async()=>n.get("/kubernetes-clusters"),getClusterDetail:async e=>n.get(`/kubernetes-clusters/${e}/detail`),createCluster:async e=>n.post("/kubernetes-clusters",e),updateCluster:async(e,t)=>n.put(`/kubernetes-clusters/${e}`,t),deleteCluster:async e=>n.delete(`/kubernetes-clusters/${e}`),getNodes:async e=>n.get(`/kubernetes-clusters/${e}/nodes`),getClusterNodes:async e=>n.get(`/kubernetes/${e}/nodes`),getNodeDetail:async(e,t)=>n.get(`/kubernetes/${e}/nodes/${encodeURIComponent(t)}`),getPods:async e=>n.get(`/kubernetes-clusters/${e}/pods`),getDeployments:async e=>n.get(`/kubernetes-clusters/${e}/deployments`),getServices:async e=>n.get(`/kubernetes-clusters/${e}/services`),getIngresses:async e=>n.get(`/kubernetes-clusters/${e}/ingresses`),syncCluster:async e=>n.post(`/kubernetes-clusters/${e}/sync`),exportAllResources:async e=>n.download(`/kubernetes/${e}/export`,`cluster-${e}-resources.tar.gz`),getTopology:async e=>n.get(`/kubernetes-clusters/${e}/topology`),saveTopology:async(e,t)=>n.put(`/kubernetes-clusters/${e}/topology`,{layout_data:t}),getPodLogs:async(e,t,s,r=200,a)=>{const c=new URLSearchParams({tail:String(r)});return a&&c.set("container",a),n.get(`/kubernetes/${e}/namespace/${t}/pods/${s}/logs?${c}`)},getPodLogsEnhanced:async(e,t,s,r={})=>{const a=new URLSearchParams;r.container&&a.set("container",r.container),r.tailLines&&r.tailLines>0&&a.set("tailLines",String(r.tailLines)),r.previous&&a.set("previous","true"),r.sinceTime&&a.set("sinceTime",r.sinceTime);const c=a.toString();return n.get(`/kubernetes/${e}/namespace/${t}/pods/${s}/logs${c?`?${c}`:""}`)},buildPodLogsStreamUrl:(e,t,s,r={})=>{const a=new URLSearchParams;return a.set("stream","true"),r.container&&a.set("container",r.container),r.tailLines&&r.tailLines>0&&a.set("tailLines",String(r.tailLines)),r.previous&&a.set("previous","true"),r.sinceTime&&a.set("sinceTime",r.sinceTime),`${`${window.location.protocol}//${window.location.host}`}/api/v1/kubernetes/${e}/namespace/${t}/pods/${s}/logs?${a}`},execPod:async(e,t,s,r,a)=>n.post(`/kubernetes/${e}/namespace/${t}/pods/${s}/exec`,{command:r,container:a}),buildPodExecWsUrl:(e,t,s,r,a)=>{const l=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`.replace(/^http/,"ws").replace("/api/v1",""),$=i.getState().token||"",u=new URLSearchParams;r&&u.set("container",r),a&&u.set("command",a),$&&u.set("token",$);const p=u.toString();return`${l}/ws/kubernetes-exec/${e}/namespaces/${t}/pods/${s}${p?`?${p}`:""}`},listPodFiles:async(e,t,s,r,a)=>n.post(`/kubernetes/${e}/namespace/${t}/pods/${s}/files/list`,{path:r,container:a}),buildPodFileDownloadUrl:(e,t,s,r,a)=>{const c=new URLSearchParams({path:r});a&&c.set("container",a);const o=i.getState().token||"";return o&&c.set("token",o),`${`${window.location.protocol}//${window.location.host}`}/api/v1/kubernetes/${e}/namespace/${t}/pods/${s}/files/download?${c}`},readPodFileText:async(e,t,s,r,a)=>{const c=m.buildPodFileDownloadUrl(e,t,s,r,a),o=await fetch(c);if(!o.ok)throw new Error(`HTTP ${o.status}`);return o.text()},uploadPodFile:async(e,t,s,r,a,c)=>{const o=new FormData;o.append("file",a),o.append("path",r),c&&o.append("container",c);const l=i.getState().token||localStorage.getItem("token")||"",$=`${window.location.protocol}//${window.location.host}`,u=await fetch(`${$}/api/v1/kubernetes/${e}/namespace/${t}/pods/${s}/files/upload`,{method:"POST",headers:l?{Authorization:`Bearer ${l}`}:{},body:o}),p=await u.json();if(!u.ok||p.code!==200)throw new Error(p.message||`HTTP ${u.status}`);return p.data},scaleDeployment:async(e,t,s,r)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/scale`,{replicas:r}),restartDeployment:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/restart`),pauseDeployment:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/pause`),resumeDeployment:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/resume`),updateDeploymentImage:async(e,t,s,r,a)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/update-image`,{image:r,container_name:a}),getHPAs:async(e,t)=>t?n.get(`/kubernetes/${e}/namespace/${t}/hpas`):n.get(`/kubernetes/${e}/hpas`),createHPA:async(e,t)=>n.post(`/kubernetes/${e}/namespace/${t.namespace}/hpas`,t),deleteHPA:async(e,t,s)=>n.delete(`/kubernetes/${e}/namespace/${t}/hpas/${s}`),getCronJobs:async(e,t)=>t?n.get(`/kubernetes/${e}/namespace/${t}/cronjobs`):n.get(`/kubernetes-clusters/${e}/cronjobs`),createCronJob:async(e,t)=>n.post(`/kubernetes/${e}/namespace/${t.namespace}/cronjobs`,t),suspendCronJob:async(e,t,s,r)=>n.post(`/kubernetes/${e}/namespace/${t}/cronjobs/${s}/suspend`,{suspend:r}),triggerCronJob:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/cronjobs/${s}/trigger`),deleteCronJob:async(e,t,s)=>n.delete(`/kubernetes/${e}/namespace/${t}/cronjobs/${s}`),getNamespaceDeployments:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/deployments`),getNamespacePods:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/pods`),getNamespaceServices:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/services`),getNamespaceIngresses:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/ingresses`),getNamespaceConfigMaps:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/configmaps`),getNamespaceSecrets:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/secrets`),getNamespaces:async e=>n.get(`/kubernetes/${e}/namespaces`),getAllDeployments:async e=>n.get(`/kubernetes/${e}/deployments`),getAllPods:async e=>n.get(`/kubernetes/${e}/pods`),getPVCs:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/pvcs`),deletePVC:async(e,t,s)=>n.delete(`/kubernetes/${e}/namespace/${t}/pvcs/${s}`),getStatefulSets:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/statefulsets`),getDaemonSets:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/daemonsets`),getServiceAccounts:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/serviceaccounts`),getRoles:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/roles`),getRoleBindings:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/rolebindings`),getStatefulSetDetail:async(e,t,s)=>n.get(`/kubernetes/${e}/namespace/${t}/statefulsets/${s}`),getDaemonSetDetail:async(e,t,s)=>n.get(`/kubernetes/${e}/namespace/${t}/daemonsets/${s}`),scaleStatefulSet:async(e,t,s,r)=>n.post(`/kubernetes/${e}/namespace/${t}/statefulsets/${s}/scale`,{replicas:r}),restartStatefulSet:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/statefulsets/${s}/restart`,{}),restartDaemonSet:async(e,t,s)=>n.post(`/kubernetes/${e}/namespace/${t}/daemonsets/${s}/restart`,{}),getResourceYaml:async(e,t,s,r)=>n.getRaw(`/kubernetes/${e}/namespace/${t}/${s}/${r}/yaml`),updateResourceYaml:async(e,t,s,r,a)=>n.putRaw(`/kubernetes/${e}/namespace/${t}/${s}/${r}/yaml`,a,"application/yaml"),deleteResourceYaml:async(e,t,s,r)=>n.delete(`/kubernetes/${e}/namespace/${t}/${s}/${r}/yaml`),exportAsCSV:(e,t)=>{if(t.length===0)return;const s=Object.keys(t[0]),r=[s.join(","),...t.map(o=>s.map(l=>JSON.stringify(o[l]??"")).join(","))].join(`
`),a=new Blob(["\uFEFF"+r],{type:"text/csv;charset=utf-8;"}),c=document.createElement("a");c.href=URL.createObjectURL(a),c.download=e,c.click()},exportAsJSON:(e,t)=>{const s=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),r=document.createElement("a");r.href=URL.createObjectURL(s),r.download=e,r.click()},getPodMetrics:async(e,t)=>{const s=t?{namespace:t}:void 0;return n.get(`/kubernetes/${e}/metrics/pods`,s)},getEvents:async(e,t,s)=>{const r={};return t&&(r.namespace=t),s&&(r.type=s),n.get(`/kubernetes/${e}/events`,r)},getEventsSummary:async(e,t,s)=>{const r={};return t&&(r.namespace=t),s&&(r.hours=s),n.get(`/kubernetes/${e}/events/summary`,r)},getCapacity:async(e,t)=>{const s=t?{namespace:t}:void 0;return n.get(`/kubernetes/${e}/capacity`,s)},getMultiClusterComparison:async()=>n.get("/kubernetes/compare"),applyYAML:async(e,t)=>n.post(`/kubernetes/${e}/yaml/apply`,{yaml:t}),getReplicaSets:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/replicasets`),getDeploymentRevisions:async(e,t,s)=>n.get(`/kubernetes/${e}/namespace/${t}/deployments/${s}/revisions`),rollbackDeployment:async(e,t,s,r)=>n.post(`/kubernetes/${e}/namespace/${t}/deployments/${s}/rollback`,{revision:r}),getDeployment:async(e,t,s)=>{try{return await n.get(`/kubernetes/${e}/namespace/${t}/deployments/${s}`)}catch{const r=await n.get(`/kubernetes/${e}/namespace/${t}/deployments`);return(Array.isArray(r)?r:r?.list||r?.items||r?.data||[]).find(c=>c.name===s)||null}},getNamespacesDetail:async e=>n.get(`/kubernetes/${e}/namespaces/detail`),getNamespaceDetail:async(e,t)=>n.get(`/kubernetes/${e}/namespace/${t}/detail`),createNamespace:async(e,t,s)=>n.post(`/kubernetes/${e}/namespaces`,{name:t,labels:s||{}}),deleteNamespace:async(e,t)=>n.delete(`/kubernetes/${e}/namespaces/${t}`)};export{m as k};