2 lines
10 KiB
JavaScript
2 lines
10 KiB
JavaScript
import{_ as ee,r,o as le,a as k,f as s,w as u,u as a,h as m,b as t,i as d,t as f,l as ae,d as $,e as E,m as te,v as oe,F as se,g as ue,n as ne}from"./index-D2VmGkBi.js";import{D as de}from"./DataTable-G-j5cPZJ.js";import{M as x,B as N}from"./Badge-B139BweD.js";import{F as p}from"./FormInput-DHZMRclc.js";import{C as re,s as C,B as v,l as S}from"./index-Bx7gSOle.js";const ie={class:"server-manage"},ve={class:"card-header-content"},pe={class:"action-buttons"},me={class:"form-group"},fe={class:"log-path-section"},ye={class:"log-path-form"},ge={class:"log-path-inputs"},Ve={class:"log-path-list"},ke={key:0},he={key:1,class:"empty-text"},we={key:0},be={key:1},ce={__name:"ServerManage",setup(Pe){const W=[{key:"name",label:"서버명",width:"150px"},{key:"host",label:"호스트"},{key:"port",label:"포트",width:"80px"},{key:"authType",label:"인증방식",width:"100px"},{key:"active",label:"상태",width:"80px"},{key:"lastScanAt",label:"마지막 분석",width:"150px"}],K=[{value:"PASSWORD",label:"비밀번호"},{value:"KEY_FILE",label:"키 파일"}],L=r([]),T=r(!1),U=r(!1),M=r(!1),h=r(!1),y=r(!1),D=r(null),n=r({name:"",host:"",port:22,username:"",authType:"PASSWORD",password:"",keyFilePath:"",passphrase:"",active:!0}),F=r(!1),b=r(null),w=r([]),i=r({path:"",filePattern:"",description:""}),c=r(!1),A=r(null),B=r(null),P=r(!1),g=r(null),I=async()=>{T.value=!0;try{L.value=await C.getAll()}catch(o){console.error("Failed to load servers:",o),alert("서버 목록을 불러오는데 실패했습니다.")}finally{T.value=!1}},Y=()=>{y.value=!1,D.value=null,n.value={name:"",host:"",port:22,username:"",authType:"PASSWORD",password:"",keyFilePath:"",passphrase:"",active:!0},h.value=!0},j=o=>{y.value=!0,D.value=o.id,n.value={name:o.name,host:o.host,port:o.port,username:o.username,authType:o.authType,password:"",keyFilePath:o.keyFilePath||"",passphrase:"",active:o.active},h.value=!0},R=async()=>{if(!n.value.name||!n.value.host||!n.value.username){alert("필수 항목을 입력해주세요.");return}U.value=!0;try{y.value?await C.update(D.value,n.value):await C.create(n.value),h.value=!1,await I()}catch(o){console.error("Failed to save server:",o),alert("저장에 실패했습니다.")}finally{U.value=!1}},G=o=>{A.value=o,c.value=!0},H=async()=>{M.value=!0;try{await C.delete(A.value.id),c.value=!1,await I()}catch(o){console.error("Failed to delete server:",o),alert("삭제에 실패했습니다.")}finally{M.value=!1}},J=async o=>{B.value=o.id;try{g.value=await C.testConnection(o.id),P.value=!0}catch(e){console.error("Failed to test connection:",e),g.value={success:!1,error:"연결 테스트 실패: "+e.message},P.value=!0}finally{B.value=null}},Q=async o=>{b.value=o,i.value={path:"",filePattern:"",description:""};try{w.value=await S.getByServerId(o.id)}catch(e){console.error("Failed to load log paths:",e),w.value=[]}F.value=!0},X=async()=>{try{await S.create({serverId:b.value.id,path:i.value.path,filePattern:i.value.filePattern,description:i.value.description,active:!0}),w.value=await S.getByServerId(b.value.id),i.value={path:"",filePattern:"",description:""}}catch(o){console.error("Failed to add log path:",o),alert("경로 추가에 실패했습니다.")}},Z=async o=>{if(confirm("이 경로를 삭제하시겠습니까?"))try{await S.delete(o),w.value=await S.getByServerId(b.value.id)}catch(e){console.error("Failed to delete log path:",e),alert("경로 삭제에 실패했습니다.")}},_=o=>new Date(o).toLocaleString("ko-KR");return le(()=>{I()}),(o,e)=>{var q;return m(),k("div",ie,[s(a(re),null,{header:u(()=>[t("div",ve,[e[21]||(e[21]=t("h3",null,"서버 관리",-1)),s(a(v),{onClick:Y},{default:u(()=>[...e[20]||(e[20]=[d("+ 서버 추가",-1)])]),_:1})])]),default:u(()=>[s(a(de),{columns:W,data:L.value,loading:T.value,"empty-text":"등록된 서버가 없습니다."},{active:u(({value:l})=>[s(a(N),{variant:l?"success":"default"},{default:u(()=>[d(f(l?"활성":"비활성"),1)]),_:2},1032,["variant"])]),authType:u(({value:l})=>[d(f(l==="PASSWORD"?"비밀번호":"키 파일"),1)]),lastScanAt:u(({value:l})=>[d(f(l?_(l):"-"),1)]),actions:u(({row:l})=>[t("div",pe,[s(a(v),{size:"sm",variant:"success",onClick:V=>J(l),loading:B.value===l.id},{default:u(()=>[...e[22]||(e[22]=[d("테스트",-1)])]),_:1},8,["onClick","loading"]),s(a(v),{size:"sm",variant:"secondary",onClick:V=>Q(l)},{default:u(()=>[...e[23]||(e[23]=[d("경로",-1)])]),_:1},8,["onClick"]),s(a(v),{size:"sm",onClick:V=>j(l)},{default:u(()=>[...e[24]||(e[24]=[d("수정",-1)])]),_:1},8,["onClick"]),s(a(v),{size:"sm",variant:"danger",onClick:V=>G(l)},{default:u(()=>[...e[25]||(e[25]=[d("삭제",-1)])]),_:1},8,["onClick"])])]),_:1},8,["data","loading"])]),_:1}),s(a(x),{modelValue:h.value,"onUpdate:modelValue":e[10]||(e[10]=l=>h.value=l),title:y.value?"서버 수정":"서버 추가",width:"500px"},{footer:u(()=>[s(a(v),{variant:"secondary",onClick:e[9]||(e[9]=l=>h.value=!1)},{default:u(()=>[...e[27]||(e[27]=[d("취소",-1)])]),_:1}),s(a(v),{onClick:R,loading:U.value},{default:u(()=>[...e[28]||(e[28]=[d("저장",-1)])]),_:1},8,["loading"])]),default:u(()=>[t("form",{onSubmit:ae(R,["prevent"])},[s(a(p),{modelValue:n.value.name,"onUpdate:modelValue":e[0]||(e[0]=l=>n.value.name=l),label:"서버명",placeholder:"예: 운영서버1",required:""},null,8,["modelValue"]),s(a(p),{modelValue:n.value.host,"onUpdate:modelValue":e[1]||(e[1]=l=>n.value.host=l),label:"호스트",placeholder:"예: 192.168.1.100",required:""},null,8,["modelValue"]),s(a(p),{modelValue:n.value.port,"onUpdate:modelValue":e[2]||(e[2]=l=>n.value.port=l),label:"포트",type:"number",placeholder:"22"},null,8,["modelValue"]),s(a(p),{modelValue:n.value.username,"onUpdate:modelValue":e[3]||(e[3]=l=>n.value.username=l),label:"사용자명",placeholder:"예: root",required:""},null,8,["modelValue"]),s(a(p),{modelValue:n.value.authType,"onUpdate:modelValue":e[4]||(e[4]=l=>n.value.authType=l),label:"인증 방식",type:"select",options:K,required:""},null,8,["modelValue"]),n.value.authType==="PASSWORD"?(m(),$(a(p),{key:0,modelValue:n.value.password,"onUpdate:modelValue":e[5]||(e[5]=l=>n.value.password=l),label:"비밀번호",type:"password",placeholder:y.value?"변경 시에만 입력":"비밀번호 입력",required:!y.value},null,8,["modelValue","placeholder","required"])):E("",!0),n.value.authType==="KEY_FILE"?(m(),$(a(p),{key:1,modelValue:n.value.keyFilePath,"onUpdate:modelValue":e[6]||(e[6]=l=>n.value.keyFilePath=l),label:"키 파일 경로",placeholder:"예: C:\\Users\\user\\.ssh\\id_rsa",required:""},null,8,["modelValue"])):E("",!0),n.value.authType==="KEY_FILE"?(m(),$(a(p),{key:2,modelValue:n.value.passphrase,"onUpdate:modelValue":e[7]||(e[7]=l=>n.value.passphrase=l),label:"Passphrase",type:"password",placeholder:y.value?"변경 시에만 입력":"Passphrase (없으면 비워두세요)"},null,8,["modelValue","placeholder"])):E("",!0),t("div",me,[t("label",null,[te(t("input",{type:"checkbox","onUpdate:modelValue":e[8]||(e[8]=l=>n.value.active=l)},null,512),[[oe,n.value.active]]),e[26]||(e[26]=d(" 활성화 ",-1))])])],32)]),_:1},8,["modelValue","title"]),s(a(x),{modelValue:F.value,"onUpdate:modelValue":e[15]||(e[15]=l=>F.value=l),title:`로그 경로 관리 - ${((q=b.value)==null?void 0:q.name)||""}`,width:"700px"},{footer:u(()=>[s(a(v),{variant:"secondary",onClick:e[14]||(e[14]=l=>F.value=!1)},{default:u(()=>[...e[34]||(e[34]=[d("닫기",-1)])]),_:1})]),default:u(()=>[t("div",fe,[t("div",ye,[e[30]||(e[30]=t("h4",null,"경로 추가",-1)),t("div",ge,[s(a(p),{modelValue:i.value.path,"onUpdate:modelValue":e[11]||(e[11]=l=>i.value.path=l),label:"경로",placeholder:"예: /var/log/tomcat/"},null,8,["modelValue"]),s(a(p),{modelValue:i.value.filePattern,"onUpdate:modelValue":e[12]||(e[12]=l=>i.value.filePattern=l),label:"파일 패턴",placeholder:"예: *.log, catalina.*.log"},null,8,["modelValue"]),s(a(p),{modelValue:i.value.description,"onUpdate:modelValue":e[13]||(e[13]=l=>i.value.description=l),label:"설명",placeholder:"예: Tomcat 로그"},null,8,["modelValue"])]),s(a(v),{size:"sm",onClick:X,disabled:!i.value.path||!i.value.filePattern},{default:u(()=>[...e[29]||(e[29]=[d(" 추가 ",-1)])]),_:1},8,["disabled"])]),t("div",Ve,[e[33]||(e[33]=t("h4",null,"등록된 경로",-1)),w.value.length>0?(m(),k("table",ke,[e[32]||(e[32]=t("thead",null,[t("tr",null,[t("th",null,"경로"),t("th",null,"파일 패턴"),t("th",null,"설명"),t("th",null,"활성"),t("th")])],-1)),t("tbody",null,[(m(!0),k(se,null,ue(w.value,l=>(m(),k("tr",{key:l.id},[t("td",null,f(l.path),1),t("td",null,f(l.filePattern),1),t("td",null,f(l.description||"-"),1),t("td",null,[s(a(N),{variant:l.active?"success":"default"},{default:u(()=>[d(f(l.active?"Y":"N"),1)]),_:2},1032,["variant"])]),t("td",null,[s(a(v),{size:"sm",variant:"danger",onClick:V=>Z(l.id)},{default:u(()=>[...e[31]||(e[31]=[d("삭제",-1)])]),_:1},8,["onClick"])])]))),128))])])):(m(),k("p",he,"등록된 경로가 없습니다."))])])]),_:1},8,["modelValue","title"]),s(a(x),{modelValue:c.value,"onUpdate:modelValue":e[17]||(e[17]=l=>c.value=l),title:"서버 삭제",width:"400px"},{footer:u(()=>[s(a(v),{variant:"secondary",onClick:e[16]||(e[16]=l=>c.value=!1)},{default:u(()=>[...e[37]||(e[37]=[d("취소",-1)])]),_:1}),s(a(v),{variant:"danger",onClick:H,loading:M.value},{default:u(()=>[...e[38]||(e[38]=[d("삭제",-1)])]),_:1},8,["loading"])]),default:u(()=>{var l;return[t("p",null,[e[35]||(e[35]=d("정말로 ",-1)),t("strong",null,f((l=A.value)==null?void 0:l.name),1),e[36]||(e[36]=d(" 서버를 삭제하시겠습니까?",-1))]),e[39]||(e[39]=t("p",{class:"warning-text"},"관련된 모든 로그 경로와 에러 이력도 함께 삭제됩니다.",-1))]}),_:1},8,["modelValue"]),s(a(x),{modelValue:P.value,"onUpdate:modelValue":e[19]||(e[19]=l=>P.value=l),title:"연결 테스트 결과",width:"450px"},{footer:u(()=>[s(a(v),{variant:"secondary",onClick:e[18]||(e[18]=l=>P.value=!1)},{default:u(()=>[...e[40]||(e[40]=[d("닫기",-1)])]),_:1})]),default:u(()=>{var l,V,z,O;return[t("div",{class:ne(["test-result",{success:(l=g.value)==null?void 0:l.success,fail:!((V=g.value)!=null&&V.success)}])},[(z=g.value)!=null&&z.success?(m(),k("div",we,[t("p",null,"✅ "+f(g.value.message),1)])):(m(),k("div",be,[t("p",null,"❌ "+f((O=g.value)==null?void 0:O.error),1)]))],2)]}),_:1},8,["modelValue"])])}}},Ue=ee(ce,[["__scopeId","data-v-6f59a208"]]);export{Ue as default};
|