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