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