Files
Nexus/web/app/assets/ServersPage-Z2EpNr-B.js
T
Nexus Deploy 4ba45abf38 feat(servers): 凭据轮询登录与连接失败列表
- 密码/SSH密钥预设增加用户名;快速添加(IP)轮询全部预设尝试 SSH 登录
- 成功入 servers 列表;失败写入 pending_servers 并支持重试/删除
- 新增 credential_poller、try_ssh_login 与 add-by-ip/pending API
2026-06-06 20:08:48 +08:00

3 lines
46 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{t as e}from"./VDataTable-CA2-7Joy.js";import{$ as t,$n as n,$t as r,A as i,Ar as a,B as o,Bn as s,Br as c,C as l,Cn as ee,Cr as u,Ct as d,D as te,E as f,Et as p,F as m,Gt as h,Ht as ne,I as g,Ir as _,J as re,L as ie,Ln as ae,M as oe,N as v,Nr as y,O as se,P as b,Qn as x,R as S,Rn as C,Rr as w,Rt as T,S as E,Sn as ce,St as D,Tr as le,Tt as O,Vn as ue,Wt as k,X as de,Xn as fe,Yn as A,Zt as pe,_ as me,_n as he,_r as ge,an as _e,ar as j,bt as M,cn as N,cr as ve,dn as ye,er as P,et as be,fn as F,ft as I,gr as xe,hr as L,ir as R,j as Se,jr as Ce,jt as we,k as Te,kn as Ee,ln as De,lr as z,m as Oe,n as ke,nn as Ae,nr as B,nt as je,or as Me,pr as Ne,pt as Pe,qn as Fe,rt as Ie,t as V,tn as Le,tr as H,tt as Re,u as ze,ur as Be,v as Ve,w as He,wr as U,wt as Ue,xr as We,xt as W,yt as G,zn as K,zr as Ge}from"./index-o0-2k-vI.js";import{o as Ke,t as qe}from"./VContainer-BbTGUkA2.js";import{t as Je}from"./VChip-B_7LyIUT.js";import{a as Ye,c as Xe,d as Ze,f as Qe,i as q,l as $e,n as et,o as tt,r as nt,s as rt,t as J,u as it}from"./VSelect-RidH-jin.js";import{t as at}from"./VDataTableServer-CYEpP3ht.js";import{n as Y,t as ot}from"./VRow-D9pCZkmz.js";import{t as X}from"./VSpacer-DE-o2Lgp.js";import{t as Z}from"./apiError-nzQ5DKV3.js";import{i as Q}from"./validation-DMwOxx4a.js";import{t as st}from"./VDialog-nLwlI-ms.js";import{t as ct}from"./VTextarea-C1n35Aqz.js";import{a as lt,i as ut,n as dt,r as ft,t as pt}from"./StatCardsRow-CXw7_aVP.js";import{a as mt,i as ht,n as gt,r as _t,t as vt}from"./VFileInput-V-GLMkLj.js";import{t as yt}from"./VAlert-CJEBMMcd.js";function $(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 bt(e){let t=[];for(let n of e){let e=$(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}function xt(e){return(e||[]).filter(e=>e.success).length}var St=F({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...Ye({filterKeys:[`title`]}),...et({hideNoData:!0,returnObject:!0}),...C(ke({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),Ct=N()({name:`VCombobox`,props:St(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,{emit:t,slots:i}){let{t:o}=pe(),c=a(),l=Ce(!1),u=Ce(!0),d=Ce(!1),p=a(),m=a(),h=Ce(-1),ne=!1,{items:g,transformIn:_,transformOut:re}=te(e),{textColorClasses:v,textColorStyles:b}=D(()=>c.value?.color),{InputIcon:S}=Oe(e),C=r(e,`modelValue`,[],e=>_(s(e)),t=>{let n=re(t);return e.multiple?n:n[0]??null}),T=ze(e),E=y(()=>e.closableChips&&!T.isReadonly.value&&!T.isDisabled.value),le=x(()=>!!(e.chips||i.chip)),k=x(()=>le.value||!!i.selection),A=Ce(!e.multiple&&!k.value?C.value[0]?.title??``:``),ge=Ce(null),M=x({get:()=>A.value,set:async t=>{if(A.value=t??``,t===null||t===``&&!e.multiple&&!k.value?C.value=[]:!e.multiple&&!k.value&&(C.value=[f(e,t)],Be(()=>m.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=Ke(t);e.length>1&&(qe(e),A.value=``)}t||(h.value=-1),u.value=!t}}),N=x(()=>typeof e.counterValue==`function`?e.counterValue(C.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?C.value.length:M.value.length),{filteredItems:ve,getMatches:ye}=tt(e,g,()=>ge.value??(e.alwaysFilter||!u.value?M.value:``)),P=x(()=>e.hideSelected&&ge.value===null?ve.value.filter(e=>!C.value.some(t=>t.value===e.value)):ve.value),be=x(()=>e.hideNoData&&!P.value.length||T.isReadonly.value||T.isDisabled.value),F=r(e,`menu`),I=x({get:()=>F.value,set:e=>{F.value&&!e&&p.value?.ΨopenChildren.size||e&&be.value||(F.value=e)}}),{menuId:xe,ariaExpanded:L,ariaControls:Se}=nt(e,I);We(A,e=>{ne?Be(()=>ne=!1):l.value&&!I.value&&(I.value=!0),t(`update:search`,e)}),We(C,t=>{!e.multiple&&!k.value&&(A.value=t[0]?.title??``)});let we=x(()=>C.value.map(e=>e.value)),De=x(()=>P.value.find(e=>e.type===`item`&&!e.props.disabled)),ke=x(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&M.value===De.value?.title)&&P.value.length>0&&!u.value&&!d.value),B=a(),je=a(),Me=a(),Ne=Xe(B,c),Pe=$e(I,()=>p.value?.contentEl,()=>c.value?.controlRef),{onTabKeydown:Fe}=rt({groups:[{type:`element`,contentRef:je},{type:`list`,contentRef:B,displayItemsCount:()=>P.value.length},{type:`element`,contentRef:Me}],onLeave:()=>{I.value=!1,c.value?.focus()}});function Ie(t){ne=!0,Be(()=>ne=!1),e.openOnClear&&(I.value=!0)}function Le(){be.value||(I.value=!0)}function H(e){be.value||(l.value&&(e.preventDefault(),e.stopPropagation()),I.value=!I.value)}function Re(e){e.key===`Tab`&&Fe(e),B.value?.$el.contains(e.target)&&(he(e)||e.key===`Backspace`)&&c.value?.focus()}function U(t){if(Ee(t)||T.isReadonly.value)return;let n=c.value?.selectionStart,r=C.value.length;if([`Enter`,`ArrowDown`,`ArrowUp`].includes(t.key)&&t.preventDefault(),[`Enter`,`ArrowDown`].includes(t.key)&&(I.value=!0),[`Escape`].includes(t.key)&&(I.value=!1),ke.value&&[`Enter`,`Tab`].includes(t.key)&&De.value&&!C.value.some(({value:e})=>e===De.value.value)&&K(De.value),t.key===`ArrowDown`&&ke.value&&B.value?.focus(`next`),t.key===`Enter`&&M.value&&(K(f(e,M.value),!0,!0),k.value&&(A.value=``)),[`Backspace`,`Delete`].includes(t.key)){if(!e.multiple&&k.value&&C.value.length>0&&!M.value)return K(C.value[0],!1);if(~h.value){t.preventDefault();let e=h.value;K(C.value[h.value],!1),h.value=e>=r-1?r-2:e}else t.key===`Backspace`&&!M.value&&(h.value=r-1);return}if(e.multiple)if(t.key===`ArrowLeft`){if(h.value<0&&n&&n>0)return;let e=h.value>-1?h.value-1:r-1;C.value[e]?h.value=e:(h.value=-1,c.value?.setSelectionRange(M.value.length,M.value.length))}else if(t.key===`ArrowRight`){if(h.value<0)return;let e=h.value+1;C.value[e]?h.value=e:(h.value=-1,c.value?.setSelectionRange(0,0))}else ~h.value&&he(t)&&(h.value=-1)}function Ue(t){let n=Ke(t?.clipboardData?.getData(`Text`)??``);n.length>1&&e.multiple&&(t.preventDefault(),qe(n))}function W(){e.eager&&m.value?.calculateVisibleItems()}function G(){l.value&&(p.value?.contentEl?._clickOutside?.lastMousedownWasOutside?l.value=!1:c.value?.focus()),u.value=!0,ge.value=null}function K(t,n=!0,r=!1){if(!(!t||t.props.disabled))if(e.multiple){let r=C.value.findIndex(n=>(e.valueComparator||_e)(n.value,t.value)),i=n??!~r;if(~r){let e=i?[...C.value,t]:[...C.value];e.splice(r,1),C.value=e}else i&&(C.value=[...C.value,t]);e.clearOnSelect&&(M.value=``)}else{let i=n!==!1;C.value=i?[t]:[],(!u.value||e.alwaysFilter)&&A.value&&(ge.value=A.value),A.value=i&&!k.value?t.title:``,Be(()=>{I.value=r,u.value=!0})}}function Ke(t){let n=[`
`,...e.delimiters??[]].map(ee).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function qe(t){for(let n of t)n=n.trim(),n&&(K(f(e,n)),await Be())}function Ye(e){l.value=!0,setTimeout(()=>{d.value=!0})}function et(e){if(d.value=!1,!c.value?.$el.contains(e.relatedTarget)){if(Pe(e))return;l.value=!1}}let J=0;function at(){J=performance.now()}function Y(e){let t=e.relatedTarget;((p.value?.contentEl)?.contains(t)||!t&&performance.now()-J<10)&&(l.value=!0)}return We(l,(t,n)=>{if(!(t||t===n)&&(h.value=-1,I.value=!1,M.value)){if(e.multiple){K(f(e,M.value));return}if(!k.value)return;C.value.some(({title:e})=>e===M.value)?A.value=``:K(f(e,M.value))}}),We(I,t=>{if(!e.hideSelected&&t&&C.value.length&&u.value){let t=P.value.findIndex(t=>C.value.some(n=>(e.valueComparator||_e)(n.value,t.value)));ue&&window.requestAnimationFrame(()=>{t>=0&&m.value?.scrollToIndex(t)})}t&&(ge.value=null)}),We(g,(e,t)=>{I.value||l.value&&!t.length&&e.length&&(I.value=!0)}),Ae(()=>{let t=!!(!e.hideNoData||P.value.length||i[`prepend-item`]||i[`append-item`]||i[`no-data`]),r=C.value.length>0,a=V.filterProps(e),s={search:M,filteredItems:ve.value};return j(V,z({ref:c},a,{modelValue:M.value,"onUpdate:modelValue":e=>M.value=e,focused:l.value,"onUpdate:focused":e=>l.value=e,validationValue:C.externalValue,counterValue:N.value,dirty:r,class:[`v-combobox`,{"v-combobox--active-menu":I.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!k.value,"v-combobox--selecting-index":h.value>-1,[`v-combobox--${e.multiple?`multiple`:`single`}`]:!0},e.class],style:e.style,readonly:T.isReadonly.value,placeholder:r?void 0:e.placeholder,"onClick:clear":Ie,"onMousedown:control":Le,onKeydown:U,onPaste:Ue,onBlur:Y,"aria-expanded":L.value,"aria-controls":Se.value}),{...i,default:({id:r})=>n(fe,null,[j(me,z({id:xe.value,ref:p,modelValue:I.value,"onUpdate:modelValue":e=>I.value=e,activator:`parent`,disabled:be.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:W,onAfterLeave:G},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[j(Ze,{elevation:e.menuElevation,onFocusin:Ye,onKeydown:Re,onMousedown:at},{default:()=>[i[`menu-header`]&&n(`header`,{ref:je},[i[`menu-header`](s)]),t&&j(He,z({key:`combobox-list`,ref:B,filterable:!0,selected:we.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!P.value.length,onFocusout:et,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${r.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},Ne,e.listProps),{default:()=>[i[`prepend-item`]?.(),!P.value.length&&!e.hideNoData&&(i[`no-data`]?.()??j(Te,{key:`no-data`,title:o(e.noDataText)},null)),j(it,{ref:m,renderless:!0,items:P.value,itemKey:`value`},{default:({item:t,index:r,itemRef:a})=>{let o=z(t.props,{ref:a,key:t.value,active:ke.value&&t===De.value?!0:void 0,onClick:()=>K(t,null),"aria-posinset":r+1,"aria-setsize":P.value.length});return t.type===`divider`?i.divider?.({props:t.raw,index:r})??j(oe,z(t.props,{key:`divider-${r}`}),null):t.type===`subheader`?i.subheader?.({props:t.raw,index:r})??j(se,z(t.props,{key:`subheader-${r}`}),null):i.item?.({item:t.raw,internalItem:t,index:r,props:o})??j(Te,z(o,{role:`option`}),{prepend:({isSelected:r})=>n(fe,null,[e.multiple&&!e.hideSelected?j(Qe,{key:t.value,modelValue:r,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&j(ie,{image:t.props.prependAvatar},null),t.props.prependIcon&&j(de,{icon:t.props.prependIcon},null)]),title:()=>u.value?t.title:q(`v-combobox`,t.title,ye(t)?.title)})}}),i[`append-item`]?.()]}),i[`menu-footer`]&&n(`footer`,{ref:Me},[i[`menu-footer`](s)])]})]}),C.value.map((t,r)=>{function a(e){e.stopPropagation(),e.preventDefault(),K(t,!1)}let o=z(Je.filterProps(t.props),{"onClick:close":a,onKeydown(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),a(e))},onMousedown(e){e.preventDefault(),e.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),s=le.value?!!i.chip:!!i.selection,c=s?ce(le.value?i.chip({item:t.raw,internalItem:t,index:r,props:o}):i.selection({item:t.raw,internalItem:t,index:r})):void 0;if(!(s&&!c))return n(`div`,{key:t.value,class:w([`v-combobox__selection`,r===h.value&&[`v-combobox__selection--selected`,v.value]]),style:Ge(r===h.value?b.value:{})},[le.value?i.chip?j(O,{key:`chip-defaults`,defaults:{VChip:{closable:E.value,size:`small`,text:t.title}}},{default:()=>[c]}):j(Je,z({key:`chip`,closable:E.value,size:`small`,text:t.title,disabled:t.props.disabled},o),null):c??n(`span`,{class:`v-combobox__selection-text`},[t.title,e.multiple&&r<C.value.length-1&&n(`span`,{class:`v-combobox__selection-comma`},[R(`,`)])])])})]),"append-inner":(...t)=>n(fe,null,[i[`append-inner`]?.(...t),(!e.hideNoData||e.items.length)&&e.menuIcon?j(de,{class:`v-combobox__menu-icon`,color:c.value?.fieldIconColor,icon:e.menuIcon,onMousedown:H,onClick:ae,"aria-hidden":!0,tabindex:`-1`},null):void 0,e.appendInnerIcon&&j(S,{key:`append-icon`,name:`appendInner`,color:t[0].iconColor.value},null)])})}),Ve({isFocused:l,isPristine:u,menu:I,search:M,selectionIndex:h,filteredItems:ve,select:K},c)}}),wt=Symbol.for(`vuetify:v-expansion-panel`),Tt=F({...ye(),...E()},`VExpansionPanelText`),Et=N()({name:`VExpansionPanelText`,props:Tt(),setup(e,{slots:t}){let r=ve(wt);if(!r)throw Error(`[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel`);let{hasContent:i,onAfterLeave:a}=l(e,r.isSelected);return Ae(()=>j(p,{onAfterLeave:a},{default:()=>[U(n(`div`,{class:w([`v-expansion-panel-text`,e.class]),style:Ge(e.style)},[t.default&&i.value&&n(`div`,{class:`v-expansion-panel-text__wrapper`},[t.default?.()])]),[[Fe,r.isSelected.value]])]})),{}}}),Dt=F({color:String,expandIcon:{type:Le,default:`$expand`},collapseIcon:{type:Le,default:`$collapse`},hideActions:Boolean,focusable:Boolean,static:Boolean,ripple:{type:[Boolean,Object],default:!1},readonly:Boolean,...ye(),...d()},`VExpansionPanelTitle`),Ot=N()({name:`VExpansionPanelTitle`,directives:{vRipple:o},props:Dt(),setup(e,{slots:t}){let r=ve(wt);if(!r)throw Error(`[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel`);let{backgroundColorClasses:i,backgroundColorStyles:a}=W(()=>e.color),{dimensionStyles:s}=Ue(e),c=x(()=>({collapseIcon:e.collapseIcon,disabled:r.disabled.value,expanded:r.isSelected.value,expandIcon:e.expandIcon,readonly:e.readonly})),l=y(()=>r.isSelected.value?e.collapseIcon:e.expandIcon);return Ae(()=>U(n(`button`,{class:w([`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:Ge([a.value,s.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},[n(`span`,{class:`v-expansion-panel-title__overlay`},null),t.default?.(c.value),!e.hideActions&&j(O,{defaults:{VIcon:{icon:l.value}}},{default:()=>[n(`span`,{class:`v-expansion-panel-title__icon`},[t.actions?.(c.value)??j(de,null,null)])]})]),[[o,e.ripple]])),{}}}),kt=F({title:String,text:String,bgColor:String,...I(),...be(),...G(),...we(),...Dt(),...Tt()},`VExpansionPanel`),At=N()({name:`VExpansionPanel`,props:kt(),emits:{"group:selected":e=>!0},setup(e,{slots:t}){let r=Ie(e,wt),{backgroundColorClasses:i,backgroundColorStyles:a}=W(()=>e.bgColor),{elevationClasses:o}=Pe(e),{roundedClasses:s}=M(e),c=y(()=>r?.disabled.value||e.disabled),l=x(()=>r.group.items.value.reduce((e,t,n)=>(r.group.selected.value.includes(t.id)&&e.push(n),e),[])),ee=x(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&l.value.some(t=>t-e===1)}),u=x(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&l.value.some(t=>t-e===-1)});return xe(wt,r),Ae(()=>{let l=!!(t.text||e.text),d=!!(t.title||e.title),te=Ot.filterProps(e),f=Et.filterProps(e);return j(e.tag,{class:w([`v-expansion-panel`,{"v-expansion-panel--active":r.isSelected.value,"v-expansion-panel--before-active":ee.value,"v-expansion-panel--after-active":u.value,"v-expansion-panel--disabled":c.value},s.value,i.value,e.class]),style:Ge([a.value,e.style])},{default:()=>[n(`div`,{class:w([`v-expansion-panel__shadow`,...o.value])},null),j(O,{defaults:{VExpansionPanelTitle:{...te},VExpansionPanelText:{...f}}},{default:()=>[d&&j(Ot,{key:`title`},{default:()=>[t.title?t.title():e.title]}),l&&j(Et,{key:`text`},{default:()=>[t.text?t.text():e.text]}),t.default?.()]})]})}),{groupItem:r}}}),jt=[`default`,`accordion`,`inset`,`popout`],Mt=F({flat:Boolean,...Re(),...K(kt(),[`bgColor`,`collapseIcon`,`color`,`eager`,`elevation`,`expandIcon`,`focusable`,`hideActions`,`readonly`,`ripple`,`static`]),...G(),...k(),...ye(),...we(),variant:{type:String,default:`default`,validator:e=>jt.includes(e)}},`VExpansionPanels`),Nt=N()({name:`VExpansionPanels`,props:Mt(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let{next:n,prev:r}=je(e,wt),{themeClasses:i}=h(e),{roundedClasses:a}=M(e),o=y(()=>e.variant&&`v-expansion-panels--variant-${e.variant}`);return De({VExpansionPanel:{bgColor:y(()=>e.bgColor),collapseIcon:y(()=>e.collapseIcon),color:y(()=>e.color),eager:y(()=>e.eager),elevation:y(()=>e.elevation),expandIcon:y(()=>e.expandIcon),focusable:y(()=>e.focusable),hideActions:y(()=>e.hideActions),readonly:y(()=>e.readonly),ripple:y(()=>e.ripple),static:y(()=>e.static)}}),Ae(()=>j(e.tag,{class:w([`v-expansion-panels`,{"v-expansion-panels--flat":e.flat,"v-expansion-panels--tile":e.tile},i.value,a.value,o.value,e.class]),style:Ge(e.style)},{default:()=>[t.default?.({prev:r,next:n})]})),{next:n,prev:r}}}),Pt=Me({__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:r}){let i=e,a=r,o=x(()=>i.form.preset_id||i.isEditing?[]:[Q(`SSH 密码或选择密码预设`)]),s=x(()=>i.form.ssh_key_preset_id||i.isEditing?[]:[Q(`私钥或选择 SSH 密钥预设`)]);return(r,i)=>(L(),P(st,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":i[18]||=e=>a(`update:modelValue`,e)},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,{class:`d-flex align-center`},{default:u(()=>[R(c(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),j(X),j(S,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:i[0]||=e=>a(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),j(oe),j(b,{class:`pt-4`},{default:u(()=>[e.lookupsLoading?(L(),P(re,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):H(``,!0),i[21]||=n(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),j(ot,{dense:``},{default:u(()=>[j(Y,{cols:`12`,sm:`6`},{default:u(()=>[j(V,{modelValue:e.form.name,"onUpdate:modelValue":i[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[_(Q)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),j(Y,{cols:`12`,sm:`6`},{default:u(()=>[j(V,{modelValue:e.form.domain,"onUpdate:modelValue":i[2]||=t=>e.form.domain=t,label:`域名 / IP`,variant:`outlined`,density:`compact`,placeholder:`例:192.168.1.10`,rules:[_(Q)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),j(Y,{cols:`6`,sm:`4`},{default:u(()=>[j(V,{modelValue:e.form.port,"onUpdate:modelValue":i[3]||=t=>e.form.port=t,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),j(Y,{cols:`6`,sm:`8`},{default:u(()=>[j(V,{modelValue:e.form.username,"onUpdate:modelValue":i[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[_(Q)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),j(oe,{class:`my-4`}),i[22]||=n(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`认证方式`,-1),j(t,{modelValue:e.form.auth_method,"onUpdate:modelValue":i[5]||=t=>e.form.auth_method=t,mandatory:``,density:`compact`,variant:`outlined`,class:`mb-3`},{default:u(()=>[j(S,{value:`password`,size:`small`},{default:u(()=>[...i[19]||=[R(`密码`,-1)]]),_:1}),j(S,{value:`key`,size:`small`},{default:u(()=>[...i[20]||=[R(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(L(),B(fe,{key:1},[j(J,{modelValue:e.form.preset_id,"onUpdate:modelValue":i[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?H(``,!0):(L(),P(V,{key:0,modelValue:e.form.password,"onUpdate:modelValue":i[7]||=t=>e.form.password=t,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:e.isEditing&&e.editHints.password_set?`留空表示不修改`:`安装 Agent 需可 SSH`,rules:o.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(L(),B(fe,{key:2},[j(J,{modelValue:e.form.ssh_key_preset_id,"onUpdate:modelValue":i[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`]),j(V,{modelValue:e.form.ssh_key_path,"onUpdate:modelValue":i[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?H(``,!0):(L(),P(ct,{key:0,modelValue:e.form.ssh_key_private,"onUpdate:modelValue":i[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:s.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)),j(oe,{class:`my-4`}),i[23]||=n(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),j(V,{modelValue:e.form.target_path,"onUpdate:modelValue":i[11]||=t=>e.form.target_path=t,label:`目标路径`,variant:`outlined`,density:`compact`,placeholder:`/www/wwwroot`,hint:`文件同步与推送的根目录,须为绝对路径`,"persistent-hint":``,class:`mb-2`,rules:[_(Q)(`目标路径`)]},null,8,[`modelValue`,`rules`]),j(Ct,{modelValue:e.form.category,"onUpdate:modelValue":i[12]||=t=>e.form.category=t,items:e.categoryOptions,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,hint:`可从已有分类选择或输入新分类`,"persistent-hint":``},null,8,[`modelValue`,`items`]),j(Nt,{variant:`accordion`,class:`mt-4`},{default:u(()=>[j(At,{title:`高级选项`},{default:u(()=>[j(Et,null,{default:u(()=>[j(J,{modelValue:e.form.platform_id,"onUpdate:modelValue":i[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`]),j(J,{modelValue:e.form.node_id,"onUpdate:modelValue":i[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`]),j(J,{modelValue:e.form.files_elevation,"onUpdate:modelValue":i[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}),j(oe),j(g,{class:`pa-4`},{default:u(()=>[j(X),j(S,{variant:`text`,disabled:e.saving,onClick:i[16]||=e=>a(`update:modelValue`,!1)},{default:u(()=>[...i[24]||=[R(`取消`,-1)]]),_:1},8,[`disabled`]),j(S,{color:`primary`,variant:`flat`,loading:e.saving,onClick:i[17]||=e=>a(`save`)},{default:u(()=>[...i[25]||=[R(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function Ft(){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 It(e){return e===`uncategorized`?``:e}function Lt(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 Rt(e){let t=Ke(),n=a(!1),r=a(null),i=a(!1),o=a(Ft()),s=a({password_set:!1,ssh_key_private_set:!1}),c=a([]),l=a([]),ee=a([]),u=a([]),d=a([]),te=a(!1),f=x(()=>r.value!=null),p=[{title:`自动(权限失败时 sudo`,value:`auto_sudo`},{title:`关闭 sudo`,value:`off`},{title:`始终 sudo(排障)`,value:`always_sudo`}];async function m(){te.value=!0;try{let[e,t,n,r]=await Promise.all([T.get(`/servers/categories`),T.getList(`/presets/`,{per_page:500}),T.getList(`/ssh-key-presets/`,{per_page:500}),T.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=It(t.name);e&&i.add(e)}ee.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`})`})),l.value=(n.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),d.value=Array.isArray(r)?r:[]}catch{t(`加载表单选项失败`,`error`)}finally{te.value=!1}}async function h(){r.value=null,o.value=Ft(),s.value={password_set:!1,ssh_key_private_set:!1},n.value=!0,await m()}async function ne(e){r.value=e.id,o.value=Lt(e),s.value={password_set:!!e.password_set,ssh_key_private_set:!!(e.ssh_key_private_set||e.ssh_key_configured)},n.value=!0,await m()}function g(){n.value=!1,r.value=null,o.value=Ft(),s.value={password_set:!1,ssh_key_private_set:!1}}function _(){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(!f.value&&!e.preset_id&&!e.password.trim())return`请选择密码预设或填写 SSH 密码(安装 Agent 需要可 SSH)`}else if(!f.value&&!e.ssh_key_preset_id&&!e.ssh_key_private.trim())return`请选择 SSH 密钥预设或粘贴私钥`;return null}function re(){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()),f.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 ie(){let n=_();if(n){t(n,`error`);return}i.value=!0;try{let n=re();f.value&&r.value!=null?await T.put(`/servers/${r.value}`,n):await T.post(`/servers/`,n),g(),e(),t(`保存成功`)}catch(e){t(Z(e,`保存失败`),`error`)}finally{i.value=!1}}return{visible:n,editingId:r,isEditing:f,saving:i,form:o,editHints:s,passwordPresets:c,sshKeyPresets:l,categoryOptions:ee,platforms:u,nodes:d,lookupsLoading:te,filesElevationItems:p,openAdd:h,openEdit:ne,close:g,save:ie}}var zt={class:`text-body-2 mr-4`},Bt={class:`font-weight-medium`},Vt={class:`text-medium-emphasis`},Ht={key:1,class:`text-medium-emphasis`},Ut={class:`text-medium-emphasis`},Wt={class:`text-caption text-medium-emphasis`},Gt={class:`d-flex ga-1`},Kt={class:`text-medium-emphasis`},qt={class:`text-caption text-medium-emphasis`},Jt=[`title`],Yt={class:`text-h6`},Xt={class:`text-h6`},Zt={class:`text-h6`},Qt={class:`text-h6`},$t={key:0,class:`text-medium-emphasis text-center py-4`},en={key:1,class:`text-medium-emphasis`},tn=Me({__name:`ServersPage`,setup(t){let r=Ke(),o=ne(),{servers:s,loading:l,page:ee,itemsPerPage:d,total:te,search:f,loadServers:h,onSearch:re,onPageChange:ie,onItemsPerPageChange:ae}=lt();async function y(){try{await h()}catch{r(`加载服务器列表失败`,`error`)}}let se=a(!1),C=a(!1),w=a(null),E=a(!1),ce=a(!1),D=a({domain:``,port:22,name:``}),O=a([]),ue=a(!1),k=a(null),pe=a(!1),me=a([]),he=a(``),_e=a(!1),M=a(null),N=a(!1),ve=[{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 ye(){D.value={domain:``,port:22,name:``},E.value=!0}function be(e,t){me.value=e,he.value=t||``,pe.value=!0}async function F(){ue.value=!0;try{O.value=(await T.get(`/servers/pending`)).items||[]}catch(e){O.value=[],r(Z(e,`加载失败列表失败`),`error`)}finally{ue.value=!1}}async function I(){let e=D.value.domain.trim();if(!e){r(`请填写 IP 或域名`,`error`);return}ce.value=!0;try{let t={domain:e,port:D.value.port||22},n=D.value.name.trim();n&&(t.name=n);let i=await T.post(`/servers/add-by-ip`,t);i.success&&i.server?(E.value=!1,r(`添加成功:${i.matched_preset} (${i.matched_username})`),y(),Xe()):(E.value=!1,be(i.errors||[],i.message),F())}catch(e){r(Z(e,`添加失败`),`error`)}finally{ce.value=!1}}async function xe(e){k.value=e.id;try{let t=await T.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(r(`重试成功:${t.matched_preset} (${t.matched_username})`),y(),Xe(),F()):(be(t.errors||[],t.message),F())}catch(e){r(Z(e,`重试失败`),`error`)}finally{k.value=null}}function Ce(e){M.value=e,_e.value=!0}async function we(){if(M.value){N.value=!0;try{await T.delete(`/servers/pending/${M.value.id}`),_e.value=!1,r(`已从失败列表移除`),F()}catch(e){r(Z(e,`删除失败`),`error`)}finally{N.value=!1}}}let{visible:Ee,form:De,isEditing:z,saving:Oe,lookupsLoading:ke,passwordPresets:Ae,sshKeyPresets:je,categoryOptions:Me,platforms:Pe,nodes:Fe,editHints:Ie,filesElevationItems:Le,openAdd:Re,openEdit:ze,close:Be,save:Ve}=Rt(()=>{y(),Xe()});We(Ee,(e,t)=>{t&&!e&&Be()});let U=a([]),Ue=x(()=>new Set(bt(U.value))),W=a(null),G=a(`info`),K=a([]),Ge=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`分类`,key:`category`,width:100},{title:`Agent`,key:`agent`,width:100},{title:`心跳`,key:`heartbeat`,width:120},{title:`操作`,key:`actions`,width:200,align:`end`}],Ye=a([{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 Xe(){try{let e=await T.get(`/servers/stats`);Ye.value[0].title=String(e.total),Ye.value[1].title=String(e.online),Ye.value[2].title=String(e.offline),Ye.value[3].title=String(e.alerts??0)}catch{}}function Ze(e){o.push({path:`/terminal`,query:{server_id:String(e.id)}})}function Qe(e){o.push({path:`/files`,query:{server_id:String(e.id)}})}let q=a(!1);async function $e(){let e=bt(U.value);if(e.length){r(`正在检查 ${e.length} 台服务器...`);try{await T.post(`/servers/check`,{server_ids:e}),r(`健康检查完成`),y()}catch(e){r(Z(e,`检查失败`),`error`)}}}async function et(){if(confirm(`确定删除选中的 ${Ue.value.size} 台服务器?`)){for(let e of Ue.value)try{await T.delete(`/servers/${e}`)}catch{}U.value=[],r(`批量删除完成`),y(),Xe()}}async function tt(){let e=bt(U.value);if(e.length){q.value=!0;try{r(`安装完成: ${xt((await T.post(`/servers/batch/install-agent`,{server_ids:e})).results)}/${e.length} 成功`),y()}catch(e){r(Z(e,`安装失败`),`error`)}finally{q.value=!1}}}async function nt(){let e=bt(U.value);if(e.length){q.value=!0;try{r(`升级完成: ${xt((await T.post(`/servers/batch/upgrade-agent`,{server_ids:e})).results)}/${e.length} 成功`),y()}catch(e){r(Z(e,`升级失败`),`error`)}finally{q.value=!1}}}async function rt(){let e=bt(U.value);if(e.length&&confirm(`确定卸载选中的 ${e.length} 台服务器的 Agent`)){q.value=!0;try{r(`卸载完成: ${xt((await T.post(`/servers/batch/uninstall-agent`,{server_ids:e})).results)}/${e.length} 成功`),y()}catch(e){r(Z(e,`卸载失败`),`error`)}finally{q.value=!1}}}async function J(){try{let e=await T.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||``]),i=``+[t.join(`,`),...n.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
`),a=new Blob([i],{type:`text/csv;charset=utf-8;`}),o=URL.createObjectURL(a),s=document.createElement(`a`);s.href=o,s.download=`servers_${new Date().toISOString().slice(0,10)}.csv`,s.click(),URL.revokeObjectURL(o),r(`导出完成`)}catch(e){r(e.message||`导出失败`,`error`)}}let it=a(!1),Q=a([]),ct=a(!1),$=a(null);async function St(){if(Q.value?.length){ct.value=!0,$.value=null;try{let e=new FormData;e.append(`file`,Q.value[0]),$.value=await T.upload(`/servers/import`,e),r(`导入完成`),y()}catch(e){r(e instanceof Error?e.message:`导入失败`,`error`)}finally{ct.value=!1}}}async function Ct(e){W.value=e,G.value=`info`;try{K.value=(await T.get(`/servers/${e.id}/logs`,{limit:20})).items||[]}catch{K.value=[]}}function wt(e){ze(e)}function Tt(e){w.value=e,se.value=!0}async function Et(){if(w.value){C.value=!0;try{await T.delete(`/servers/${w.value.id}`),se.value=!1,y(),Xe(),r(`已删除`)}catch(e){r(e.message||`删除失败`,`error`)}finally{C.value=!1}}}return Ne(()=>{Xe(),y(),F()}),(t,r)=>(L(),P(qe,{fluid:``,class:`pa-4 pa-md-6`},{default:u(()=>[j(pt,{items:Ye.value},null,8,[`items`]),j(v,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:u(()=>[j(m,{class:`d-flex align-center`},{default:u(()=>[r[27]||=R(` 服务器列表 `,-1),j(X),j(V,{modelValue:_(f),"onUpdate:modelValue":[r[0]||=e=>le(f)?f.value=e:null,_(re)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),j(S,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:_(Re)},{default:u(()=>[...r[23]||=[R(` 添加 `,-1)]]),_:1},8,[`onClick`]),j(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:ye},{default:u(()=>[...r[24]||=[R(` 快速添加(IP) `,-1)]]),_:1}),j(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:J},{default:u(()=>[...r[25]||=[R(` 导出CSV `,-1)]]),_:1}),j(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-file-import`,size:`small`,onClick:r[1]||=e=>it.value=!0},{default:u(()=>[...r[26]||=[R(` 导入 `,-1)]]),_:1})]),_:1}),Ue.value.size>0?(L(),P(v,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:u(()=>[j(b,{class:`d-flex align-center py-2`},{default:u(()=>[n(`span`,zt,`已选择 `+c(Ue.value.size)+` 台服务器`,1),j(X),j(S,{size:`small`,variant:`text`,onClick:$e},{default:u(()=>[...r[28]||=[R(`健康检查`,-1)]]),_:1}),j(S,{size:`small`,variant:`text`,onClick:tt,loading:q.value},{default:u(()=>[...r[29]||=[R(`安装Agent`,-1)]]),_:1},8,[`loading`]),j(S,{size:`small`,variant:`text`,onClick:nt,loading:q.value},{default:u(()=>[...r[30]||=[R(`升级Agent`,-1)]]),_:1},8,[`loading`]),j(S,{size:`small`,variant:`text`,color:`error`,onClick:rt,loading:q.value},{default:u(()=>[...r[31]||=[R(`卸载Agent`,-1)]]),_:1},8,[`loading`]),j(S,{size:`small`,variant:`text`,color:`error`,onClick:et},{default:u(()=>[...r[32]||=[R(`批量删除`,-1)]]),_:1}),j(S,{size:`small`,variant:`text`,onClick:r[2]||=e=>U.value=[]},{default:u(()=>[...r[33]||=[R(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):H(``,!0),j(at,{items:_(s),headers:Ge,"items-length":_(te),loading:_(l),page:_(ee),"items-per-page":_(d),hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:U.value,"onUpdate:modelValue":r[3]||=e=>U.value=e,"onUpdate:page":_(ie),"onUpdate:itemsPerPage":_(ae),"onClick:row":r[4]||=(e,{item:t})=>Ct(t)},{"item.status":u(({item:e})=>[j(Je,{color:_(ft)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:u(()=>[R(c(_(ut)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":u(({item:e})=>[n(`span`,Bt,c(e.name),1)]),"item.address":u(({item:e})=>[n(`span`,Vt,c(e.domain)+`:`+c(e.port),1)]),"item.category":u(({item:e})=>[e.category?(L(),P(Je,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:u(()=>[R(c(e.category),1)]),_:2},1024)):(L(),B(`span`,Ht,`—`))]),"item.agent":u(({item:e})=>[n(`span`,Ut,c(e.agent_version||`—`),1)]),"item.heartbeat":u(({item:e})=>[n(`span`,Wt,c(_(dt)(e.last_heartbeat)),1)]),"item.actions":u(({item:e})=>[n(`div`,Gt,[j(S,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:A(t=>Ze(e),[`stop`])},{default:u(()=>[...r[34]||=[R(`终端`,-1)]]),_:1},8,[`onClick`]),j(S,{variant:`text`,size:`x-small`,density:`compact`,onClick:A(t=>Qe(e),[`stop`])},{default:u(()=>[...r[35]||=[R(`文件`,-1)]]),_:1},8,[`onClick`]),j(S,{variant:`text`,size:`x-small`,density:`compact`,onClick:A(t=>wt(e),[`stop`])},{default:u(()=>[...r[36]||=[R(`编辑`,-1)]]),_:1},8,[`onClick`]),j(S,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:A(t=>Tt(e),[`stop`])},{default:u(()=>[...r[37]||=[R(`删除`,-1)]]),_:1},8,[`onClick`])])]),"no-data":u(()=>[...r[38]||=[n(`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`])]),_:1}),j(v,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:u(()=>[j(m,{class:`d-flex align-center`},{default:u(()=>[r[40]||=R(` 连接失败列表 `,-1),O.value.length?(L(),P(Je,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:u(()=>[R(c(O.value.length),1)]),_:1})):H(``,!0),j(X),j(S,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:ue.value,onClick:F},{default:u(()=>[...r[39]||=[R(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),j(e,{items:O.value,headers:ve,loading:ue.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":u(({item:e})=>[n(`span`,Kt,c(e.domain)+`:`+c(e.port),1)]),"item.last_attempt_at":u(({item:e})=>[n(`span`,qt,c(_(dt)(e.last_attempt_at)),1)]),"item.last_error":u(({item:e})=>[n(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},c(e.last_error||`—`),9,Jt)]),"item.actions":u(({item:e})=>[j(S,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:k.value===e.id,onClick:t=>xe(e)},{default:u(()=>[...r[41]||=[R(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),j(S,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>Ce(e)},{default:u(()=>[...r[42]||=[R(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":u(()=>[...r[43]||=[n(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),j(p,null,{default:u(()=>[W.value?(L(),P(v,{key:0,class:`mt-4`,elevation:`0`,border:``,rounded:`lg`},{default:u(()=>[j(m,{class:`d-flex align-center`},{default:u(()=>[j(de,{class:`mr-2`},{default:u(()=>[...r[44]||=[R(`mdi-information-outline`,-1)]]),_:1}),R(` `+c(W.value.name)+` `,1),j(Je,{color:_(ft)(W.value.status),size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:u(()=>[R(c(_(ut)(W.value.status)),1)]),_:1},8,[`color`]),j(X),j(S,{icon:`mdi-close`,size:`small`,variant:`text`,onClick:r[5]||=e=>W.value=null})]),_:1}),j(oe),j(gt,{modelValue:G.value,"onUpdate:modelValue":r[6]||=e=>G.value=e,density:`compact`},{default:u(()=>[j(mt,{value:`info`},{default:u(()=>[...r[45]||=[R(`系统信息`,-1)]]),_:1}),j(mt,{value:`logs`},{default:u(()=>[...r[46]||=[R(`同步日志`,-1)]]),_:1})]),_:1},8,[`modelValue`]),j(ht,{modelValue:G.value,"onUpdate:modelValue":r[7]||=e=>G.value=e},{default:u(()=>[j(_t,{value:`info`},{default:u(()=>[j(b,null,{default:u(()=>[j(ot,{dense:``},{default:u(()=>[j(Y,{cols:`6`,md:`3`},{default:u(()=>[r[47]||=n(`div`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),n(`div`,Yt,c(W.value.system_info?.cpu_usage??`—`)+`%`,1)]),_:1}),j(Y,{cols:`6`,md:`3`},{default:u(()=>[r[48]||=n(`div`,{class:`text-caption text-medium-emphasis`},`内存`,-1),n(`div`,Xt,c(W.value.system_info?.mem_usage??`—`)+`%`,1)]),_:1}),j(Y,{cols:`6`,md:`3`},{default:u(()=>[r[49]||=n(`div`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),n(`div`,Zt,c(W.value.system_info?.disk_usage??`—`)+`%`,1)]),_:1}),j(Y,{cols:`6`,md:`3`},{default:u(()=>[r[50]||=n(`div`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),n(`div`,Qt,c(W.value.agent_version||`未安装`),1)]),_:1})]),_:1})]),_:1})]),_:1}),j(_t,{value:`logs`},{default:u(()=>[j(b,null,{default:u(()=>[K.value.length===0?(L(),B(`div`,$t,`暂无同步日志`)):(L(),P(He,{key:1,density:`compact`},{default:u(()=>[(L(!0),B(fe,null,ge(K.value,e=>(L(),P(Te,{key:e.id,subtitle:e.created_at,title:`${e.source_path}${e.target_path}`},{append:u(()=>[j(Je,{size:`x-small`,color:e.status===`success`?`green`:`red`,variant:`tonal`,label:``},{default:u(()=>[R(c(e.status),1)]),_:2},1032,[`color`])]),_:2},1032,[`subtitle`,`title`]))),128))]),_:1}))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1})):H(``,!0)]),_:1}),j(Pt,{modelValue:_(Ee),"onUpdate:modelValue":r[8]||=e=>le(Ee)?Ee.value=e:null,form:_(De),"is-editing":_(z),saving:_(Oe),"lookups-loading":_(ke),"password-presets":_(Ae),"ssh-key-presets":_(je),"category-options":_(Me),platforms:_(Pe),nodes:_(Fe),"edit-hints":_(Ie),"files-elevation-items":_(Le),onSave:_(Ve)},null,8,[`modelValue`,`form`,`is-editing`,`saving`,`lookups-loading`,`password-presets`,`ssh-key-presets`,`category-options`,`platforms`,`nodes`,`edit-hints`,`files-elevation-items`,`onSave`]),j(st,{modelValue:se.value,"onUpdate:modelValue":r[10]||=e=>se.value=e,"max-width":`400`},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,null,{default:u(()=>[...r[51]||=[R(`确认删除`,-1)]]),_:1}),j(b,null,{default:u(()=>[r[52]||=R(`确定要删除服务器 `,-1),n(`strong`,null,c(w.value?.name),1),r[53]||=R(` 吗?`,-1)]),_:1}),j(g,null,{default:u(()=>[j(X),j(S,{variant:`text`,onClick:r[9]||=e=>se.value=!1},{default:u(()=>[...r[54]||=[R(`取消`,-1)]]),_:1}),j(S,{color:`error`,variant:`flat`,onClick:Et,loading:C.value},{default:u(()=>[...r[55]||=[R(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),j(st,{modelValue:E.value,"onUpdate:modelValue":r[15]||=e=>E.value=e,"max-width":`480`,persistent:``},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,null,{default:u(()=>[...r[56]||=[R(`快速添加服务器(仅 IP`,-1)]]),_:1}),j(b,null,{default:u(()=>[r[57]||=n(`p`,{class:`text-body-2 text-medium-emphasis mb-3`},` 将按顺序轮询凭据管理中的全部密码预设与 SSH 密钥预设尝试登录,首个成功即加入服务器列表。 `,-1),j(V,{modelValue:D.value.domain,"onUpdate:modelValue":r[11]||=e=>D.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`]),j(V,{modelValue:D.value.port,"onUpdate:modelValue":r[12]||=e=>D.value.port=e,modelModifiers:{number:!0},label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),j(V,{modelValue:D.value.name,"onUpdate:modelValue":r[13]||=e=>D.value.name=e,label:`显示名称(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用 IP`,"persistent-hint":``},null,8,[`modelValue`])]),_:1}),j(g,null,{default:u(()=>[j(X),j(S,{variant:`text`,disabled:ce.value,onClick:r[14]||=e=>E.value=!1},{default:u(()=>[...r[58]||=[R(`取消`,-1)]]),_:1},8,[`disabled`]),j(S,{color:`primary`,variant:`flat`,loading:ce.value,onClick:I},{default:u(()=>[...r[59]||=[R(`开始轮询`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),j(st,{modelValue:pe.value,"onUpdate:modelValue":r[17]||=e=>pe.value=e,"max-width":`560`},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,{class:`text-error`},{default:u(()=>[...r[60]||=[R(`SSH 连接失败`,-1)]]),_:1}),j(b,null,{default:u(()=>[r[61]||=n(`p`,{class:`text-body-2 mb-3`},`已尝试全部凭据预设,均未登录成功。该服务器已加入「连接失败列表」,可稍后重试。`,-1),me.value.length?(L(),P(He,{key:0,density:`compact`,class:`bg-grey-lighten-4 rounded`},{default:u(()=>[(L(!0),B(fe,null,ge(me.value,(e,t)=>(L(),P(Te,{key:t},{default:u(()=>[j(i,{class:`text-body-2`},{default:u(()=>[R(` [`+c(e.preset_type===`password`?`密码`:`密钥`)+`] `+c(e.preset_name)+` (`+c(e.username)+`) `,1)]),_:2},1024),j(Se,{class:`text-error`},{default:u(()=>[R(c(e.error),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(L(),B(`p`,en,c(he.value),1))]),_:1}),j(g,null,{default:u(()=>[j(X),j(S,{color:`primary`,variant:`flat`,onClick:r[16]||=e=>pe.value=!1},{default:u(()=>[...r[62]||=[R(`知道了`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),j(st,{modelValue:_e.value,"onUpdate:modelValue":r[19]||=e=>_e.value=e,"max-width":`400`},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,null,{default:u(()=>[...r[63]||=[R(`确认删除`,-1)]]),_:1}),j(b,null,{default:u(()=>[r[64]||=R(`从失败列表移除 `,-1),n(`strong`,null,c(M.value?.domain),1),r[65]||=R(``,-1)]),_:1}),j(g,null,{default:u(()=>[j(X),j(S,{variant:`text`,onClick:r[18]||=e=>_e.value=!1},{default:u(()=>[...r[66]||=[R(`取消`,-1)]]),_:1}),j(S,{color:`error`,variant:`flat`,loading:N.value,onClick:we},{default:u(()=>[...r[67]||=[R(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),j(st,{modelValue:it.value,"onUpdate:modelValue":r[22]||=e=>it.value=e,"max-width":`500`},{default:u(()=>[j(v,{border:``},{default:u(()=>[j(m,null,{default:u(()=>[...r[68]||=[R(`导入服务器`,-1)]]),_:1}),j(b,null,{default:u(()=>[r[69]||=n(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},[R(` 上传 CSV 文件批量导入服务器。 `),n(`a`,{href:`/app/servers_import_template.csv`,download:``,class:`text-primary`},`下载模板`)],-1),j(vt,{modelValue:Q.value,"onUpdate:modelValue":r[20]||=e=>Q.value=e,label:`选择 CSV 文件`,variant:`outlined`,density:`compact`,accept:`.csv`,"show-size":``},null,8,[`modelValue`]),$.value?(L(),P(yt,{key:0,type:$.value.failed>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:u(()=>[R(` 成功 `+c($.value.created)+`,跳过 `+c($.value.skipped)+`,失败 `+c($.value.failed),1)]),_:1},8,[`type`])):H(``,!0)]),_:1}),j(g,null,{default:u(()=>[j(X),j(S,{variant:`text`,onClick:r[21]||=e=>it.value=!1},{default:u(()=>[...r[70]||=[R(`关闭`,-1)]]),_:1}),j(S,{color:`primary`,variant:`flat`,onClick:St,loading:ct.value,disabled:!Q.value?.length},{default:u(()=>[...r[71]||=[R(`开始导入`,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{tn as default};