0b2d7ac50d
脚本 exec 立即返回 running 并在后台跑批次;/ws/alerts 推送 script_progress/complete; 新增 ScriptRunsPage、Telegram 汇总通知与可配置的浏览器完成提示音。 Co-authored-by: Cursor <cursoragent@cursor.com>
7 lines
61 KiB
JavaScript
7 lines
61 KiB
JavaScript
import{a as e,t}from"./VDataTable-DmyjZbVN.js";import{$n as n,A as r,An as i,Bn as a,C as o,Cn as s,Ct as c,D as ee,Dr as l,Dt as u,E as te,Er as d,Et as ne,F as f,Gt as re,Hn as ie,Hr as ae,Ir as p,Jn as m,Kt as oe,L as h,M as se,Mt as ce,N as g,Nr as _,O as le,Or as ue,P as v,Pr as de,Qt as fe,R as pe,Rn as me,S as he,St as y,Tt as b,Ur as x,Ut as ge,V as S,Vn as C,Vr as _e,X as w,Xn as T,Y as E,Yn as ve,Z as ye,Zn as D,_ as be,_r as O,ar as k,bt as xe,dr as A,en as Se,er as j,et as M,fn as N,fr as P,hr as Ce,it as F,j as we,k as Te,ln as I,lr as Ee,m as De,mt as Oe,n as L,nn as ke,nr as R,nt as Ae,on as je,or as z,pn as B,pt as Me,rn as Ne,rr as V,rt as Pe,sr as Fe,t as H,tr as U,tt as Ie,u as Le,un as Re,v as ze,vn as Be,vr as Ve,w as He,wn as Ue,wr as We,wt as Ge,xt as Ke,yr as qe,z as W,zn as Je,zr as G,zt as K}from"./index-DoaDMa1C.js";import{o as Ye,t as Xe}from"./VContainer-BQRFgmV8.js";import{t as q}from"./VChip-w-VUeBu6.js";import{a as Ze,c as Qe,d as $e,f as et,i as tt,l as nt,n as rt,o as it,r as at,s as ot,t as st,u as ct}from"./VSelect-lvvpsnJa.js";import{t as lt}from"./VDataTableServer-CqSShzYP.js";import{n as J,t as ut}from"./VRow-CQuw1Sq-.js";import{t as Y}from"./VSpacer-DctU2jOI.js";import{t as dt}from"./apiError-CbHg7QFF.js";import{n as ft}from"./labels-CzOhyWto.js";import{t as pt}from"./dataTable-Rzp2u0tF.js";import{i as X}from"./validation-DMwOxx4a.js";import{t as mt}from"./VDialog-CEuZlRyE.js";import{t as ht}from"./VTextarea-BXQIpPbY.js";import{a as gt,i as _t,n as vt,r as yt,t as bt}from"./StatCardsRow-DZl-knQO.js";import{i as xt,n as St,r as Ct,t as wt}from"./VTabs-BAgFN23l.js";import{t as Tt}from"./VAlert-CtfIhOih.js";import{n as Et,t as Dt}from"./useServerCategories-BQfAWO0w.js";function Z(e){if(typeof e==`number`&&Number.isFinite(e)&&e>0)return Math.trunc(e);if(typeof e==`string`&&/^\d+$/.test(e.trim())){let t=Number(e.trim());return Number.isFinite(t)&&t>0?t:null}return null}function Ot(e){let t=[];for(let n of e){let e=Z(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}var Q=B({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...Ze({filterKeys:[`title`]}),...rt({hideNoData:!0,returnObject:!0}),...Je(L({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),kt=I()({name:`VCombobox`,props:Q(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,{emit:t,slots:r}){let{t:a}=fe(),o=_(),l=de(!1),u=de(!0),d=de(!1),f=_(),re=_(),m=de(-1),oe=!1,{items:h,transformIn:ce,transformOut:g}=ee(e),{textColorClasses:ue,textColorStyles:v}=c(()=>o.value?.color),{InputIcon:he}=De(e),y=Se(e,`modelValue`,[],e=>ce(C(e)),t=>{let n=g(t);return e.multiple?n:n[0]??null}),b=Le(e),x=p(()=>e.closableChips&&!b.isReadonly.value&&!b.isDisabled.value),ge=n(()=>!!(e.chips||r.chip)),S=n(()=>ge.value||!!r.selection),w=de(!e.multiple&&!S.value?y.value[0]?.title??``:``),T=de(null),E=n({get:()=>w.value,set:async t=>{if(w.value=t??``,t===null||t===``&&!e.multiple&&!S.value?y.value=[]:!e.multiple&&!S.value&&(y.value=[te(e,t)],P(()=>re.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=Je(t);e.length>1&&(G(e),w.value=``)}t||(m.value=-1),u.value=!t}}),ve=n(()=>typeof e.counterValue==`function`?e.counterValue(y.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?y.value.length:E.value.length),{filteredItems:O,getMatches:xe}=it(e,h,()=>T.value??(e.alwaysFilter||!u.value?E.value:``)),M=n(()=>e.hideSelected&&T.value===null?O.value.filter(e=>!y.value.some(t=>t.value===e.value)):O.value),N=n(()=>e.hideNoData&&!M.value.length||b.isReadonly.value||b.isDisabled.value),Ce=Se(e,`menu`),F=n({get:()=>Ce.value,set:e=>{Ce.value&&!e&&f.value?.ΨopenChildren.size||e&&N.value||(Ce.value=e)}}),{menuId:we,ariaExpanded:I,ariaControls:Ee}=at(e,F);We(w,e=>{oe?P(()=>oe=!1):l.value&&!F.value&&(F.value=!0),t(`update:search`,e)}),We(y,t=>{!e.multiple&&!S.value&&(w.value=t[0]?.title??``)});let Oe=n(()=>y.value.map(e=>e.value)),L=n(()=>M.value.find(e=>e.type===`item`&&!e.props.disabled)),ke=n(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&E.value===L.value?.title)&&M.value.length>0&&!u.value&&!d.value),R=_(),Ae=_(),B=_(),Me=Qe(R,o),V=nt(F,()=>f.value?.contentEl,()=>o.value?.controlRef),{onTabKeydown:Pe}=ot({groups:[{type:`element`,contentRef:Ae},{type:`list`,contentRef:R,displayItemsCount:()=>M.value.length},{type:`element`,contentRef:B}],onLeave:()=>{F.value=!1,o.value?.focus()}});function Fe(t){oe=!0,P(()=>oe=!1),e.openOnClear&&(F.value=!0)}function U(){N.value||(F.value=!0)}function Ie(e){N.value||(l.value&&(e.preventDefault(),e.stopPropagation()),F.value=!F.value)}function Re(e){e.key===`Tab`&&Pe(e),R.value?.$el.contains(e.target)&&(Be(e)||e.key===`Backspace`)&&o.value?.focus()}function Ve(t){if(i(t)||b.isReadonly.value)return;let n=o.value?.selectionStart,r=y.value.length;if([`Enter`,`ArrowDown`,`ArrowUp`].includes(t.key)&&t.preventDefault(),[`Enter`,`ArrowDown`].includes(t.key)&&(F.value=!0),[`Escape`].includes(t.key)&&(F.value=!1),ke.value&&[`Enter`,`Tab`].includes(t.key)&&L.value&&!y.value.some(({value:e})=>e===L.value.value)&&W(L.value),t.key===`ArrowDown`&&ke.value&&R.value?.focus(`next`),t.key===`Enter`&&E.value&&(W(te(e,E.value),!0,!0),S.value&&(w.value=``)),[`Backspace`,`Delete`].includes(t.key)){if(!e.multiple&&S.value&&y.value.length>0&&!E.value)return W(y.value[0],!1);if(~m.value){t.preventDefault();let e=m.value;W(y.value[m.value],!1),m.value=e>=r-1?r-2:e}else t.key===`Backspace`&&!E.value&&(m.value=r-1);return}if(e.multiple)if(t.key===`ArrowLeft`){if(m.value<0&&n&&n>0)return;let e=m.value>-1?m.value-1:r-1;y.value[e]?m.value=e:(m.value=-1,o.value?.setSelectionRange(E.value.length,E.value.length))}else if(t.key===`ArrowRight`){if(m.value<0)return;let e=m.value+1;y.value[e]?m.value=e:(m.value=-1,o.value?.setSelectionRange(0,0))}else ~m.value&&Be(t)&&(m.value=-1)}function Ge(t){let n=Je(t?.clipboardData?.getData(`Text`)??``);n.length>1&&e.multiple&&(t.preventDefault(),G(n))}function Ke(){e.eager&&re.value?.calculateVisibleItems()}function qe(){l.value&&(f.value?.contentEl?._clickOutside?.lastMousedownWasOutside?l.value=!1:o.value?.focus()),u.value=!0,T.value=null}function W(t,n=!0,r=!1){if(!(!t||t.props.disabled))if(e.multiple){let r=y.value.findIndex(n=>(e.valueComparator||je)(n.value,t.value)),i=n??!~r;if(~r){let e=i?[...y.value,t]:[...y.value];e.splice(r,1),y.value=e}else i&&(y.value=[...y.value,t]);e.clearOnSelect&&(E.value=``)}else{let i=n!==!1;y.value=i?[t]:[],(!u.value||e.alwaysFilter)&&w.value&&(T.value=w.value),w.value=i&&!S.value?t.title:``,P(()=>{F.value=r,u.value=!0})}}function Je(t){let n=[`
|
||
`,...e.delimiters??[]].map(Ue).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function G(t){for(let n of t)n=n.trim(),n&&(W(te(e,n)),await P())}function K(e){l.value=!0,setTimeout(()=>{d.value=!0})}function Ye(e){if(d.value=!1,!o.value?.$el.contains(e.relatedTarget)){if(V(e))return;l.value=!1}}let Xe=0;function Ze(){Xe=performance.now()}function rt(e){let t=e.relatedTarget;((f.value?.contentEl)?.contains(t)||!t&&performance.now()-Xe<10)&&(l.value=!0)}return We(l,(t,n)=>{if(!(t||t===n)&&(m.value=-1,F.value=!1,E.value)){if(e.multiple){W(te(e,E.value));return}if(!S.value)return;y.value.some(({title:e})=>e===E.value)?w.value=``:W(te(e,E.value))}}),We(F,t=>{if(!e.hideSelected&&t&&y.value.length&&u.value){let t=M.value.findIndex(t=>y.value.some(n=>(e.valueComparator||je)(n.value,t.value)));ie&&window.requestAnimationFrame(()=>{t>=0&&re.value?.scrollToIndex(t)})}t&&(T.value=null)}),We(h,(e,t)=>{F.value||l.value&&!t.length&&e.length&&(F.value=!0)}),Ne(()=>{let t=!!(!e.hideNoData||M.value.length||r[`prepend-item`]||r[`append-item`]||r[`no-data`]),n=y.value.length>0,i=H.filterProps(e),c={search:E,filteredItems:O.value};return z(H,A({ref:o},i,{modelValue:E.value,"onUpdate:modelValue":e=>E.value=e,focused:l.value,"onUpdate:focused":e=>l.value=e,validationValue:y.externalValue,counterValue:ve.value,dirty:n,class:[`v-combobox`,{"v-combobox--active-menu":F.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!S.value,"v-combobox--selecting-index":m.value>-1,[`v-combobox--${e.multiple?`multiple`:`single`}`]:!0},e.class],style:e.style,readonly:b.isReadonly.value,placeholder:n?void 0:e.placeholder,"onClick:clear":Fe,"onMousedown:control":U,onKeydown:Ve,onPaste:Ge,onBlur:rt,"aria-expanded":I.value,"aria-controls":Ee.value}),{...r,default:({id:n})=>j(D,null,[z(be,A({id:we.value,ref:f,modelValue:F.value,"onUpdate:modelValue":e=>F.value=e,activator:`parent`,disabled:N.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Ke,onAfterLeave:qe},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[z($e,{elevation:e.menuElevation,onFocusin:K,onKeydown:Re,onMousedown:Ze},{default:()=>[r[`menu-header`]&&j(`header`,{ref:Ae},[r[`menu-header`](c)]),t&&z(He,A({key:`combobox-list`,ref:R,filterable:!0,selected:Oe.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!M.value.length,onFocusout:Ye,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${n.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},Me,e.listProps),{default:()=>[r[`prepend-item`]?.(),!M.value.length&&!e.hideNoData&&(r[`no-data`]?.()??z(Te,{key:`no-data`,title:a(e.noDataText)},null)),z(ct,{ref:re,renderless:!0,items:M.value,itemKey:`value`},{default:({item:t,index:n,itemRef:i})=>{let a=A(t.props,{ref:i,key:t.value,active:ke.value&&t===L.value?!0:void 0,onClick:()=>W(t,null),"aria-posinset":n+1,"aria-setsize":M.value.length});return t.type===`divider`?r.divider?.({props:t.raw,index:n})??z(se,A(t.props,{key:`divider-${n}`}),null):t.type===`subheader`?r.subheader?.({props:t.raw,index:n})??z(le,A(t.props,{key:`subheader-${n}`}),null):r.item?.({item:t.raw,internalItem:t,index:n,props:a})??z(Te,A(a,{role:`option`}),{prepend:({isSelected:n})=>j(D,null,[e.multiple&&!e.hideSelected?z(et,{key:t.value,modelValue:n,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&z(pe,{image:t.props.prependAvatar},null),t.props.prependIcon&&z(ye,{icon:t.props.prependIcon},null)]),title:()=>u.value?t.title:tt(`v-combobox`,t.title,xe(t)?.title)})}}),r[`append-item`]?.()]}),r[`menu-footer`]&&j(`footer`,{ref:B},[r[`menu-footer`](c)])]})]}),y.value.map((t,n)=>{function i(e){e.stopPropagation(),e.preventDefault(),W(t,!1)}let a=A(q.filterProps(t.props),{"onClick:close":i,onKeydown(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),i(e))},onMousedown(e){e.preventDefault(),e.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),o=ge.value?!!r.chip:!!r.selection,c=o?s(ge.value?r.chip({item:t.raw,internalItem:t,index:n,props:a}):r.selection({item:t.raw,internalItem:t,index:n})):void 0;if(!(o&&!c))return j(`div`,{key:t.value,class:_e([`v-combobox__selection`,n===m.value&&[`v-combobox__selection--selected`,ue.value]]),style:ae(n===m.value?v.value:{})},[ge.value?r.chip?z(ne,{key:`chip-defaults`,defaults:{VChip:{closable:x.value,size:`small`,text:t.title}}},{default:()=>[c]}):z(q,A({key:`chip`,closable:x.value,size:`small`,text:t.title,disabled:t.props.disabled},a),null):c??j(`span`,{class:`v-combobox__selection-text`},[t.title,e.multiple&&n<y.value.length-1&&j(`span`,{class:`v-combobox__selection-comma`},[k(`,`)])])])})]),"append-inner":(...t)=>j(D,null,[r[`append-inner`]?.(...t),(!e.hideNoData||e.items.length)&&e.menuIcon?z(ye,{class:`v-combobox__menu-icon`,color:o.value?.fieldIconColor,icon:e.menuIcon,onMousedown:Ie,onClick:me,"aria-hidden":!0,tabindex:`-1`},null):void 0,e.appendInnerIcon&&z(he,{key:`append-icon`,name:`appendInner`,color:t[0].iconColor.value},null)])})}),ze({isFocused:l,isPristine:u,menu:F,search:E,selectionIndex:m,filteredItems:O,select:W},o)}}),At=Symbol.for(`vuetify:v-expansion-panel`),jt=B({...N(),...he()},`VExpansionPanelText`),Mt=I()({name:`VExpansionPanelText`,props:jt(),setup(e,{slots:t}){let n=Ee(At);if(!n)throw Error(`[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel`);let{hasContent:r,onAfterLeave:i}=o(e,n.isSelected);return Ne(()=>z(u,{onAfterLeave:i},{default:()=>[l(j(`div`,{class:_e([`v-expansion-panel-text`,e.class]),style:ae(e.style)},[t.default&&r.value&&j(`div`,{class:`v-expansion-panel-text__wrapper`},[t.default?.()])]),[[m,n.isSelected.value]])]})),{}}}),Nt=B({color:String,expandIcon:{type:ke,default:`$expand`},collapseIcon:{type:ke,default:`$collapse`},hideActions:Boolean,focusable:Boolean,static:Boolean,ripple:{type:[Boolean,Object],default:!1},readonly:Boolean,...N(),...Ge()},`VExpansionPanelTitle`),Pt=I()({name:`VExpansionPanelTitle`,directives:{vRipple:S},props:Nt(),setup(e,{slots:t}){let r=Ee(At);if(!r)throw Error(`[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel`);let{backgroundColorClasses:i,backgroundColorStyles:a}=y(()=>e.color),{dimensionStyles:o}=b(e),s=n(()=>({collapseIcon:e.collapseIcon,disabled:r.disabled.value,expanded:r.isSelected.value,expandIcon:e.expandIcon,readonly:e.readonly})),c=p(()=>r.isSelected.value?e.collapseIcon:e.expandIcon);return Ne(()=>l(j(`button`,{class:_e([`v-expansion-panel-title`,{"v-expansion-panel-title--active":r.isSelected.value,"v-expansion-panel-title--focusable":e.focusable,"v-expansion-panel-title--static":e.static},i.value,e.class]),style:ae([a.value,o.value,e.style]),type:`button`,tabindex:r.disabled.value?-1:void 0,disabled:r.disabled.value,"aria-expanded":r.isSelected.value,onClick:e.readonly?void 0:r.toggle},[j(`span`,{class:`v-expansion-panel-title__overlay`},null),t.default?.(s.value),!e.hideActions&&z(ne,{defaults:{VIcon:{icon:c.value}}},{default:()=>[j(`span`,{class:`v-expansion-panel-title__icon`},[t.actions?.(s.value)??z(ye,null,null)])]})]),[[S,e.ripple]])),{}}}),Ft=B({title:String,text:String,bgColor:String,...Me(),...Ie(),...xe(),...ce(),...Nt(),...jt()},`VExpansionPanel`),It=I()({name:`VExpansionPanel`,props:Ft(),emits:{"group:selected":e=>!0},setup(e,{slots:t}){let r=F(e,At),{backgroundColorClasses:i,backgroundColorStyles:a}=y(()=>e.bgColor),{elevationClasses:o}=Oe(e),{roundedClasses:s}=Ke(e),c=p(()=>r?.disabled.value||e.disabled),ee=n(()=>r.group.items.value.reduce((e,t,n)=>(r.group.selected.value.includes(t.id)&&e.push(n),e),[])),l=n(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&ee.value.some(t=>t-e===1)}),u=n(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&ee.value.some(t=>t-e===-1)});return Ve(At,r),Ne(()=>{let n=!!(t.text||e.text),ee=!!(t.title||e.title),te=Pt.filterProps(e),d=Mt.filterProps(e);return z(e.tag,{class:_e([`v-expansion-panel`,{"v-expansion-panel--active":r.isSelected.value,"v-expansion-panel--before-active":l.value,"v-expansion-panel--after-active":u.value,"v-expansion-panel--disabled":c.value},s.value,i.value,e.class]),style:ae([a.value,e.style])},{default:()=>[j(`div`,{class:_e([`v-expansion-panel__shadow`,...o.value])},null),z(ne,{defaults:{VExpansionPanelTitle:{...te},VExpansionPanelText:{...d}}},{default:()=>[ee&&z(Pt,{key:`title`},{default:()=>[t.title?t.title():e.title]}),n&&z(Mt,{key:`text`},{default:()=>[t.text?t.text():e.text]}),t.default?.()]})]})}),{groupItem:r}}}),Lt=[`default`,`accordion`,`inset`,`popout`],Rt=B({flat:Boolean,...Ae(),...a(Ft(),[`bgColor`,`collapseIcon`,`color`,`eager`,`elevation`,`expandIcon`,`focusable`,`hideActions`,`readonly`,`ripple`,`static`]),...xe(),...re(),...N(),...ce(),variant:{type:String,default:`default`,validator:e=>Lt.includes(e)}},`VExpansionPanels`),zt=I()({name:`VExpansionPanels`,props:Rt(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let{next:n,prev:r}=Pe(e,At),{themeClasses:i}=oe(e),{roundedClasses:a}=Ke(e),o=p(()=>e.variant&&`v-expansion-panels--variant-${e.variant}`);return Re({VExpansionPanel:{bgColor:p(()=>e.bgColor),collapseIcon:p(()=>e.collapseIcon),color:p(()=>e.color),eager:p(()=>e.eager),elevation:p(()=>e.elevation),expandIcon:p(()=>e.expandIcon),focusable:p(()=>e.focusable),hideActions:p(()=>e.hideActions),readonly:p(()=>e.readonly),ripple:p(()=>e.ripple),static:p(()=>e.static)}}),Ne(()=>z(e.tag,{class:_e([`v-expansion-panels`,{"v-expansion-panels--flat":e.flat,"v-expansion-panels--tile":e.tile},i.value,a.value,o.value,e.class]),style:ae(e.style)},{default:()=>[t.default?.({prev:r,next:n})]})),{next:n,prev:r}}}),Bt=Fe({__name:`ServerFormDialog`,props:{modelValue:{type:Boolean},form:{},isEditing:{type:Boolean},saving:{type:Boolean},lookupsLoading:{type:Boolean},passwordPresets:{},sshKeyPresets:{},categoryOptions:{},platforms:{},nodes:{},editHints:{},filesElevationItems:{}},emits:[`update:modelValue`,`save`],setup(e,{emit:t}){let r=e,i=t,a=n(()=>r.form.preset_id||r.isEditing?[]:[X(`SSH 密码或选择密码预设`)]),o=n(()=>r.form.ssh_key_preset_id||r.isEditing?[]:[X(`私钥或选择 SSH 密钥预设`)]);return(t,n)=>(O(),U(mt,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":n[18]||=e=>i(`update:modelValue`,e)},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,{class:`d-flex align-center`},{default:d(()=>[k(x(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),z(Y),z(W,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:n[0]||=e=>i(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),z(se),z(v,{class:`pt-4`},{default:d(()=>[e.lookupsLoading?(O(),U(E,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):R(``,!0),n[21]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),z(ut,{dense:``},{default:d(()=>[z(J,{cols:`12`,sm:`6`},{default:d(()=>[z(H,{modelValue:e.form.name,"onUpdate:modelValue":n[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[G(X)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),z(J,{cols:`12`,sm:`6`},{default:d(()=>[z(H,{modelValue:e.form.domain,"onUpdate:modelValue":n[2]||=t=>e.form.domain=t,label:`域名 / IP`,variant:`outlined`,density:`compact`,placeholder:`例:192.168.1.10`,rules:[G(X)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),z(J,{cols:`6`,sm:`4`},{default:d(()=>[z(H,{modelValue:e.form.port,"onUpdate:modelValue":n[3]||=t=>e.form.port=t,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),z(J,{cols:`6`,sm:`8`},{default:d(()=>[z(H,{modelValue:e.form.username,"onUpdate:modelValue":n[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[G(X)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),z(se,{class:`my-4`}),n[22]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`认证方式`,-1),z(M,{modelValue:e.form.auth_method,"onUpdate:modelValue":n[5]||=t=>e.form.auth_method=t,mandatory:``,density:`compact`,variant:`outlined`,class:`mb-3`},{default:d(()=>[z(W,{value:`password`,size:`small`},{default:d(()=>[...n[19]||=[k(`密码`,-1)]]),_:1}),z(W,{value:`key`,size:`small`},{default:d(()=>[...n[20]||=[k(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(O(),V(D,{key:1},[z(st,{modelValue:e.form.preset_id,"onUpdate:modelValue":n[6]||=t=>e.form.preset_id=t,items:e.passwordPresets,"item-title":`display`,"item-value":`id`,label:`密码预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密填入,无需再填密码框`,"persistent-hint":``},null,8,[`modelValue`,`items`]),e.form.preset_id?R(``,!0):(O(),U(H,{key:0,modelValue:e.form.password,"onUpdate:modelValue":n[7]||=t=>e.form.password=t,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:e.isEditing&&e.editHints.password_set?`留空表示不修改`:`安装 Agent 需可 SSH`,rules:a.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(O(),V(D,{key:2},[z(st,{modelValue:e.form.ssh_key_preset_id,"onUpdate:modelValue":n[8]||=t=>e.form.ssh_key_preset_id=t,items:e.sshKeyPresets,"item-title":`display`,"item-value":`id`,label:`SSH 密钥预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密私钥,无需再粘贴`,"persistent-hint":``},null,8,[`modelValue`,`items`]),z(H,{modelValue:e.form.ssh_key_path,"onUpdate:modelValue":n[9]||=t=>e.form.ssh_key_path=t,label:`密钥路径(可选)`,variant:`outlined`,density:`compact`,placeholder:`~/.ssh/id_rsa`,class:`mb-2`},null,8,[`modelValue`]),e.form.ssh_key_preset_id?R(``,!0):(O(),U(ht,{key:0,modelValue:e.form.ssh_key_private,"onUpdate:modelValue":n[10]||=t=>e.form.ssh_key_private=t,label:`私钥 PEM`,variant:`outlined`,density:`compact`,rows:`4`,"auto-grow":``,placeholder:e.isEditing&&e.editHints.ssh_key_private_set?`留空表示不修改私钥`:`粘贴 -----BEGIN ... PRIVATE KEY-----`,rules:o.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)),z(se,{class:`my-4`}),n[23]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),z(H,{modelValue:e.form.target_path,"onUpdate:modelValue":n[11]||=t=>e.form.target_path=t,label:`目标路径`,variant:`outlined`,density:`compact`,placeholder:`/www/wwwroot`,hint:`文件同步与推送的根目录,须为绝对路径`,"persistent-hint":``,class:`mb-2`,rules:[G(X)(`目标路径`)]},null,8,[`modelValue`,`rules`]),z(kt,{modelValue:e.form.category,"onUpdate:modelValue":n[12]||=t=>e.form.category=t,items:e.categoryOptions,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,hint:`可从已有分类选择或输入新分类`,"persistent-hint":``},null,8,[`modelValue`,`items`]),z(zt,{variant:`accordion`,class:`mt-4`},{default:d(()=>[z(It,{title:`高级选项`},{default:d(()=>[z(Mt,null,{default:d(()=>[z(st,{modelValue:e.form.platform_id,"onUpdate:modelValue":n[13]||=t=>e.form.platform_id=t,items:e.platforms,"item-title":`name`,"item-value":`id`,label:`平台`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),z(st,{modelValue:e.form.node_id,"onUpdate:modelValue":n[14]||=t=>e.form.node_id=t,items:e.nodes,"item-title":`name`,"item-value":`id`,label:`节点`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),z(st,{modelValue:e.form.files_elevation,"onUpdate:modelValue":n[15]||=t=>e.form.files_elevation=t,items:e.filesElevationItems,"item-title":`title`,"item-value":`value`,label:`文件管理提权`,variant:`outlined`,density:`compact`,hint:`非 root 用户需目标机配置免密 sudo`,"persistent-hint":``},null,8,[`modelValue`,`items`])]),_:1})]),_:1})]),_:1})]),_:1}),z(se),z(h,{class:`pa-4`},{default:d(()=>[z(Y),z(W,{variant:`text`,disabled:e.saving,onClick:n[16]||=e=>i(`update:modelValue`,!1)},{default:d(()=>[...n[24]||=[k(`取消`,-1)]]),_:1},8,[`disabled`]),z(W,{color:`primary`,variant:`flat`,loading:e.saving,onClick:n[17]||=e=>i(`save`)},{default:d(()=>[...n[25]||=[k(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Vt={key:1,class:`text-body-2 text-medium-emphasis mb-0`},Ht={class:`text-body-2 mb-3`},Ut={class:`text-success font-weight-medium`},Wt={class:`text-error font-weight-medium`},Gt={key:3,class:`text-medium-emphasis mb-0`},Kt=Fe({__name:`BatchAgentResultDialog`,props:{modelValue:{type:Boolean},title:{},loading:{type:Boolean},results:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,a=t,o=n(()=>i.results.filter(e=>e.success).length),s=n(()=>i.results.length-o.value);return(t,n)=>(O(),U(mt,{"model-value":e.modelValue,"max-width":`560`,scrollable:``,persistent:``,"onUpdate:modelValue":n[2]||=e=>a(`update:modelValue`,e)},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,{class:`d-flex align-center`},{default:d(()=>[k(x(e.title)+` `,1),z(Y),z(W,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.loading,onClick:n[0]||=e=>a(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),z(se),z(v,{class:`pt-4`},{default:d(()=>[e.loading?(O(),U(E,{key:0,indeterminate:``,color:`primary`,class:`mb-2`})):R(``,!0),e.loading?(O(),V(`p`,Vt,`正在执行,请稍候…`)):e.results.length?(O(),V(D,{key:2},[j(`p`,Ht,[n[3]||=k(` 成功 `,-1),j(`span`,Ut,x(o.value),1),n[4]||=k(` 台, 失败 `,-1),j(`span`,Wt,x(s.value),1),n[5]||=k(` 台 `,-1)]),z(He,{density:`compact`,class:`rounded border`},{default:d(()=>[(O(!0),V(D,null,qe(e.results,e=>(O(),U(Te,{key:e.server_id,class:`py-1`},{prepend:d(()=>[z(ye,{color:e.success?`success`:`error`,size:`18`},{default:d(()=>[k(x(e.success?`mdi-check-circle`:`mdi-close-circle`),1)]),_:2},1032,[`color`])]),default:d(()=>[z(r,{class:`text-body-2`},{default:d(()=>[k(x(e.server_name||`#${e.server_id}`),1)]),_:2},1024),e.success&&e.stdout?(O(),U(we,{key:0,class:`text-caption text-medium-emphasis`},{default:d(()=>[k(x(e.stdout),1)]),_:2},1024)):!e.success&&e.error?(O(),U(we,{key:1,class:`text-caption text-error`},{default:d(()=>[k(x(e.error),1)]),_:2},1024)):R(``,!0)]),_:2},1024))),128))]),_:1})],64)):(O(),V(`p`,Gt,`无结果`))]),_:1}),z(se),z(h,{class:`pa-4`},{default:d(()=>[z(Y),z(W,{color:`primary`,variant:`flat`,disabled:e.loading,onClick:n[1]||=e=>a(`update:modelValue`,!1)},{default:d(()=>[...n[6]||=[k(` 关闭 `,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function qt(){return{name:``,domain:``,port:22,username:`root`,auth_method:`password`,preset_id:null,password:``,ssh_key_preset_id:null,ssh_key_path:``,ssh_key_private:``,target_path:`/www/wwwroot`,category:``,platform_id:null,node_id:null,files_elevation:`auto_sudo`}}function Jt(e){return e===`uncategorized`?``:e}function Yt(e){let t=e.auth_method===`key`?`key`:`password`;return{name:e.name,domain:e.domain||``,port:e.port??22,username:e.username||`root`,auth_method:t,preset_id:e.preset_id,password:``,ssh_key_preset_id:e.ssh_key_preset_id,ssh_key_path:e.ssh_key_path||``,ssh_key_private:``,target_path:e.target_path||`/www/wwwroot`,category:e.category||``,platform_id:e.platform_id,node_id:e.node_id,files_elevation:e.files_elevation||`auto_sudo`}}function Xt(e){let t=Ye(),r=_(!1),i=_(null),a=_(!1),o=_(qt()),s=_({password_set:!1,ssh_key_private_set:!1}),c=_([]),ee=_([]),l=_([]),u=_([]),te=_([]),d=_(!1),ne=n(()=>i.value!=null),f=[{title:`自动(权限失败时 sudo)`,value:`auto_sudo`},{title:`关闭 sudo`,value:`off`},{title:`始终 sudo(排障)`,value:`always_sudo`}];async function re(){d.value=!0;try{let[e,t,n,r]=await Promise.all([K.get(`/servers/categories`),K.getList(`/presets/`,{per_page:500}),K.getList(`/ssh-key-presets/`,{per_page:500}),K.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=Jt(t.name);e&&i.add(e)}l.value=[...i].sort((e,t)=>e.localeCompare(t,`zh`)),u.value=(e.platforms||[]).map(e=>({id:e.id,name:e.name})),c.value=(t.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),ee.value=(n.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),te.value=Array.isArray(r)?r:[]}catch{t(`加载表单选项失败`,`error`)}finally{d.value=!1}}async function ie(){i.value=null,o.value=qt(),s.value={password_set:!1,ssh_key_private_set:!1},r.value=!0,await re()}async function ae(e){i.value=e.id,o.value=Yt(e),s.value={password_set:!!e.password_set,ssh_key_private_set:!!(e.ssh_key_private_set||e.ssh_key_configured)},r.value=!0,await re()}function p(){r.value=!1,i.value=null,o.value=qt(),s.value={password_set:!1,ssh_key_private_set:!1}}function m(){let e=o.value;if(!e.name.trim())return`请填写服务器名称`;if(!e.domain.trim())return`请填写域名或 IP`;if(!e.username.trim())return`请填写 SSH 用户名`;let t=Number(e.port);if(!Number.isFinite(t)||t<1||t>65535)return`SSH 端口无效`;let n=e.target_path.trim();if(!n)return`请填写目标路径(部署根目录)`;if(!n.startsWith(`/`))return`目标路径须为绝对路径(以 / 开头)`;if(e.auth_method===`password`){if(!ne.value&&!e.preset_id&&!e.password.trim())return`请选择密码预设或填写 SSH 密码(安装 Agent 需要可 SSH)`}else if(!ne.value&&!e.ssh_key_preset_id&&!e.ssh_key_private.trim())return`请选择 SSH 密钥预设或粘贴私钥`;return null}function oe(){let e=o.value,t={name:e.name.trim(),domain:e.domain.trim(),port:Number(e.port),username:e.username.trim()||`root`,auth_method:e.auth_method,target_path:e.target_path.trim(),category:e.category.trim()||void 0,platform_id:e.platform_id??void 0,node_id:e.node_id??void 0,files_elevation:e.files_elevation,agent_port:8601};return e.auth_method===`password`?(e.preset_id!=null&&(t.preset_id=e.preset_id),e.password.trim()&&(t.password=e.password.trim()),ne.value||!e.preset_id&&e.password.trim()):(e.ssh_key_preset_id!=null&&(t.ssh_key_preset_id=e.ssh_key_preset_id),e.ssh_key_path.trim()&&(t.ssh_key_path=e.ssh_key_path.trim()),e.ssh_key_private.trim()&&(t.ssh_key_private=e.ssh_key_private.trim())),t}async function h(){let n=m();if(n){t(n,`error`);return}a.value=!0;try{let n=oe();ne.value&&i.value!=null?await K.put(`/servers/${i.value}`,n):await K.post(`/servers/`,n),p(),e(),t(`保存成功`)}catch(e){t(dt(e,`保存失败`),`error`)}finally{a.value=!1}}return{visible:r,editingId:i,isEditing:ne,saving:a,form:o,editHints:s,passwordPresets:c,sshKeyPresets:ee,categoryOptions:l,platforms:u,nodes:te,lookupsLoading:d,filesElevationItems:f,openAdd:ie,openEdit:ae,close:p,save:h}}var Zt={class:`d-flex align-center flex-wrap ga-2`},Qt={class:`text-body-2 mr-4`},$t={class:`font-weight-medium`},en={class:`text-medium-emphasis`},tn={key:1,class:`text-medium-emphasis`},nn={key:1,class:`d-flex align-center ga-1`},rn=[`title`],an={class:`text-medium-emphasis`},on={class:`text-caption text-medium-emphasis`},sn={class:`d-flex ga-1`},cn={key:2,class:`px-4 pb-4`},ln={key:0,class:`text-center py-8`},un={key:1,class:`text-center text-medium-emphasis py-6`},dn={class:`d-flex align-center ga-2`},fn={class:`text-caption text-medium-emphasis`},pn=[`onClick`],mn={class:`font-weight-medium`},hn={class:`text-medium-emphasis`},gn={class:`text-caption text-medium-emphasis text-truncate`,style:{"max-width":`180px`}},_n={class:`text-medium-emphasis`},vn={class:`text-caption text-medium-emphasis`},yn=[`title`],bn={class:`text-h6`},xn={class:`text-h6`},Sn={class:`text-h6`},Cn={class:`text-h6`},wn={class:`text-body-1 font-weight-medium text-truncate`},Tn={key:0,class:`text-center py-4`},En={key:1,class:`text-medium-emphasis text-center py-4`},Dn={key:1,class:`text-medium-emphasis`},On={class:`text-body-2 mb-2`},kn={class:`text-body-2 text-medium-emphasis mb-3`},An={key:0,class:`text-caption text-medium-emphasis mt-1`},jn={key:0},Mn={key:0},Nn=Fe({__name:`ServersPage`,setup(i){let a=[...pt],o=Ye(),s=ge(),{servers:c,loading:ee,page:l,itemsPerPage:te,total:ne,search:re,categoryFilter:ie,loadServers:ae,onSearch:p,onPageChange:m,onItemsPerPageChange:oe,onCategoryChange:ce,loadAllServers:le}=gt(),{categories:de,loading:fe,totalCount:pe,loadCategories:me}=Et(),he=_(`table`),y=_([]),b=_(!1),S=_([]);async function C(){try{await ae(),he.value===`group`&&await _e()}catch{o(`加载服务器列表失败`,`error`)}}async function _e(){b.value=!0;try{y.value=await le(),S.value=E.value.map(e=>e.category)}catch{y.value=[],o(`加载分类视图失败`,`error`)}finally{b.value=!1}}let E=n(()=>{let e={};for(let t of y.value){let n=t.category?.trim()||`uncategorized`;e[n]||(e[n]=[]),e[n].push(t)}return Object.entries(e).map(([e,t])=>({category:e,label:Dt(e),servers:t.sort((e,t)=>e.name.localeCompare(t.name,`zh`))})).sort((e,t)=>e.category===`uncategorized`?1:t.category===`uncategorized`?-1:e.label.localeCompare(t.label,`zh`))});function be(e){ce(e),he.value===`group`&&_e()}function xe(e,t){let n=new Set(X.value.map(e=>typeof e==`number`?e:e.id));t?n.add(e):n.delete(e),X.value=[...n]}We(he,e=>{e===`group`&&_e()});let A=_(!1),Se=_(!1),N=_(null),P=_(!1),F=_(!1),I=_({domain:``,port:22,name:``}),Ee=_([]),De=_(!1),Oe=_(null),L=_(!1),ke=_([]),Ae=_(``),je=_(!1),B=_(null),Me=_(!1),Ne=[{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`尝试次数`,key:`attempts`,width:100},{title:`最后错误`,key:`last_error`},{title:`最后尝试`,key:`last_attempt_at`,width:160},{title:`操作`,key:`actions`,width:140,align:`end`}];function Pe(){I.value={domain:``,port:22,name:``},P.value=!0}function Fe(e,t){ke.value=e,Ae.value=t||``,L.value=!0}async function Ie(){De.value=!0;try{Ee.value=(await K.get(`/servers/pending`)).items||[]}catch(e){Ee.value=[],o(dt(e,`加载失败列表失败`),`error`)}finally{De.value=!1}}async function Le(){let e=I.value.domain.trim();if(!e){o(`请填写 IP 或域名`,`error`);return}F.value=!0;try{let t={domain:e,port:I.value.port||22},n=I.value.name.trim();n&&(t.name=n);let r=await K.post(`/servers/add-by-ip`,t);r.success&&r.server?(P.value=!1,o(`添加成功:${r.matched_preset} (${r.matched_username})`),C(),Wt()):(P.value=!1,Fe(r.errors||[],r.message),Ie())}catch(e){o(dt(e,`添加失败`),`error`)}finally{F.value=!1}}async function Re(e){Oe.value=e.id;try{let t=await K.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(o(`重试成功:${t.matched_preset} (${t.matched_username})`),C(),Wt(),Ie()):(Fe(t.errors||[],t.message),Ie())}catch(e){o(dt(e,`重试失败`),`error`)}finally{Oe.value=null}}function ze(e){B.value=e,je.value=!0}async function Be(){if(B.value){Me.value=!0;try{await K.delete(`/servers/pending/${B.value.id}`),je.value=!1,o(`已从失败列表移除`),Ie()}catch(e){o(dt(e,`删除失败`),`error`)}finally{Me.value=!1}}}let{visible:Ve,form:Ue,isEditing:Ge,saving:Ke,lookupsLoading:Je,passwordPresets:Ze,sshKeyPresets:Qe,categoryOptions:$e,platforms:tt,nodes:nt,editHints:rt,filesElevationItems:it,openAdd:at,openEdit:ot,close:st,save:ct}=Xt(()=>{C(),Wt(),me()});We(Ve,(e,t)=>{t&&!e&&st()});let X=_([]),Z=n(()=>new Set(Ot(X.value))),Q=_(null),At=_(`info`),jt=_([]),Nt=_(!1);function Ft(e){switch(e){case`success`:return`success`;case`failed`:return`error`;case`running`:return`warning`;case`cancelled`:return`grey`;default:return`default`}}function Lt(e){switch(e){case`success`:return`成功`;case`failed`:return`失败`;case`running`:return`进行中`;case`cancelled`:return`已取消`;default:return e}}function Rt(e){let t=[];return e.started_at&&t.push(e.started_at),e.sync_mode&&t.push(e.sync_mode),e.trigger_type&&t.push(e.trigger_type),e.push_permission&&t.push(`权限 ${ft(e.push_permission)}`),t.join(` · `)||`—`}function Vt(e){return Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:[]}let Ht=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`分类`,key:`category`,width:100},{title:`目标路径`,key:`target_path`,width:200},{title:`Agent`,key:`agent`,width:100},{title:`心跳`,key:`heartbeat`,width:120},{title:`操作`,key:`actions`,width:200,align:`end`}],Ut=_([{subtitle:`服务器总数`,title:`0`,icon:`mdi-server-network`,color:`blue`},{subtitle:`在线`,title:`0`,icon:`mdi-check-circle-outline`,color:`green`},{subtitle:`离线`,title:`0`,icon:`mdi-alert-circle-outline`,color:`orange`},{subtitle:`告警中`,title:`0`,icon:`mdi-bell-alert-outline`,color:`red`}]);async function Wt(){try{let e=await K.get(`/servers/stats`);Ut.value[0].title=String(e.total),Ut.value[1].title=String(e.online),Ut.value[2].title=String(e.offline),Ut.value[3].title=String(e.alerts??0)}catch{}}function Gt(e){s.push({path:`/terminal`,query:{server_id:String(e.id)}})}function qt(e){s.push({path:`/files`,query:{server_id:String(e.id)}})}let Jt=_(!1),Yt=_(``),Nn=_(!1),Pn=n(()=>{let e=de.value.filter(e=>e.name!==`uncategorized`).map(e=>e.label);if($e.value.length)for(let t of $e.value)t&&!e.includes(t)&&e.push(t);return e.sort((e,t)=>e.localeCompare(t,`zh`))});function Fn(){if(Z.value.size===0){o(`请先勾选至少一台服务器`,`error`);return}Yt.value=``,Jt.value=!0}async function In(){let e=[...Z.value];if(e.length!==0){Nn.value=!0;try{let t=(Yt.value||``).trim(),n=0;for(let r=0;r<e.length;r+=200){let i=await K.post(`/servers/batch/category`,{server_ids:e.slice(r,r+200),category:t});n+=i.updated}Jt.value=!1,X.value=[],o(`已更新 ${n} 台服务器分类`),await Promise.all([C(),me(),Wt()])}catch(e){o(dt(e,`批量修改分类失败`),`error`)}finally{Nn.value=!1}}}let Ln=_(!1),Rn=_(!1),zn=_(!1),Bn=_(!1),Vn=_(``),Hn=_([]),Un=_(null),Wn=_(``),Gn=_(null);function Kn(e){Vn.value=e,Hn.value=[],Bn.value=!0,zn.value=!0}function qn(e){Hn.value=e,Bn.value=!1}async function Jn(e,t,n){let r=Ot(X.value);if(!r.length){o(`请先选择服务器`,`warning`);return}if(!(n?.confirm&&!confirm(n.confirm.replace(`{n}`,String(r.length))))){Kn(e);try{qn((await K.post(t,{server_ids:r})).results||[]),n?.reload!==!1&&C()}catch(e){zn.value=!1,o(dt(e,`操作失败`),`error`)}}}function Yn(e){Un.value=e.id,Wn.value=e.target_path?.trim()||`/www/wwwroot`}function Xn(){Un.value=null,Wn.value=``,Gn.value=null}async function Zn(e){let t=Wn.value.trim();if(!t){o(`目标路径不能为空`,`warning`);return}if(!t.startsWith(`/`)){o(`目标路径须为绝对路径(以 / 开头)`,`warning`);return}Gn.value=e;try{await K.put(`/servers/${e}`,{target_path:t}),o(`目标路径已更新`),Xn(),C(),Q.value?.id===e&&(Q.value={...Q.value,target_path:t})}catch(e){o(dt(e,`保存失败`),`error`)}finally{Gn.value=null}}function Qn(){if(!Z.value.size){o(`请先选择服务器`,`warning`);return}Rn.value=!0}async function $n(){Rn.value=!1,await Jn(`自动检测目标路径`,`/servers/batch/detect-path`)}async function er(){let e=Ot(X.value);if(e.length){o(`正在检查 ${e.length} 台服务器...`);try{await K.post(`/servers/check`,{server_ids:e}),o(`健康检查完成`),C()}catch(e){o(dt(e,`检查失败`),`error`)}}}async function tr(){if(confirm(`确定删除选中的 ${Z.value.size} 台服务器?`)){for(let e of Z.value)try{await K.delete(`/servers/${e}`)}catch{}X.value=[],o(`批量删除完成`),C(),Wt()}}async function nr(){Ln.value=!0;try{await Jn(`批量安装 Agent`,`/servers/batch/install-agent`,{reload:!0})}finally{Ln.value=!1}}async function rr(){Ln.value=!0;try{await Jn(`批量升级 Agent`,`/servers/batch/upgrade-agent`,{confirm:`确定对 {n} 台服务器升级 Agent?`,reload:!0})}finally{Ln.value=!1}}async function ir(){Ln.value=!0;try{await Jn(`批量卸载 Agent`,`/servers/batch/uninstall-agent`,{confirm:`确定对 {n} 台已安装 Agent 的服务器执行卸载?
|
||
将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`,reload:!0})}finally{Ln.value=!1}}async function ar(){try{let e=await K.getList(`/servers/`,{per_page:5e3}),t=[`ID`,`名称`,`地址`,`端口`,`用户名`,`分类`,`状态`,`Agent版本`,`最后心跳`],n=(e.items||[]).map(e=>[e.id,e.name,e.domain,e.port,e.username,e.category||``,e.status,e.agent_version||``,e.last_heartbeat||``]),r=``+[t.join(`,`),...n.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
|
||
`),i=new Blob([r],{type:`text/csv;charset=utf-8;`}),a=URL.createObjectURL(i),s=document.createElement(`a`);s.href=a,s.download=`servers_${new Date().toISOString().slice(0,10)}.csv`,s.click(),URL.revokeObjectURL(a),o(`导出完成`)}catch(e){o(e.message||`导出失败`,`error`)}}let or=_(!1),sr=_(``),cr=_(22),lr=_(8601),ur=_(!1),$=_(null);function dr(e){let t=e.trim();if(!t)return``;let n=t.indexOf(` `);if(n>=0)return t.slice(n+1).trim();let r=t.lastIndexOf(`,`);if(r>=0){let e=t.slice(r+1).trim(),n=t.slice(0,r).trim();if(e&&n&&(e.includes(`.`)||e.includes(`:`)))return e}return t}function fr(e){let t=new Set,n=[],r=0;for(let i of e.split(`
|
||
`)){let e=dr(i);if(!e)continue;r+=1;let a=e.toLowerCase();t.has(a)||(t.add(a),n.push(e))}return{unique:n.length,raw:r,deduped:Math.max(0,r-n.length)}}let pr=n(()=>fr(sr.value));function mr(){sr.value=``,cr.value=22,lr.value=8601,$.value=null,or.value=!0}async function hr(){let e=sr.value.trim();if(!e){o(`请填写至少一个 IP 或域名`,`error`);return}ur.value=!0,$.value=null;try{let t=await K.post(`/servers/add-by-ips-batch`,{text:e,port:cr.value||22,agent_port:lr.value||8601});$.value=t,t.created>0&&(C(),Wt()),t.pending>0&&Ie(),o(t.pending>0?`添加完成:${t.created} 台成功,${t.pending} 台进入连接失败列表`:`添加完成:${t.created} 台成功`,t.pending>0?`warning`:`success`)}catch(e){o(dt(e,`批量添加失败`),`error`)}finally{ur.value=!1}}async function gr(e){Q.value=e,At.value=`info`,Nt.value=!0,jt.value=[];try{jt.value=Vt(await K.get(`/servers/${e.id}/logs`,{limit:20}))}catch{jt.value=[]}finally{Nt.value=!1}}function _r(e){ot(e)}function vr(e){N.value=e,A.value=!0}async function yr(){if(N.value){Se.value=!0;try{await K.delete(`/servers/${N.value.id}`),A.value=!1,C(),Wt(),o(`已删除`)}catch(e){o(e.message||`删除失败`,`error`)}finally{Se.value=!1}}}return Ce(()=>{Wt(),me(),C(),Ie()}),(n,i)=>(O(),U(Xe,{fluid:``,class:`pa-4 pa-md-6`},{default:d(()=>[z(bt,{items:Ut.value},null,8,[`items`]),z(g,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:d(()=>[z(f,{class:`d-flex align-center`},{default:d(()=>[i[44]||=k(` 服务器列表 `,-1),z(Y),z(H,{modelValue:G(re),"onUpdate:modelValue":[i[0]||=e=>ue(re)?re.value=e:null,G(p)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),z(W,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:G(at)},{default:d(()=>[...i[37]||=[k(` 添加 `,-1)]]),_:1},8,[`onClick`]),z(W,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:Pe},{default:d(()=>[...i[38]||=[k(` 快速添加(IP) `,-1)]]),_:1}),z(W,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:ar},{default:d(()=>[...i[39]||=[k(` 导出CSV `,-1)]]),_:1}),z(W,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-ip-network`,size:`small`,onClick:mr},{default:d(()=>[...i[40]||=[k(` 批量添加 `,-1)]]),_:1}),z(W,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:Z.value.size===0,title:`请先勾选至少一台服务器`,onClick:Qn},{default:d(()=>[...i[41]||=[k(` 检测路径 `,-1)]]),_:1},8,[`disabled`]),z(M,{modelValue:he.value,"onUpdate:modelValue":i[1]||=e=>he.value=e,mandatory:``,density:`compact`,class:`ml-2`,color:`primary`,variant:`outlined`,divided:``},{default:d(()=>[z(W,{value:`table`,size:`small`,"prepend-icon":`mdi-table`},{default:d(()=>[...i[42]||=[k(`列表`,-1)]]),_:1}),z(W,{value:`group`,size:`small`,"prepend-icon":`mdi-folder-multiple`},{default:d(()=>[...i[43]||=[k(`分类`,-1)]]),_:1})]),_:1},8,[`modelValue`])]),_:1}),z(v,{class:`pt-0 pb-2`},{default:d(()=>[j(`div`,Zt,[i[45]||=j(`span`,{class:`text-caption text-medium-emphasis mr-1`},`分类筛选`,-1),z(q,{color:G(ie)===``?`primary`:void 0,variant:G(ie)===``?`flat`:`outlined`,size:`small`,label:``,onClick:i[2]||=e=>be(``)},{default:d(()=>[k(` 全部 `+x(G(pe)),1)]),_:1},8,[`color`,`variant`]),(O(!0),V(D,null,qe(G(de),e=>(O(),U(q,{key:e.name,color:G(ie)===e.name?`primary`:void 0,variant:G(ie)===e.name?`flat`:`outlined`,size:`small`,label:``,onClick:t=>be(e.name)},{default:d(()=>[k(x(e.label)+` `+x(e.count),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128)),G(fe)?(O(),U(w,{key:0,indeterminate:``,size:`16`,width:`2`})):R(``,!0)])]),_:1}),Z.value.size>0?(O(),U(g,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:d(()=>[z(v,{class:`d-flex align-center py-2`},{default:d(()=>[j(`span`,Qt,`已选择 `+x(Z.value.size)+` 台服务器`,1),z(Y),z(W,{size:`small`,variant:`text`,onClick:Fn},{default:d(()=>[...i[46]||=[k(`修改分类`,-1)]]),_:1}),z(W,{size:`small`,variant:`text`,onClick:er},{default:d(()=>[...i[47]||=[k(`健康检查`,-1)]]),_:1}),z(W,{size:`small`,variant:`text`,onClick:Qn},{default:d(()=>[...i[48]||=[k(`检测目标路径`,-1)]]),_:1}),z(W,{size:`small`,variant:`text`,onClick:nr,loading:Ln.value},{default:d(()=>[...i[49]||=[k(`安装Agent`,-1)]]),_:1},8,[`loading`]),z(W,{size:`small`,variant:`text`,onClick:rr,loading:Ln.value},{default:d(()=>[...i[50]||=[k(`升级Agent`,-1)]]),_:1},8,[`loading`]),z(W,{size:`small`,variant:`text`,color:`error`,onClick:ir,loading:Ln.value},{default:d(()=>[...i[51]||=[k(`卸载Agent`,-1)]]),_:1},8,[`loading`]),z(W,{size:`small`,variant:`text`,color:`error`,onClick:tr},{default:d(()=>[...i[52]||=[k(`批量删除`,-1)]]),_:1}),z(W,{size:`small`,variant:`text`,onClick:i[3]||=e=>X.value=[]},{default:d(()=>[...i[53]||=[k(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):R(``,!0),he.value===`table`?(O(),U(lt,{key:1,items:G(c),headers:Ht,"items-length":G(ne),loading:G(ee),page:G(l),"items-per-page":G(te),"items-per-page-options":a,hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:X.value,"onUpdate:modelValue":i[6]||=e=>X.value=e,"onUpdate:page":G(m),"onUpdate:itemsPerPage":G(oe),"onClick:row":i[7]||=(e,{item:t})=>gr(t)},{"item.status":d(({item:e})=>[z(q,{color:G(yt)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:d(()=>[k(x(G(_t)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":d(({item:e})=>[j(`span`,$t,x(e.name),1)]),"item.address":d(({item:e})=>[j(`span`,en,x(e.domain)+`:`+x(e.port),1)]),"item.category":d(({item:e})=>[e.category?(O(),U(q,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:d(()=>[k(x(e.category),1)]),_:2},1024)):(O(),V(`span`,tn,`—`))]),"item.target_path":d(({item:e})=>[Un.value===e.id?(O(),V(`div`,{key:0,class:`d-flex align-center ga-1`,onClick:i[5]||=T(()=>{},[`stop`])},[z(H,{modelValue:Wn.value,"onUpdate:modelValue":i[4]||=e=>Wn.value=e,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,style:{"max-width":`140px`},onKeyup:[ve(t=>Zn(e.id),[`enter`]),ve(Xn,[`esc`])]},null,8,[`modelValue`,`onKeyup`]),z(W,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:Gn.value===e.id,onClick:t=>Zn(e.id)},null,8,[`loading`,`onClick`]),z(W,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:Xn})])):(O(),V(`div`,nn,[j(`span`,{class:`text-caption text-medium-emphasis text-truncate d-inline-block`,style:{"max-width":`140px`},title:e.target_path||`未配置`},x(e.target_path?.trim()||`—`),9,rn),z(W,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:T(t=>Yn(e),[`stop`])},null,8,[`onClick`])]))]),"item.agent":d(({item:e})=>[j(`span`,an,x(e.agent_version||`—`),1)]),"item.heartbeat":d(({item:e})=>[j(`span`,on,x(G(vt)(e.last_heartbeat)),1)]),"item.actions":d(({item:e})=>[j(`div`,sn,[z(W,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:T(t=>Gt(e),[`stop`])},{default:d(()=>[...i[54]||=[k(`终端`,-1)]]),_:1},8,[`onClick`]),z(W,{variant:`text`,size:`x-small`,density:`compact`,onClick:T(t=>qt(e),[`stop`])},{default:d(()=>[...i[55]||=[k(`文件`,-1)]]),_:1},8,[`onClick`]),z(W,{variant:`text`,size:`x-small`,density:`compact`,onClick:T(t=>_r(e),[`stop`])},{default:d(()=>[...i[56]||=[k(`编辑`,-1)]]),_:1},8,[`onClick`]),z(W,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:T(t=>vr(e),[`stop`])},{default:d(()=>[...i[57]||=[k(`删除`,-1)]]),_:1},8,[`onClick`])])]),"no-data":d(()=>[...i[58]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`,`modelValue`,`onUpdate:page`,`onUpdate:itemsPerPage`])):(O(),V(`div`,cn,[b.value?(O(),V(`div`,ln,[z(w,{indeterminate:``,size:`32`}),i[59]||=j(`div`,{class:`text-caption text-medium-emphasis mt-2`},`按分类加载中…`,-1)])):E.value.length===0?(O(),V(`div`,un,` 暂无服务器数据 `)):(O(),U(zt,{key:2,modelValue:S.value,"onUpdate:modelValue":i[10]||=e=>S.value=e,multiple:``,variant:`accordion`},{default:d(()=>[(O(!0),V(D,null,qe(E.value,t=>(O(),U(It,{key:t.category},{default:d(()=>[z(Pt,null,{default:d(()=>[j(`div`,dn,[z(q,{color:`primary`,variant:`tonal`,size:`small`,label:``},{default:d(()=>[k(x(t.label),1)]),_:2},1024),j(`span`,fn,x(t.servers.length)+` 台`,1)])]),_:2},1024),z(Mt,null,{default:d(()=>[z(e,{density:`compact`,hover:``},{default:d(()=>[i[61]||=j(`thead`,null,[j(`tr`,null,[j(`th`,{style:{width:`40px`}}),j(`th`,null,`状态`),j(`th`,null,`名称`),j(`th`,null,`地址`),j(`th`,null,`目标路径`),j(`th`,{class:`text-end`},`操作`)])],-1),j(`tbody`,null,[(O(!0),V(D,null,qe(t.servers,e=>(O(),V(`tr`,{key:e.id,class:`cursor-pointer`,onClick:t=>gr(e)},[j(`td`,{onClick:i[8]||=T(()=>{},[`stop`])},[z(et,{"model-value":Z.value.has(e.id),density:`compact`,"hide-details":``,"onUpdate:modelValue":t=>xe(e.id,t)},null,8,[`model-value`,`onUpdate:modelValue`])]),j(`td`,null,[z(q,{color:G(yt)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:d(()=>[k(x(G(_t)(e.status)),1)]),_:2},1032,[`color`])]),j(`td`,mn,x(e.name),1),j(`td`,hn,x(e.domain)+`:`+x(e.port),1),j(`td`,gn,x(e.target_path?.trim()||`—`),1),j(`td`,{class:`text-end`,onClick:i[9]||=T(()=>{},[`stop`])},[z(W,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>_r(e)},{default:d(()=>[...i[60]||=[k(`编辑`,-1)]]),_:1},8,[`onClick`])])],8,pn))),128))])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1},8,[`modelValue`]))]))]),_:1}),z(g,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:d(()=>[z(f,{class:`d-flex align-center`},{default:d(()=>[i[63]||=k(` 连接失败列表 `,-1),Ee.value.length?(O(),U(q,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:d(()=>[k(x(Ee.value.length),1)]),_:1})):R(``,!0),z(Y),z(W,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:De.value,onClick:Ie},{default:d(()=>[...i[62]||=[k(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),z(t,{items:Ee.value,headers:Ne,loading:De.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":d(({item:e})=>[j(`span`,_n,x(e.domain)+`:`+x(e.port),1)]),"item.last_attempt_at":d(({item:e})=>[j(`span`,vn,x(G(vt)(e.last_attempt_at)),1)]),"item.last_error":d(({item:e})=>[j(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},x(e.last_error||`—`),9,yn)]),"item.actions":d(({item:e})=>[z(W,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:Oe.value===e.id,onClick:t=>Re(e)},{default:d(()=>[...i[64]||=[k(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),z(W,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>ze(e)},{default:d(()=>[...i[65]||=[k(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":d(()=>[...i[66]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),z(u,null,{default:d(()=>[Q.value?(O(),U(g,{key:0,class:`mt-4`,elevation:`0`,border:``,rounded:`lg`},{default:d(()=>[z(f,{class:`d-flex align-center`},{default:d(()=>[z(ye,{class:`mr-2`},{default:d(()=>[...i[67]||=[k(`mdi-information-outline`,-1)]]),_:1}),k(` `+x(Q.value.name)+` `,1),z(q,{color:G(yt)(Q.value.status),size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:d(()=>[k(x(G(_t)(Q.value.status)),1)]),_:1},8,[`color`]),z(Y),z(W,{icon:`mdi-close`,size:`small`,variant:`text`,onClick:i[11]||=e=>Q.value=null})]),_:1}),z(se),z(wt,{modelValue:At.value,"onUpdate:modelValue":i[12]||=e=>At.value=e,density:`compact`},{default:d(()=>[z(xt,{value:`info`},{default:d(()=>[...i[68]||=[k(`系统信息`,-1)]]),_:1}),z(xt,{value:`logs`},{default:d(()=>[...i[69]||=[k(`同步日志`,-1)]]),_:1})]),_:1},8,[`modelValue`]),z(Ct,{modelValue:At.value,"onUpdate:modelValue":i[13]||=e=>At.value=e},{default:d(()=>[z(St,{value:`info`},{default:d(()=>[z(v,null,{default:d(()=>[z(ut,{dense:``},{default:d(()=>[z(J,{cols:`6`,md:`3`},{default:d(()=>[i[70]||=j(`div`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),j(`div`,bn,x(Q.value.system_info?.cpu_usage??`—`)+`%`,1)]),_:1}),z(J,{cols:`6`,md:`3`},{default:d(()=>[i[71]||=j(`div`,{class:`text-caption text-medium-emphasis`},`内存`,-1),j(`div`,xn,x(Q.value.system_info?.mem_usage??`—`)+`%`,1)]),_:1}),z(J,{cols:`6`,md:`3`},{default:d(()=>[i[72]||=j(`div`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),j(`div`,Sn,x(Q.value.system_info?.disk_usage??`—`)+`%`,1)]),_:1}),z(J,{cols:`6`,md:`3`},{default:d(()=>[i[73]||=j(`div`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),j(`div`,Cn,x(Q.value.agent_version||`未安装`),1)]),_:1}),z(J,{cols:`12`,md:`6`},{default:d(()=>[i[74]||=j(`div`,{class:`text-caption text-medium-emphasis`},`目标路径`,-1),j(`div`,wn,x(Q.value.target_path?.trim()||`未配置(推送页留空时无法推送到此机)`),1)]),_:1})]),_:1})]),_:1})]),_:1}),z(St,{value:`logs`},{default:d(()=>[z(v,null,{default:d(()=>[Nt.value?(O(),V(`div`,Tn,[z(w,{indeterminate:``,size:`24`})])):jt.value.length===0?(O(),V(`div`,En,`暂无同步日志`)):(O(),U(He,{key:2,density:`compact`},{default:d(()=>[(O(!0),V(D,null,qe(jt.value,e=>(O(),U(Te,{key:e.id,subtitle:Rt(e),title:`${e.source_path} → ${e.target_path}`},{append:d(()=>[z(q,{size:`x-small`,color:Ft(e.status),variant:`tonal`,label:``},{default:d(()=>[k(x(Lt(e.status)),1)]),_:2},1032,[`color`])]),_:2},1032,[`subtitle`,`title`]))),128))]),_:1}))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1})):R(``,!0)]),_:1}),z(Bt,{modelValue:G(Ve),"onUpdate:modelValue":i[14]||=e=>ue(Ve)?Ve.value=e:null,form:G(Ue),"is-editing":G(Ge),saving:G(Ke),"lookups-loading":G(Je),"password-presets":G(Ze),"ssh-key-presets":G(Qe),"category-options":G($e),platforms:G(tt),nodes:G(nt),"edit-hints":G(rt),"files-elevation-items":G(it),onSave:G(ct)},null,8,[`modelValue`,`form`,`is-editing`,`saving`,`lookups-loading`,`password-presets`,`ssh-key-presets`,`category-options`,`platforms`,`nodes`,`edit-hints`,`files-elevation-items`,`onSave`]),z(mt,{modelValue:A.value,"onUpdate:modelValue":i[16]||=e=>A.value=e,"max-width":`400`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[75]||=[k(`确认删除`,-1)]]),_:1}),z(v,null,{default:d(()=>[i[76]||=k(`确定要删除服务器 `,-1),j(`strong`,null,x(N.value?.name),1),i[77]||=k(` 吗?`,-1)]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,onClick:i[15]||=e=>A.value=!1},{default:d(()=>[...i[78]||=[k(`取消`,-1)]]),_:1}),z(W,{color:`error`,variant:`flat`,onClick:yr,loading:Se.value},{default:d(()=>[...i[79]||=[k(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(mt,{modelValue:P.value,"onUpdate:modelValue":i[21]||=e=>P.value=e,"max-width":`480`,persistent:``},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[80]||=[k(`快速添加服务器(仅 IP)`,-1)]]),_:1}),z(v,null,{default:d(()=>[i[81]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-3`},` 将按顺序轮询凭据管理中的全部密码预设与 SSH 密钥预设尝试登录,首个成功即加入服务器列表。 `,-1),z(H,{modelValue:I.value.domain,"onUpdate:modelValue":i[17]||=e=>I.value.domain=e,label:`IP 或域名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`192.168.1.10`,rules:[e=>!!e?.trim()||`必填`]},null,8,[`modelValue`,`rules`]),z(H,{modelValue:I.value.port,"onUpdate:modelValue":i[18]||=e=>I.value.port=e,modelModifiers:{number:!0},label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),z(H,{modelValue:I.value.name,"onUpdate:modelValue":i[19]||=e=>I.value.name=e,label:`显示名称(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用 IP`,"persistent-hint":``},null,8,[`modelValue`])]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,disabled:F.value,onClick:i[20]||=e=>P.value=!1},{default:d(()=>[...i[82]||=[k(`取消`,-1)]]),_:1},8,[`disabled`]),z(W,{color:`primary`,variant:`flat`,loading:F.value,onClick:Le},{default:d(()=>[...i[83]||=[k(`开始轮询`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(mt,{modelValue:L.value,"onUpdate:modelValue":i[23]||=e=>L.value=e,"max-width":`560`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,{class:`text-error`},{default:d(()=>[...i[84]||=[k(`SSH 连接失败`,-1)]]),_:1}),z(v,null,{default:d(()=>[i[85]||=j(`p`,{class:`text-body-2 mb-3`},`已尝试全部凭据预设,均未登录成功。该服务器已加入「连接失败列表」,可稍后重试。`,-1),ke.value.length?(O(),U(He,{key:0,density:`compact`,class:`bg-grey-lighten-4 rounded`},{default:d(()=>[(O(!0),V(D,null,qe(ke.value,(e,t)=>(O(),U(Te,{key:t},{default:d(()=>[z(r,{class:`text-body-2`},{default:d(()=>[k(` [`+x(e.preset_type===`password`?`密码`:e.preset_type===`system`?`系统`:`密钥`)+`] `+x(e.preset_name)+` (`+x(e.username)+`) `,1)]),_:2},1024),z(we,{class:`text-error`},{default:d(()=>[k(x(e.error),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(O(),V(`p`,Dn,x(Ae.value),1))]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{color:`primary`,variant:`flat`,onClick:i[22]||=e=>L.value=!1},{default:d(()=>[...i[86]||=[k(`知道了`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(mt,{modelValue:je.value,"onUpdate:modelValue":i[25]||=e=>je.value=e,"max-width":`400`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[87]||=[k(`确认删除`,-1)]]),_:1}),z(v,null,{default:d(()=>[i[88]||=k(`从失败列表移除 `,-1),j(`strong`,null,x(B.value?.domain),1),i[89]||=k(`?`,-1)]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,onClick:i[24]||=e=>je.value=!1},{default:d(()=>[...i[90]||=[k(`取消`,-1)]]),_:1}),z(W,{color:`error`,variant:`flat`,loading:Me.value,onClick:Be},{default:d(()=>[...i[91]||=[k(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(mt,{modelValue:Rn.value,"onUpdate:modelValue":i[27]||=e=>Rn.value=e,"max-width":`480`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[92]||=[k(`自动检测目标路径`,-1)]]),_:1}),z(v,null,{default:d(()=>[j(`p`,On,[i[93]||=k(` 将对选中的 `,-1),j(`strong`,null,x(Z.value.size),1),i[94]||=k(` 台服务器执行 SSH 检测。 `,-1)]),i[95]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-0`},[k(` 在远程 `),j(`code`,null,`/www/wwwroot`),k(` 下搜索 `),j(`code`,null,`workerman.bat`),k(`,找到后将所在目录写入各服务器的 `),j(`strong`,null,`target_path`),k(`(找到第一个即停止)。 `)],-1)]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,onClick:i[26]||=e=>Rn.value=!1},{default:d(()=>[...i[96]||=[k(`取消`,-1)]]),_:1}),z(W,{color:`primary`,variant:`flat`,onClick:$n},{default:d(()=>[...i[97]||=[k(`开始检测`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(Kt,{modelValue:zn.value,"onUpdate:modelValue":i[28]||=e=>zn.value=e,title:Vn.value,loading:Bn.value,results:Hn.value},null,8,[`modelValue`,`title`,`loading`,`results`]),z(mt,{modelValue:Jt.value,"onUpdate:modelValue":i[31]||=e=>Jt.value=e,"max-width":`420`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[98]||=[k(`批量修改分类`,-1)]]),_:1}),z(v,null,{default:d(()=>[j(`div`,kn,` 已选择 `+x(Z.value.size)+` 台服务器,将统一设置为以下分类(留空表示清除分类)。 `,1),z(kt,{modelValue:Yt.value,"onUpdate:modelValue":i[29]||=e=>Yt.value=e,items:Pn.value,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,"hide-details":``,placeholder:`输入或选择分类`},null,8,[`modelValue`,`items`])]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,onClick:i[30]||=e=>Jt.value=!1},{default:d(()=>[...i[99]||=[k(`取消`,-1)]]),_:1}),z(W,{color:`primary`,variant:`flat`,loading:Nn.value,onClick:In},{default:d(()=>[...i[100]||=[k(` 确认 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),z(mt,{modelValue:or.value,"onUpdate:modelValue":i[36]||=e=>or.value=e,"max-width":`560`},{default:d(()=>[z(g,{border:``},{default:d(()=>[z(f,null,{default:d(()=>[...i[101]||=[k(`批量添加服务器`,-1)]]),_:1}),z(v,null,{default:d(()=>[i[102]||=j(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},` 每行一个 IP 或域名;也可使用「名称 + Tab + IP」附带显示名称。空白行自动忽略,重复地址自动去重(不区分大小写)。SSH 凭据从「凭据管理」预设轮询匹配;连接失败将进入下方「连接失败列表」。 `,-1),z(ht,{modelValue:sr.value,"onUpdate:modelValue":i[32]||=e=>sr.value=e,label:`IP / 域名列表(可选:名称 Tab IP)`,variant:`outlined`,density:`compact`,rows:`10`,"auto-grow":``,placeholder:`武汉示例公司 192.168.1.10
|
||
192.168.1.11
|
||
10.0.0.5`},null,8,[`modelValue`]),pr.value.unique>0?(O(),V(`div`,An,[k(` 将添加 `+x(pr.value.unique)+` 台 `,1),pr.value.deduped>0?(O(),V(`span`,jn,`(已去重 `+x(pr.value.deduped)+` 个重复)`,1)):R(``,!0)])):R(``,!0),z(ut,{dense:``,class:`mt-1`},{default:d(()=>[z(J,{cols:`6`},{default:d(()=>[z(H,{modelValue:cr.value,"onUpdate:modelValue":i[33]||=e=>cr.value=e,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),z(J,{cols:`6`},{default:d(()=>[z(H,{modelValue:lr.value,"onUpdate:modelValue":i[34]||=e=>lr.value=e,modelModifiers:{number:!0},label:`Agent 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1})]),_:1}),$.value?(O(),U(Tt,{key:1,type:$.value.pending>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:d(()=>[k(` 共 `+x($.value.total)+` 台:成功 `+x($.value.created)+`,待连接 `+x($.value.pending)+`,跳过 `+x($.value.skipped)+` `,1),($.value.duplicates_removed??0)>0?(O(),V(`span`,Mn,` (输入 `+x($.value.input_lines)+` 行,去重 `+x($.value.duplicates_removed)+` 个) `,1)):R(``,!0)]),_:1},8,[`type`])):R(``,!0)]),_:1}),z(h,null,{default:d(()=>[z(Y),z(W,{variant:`text`,onClick:i[35]||=e=>or.value=!1},{default:d(()=>[...i[103]||=[k(`关闭`,-1)]]),_:1}),z(W,{color:`primary`,variant:`flat`,onClick:hr,loading:ur.value,disabled:!sr.value.trim()},{default:d(()=>[...i[104]||=[k(` 开始添加 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{Nn as default}; |