f127f07ab2
rdp_hosts 表与专用 API,在 3389远程页添加/连接,不再依赖子机列表。 Co-authored-by: Cursor <cursoragent@cursor.com>
4 lines
31 KiB
JavaScript
4 lines
31 KiB
JavaScript
import{a as e,x as t}from"./VDataTable-xIamJ7nl.js";import{n,t as r}from"./useSnackbar-yP7apGY8.js";import{n as i,t as a}from"./VRow-DQSkwKSy.js";import{Bt as o,Cr as s,Ct as c,Er as l,F as ee,Ft as te,Gt as ne,Ht as re,I as u,Ir as ie,K as ae,Mr as oe,Nr as se,Or as ce,Q as d,Qr as le,Rr as f,Rt as ue,Sr as p,Tr as m,Ur as h,Ut as de,Vr as g,Vt as fe,Wt as pe,Yr as me,Zr as _,_ as v,an as he,br as y,di as b,en as x,gr as S,hi as C,hr as ge,ii as w,k as _e,l as ve,m as ye,mr as be,n as xe,pi as Se,pr as Ce,qt as we,tt as Te,v as T,xr as E,y as D,yr as O,zt as Ee}from"./index-_6O5JL4W.js";import{n as De,t as Oe}from"./initMonaco-D1bUcg_U.js";import{t as ke}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as Ae}from"./usePageActivateRefresh-CzjzBWP4.js";import{n as je,t as Me}from"./dataTable-esDY4cOk.js";import{t as Ne}from"./paginatedFetch-BvAUiQXI.js";import{S as k,_ as A,b as j,t as Pe,v as M}from"./VTextField-CD7WwKb1.js";import{t as Fe}from"./VSelect-CDx3fXFa.js";import{t as Ie}from"./VDataTableServer-lHUUBg35.js";import{t as N}from"./apiError-cM_GzSSg.js";import{t as Le}from"./useServerList-C-O2e1dF.js";import{t as Re}from"./VDialog-DEJqI2_G.js";import{r as ze}from"./validation-BMzYTJL4.js";import{t as Be}from"./VTextarea-Chu9xRUJ.js";import{t as Ve}from"./ServerCategoryPicker-C52wtNcv.js";import{t as He}from"./VSwitch-71TafizM.js";import{n as Ue,t as We}from"./execDetailGrouping-BfJ_-Vag.js";import{i as Ge,n as Ke,r as qe,t as Je}from"./VExpansionPanels-D4bNYoOX.js";var Ye=ke(ce({__name:`ScriptContentEditor`,props:{modelValue:{},readonly:{type:Boolean}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=e,r=t,i=De(),a=w(),o=null,c=!1;function l(){a.value&&(o?.dispose(),o=i.editor.create(a.value,{...Oe({language:`shell`,readOnly:n.readonly??!1}),value:n.modelValue||``}),o.onDidChangeModelContent(()=>{c||!o||r(`update:modelValue`,o.getValue())}))}return me(()=>n.modelValue,e=>{o&&o.getValue()!==e&&(c=!0,o.setValue(e||``),c=!1)}),me(()=>n.readonly,e=>{o?.updateOptions({readOnly:e??!1})}),f(()=>{l()}),ie(()=>{o?.dispose(),o=null}),(e,t)=>(g(),s(`div`,{ref_key:`host`,ref:a,class:`script-content-editor`},null,512))}}),[[`__scopeId`,`data-v-8c9e5994`]]),Xe={class:`text-body-1 font-weight-medium`},Ze={class:`text-body-2 text-medium-emphasis`},Qe={class:`text-caption text-medium-emphasis mt-2`},$e={key:3,class:`d-flex justify-center mt-4`},et={class:`text-caption`},tt={key:2,class:`text-center text-medium-emphasis py-6`},nt={class:`text-body-2`},rt={class:`text-caption text-medium-emphasis`},it={class:`d-flex align-center flex-wrap ga-1`},at={class:`text-caption text-medium-emphasis mb-2`},ot={class:`text-body-2 mb-3 pa-3 rounded bg-surface-variant overflow-auto`,style:{"max-height":`100px`}},st={key:0,class:`d-flex flex-wrap ga-2 mb-3`},ct={class:`text-body-2`},lt={class:`d-flex align-center flex-wrap ga-2 mb-3`},ut=[`onClick`],dt={class:`font-weight-medium`},ft={key:0,class:`text-caption text-medium-emphasis`},pt=[`title`],mt={key:0},ht={class:`d-flex align-center ga-2 flex-grow-1 min-width-0`},gt=[`title`],_t=[`onClick`],vt={class:`font-weight-medium`},yt={key:0,class:`text-caption text-medium-emphasis`},bt={class:`text-error font-weight-medium`},xt={key:4,class:`text-center text-medium-emphasis py-4`},St={class:`d-flex align-center flex-wrap ga-2 mb-2`},Ct={class:`text-subtitle-2`},wt={key:0,class:`text-medium-emphasis`},Tt={class:`text-body-2 overflow-auto exec-detail-output`},Et=ke(ce({name:`ScriptsPage`,__name:`ScriptsPage`,setup(ie){let ce=[...Me],f=r(),De=he(),{servers:Oe,loading:ke,loadServers:Et}=Le(),Dt=[{label:`运维`,value:`ops`},{label:`部署`,value:`deploy`},{label:`检查`,value:`check`},{label:`清理`,value:`cleanup`}],Ot=w(!1),kt=w(``),P=w([]),F=w(null),At=w([]),jt=w(1),Mt=w(20),I=w(!1),Nt=w(null),Pt=w(!1),L=w({name:``,category:`ops`,description:``,content:``}),R=w(!1),z=w(null),B=w([]),Ft=w(300),It=w(!1),Lt=w(null),Rt=w(!1),V=w(!1),zt=w(null),Bt=w(null),Vt=w([]),H=w(!1),Ht=w([]),Ut=w(0),U=w(1),Wt=w(20),Gt=w(!1),W=w(null),Kt=w(!1),qt=w(``),G=w([]),Jt=w(60),Yt=w(!1),Xt=w(null),Zt=w(!1),Qt=w(!1),K=w(null),$t=w(!1),en=w(null),q=w(`all`),tn=w(`list`),J=w(null),nn=w([]),rn=O(()=>At.value.map(e=>({title:e.name,value:e.id}))),an=O(()=>{let e=kt.value.trim().toLowerCase();return e?P.value.filter(t=>t.name.toLowerCase().includes(e)||(t.category||``).toLowerCase().includes(e)||(t.description||``).toLowerCase().includes(e)):P.value}),on=O(()=>an.value.length),sn=O(()=>{let e=(jt.value-1)*Mt.value;return an.value.slice(e,e+Mt.value)});me(kt,()=>{jt.value=1});let cn=je([{title:`ID`,key:`id`,width:72},{title:`脚本/命令`,key:`label`},{title:`状态`,key:`status`,width:100},{title:`进度`,key:`progress`,width:88},{title:`台数`,key:`server_count`,width:72},{title:`操作人`,key:`operator`,width:88},{title:`开始时间`,key:`started_at`,width:168},{title:`操作`,key:`actions`,width:180}]),ln=O(()=>W.value?P.value.find(e=>e.id===W.value)?.name||`脚本 #${W.value}`:``),un={started:`开始`,batch_progress:`批次进度`,execution_finished:`结束`,stopped:`停止`,retry_requested:`重试`,stuck_marked:`标记卡住`,server_auto_stuck:`子机超时`,auto_stuck:`自动卡住`,job_completed:`回调完成`},dn=O(()=>new Map(Oe.value.map(e=>[e.id,e])));function fn(e){let t=(e.stderr||``).trim(),n=(e.stdout||``).trim(),r=(e.message||``).trim(),i=t||n||r||`—`;return{summary:(t||r||n||``).slice(0,200)||`—`,full:i}}let Y=O(()=>{if(!K.value?.results)return[];let e=dn.value;return Object.entries(K.value.results).filter(([e])=>e!==`_meta`&&/^\d+$/.test(e)).map(([t,n])=>{let r=Number(t),i=e.get(r),a=String(n.status||``),o=n.phase?String(n.phase):void 0,s=n.exit_code??null,c=fn(n),l=re(a,o,s),ee=de(o);return{serverId:t,serverIdNum:r,serverName:pe(t,K.value?.server_names,i?.name),serverDomain:i?.domain||``,status:a,phase:o,exitCode:s,summary:c.summary,fullOutput:c.full,failed:l,pending:ee}}).sort((e,t)=>e.failed===t.failed?e.pending===t.pending?e.serverName.localeCompare(t.serverName,`zh`):e.pending?1:-1:e.failed?-1:1)}),X=O(()=>ne(K.value?.results,K.value?.server_ids)),pn=O(()=>Y.value.filter(e=>e.failed).map(e=>e.serverName)),mn=O(()=>We(Y.value)),hn=O(()=>q.value===`failed`?Y.value.filter(e=>e.failed):q.value===`success`?Y.value.filter(e=>!e.failed&&!e.pending):Y.value),Z=O(()=>Y.value.find(e=>e.serverId===J.value)||null);function gn(e){return ne(e.results,e.server_ids)}function _n(e){return Dt.find(t=>t.value===e)?.label||e}function vn(e){if(!e)return`—`;let t=e.startsWith(`[long_task] `)?e.slice(12):e;return t.length>60?`${t.slice(0,60)}…`:t}function yn(e){return e.script_id?P.value.find(t=>t.id===e.script_id)?.name||`脚本 #${e.script_id}`:`临时命令`}function bn(e){let t=e.events||[];return t.length?t.slice(-3).map(e=>{let t=un[e.action||``]||e.action||`事件`,n=we(e.at),r=e.detail||``;return`${n} · ${t}${r?` — ${r}`:``}`}):[]}async function xn(e=!1){e||(H.value=!0);try{Vt.value=(await x.get(`/scripts/executions`,{limit:5})).items||[]}catch{e||(Vt.value=[])}finally{e||(H.value=!1)}}async function Q(e=!1){e||(Gt.value=!0);try{let e=await Ne(async(e,t)=>{let n={limit:e,offset:t};W.value&&(n.script_id=W.value);let r=await x.get(`/scripts/executions`,n);return{items:r.items||[],total:r.total||0}},U.value,Wt.value);Ht.value=e.items,Ut.value=e.total,Wt.value===-1&&(U.value=1)}catch{e||(Ht.value=[],Ut.value=0)}finally{e||(Gt.value=!1)}}function $(e=!1){xn(e),Q(e)}Ue($);function Sn(e){U.value=e,Q()}function Cn(e){Wt.value=e,U.value=1,Q()}function wn(){W.value=null,U.value=1,Q()}async function Tn(e){W.value=e.id,U.value=1,await Q(),await se(),Bt.value?.scrollIntoView({behavior:`smooth`,block:`start`})}function En(e){return e||`—`}function Dn(e){if(!e)return 0;try{let t=JSON.parse(e);return Array.isArray(t)?t.length:0}catch{return 0}}function On(e){let t=e.id??e.execution_id;if(t==null)throw Error(`执行响应缺少 id`);return t}async function kn(){Ot.value=!0;try{P.value=(await x.getList(`/scripts/`)).items}catch(e){P.value=[],f(N(e,`加载脚本列表失败`),`error`)}finally{Ot.value=!1}}async function An(){try{F.value=await x.get(`/scripts/exec-config`)}catch{F.value=null}}async function jn(){try{At.value=await x.getList(`/scripts/credentials`).then(e=>e.items)}catch{At.value=[]}}function Mn(e){Nt.value=e,e?L.value={name:e.name,category:e.category||`ops`,description:e.description||``,content:e.content||``}:L.value={name:``,category:`ops`,description:``,content:``},I.value=!0}async function Nn(){if(!L.value.name.trim()||!L.value.content.trim()){f(`请填写名称与脚本内容`,`warning`);return}Pt.value=!0;try{let e={name:L.value.name.trim(),category:L.value.category,description:L.value.description.trim()||null,content:L.value.content};Nt.value?await x.put(`/scripts/${Nt.value.id}`,e):await x.post(`/scripts/`,e),I.value=!1,await kn(),f(`保存成功`)}catch(e){f(N(e,`保存失败`),`error`)}finally{Pt.value=!1}}function Pn(e){z.value=e,B.value=[],It.value=!1,Lt.value=null,R.value=!0}async function Fn(e,t,n){let r=await x.post(`/scripts/exec`,e);return te(On(r),t,n,!!e.long_task,r.progress,r.status),r}async function In(){if(!z.value||!B.value.length){f(`请选择服务器`,`warning`);return}Rt.value=!0;try{await Fn({script_id:z.value.id,server_ids:B.value,timeout:Ft.value,long_task:It.value,credential_id:Lt.value??void 0},z.value.name,B.value.length),R.value=!1,c(`脚本已提交执行`),$()}catch(e){f(N(e,`执行失败`),`error`)}finally{Rt.value=!1}}function Ln(e){zt.value=e,V.value=!0}async function Rn(){if(zt.value)try{await x.delete(`/scripts/${zt.value.id}`),V.value=!1,await kn(),f(`已删除`)}catch(e){f(N(e,`删除失败`),`error`)}}async function zn(){if(!(!qt.value.trim()||G.value.length===0)){Zt.value=!0;try{await Fn({command:qt.value.trim(),server_ids:G.value,timeout:Jt.value,long_task:Yt.value,credential_id:Xt.value??void 0},`临时命令`,G.value.length),c(`已在 ${G.value.length} 台服务器上执行`),$()}catch(e){f(N(e,`执行失败`),`error`)}finally{Zt.value=!1}}}async function Bn(e){try{await x.post(`/scripts/executions/${e.id}/stop`),$(),f(`已发送停止指令`)}catch(e){f(N(e,`停止失败`),`error`)}}async function Vn(e){try{let t=await x.post(`/scripts/executions/${e.id}/retry`,{});te(On(t),`${yn(e)}(重试)`,Dn(e.server_ids)||Dn(t.server_ids),!!e.long_task,t.progress,t.status),$(),c(`重试已提交`)}catch(e){f(N(e,`重试失败`),`error`)}}async function Hn(e){if(en.value=e,q.value=`all`,tn.value=`list`,J.value=null,nn.value=[],Qt.value=!0,await Zn(!1),ne(K.value?.results,K.value?.server_ids).failed>0&&(K.value?.status===`failed`||K.value?.status===`partial`)){q.value=`failed`;let e=Y.value.find(e=>e.failed);e&&(J.value=e.serverId)}}function Un(e){let t=e.serverDomain?` (${e.serverDomain})`:``,n=e.exitCode==null?``:` · exit ${e.exitCode}`,r=e.summary.split(`
|
||
`)[0]?.trim()||e.summary,i=r&&r!==`—`?` · ${r.slice(0,120)}`:``;return`- ${e.serverName}${t}${n}${i}`}async function Wn(e,t){try{await navigator.clipboard.writeText(e),f(t)}catch{f(`复制失败`,`error`)}}async function Gn(){let e=Y.value.filter(e=>e.failed);e.length&&await Wn([`执行 #${K.value?.id??en.value} · 失败 ${e.length} 台`,...e.map(Un)].join(`
|
||
`),`已复制失败清单`)}async function Kn(){let e=mn.value;if(!e.length)return;let t=[`执行 #${K.value?.id??en.value} · 失败分组 ${e.length} 类`];for(let n of e){let e=n.rows.map(e=>e.serverName).join(`、`);t.push(`[${n.errorKey.slice(0,120)}] ${n.count} 台: ${e}`)}await Wn(t.join(`
|
||
`),`已复制分组摘要`)}function qn(e){J.value=J.value===e?null:e}async function Jn(e){if(!(!e.fullOutput||e.fullOutput===`—`))try{await navigator.clipboard.writeText(e.fullOutput),f(`已复制到剪贴板`)}catch{f(`复制失败`,`error`)}}function Yn(e){De.push({path:`/terminal`,query:{server_id:String(e)}})}async function Xn(){K.value&&await Vn(K.value)}async function Zn(e){if(en.value!=null){$t.value=!0;try{K.value=await x.get(`/scripts/executions/${en.value}`,{fetch_logs:e,log_lines:100})}catch(e){f(N(e,`加载详情失败`),`error`),Qt.value=!1}finally{$t.value=!1}}}async function Qn(e=!1){await Promise.all([kn(),Et({all:!0}),An(),jn(),$(e)])}return Ae(e=>Qn(e)),(r,c)=>(g(),E(n,{fluid:``,class:`pa-6`},{default:_(()=>[l(A,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:_(()=>[l(j,{class:`d-flex flex-wrap align-center ga-2`},{default:_(()=>[c[34]||=m(` 脚本库 `,-1),F.value?(g(),E(D,{key:0,size:`small`,variant:`tonal`,label:``,class:`ml-1`},{default:_(()=>[m(` 分批 `+C(F.value.batch_size)+` 台 · 并发 `+C(F.value.concurrency),1)]),_:1})):p(``,!0),l(v),l(Pe,{modelValue:kt.value,"onUpdate:modelValue":c[0]||=e=>kt.value=e,"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,variant:`outlined`,rounded:``,style:{"max-width":`240px`}},null,8,[`modelValue`]),l(u,{color:`primary`,variant:`flat`,class:`ml-1`,"prepend-icon":`mdi-plus`,size:`small`,onClick:c[1]||=e=>Mn(null)},{default:_(()=>[...c[33]||=[m(` 新建脚本 `,-1)]]),_:1})]),_:1})]),_:1}),l(A,{elevation:`0`,border:``,rounded:`lg`,class:`mb-4`},{default:_(()=>[l(j,{class:`d-flex align-center`,style:{cursor:`pointer`},onClick:c[2]||=e=>Kt.value=!Kt.value},{default:_(()=>[l(d,{class:`mr-2`},{default:_(()=>[...c[35]||=[m(`mdi-console`,-1)]]),_:1}),c[36]||=m(` 临时命令执行 `,-1),l(v),l(d,null,{default:_(()=>[m(C(Kt.value?`mdi-chevron-up`:`mdi-chevron-down`),1)]),_:1})]),_:1}),l(_e,null,{default:_(()=>[le(y(`div`,null,[l(T),l(M,null,{default:_(()=>[l(Be,{modelValue:qt.value,"onUpdate:modelValue":c[3]||=e=>qt.value=e,label:`命令`,variant:`outlined`,density:`compact`,rows:`3`,placeholder:`输入要执行的命令... (Ctrl+Enter 执行)`,class:`mb-3 font-monospace`,onKeydown:be(ge(zn,[`ctrl`]),[`enter`]),rules:[b(ze)(`命令`)]},null,8,[`modelValue`,`onKeydown`,`rules`]),c[38]||=y(`div`,{class:`text-caption text-medium-emphasis mb-1`},`目标服务器(按分类选择)`,-1),l(Ve,{modelValue:G.value,"onUpdate:modelValue":c[4]||=e=>G.value=e,servers:b(Oe),loading:b(ke),"max-height":`220px`,class:`mb-3`},null,8,[`modelValue`,`servers`,`loading`]),l(a,{dense:``},{default:_(()=>[l(i,{cols:`6`,md:`2`},{default:_(()=>[l(Pe,{modelValue:Jt.value,"onUpdate:modelValue":c[5]||=e=>Jt.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:F.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),l(i,{cols:`6`,md:`3`},{default:_(()=>[l(Fe,{modelValue:Xt.value,"onUpdate:modelValue":c[6]||=e=>Xt.value=e,items:rn.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``},null,8,[`modelValue`,`items`])]),_:1}),l(i,{cols:`12`,md:`2`,class:`d-flex align-center ga-2`},{default:_(()=>[l(He,{modelValue:Yt.value,"onUpdate:modelValue":c[7]||=e=>Yt.value=e,label:`长任务`,density:`compact`,"hide-details":``,color:`primary`},null,8,[`modelValue`]),l(u,{color:`primary`,variant:`flat`,onClick:zn,loading:Zt.value,disabled:!qt.value.trim()||G.value.length===0},{default:_(()=>[...c[37]||=[m(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1})],512),[[Ce,Kt.value]])]),_:1})]),_:1}),Ot.value?(g(),E(ae,{key:0,indeterminate:``,color:`primary`})):p(``,!0),sn.value.length?(g(),E(a,{key:1},{default:_(()=>[(g(!0),s(S,null,h(sn.value,e=>(g(),E(i,{cols:`12`,sm:`6`,md:`4`,key:e.id},{default:_(()=>[l(A,{elevation:`0`,border:``,rounded:`lg`,class:`fill-height`},{default:_(()=>[l(j,{class:`d-flex align-center`},{default:_(()=>[l(d,{color:`primary`,class:`mr-2`},{default:_(()=>[...c[39]||=[m(`mdi-code-braces`,-1)]]),_:1}),y(`span`,Xe,C(e.name),1),l(v),l(xe,null,{activator:_(({props:e})=>[l(u,oe({icon:`mdi-dots-vertical`,variant:`text`,size:`small`},{ref_for:!0},e),null,16)]),default:_(()=>[l(ve,{density:`compact`},{default:_(()=>[l(ye,{title:`编辑`,onClick:t=>Mn(e)},{prepend:_(()=>[l(d,null,{default:_(()=>[...c[40]||=[m(`mdi-pencil`,-1)]]),_:1})]),_:1},8,[`onClick`]),l(ye,{title:`执行`,onClick:t=>Pn(e)},{prepend:_(()=>[l(d,null,{default:_(()=>[...c[41]||=[m(`mdi-play`,-1)]]),_:1})]),_:1},8,[`onClick`]),l(ye,{title:`删除`,onClick:t=>Ln(e),class:`text-error`},{prepend:_(()=>[l(d,{color:`error`},{default:_(()=>[...c[42]||=[m(`mdi-delete`,-1)]]),_:1})]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024),l(M,null,{default:_(()=>[e.category?(g(),E(D,{key:0,size:`small`,variant:`tonal`,label:``,class:`mb-2`},{default:_(()=>[m(C(_n(e.category)),1)]),_:2},1024)):p(``,!0),y(`div`,Ze,C(e.description||`无描述`),1),y(`div`,Qe,` 更新于 `+C(b(we)(e.updated_at||e.created_at)),1)]),_:2},1024),l(k,null,{default:_(()=>[l(u,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-play`,color:`primary`,onClick:t=>Pn(e)},{default:_(()=>[...c[43]||=[m(` 执行 `,-1)]]),_:1},8,[`onClick`]),l(v),l(u,{size:`small`,variant:`text`,onClick:t=>Tn(e)},{default:_(()=>[...c[44]||=[m(`历史`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})):Ot.value?p(``,!0):(g(),E(A,{key:2,elevation:`0`,border:``,rounded:`lg`},{default:_(()=>[l(M,{class:`text-center text-medium-emphasis py-10`},{default:_(()=>[...c[45]||=[m(`暂无脚本,点击「新建脚本」添加`,-1)]]),_:1})]),_:1})),on.value>Mt.value?(g(),s(`div`,$e,[l(t,{modelValue:jt.value,"onUpdate:modelValue":c[8]||=e=>jt.value=e,length:Math.ceil(on.value/Mt.value),rounded:``,density:`compact`},null,8,[`modelValue`,`length`])])):p(``,!0),y(`div`,{ref_key:`historySectionRef`,ref:Bt},[l(A,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:_(()=>[l(j,{class:`d-flex align-center text-subtitle-1`},{default:_(()=>[l(d,{class:`mr-2`},{default:_(()=>[...c[46]||=[m(`mdi-history`,-1)]]),_:1}),c[47]||=m(` 最近执行 `,-1),l(v),l(u,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:H.value,onClick:xn},null,8,[`loading`])]),_:1}),l(T),l(M,{class:`pa-0`},{default:_(()=>[H.value?(g(),E(ae,{key:0,indeterminate:``,color:`primary`})):p(``,!0),Vt.value.length?(g(),E(ve,{key:1,density:`compact`,class:`py-0`},{default:_(()=>[(g(!0),s(S,null,h(Vt.value,e=>(g(),E(ye,{key:e.id,title:`#${e.id} · ${yn(e)}`,onClick:t=>Hn(e.id),style:{cursor:`pointer`}},{subtitle:_(()=>[y(`div`,et,C(b(fe)(e.status))+` · `+C(Dn(e.server_ids))+` 台 · `+C(e.operator||`—`)+` · `+C(b(we)(e.started_at)),1),(g(!0),s(S,null,h(bn(e),(e,t)=>(g(),s(`div`,{key:t,class:`text-caption text-medium-emphasis font-monospace mt-1`},C(e),1))),128))]),append:_(()=>[l(D,{color:b(o)(e.status),size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(C(b(fe)(e.status)),1)]),_:2},1032,[`color`])]),_:2},1032,[`title`,`onClick`]))),128))]),_:1})):H.value?p(``,!0):(g(),s(`div`,tt,`暂无执行记录`))]),_:1})]),_:1}),l(A,{elevation:`0`,border:``,rounded:`lg`,class:`mt-4`},{default:_(()=>[l(j,{class:`d-flex flex-wrap align-center ga-2 text-subtitle-1`},{default:_(()=>[l(d,{class:`mr-1`},{default:_(()=>[...c[48]||=[m(`mdi-format-list-bulleted`,-1)]]),_:1}),c[49]||=m(` 全部执行历史 `,-1),W.value?(g(),E(D,{key:0,size:`small`,variant:`tonal`,closable:``,label:``,"onClick:close":wn},{default:_(()=>[m(C(ln.value),1)]),_:1})):p(``,!0),l(v),l(u,{size:`small`,variant:`text`,icon:`mdi-refresh`,loading:Gt.value,onClick:Q},null,8,[`loading`])]),_:1}),l(T),l(Ie,{items:Ht.value,headers:b(cn),"items-length":Ut.value,loading:Gt.value,page:U.value,"items-per-page":Wt.value,"items-per-page-options":ce,density:`compact`,hover:``,"onUpdate:page":Sn,"onUpdate:itemsPerPage":Cn},{"item.label":_(({item:e})=>[y(`div`,nt,C(yn(e)),1),y(`code`,rt,C(vn(e.command)),1)]),"item.status":_(({item:e})=>[l(D,{color:b(o)(e.status),size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(C(b(fe)(e.status)),1)]),_:2},1032,[`color`])]),"item.server_count":_(({item:e})=>[m(C(Dn(e.server_ids)),1)]),"item.progress":_(({item:e})=>[y(`div`,it,[y(`span`,null,C(En(e.progress)),1),gn(e).failed>0?(g(),E(D,{key:0,color:`error`,size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(C(gn(e).failed)+` 台失败 `,1)]),_:2},1024)):p(``,!0)])]),"item.started_at":_(({item:e})=>[m(C(b(we)(e.started_at)),1)]),"item.actions":_(({item:e})=>[l(u,{size:`x-small`,variant:`text`,onClick:t=>Hn(e.id)},{default:_(()=>[...c[50]||=[m(`详情`,-1)]]),_:1},8,[`onClick`]),e.status===`running`||e.status===`partial`?(g(),E(u,{key:0,size:`x-small`,variant:`text`,color:`error`,onClick:t=>Bn(e)},{default:_(()=>[...c[51]||=[m(` 停止 `,-1)]]),_:1},8,[`onClick`])):p(``,!0),e.status===`failed`||e.status===`partial`?(g(),E(u,{key:1,size:`x-small`,variant:`text`,color:`primary`,onClick:t=>Vn(e)},{default:_(()=>[...c[52]||=[m(` 重试 `,-1)]]),_:1},8,[`onClick`])):p(``,!0)]),"no-data":_(()=>[...c[53]||=[y(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无执行记录`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1})],512),l(Re,{modelValue:I.value,"onUpdate:modelValue":c[14]||=e=>I.value=e,"max-width":`900`,scrollable:``},{default:_(()=>[l(A,{border:``},{default:_(()=>[l(j,null,{default:_(()=>[m(C(Nt.value?`编辑脚本`:`新建脚本`),1)]),_:1}),l(T),l(M,null,{default:_(()=>[l(Pe,{modelValue:L.value.name,"onUpdate:modelValue":c[9]||=e=>L.value.name=e,label:`脚本名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[b(ze)(`脚本名称`)]},null,8,[`modelValue`,`rules`]),l(Fe,{modelValue:L.value.category,"onUpdate:modelValue":c[10]||=e=>L.value.category=e,items:Dt,"item-title":`label`,"item-value":`value`,label:`分类`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),l(Be,{modelValue:L.value.description,"onUpdate:modelValue":c[11]||=e=>L.value.description=e,label:`描述`,variant:`outlined`,density:`compact`,rows:`2`,class:`mb-2`},null,8,[`modelValue`]),c[54]||=y(`div`,{class:`text-caption text-medium-emphasis mb-1`},`脚本内容`,-1),l(Ye,{modelValue:L.value.content,"onUpdate:modelValue":c[12]||=e=>L.value.content=e},null,8,[`modelValue`])]),_:1}),l(T),l(k,null,{default:_(()=>[l(v),l(u,{variant:`text`,onClick:c[13]||=e=>I.value=!1},{default:_(()=>[...c[55]||=[m(`取消`,-1)]]),_:1}),l(u,{color:`primary`,variant:`flat`,onClick:Nn,loading:Pt.value,disabled:!L.value.content.trim()},{default:_(()=>[...c[56]||=[m(` 保存 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(Re,{modelValue:R.value,"onUpdate:modelValue":c[20]||=e=>R.value=e,"max-width":`720`,scrollable:``},{default:_(()=>[l(A,{border:``},{default:_(()=>[l(j,null,{default:_(()=>[m(`执行脚本: `+C(z.value?.name),1)]),_:1}),l(M,null,{default:_(()=>[c[57]||=y(`div`,{class:`text-caption text-medium-emphasis mb-1`},`选择服务器(按分类勾选)`,-1),l(Ve,{modelValue:B.value,"onUpdate:modelValue":c[15]||=e=>B.value=e,servers:b(Oe),loading:b(ke),"max-height":`360px`,class:`mb-2`},null,8,[`modelValue`,`servers`,`loading`]),l(a,{dense:``},{default:_(()=>[l(i,{cols:`6`},{default:_(()=>[l(Pe,{modelValue:Ft.value,"onUpdate:modelValue":c[16]||=e=>Ft.value=e,modelModifiers:{number:!0},label:`超时(秒)`,variant:`outlined`,density:`compact`,type:`number`,max:F.value?.max_timeout??600},null,8,[`modelValue`,`max`])]),_:1}),l(i,{cols:`6`},{default:_(()=>[l(Fe,{modelValue:Lt.value,"onUpdate:modelValue":c[17]||=e=>Lt.value=e,items:rn.value,"item-title":`title`,"item-value":`value`,label:`DB 凭据(可选)`,variant:`outlined`,density:`compact`,clearable:``},null,8,[`modelValue`,`items`])]),_:1})]),_:1}),l(He,{modelValue:It.value,"onUpdate:modelValue":c[18]||=e=>It.value=e,label:`长任务(nohup + Agent 回调,适合超时较长的脚本)`,density:`compact`,color:`primary`},null,8,[`modelValue`])]),_:1}),l(k,null,{default:_(()=>[l(v),l(u,{variant:`text`,onClick:c[19]||=e=>R.value=!1},{default:_(()=>[...c[58]||=[m(`取消`,-1)]]),_:1}),l(u,{color:`primary`,variant:`flat`,onClick:In,loading:Rt.value,disabled:!B.value.length},{default:_(()=>[...c[59]||=[m(` 执行 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(Re,{modelValue:V.value,"onUpdate:modelValue":c[22]||=e=>V.value=e,"max-width":`400`},{default:_(()=>[l(A,{border:``},{default:_(()=>[l(j,null,{default:_(()=>[...c[60]||=[m(`确认删除`,-1)]]),_:1}),l(M,null,{default:_(()=>[c[61]||=m(`确定要删除脚本 `,-1),y(`strong`,null,C(zt.value?.name),1),c[62]||=m(` 吗?`,-1)]),_:1}),l(k,null,{default:_(()=>[l(v),l(u,{variant:`text`,onClick:c[21]||=e=>V.value=!1},{default:_(()=>[...c[63]||=[m(`取消`,-1)]]),_:1}),l(u,{color:`error`,variant:`flat`,onClick:Rn},{default:_(()=>[...c[64]||=[m(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),l(Re,{modelValue:Qt.value,"onUpdate:modelValue":c[32]||=e=>Qt.value=e,"max-width":`960`,scrollable:``},{default:_(()=>[l(A,{border:``},{default:_(()=>[l(j,{class:`d-flex align-center flex-wrap ga-2`},{default:_(()=>[y(`span`,null,`执行详情 #`+C(K.value?.id),1),K.value?(g(),E(D,{key:0,color:b(o)(K.value.status),size:`small`,variant:`tonal`,label:``},{default:_(()=>[m(C(b(fe)(K.value.status)),1)]),_:1},8,[`color`])):p(``,!0),l(v),K.value?.long_task?(g(),E(u,{key:1,size:`small`,variant:`tonal`,loading:$t.value,onClick:c[23]||=e=>Zn(!0)},{default:_(()=>[...c[65]||=[m(` 拉取日志 `,-1)]]),_:1},8,[`loading`])):p(``,!0)]),_:1}),l(T),K.value?(g(),E(M,{key:0},{default:_(()=>[y(`div`,at,C(En(K.value.progress))+` · 操作人 `+C(K.value.operator||`—`),1),y(`pre`,ot,C(K.value.command),1),X.value.total?(g(),s(`div`,st,[l(D,{size:`small`,variant:`tonal`,label:``},{default:_(()=>[m(`共 `+C(X.value.total)+` 台`,1)]),_:1}),X.value.success?(g(),E(D,{key:0,color:`success`,size:`small`,variant:`tonal`,label:``},{default:_(()=>[m(` 成功 `+C(X.value.success),1)]),_:1})):p(``,!0),X.value.failed?(g(),E(D,{key:1,color:`error`,size:`small`,variant:`tonal`,label:``},{default:_(()=>[m(` 失败 `+C(X.value.failed),1)]),_:1})):p(``,!0),X.value.pending?(g(),E(D,{key:2,color:`info`,size:`small`,variant:`tonal`,label:``},{default:_(()=>[m(` 进行中 `+C(X.value.pending),1)]),_:1})):p(``,!0)])):p(``,!0),pn.value.length?(g(),E(ee,{key:1,type:`error`,variant:`tonal`,density:`compact`,class:`mb-3`,title:`失败 ${pn.value.length} 台`},{default:_(()=>[y(`div`,ct,C(pn.value.join(`、`)),1)]),_:1},8,[`title`])):p(``,!0),y(`div`,lt,[c[74]||=y(`span`,{class:`text-caption text-medium-emphasis`},`筛选`,-1),l(Te,{modelValue:q.value,"onUpdate:modelValue":c[24]||=e=>q.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:_(()=>[l(u,{value:`all`,size:`small`},{default:_(()=>[...c[66]||=[m(`全部`,-1)]]),_:1}),l(u,{value:`failed`,size:`small`},{default:_(()=>[...c[67]||=[m(`仅失败`,-1)]]),_:1}),l(u,{value:`success`,size:`small`},{default:_(()=>[...c[68]||=[m(`仅成功`,-1)]]),_:1})]),_:1},8,[`modelValue`]),X.value.failed>0?(g(),s(S,{key:0},[l(T,{vertical:``,class:`mx-1`}),c[73]||=y(`span`,{class:`text-caption text-medium-emphasis`},`视图`,-1),l(Te,{modelValue:tn.value,"onUpdate:modelValue":c[25]||=e=>tn.value=e,mandatory:``,density:`compact`,color:`primary`,variant:`outlined`,divided:``},{default:_(()=>[l(u,{value:`list`,size:`small`},{default:_(()=>[...c[69]||=[m(`列表`,-1)]]),_:1}),l(u,{value:`group`,size:`small`},{default:_(()=>[...c[70]||=[m(`按错误分组`,-1)]]),_:1})]),_:1},8,[`modelValue`]),l(u,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:Gn},{default:_(()=>[...c[71]||=[m(` 复制失败清单 `,-1)]]),_:1}),tn.value===`group`?(g(),E(u,{key:0,size:`small`,variant:`tonal`,"prepend-icon":`mdi-content-copy`,onClick:Kn},{default:_(()=>[...c[72]||=[m(` 复制分组摘要 `,-1)]]),_:1})):p(``,!0)],64)):p(``,!0)]),tn.value===`list`?(g(),E(e,{key:2,density:`compact`,class:`exec-detail-table`},{default:_(()=>[c[76]||=y(`thead`,null,[y(`tr`,null,[y(`th`,null,`服务器`),y(`th`,null,`状态`),y(`th`,{style:{width:`72px`}},`退出码`),y(`th`,null,`错误摘要`),y(`th`,{style:{width:`120px`},class:`text-end`},`操作`)])],-1),y(`tbody`,null,[(g(!0),s(S,null,h(hn.value,e=>(g(),s(`tr`,{key:e.serverId,class:Se([{"exec-detail-row--failed":e.failed,"exec-detail-row--active":J.value===e.serverId},`exec-detail-row cursor-pointer`]),onClick:t=>qn(e.serverId)},[y(`td`,null,[y(`div`,dt,C(e.serverName),1),e.serverDomain?(g(),s(`div`,ft,C(e.serverDomain),1)):p(``,!0)]),y(`td`,null,[l(D,{color:b(ue)(e.status,e.phase,e.exitCode),size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(C(b(Ee)(e.status,e.phase)),1)]),_:2},1032,[`color`])]),y(`td`,{class:Se({"text-error font-weight-medium":e.failed})},C(e.exitCode??`—`),3),y(`td`,{class:`text-truncate`,style:{"max-width":`280px`},title:e.summary},C(e.summary),9,pt),y(`td`,{class:`text-end`,onClick:c[26]||=ge(()=>{},[`stop`])},[e.fullOutput&&e.fullOutput!==`—`?(g(),E(u,{key:0,size:`x-small`,variant:`text`,icon:`mdi-content-copy`,title:`复制输出`,onClick:t=>Jn(e)},null,8,[`onClick`])):p(``,!0),l(u,{size:`x-small`,variant:`text`,icon:`mdi-console`,title:`打开终端`,onClick:t=>Yn(e.serverIdNum)},null,8,[`onClick`])])],10,ut))),128)),hn.value.length===0?(g(),s(`tr`,mt,[...c[75]||=[y(`td`,{colspan:`5`,class:`text-center text-medium-emphasis py-4`},`当前筛选无记录`,-1)]])):p(``,!0)])]),_:1})):mn.value.length?(g(),E(Je,{key:3,modelValue:nn.value,"onUpdate:modelValue":c[28]||=e=>nn.value=e,multiple:``,variant:`accordion`,class:`exec-detail-groups`},{default:_(()=>[(g(!0),s(S,null,h(mn.value,(t,n)=>(g(),E(Ke,{key:`${n}-${t.errorKey}`},{default:_(()=>[l(qe,null,{default:_(()=>[y(`div`,ht,[y(`span`,{class:`text-body-2 text-truncate`,title:t.errorKey},C(t.errorKey),9,gt),l(D,{color:`error`,size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(C(t.count)+` 台`,1)]),_:2},1024)])]),_:2},1024),l(Ge,null,{default:_(()=>[l(e,{density:`compact`},{default:_(()=>[c[77]||=y(`thead`,null,[y(`tr`,null,[y(`th`,null,`服务器`),y(`th`,{style:{width:`72px`}},`退出码`),y(`th`,{style:{width:`120px`},class:`text-end`},`操作`)])],-1),y(`tbody`,null,[(g(!0),s(S,null,h(t.rows,e=>(g(),s(`tr`,{key:e.serverId,class:Se([{"exec-detail-row--active":J.value===e.serverId},`exec-detail-row cursor-pointer`]),onClick:t=>qn(e.serverId)},[y(`td`,null,[y(`div`,vt,C(e.serverName),1),e.serverDomain?(g(),s(`div`,yt,C(e.serverDomain),1)):p(``,!0)]),y(`td`,bt,C(e.exitCode??`—`),1),y(`td`,{class:`text-end`,onClick:c[27]||=ge(()=>{},[`stop`])},[e.fullOutput&&e.fullOutput!==`—`?(g(),E(u,{key:0,size:`x-small`,variant:`text`,icon:`mdi-content-copy`,title:`复制输出`,onClick:t=>Jn(e)},null,8,[`onClick`])):p(``,!0),l(u,{size:`x-small`,variant:`text`,icon:`mdi-console`,title:`打开终端`,onClick:t=>Yn(e.serverIdNum)},null,8,[`onClick`])])],10,_t))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`])):(g(),s(`div`,xt,`无失败记录可分组`)),Z.value?(g(),E(A,{key:5,variant:`tonal`,color:Z.value.failed?`error`:void 0,class:`mt-3 pa-3`},{default:_(()=>[y(`div`,St,[y(`span`,Ct,[m(C(Z.value.serverName)+` `,1),Z.value.serverDomain?(g(),s(`span`,wt,`(`+C(Z.value.serverDomain)+`)`,1)):p(``,!0)]),l(v),l(u,{size:`x-small`,variant:`text`,"prepend-icon":`mdi-content-copy`,onClick:c[29]||=e=>Jn(Z.value)},{default:_(()=>[...c[78]||=[m(` 复制 `,-1)]]),_:1}),l(u,{size:`x-small`,variant:`text`,"prepend-icon":`mdi-console`,onClick:c[30]||=e=>Yn(Z.value.serverIdNum)},{default:_(()=>[...c[79]||=[m(` 终端 `,-1)]]),_:1})]),y(`pre`,Tt,C(Z.value.fullOutput),1)]),_:1},8,[`color`])):p(``,!0)]),_:1})):p(``,!0),K.value?(g(),E(k,{key:1},{default:_(()=>[K.value.status===`failed`||K.value.status===`partial`?(g(),E(u,{key:0,color:`primary`,variant:`text`,onClick:Xn},{default:_(()=>[...c[80]||=[m(` 重试失败项 `,-1)]]),_:1})):p(``,!0),l(v),l(u,{variant:`text`,onClick:c[31]||=e=>Qt.value=!1},{default:_(()=>[...c[81]||=[m(`关闭`,-1)]]),_:1})]),_:1})):p(``,!0)]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}}),[[`__scopeId`,`data-v-990c5229`]]);export{Et as default}; |