From cc4a9ef3f10ae96e416f6be293eedd0a5916e1cc Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Thu, 12 Dec 2024 17:37:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linker.tray.win/default.aproj | 2 +- linker.tray.win/dist/linker.tray.win.exe | Bin 5931008 -> 5931520 bytes .../{245.922d2586.css => 509.8ac32231.css} | 2 +- linker.tray.win/web/index.html | 2 +- linker.tray.win/web/js/245.a0641292.js | 1 - linker.tray.win/web/js/509.b1ccc755.js | 1 + linker.tray.win/web/js/app.1dbd8a85.js | 1 + linker.tray.win/web/js/app.8e82ca5d.js | 1 - linker.tunnel/TunnelTransfer.cs | 94 +++- linker.tunnel/adapter/ITunnelAdapter.cs | 103 ----- linker.tunnel/transport/ITunnelTransport.cs | 34 +- linker.tunnel/transport/TransportMsQuic.cs | 18 +- linker.tunnel/transport/TransportTcpNutssb.cs | 14 +- linker.tunnel/transport/TransportTcpP2PNAT.cs | 18 +- .../transport/TransportTcpPortMap.cs | 14 +- linker.tunnel/transport/TransportUdp.cs | 4 +- .../transport/TransportUdpPortMap.cs | 11 +- .../wanport/TunnelWanPortTransfer.cs | 12 +- linker/config/Config.cs | 2 - .../plugins/relay/client/RelayTestTransfer.cs | 4 +- linker/plugins/socks5/TunnelProxy.cs | 11 - linker/plugins/tunnel/TunnelAdapter.cs | 78 +++- linker/plugins/tunnel/TunnelApiController.cs | 21 +- linker/plugins/tunnel/TunnelBase.cs | 4 +- linker/plugins/tunnel/TunnelConfigTransfer.cs | 65 +-- linker/plugins/tunnel/TunnelDecenter.cs | 55 +++ linker/plugins/tunnel/TunnelStartup.cs | 48 +- linker/plugins/tunnel/config/Config.cs | 1 - .../excludeip/TunnelExcludeIPTransfer.cs | 2 - .../tunnel/messenger/TunnelMessenger.cs | 1 - linker/plugins/tuntap/TuntapAdapter.cs | 237 ++++++++++ linker/plugins/tuntap/TuntapApiController.cs | 24 +- linker/plugins/tuntap/TuntapConfigTransfer.cs | 409 +++--------------- linker/plugins/tuntap/TuntapDecenter.cs | 126 ++++++ .../tuntap/TuntapDeviceStatusTransfer.cs | 39 +- linker/plugins/tuntap/TuntapPingTransfer.cs | 14 +- linker/plugins/tuntap/TuntapProxy.cs | 146 +++---- linker/plugins/tuntap/TuntapStartup.cs | 4 +- linker/plugins/tuntap/TuntapTransfer.cs | 12 +- .../tuntap/lease/LeaseServerTreansfer.cs | 1 - .../tuntap/messenger/TuntapMessenger.cs | 11 +- version.txt | 2 +- 42 files changed, 843 insertions(+), 806 deletions(-) rename linker.tray.win/web/css/{245.922d2586.css => 509.8ac32231.css} (96%) delete mode 100644 linker.tray.win/web/js/245.a0641292.js create mode 100644 linker.tray.win/web/js/509.b1ccc755.js create mode 100644 linker.tray.win/web/js/app.1dbd8a85.js delete mode 100644 linker.tray.win/web/js/app.8e82ca5d.js delete mode 100644 linker.tunnel/adapter/ITunnelAdapter.cs create mode 100644 linker/plugins/tunnel/TunnelDecenter.cs create mode 100644 linker/plugins/tuntap/TuntapAdapter.cs create mode 100644 linker/plugins/tuntap/TuntapDecenter.cs diff --git a/linker.tray.win/default.aproj b/linker.tray.win/default.aproj index 2363b438..acff0623 100644 --- a/linker.tray.win/default.aproj +++ b/linker.tray.win/default.aproj @@ -1,5 +1,5 @@  - + diff --git a/linker.tray.win/dist/linker.tray.win.exe b/linker.tray.win/dist/linker.tray.win.exe index bd4a4b49815e2644fe21b52ded12e142c4d0807c..1a50470503e0f1396fa5112caee6c75750c8cce6 100644 GIT binary patch delta 5711 zcmbtYdw3Jqm7hD70b3a3;1_<|xIrRgVaYPs0s*phWCOA-+u#>r%~%>g$C50MF^_mL z0YYe&jYAS{c0(aa3Gnriq;0-l((VUInvs;qgGkT4j z^uOBQPj}9_ch0@%dGDR+>6`rY{+s*@rG(TyT1JMGUJSI*SJtQ0K6-(?kctGydGs6? z+;=~J@P3{k)HVsBLnI^SAm$?GAyN>j?0#O~yoglNx3cs%GJd<9n?7?FH$A74n|>Kv zE4!Gje=@u7cO1w4n+|{Qud>(5B@vCbZnJWq^BOI9t=t+M7aK1l{dpQYRiXcTvZn>K zj`Dkf`*#!?8#rGC?iY(S`d@Yd_p7BEeexOLZYFE=%o*TPD@gqPV{f~-n;BaFgEw5< z4Ua|#YZ~@&pDx!JzQG30Qok@R;EC^ca+hxJ zgaKhhEJNIb5D*mz6Jj}{5@AMISblw##*^l%>{HbLq>C)|rE!Rap_$h!u#Hh#EvK!iHFdSdFkF)*#j*)*&2-I`&yr zec8XxGyD2{HDXOQD@u2!Ut+B~*H0fws;;bM%da{&>XIxg&2*;OWg{buz32QP$pgEg zQcz3-7NenT(}Z6UgWwxd%8Y`W?fbx)mP&v=^0D(Oo%z@~myO+YUe3^mUvZfnMngRn zPrJ$stbG<=e^rgQZ0lCzs_kN^#BGOF-hh8xDe0wa4?zxn_KtIic<9sVP{Njf;oO`| zI@kdo3_P~a>EJe@S*KjN?4>!7osO(Gv!F$fGk;hBrSx17-0W~EJfBM3)GmNAZcMQR zMei42{~nKI-#sGjv{edTSsWj?l?{X>$zL`lbYMr6H5n3v$Z41CTgsFnMV8983Y((u znWu!NM1Gsb?@Z)(X?#cQ5vQbUDN6 zrpTTb=`b4^YI83k4tA~@9^(0CiIzSF#ca3+Qgy_AdSW#s0hHsGQi3!N3 z@6^Myq?}DTVK?E2Ble+apZnP3E_jLLcWc%eo@Je}h;`_6BV^2Ll{R}EG7eVPb=i}{i0g_uF^F}AdBAeI+NMMZQvlhEK*Vqh4eq$;d5RQ z>BpPk3hx)`&o=|p1w>&B9qI%JJ>P+)@bykG(FL9Ol-q?*TRWjRb5KkOobjOOFB3-T zOed_&41T?5Qtip3f9ixKnIm8C9td|cR~MWm{B}{zy>M`Bq~Ci0QzqEx($h0N@GA^~ z$t_Tg&G)y!&#(#J3kT=AC6fb;2HH9W#k6oM{4TFgjA!b0)I`hFe!BN@S8kP6wA9p8 zTE%#x){FK&F`B3@G;O%1Pp#^o@Ozb^fWHL7Ml7KR{st}*7j5Z9?M9E~hi?kj>Huz|WIT z`nN;Sg$u&QO7+9=&uMj{T{hI#)>IjVW|1D>;A~*aMxY)K@ysuSjnCVmd8c`ncN}5w z&})7y6uU(G4pG=F(&A!RO7jAs=XZ%mZ$kmC55Tb5sma(pO9qIs!@x$-?u_}gHCh2a z3qWyIi{_?@;6O<9NfpsOx^xoF3?XBUaAF>PSH!Vc5vAQbT37`~+-v(zy- zn3U8a3iOe~kV(%d@F&thk59lpQclaZ!*6tBxNs^i#Zs|w5{{5z_U%ddfae<{@z1b0 z+H`pvG({U{DcT(|maqph8hS+ghM20791CATl;eRVlm-0t@{o4~4(^2_LW zbbB<903R-v`WcvIdEMfom3@C)SnRo)05xy6F=Y_@e`jcRpvr{%2Z5C>N5*pOGzfzn$ zZ0pl7Mfi?HLArK~K6>~h(CNnw*3c`L2)&}&Nwy-xb;lknqv+GIhD1zjYf)SzpU zO=2xZ#FXHV2VxU@;aT`8S={xNz-x;Jo`dc`4K~un&Yy;CwW|I04D^uvI?XkXS+3cH zuKA%Ww{S&YRe#M&JpD&6E6uXKF6N~jbox7xwPKfQ*w`ImGbVEMjHpzoM-HdP2#N#o zqP39*EC3oZ;0tT7S?ycaH7855j`5!Ao8=@m*8bW##CkAN#=(m zYEaX8Si^2!h9REsjTH;$PGeLZ_jSk^loWeUOdU~4tf+#l z#7nReeZ+0tuW7dL<6JGJe2RK{TN1g~UHpSHjU{~utLE~e!q$BRHD;Kxh z-h1NpG!!kN;fgAZ|D}TZ&D$`^lOe|c7Zz4BbXxguAo*S;USB7a#QKW5sn;fY>T}3g zI;hyaiZB{pNR@ha2%VFZq>m+wOL}!r9#P{m;R=XF^u52YyLbzZuy2WuZQR zRQRYi9%c?u5~M-*Z=k!Cse815;T zg?3k3psjy~H%N#U-GR69 z*!0;QxPmwLUw#3NWRzup2}gP2e*F8cE|f5bxVB>BBd!w6#skE)DkgrOTNn>7n6~^G z1e%)UdS?ElX5Sz^o8(%NJfheq75d7dGbjRn zlCiKa(;M`uG&iq7NW($4vOcrd>s?u0P3!U+_R`C7evRm@vRJCj>`q?8hLp_e6*jX_ zRc*mvtHp}H>X)9L@`h3!EzNdrJovhy0nvz9kJx}vd2U1#q8ZVG@E}?dZHRWnCd6h$ z2ci?vh3ICl8+uaKrPbhv!0WX)bisv3m+0twgFP!#<_wJIe}(dUAMTRX+}|Wy(m; RM{(kqzsHwBukY!}{eLW_SswrZ delta 5422 zcmZu#33wF8mF{XufEa`%K=(Ze&_E;2j7CBd4Ct7u(Jg_5E*nE5wS=HGBaIr6ID)_j z@fynp1J7R)2k^!=`Mx+1$4)s}9OF1%o5br264=C>IL0g(l3;8WLv~~K^;|8*nfdaq&pb1{9i7tKOEpl=?3WCsV5(Llvd&Iqa zM1s(t5r{}c6k-ZuDqm<78LvA`)(RyMhT# z)Tmg!mkF0}kWk0geN1>G#gK15!-RJh81h^H!Gx<(hWz4Ll;aKg=p`mxZZ_m^7Q1%| zHwp~Jj$XH5uZjx~c=G%0!UxHQ{efS!3;+IeL$2T5AzayS$d1{a!XGAhIw!GHI55G1 zz3-!bHaJzYXxr6HeswoAyJK>bH3N6s+p zpS-{iSWS(l1cy*0ao7;sdp#nQ{?McJEJ8?##fW@F0m6!~ zA?!S@s?h#ld|;kKn=;iVFR}G14!E+&F)unOtl18`D;=}BMRF{i%ImWo*->!1+VS|_ zn}rTU5uzBe1W|%0MU)|yB9)qLSY%tTO+8T8UC(@0N>tcxJ3C_E(~# zh+o@C>mnl@b_Wd1rKMyu*Sz!vl3MS~vr1ZipWTvYZr$wBf;(W;&^d z#_jY!pU44LxpVJ4VHpRJplQLRnmAX}Vc(}~m=Tj7qd8gEjhM;PzPaZ@~3zWV}&0?#+ z?vzffc%v%;&(r!3z2+S_$PWbHP;x$ zJ!zDB|0uvdrtvd}6lZRT@r^;ow|`8tqB<2P%11t?6;ajxVwk&e~#DTB293|zDmw?|;O5+fZ2ObaPJ^R9oueFB@Hst0Ho=Y0>A&Xn z8jI4aDkHe;TPAB3+fcV&26+*)k}CMi7qpNt$hk@FV!aH1cDgLFRCeBD*7`M7F|U!< z%8T3>X$j0{+yBskq+WFEANKARRKf0iHXHWc zqVZt9MV}(;;q)!qfD@VdC2bIy44EZ*dMRLOIGw{qY#t1rpmX_$Us4MZsSFioXfkBo zp{-;sXm{vZG79JJ(8s6M1c!sCe&{Ly>r0q-QV!A?{FT4a^&)2E?7!0voF+aT@ciHD zuVY$er(+v&4`E*S%UX$ zGy&?Sv72NYlt;7s$!hpzG&>vV(pPJYV|QE6Q#ah1&gw`VrzZACku(9u_&53UGuics zG`Hbl(^@z%a z-~W(WV0bp$DGtf-ZUSnKw$Uj(eGYq=L~N8T@FR`R;inSVH;A=UwyeRgMOs^C+iBUU zA9A(&TH{Iww^EnvY#AL`?^W|GlA^-5AEaj3m&8`2b;*(vs)SBioXfXk2-nK_z9nGI zcFhA*GW%5&%6$#+XrXHXkQDZLimdvp`h&fFr6sRR4jip2%t&Q_D3bMI`ki@bZHxKwj#9-|+%0#9&n=JY z)YPD#Uic`T6-WA1rxza0VChht!CE4RgW`bLqr&oIn3wxi{aVz$1=FPfTa?dr{=L`qF5_K$3pgUTDLLV&68$}1L(K0 z%wk2hI+pa7hG)A$b#{klI{@nzF`GE3!e76@WVBUWGvg_*NilDO9I-dukW@okIQQ6dhg@Y*e!0^WQU2iI=l4GxEm{c@59ClJm> zWD~#ZU^|J}r^3qr!+bPuV;Uj7Jfe^-Bs{f%HHl*VL|Y_PEo-2l1h0OBU*dUHQo_`R(xH|rW{^WAj zB9c|SZ5<zHhG**aVHUSxNOk6hyxKTG{ULA!qU@HC8<}a-+UmY*Se#yt$EC;m8P!F*_a4U7Otj|` zA7LcbtA#VPN1K?TRlxsrEDL;^)2m6t{(%ei%SI0p((N4>^m-JJHe9y71z+*XD2(l6 zj$IyAf5Y%7s{Vppwn3GGuYq_U9`>tzTJRO5tS|I3;@1y_q)R^(ddeEqP|Zh@>>6hYxP=alv--F;X>FgP z1v;0Y&V^mT;-fZe&VG%*d%=}* zfZqi6yU}F3qX-ZEd~Ji`$rMP+8$TI{gdOYLwy&0PSC z)7`uL>QcMC$6i!Y4Bt<87x2sJ?&|0{SluSsi;D5Lu*ilinker.web
\ No newline at end of file +linker.web
\ No newline at end of file diff --git a/linker.tray.win/web/js/245.a0641292.js b/linker.tray.win/web/js/245.a0641292.js deleted file mode 100644 index 7b8edc19..00000000 --- a/linker.tray.win/web/js/245.a0641292.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[245],{9232:function(e,a,l){l.d(a,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var t=l(4);const n=e=>(0,t.zG)("relay/SetServers",e),o=()=>(0,t.zG)("relay/Subscribe"),r=e=>(0,t.zG)("relay/Connect",e)},743:function(e,a,l){l.d(a,{Ap:function(){return n},Co:function(){return o},DY:function(){return i},Qs:function(){return u},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var t=l(4);const n=()=>(0,t.zG)("sforwardclient/GetSecretKey"),o=e=>(0,t.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,t.zG)("sforwardclient/get",e),s=()=>(0,t.zG)("sforwardclient/refresh"),d=(e="0")=>(0,t.zG)("sforwardclient/getcount",e),i=e=>(0,t.zG)("sforwardclient/remove",e),u=e=>(0,t.zG)("sforwardclient/add",e),c=e=>(0,t.zG)("sforwardclient/TestLocal",e)},83:function(e,a,l){l.d(a,{$M:function(){return s},KW:function(){return r},gM:function(){return o},r7:function(){return n}});var t=l(4);const n=(e="0")=>(0,t.zG)("tunnel/get",e),o=()=>(0,t.zG)("tunnel/refresh"),r=e=>(0,t.zG)("tunnel/SetRouteLevel",e),s=e=>(0,t.zG)("tunnel/SetTransports",e)},424:function(e,a,l){l.r(a),l.d(a,{default:function(){return ut}});var t=l(6768);const n={class:"home-list-wrap absolute"},o={class:"page t-c"},r={class:"page-wrap"};function s(e,a,l,s,d,i){const u=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),w=(0,t.g2)("Forward"),k=(0,t.g2)("Oper"),g=(0,t.g2)("el-table"),f=(0,t.g2)("el-pagination"),v=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),C=(0,t.g2)("TunnelEdit"),F=(0,t.g2)("ConnectionsEdit"),L=(0,t.g2)("TuntapEdit"),E=(0,t.g2)("Socks5Edit"),_=(0,t.g2)("TuntapLease"),y=(0,t.g2)("ForwardEdit"),I=(0,t.g2)("SForwardEdit");return(0,t.uX)(),(0,t.CE)("div",n,[(0,t.bF)(u,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(g,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),s.tuntap.show?((0,t.uX)(),(0,t.Wv)(m,{key:0,onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.socks5.show?((0,t.uX)(),(0,t.Wv)(p,{key:1,onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.forward.show?((0,t.uX)(),(0,t.Wv)(w,{key:2,onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"])):(0,t.Q3)("",!0),(0,t.bF)(k,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",o,[(0,t.Lk)("div",r,[(0,t.bF)(f,{small:"",background:"",layout:"total,sizes,prev,pager, next",total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])]),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(v,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":a[0]||(a[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":a[1]||(a[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":a[2]||(a[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":a[3]||(a[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(L,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":a[4]||(a[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(E,{key:5,modelValue:s.socks5.showEdit,"onUpdate:modelValue":a[5]||(a[5]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showLease,"onUpdate:modelValue":a[6]||(a[6]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(y,{key:7,modelValue:s.forward.showEdit,"onUpdate:modelValue":a[7]||(a[7]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(I,{key:8,modelValue:s.sforward.showEdit,"onUpdate:modelValue":a[8]||(a[8]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}l(4114);var d=l(3830),i=l(144),u=l(1219);function c(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(i,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网关",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.tuntap.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.socks5.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.forward.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["onSortChange"])}var h=l(7716);const m=Symbol(),p=()=>{(0,d.B)();const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(m,e);const a=()=>{(0,h.dS)()},l=()=>{(0,h.V1)(e.value.hashcode.toString()).then((a=>{e.value.hashcode=a.HashCode,a.List&&(e.value.list=a.List),e.value.timer=setTimeout(l,1020)})).catch((()=>{e.value.timer=setTimeout(l,1020)}))},n=a=>{e.value.machineId=a[0],e.value.machineName=a[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:l,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:a}},w=()=>(0,t.WQ)(m);var k=l(2173);const g=Symbol(),f=()=>{const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(g,e);const a=()=>{clearTimeout(e.value.timer),(0,k.$y)(e.value.hashcode.toString()).then((l=>{if(e.value.hashcode=l.HashCode,l.List){for(let e in l.List)Object.assign(l.List[e],{running:2==l.List[e].Status,loading:1==l.List[e].Status});e.value.list=l.List}e.value.timer=setTimeout(a,1100)})).catch((l=>{e.value.timer=setTimeout(a,1100)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,k.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=a=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(a)>=0||e.Lans.filter((e=>e.IP.indexOf(a)>=0)).length>0)).map((e=>e.MachineId)),s=a=>{const l=Object.values(e.value.list).sort(((e,a)=>e.Port-a.Port));return l.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:a,handleSocks5Edit:l,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},v=()=>(0,t.WQ)(g);var b=l(8104),C={emits:["sort"],setup(e,{emit:a}){const l=(0,b.W)();l.value.show="false"!=localStorage.getItem("tuntap.show");const t=v();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{a("sort",e)},r=()=>{localStorage.setItem("tuntap.show",l.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:l,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},F=l(1241);const L=(0,F.A)(C,[["render",c],["__scopeId","data-v-4b2df38c"]]);var E=L;const _=e=>((0,t.Qi)("data-v-6638f97d"),e=e(),(0,t.jt)(),e),y={class:"dropdown"},I=_((()=>(0,t.Lk)("span",null,"操作",-1)));function V(e,a,l,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("SwitchButton"),u=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),w=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(w,{label:"操作",fixed:"right"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[e.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(u,{key:0,onClick:a=>n.handleExit(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),e.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(u,{key:1,onClick:a=>n.handleDel(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(e.row,n.accessList[e.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(u,{key:2,onClick:a=>n.handleAccess(e.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",y,[I,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var P=l(9299),S=l(920),T=l(7477),M=l(2933),R=l(5962),W={emits:["refresh","access"],components:{Delete:T.epd,SwitchButton:T.L$q,ArrowDown:T.yd$,Flag:T.lNU},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,R.q)(),o=(0,t.EW)((()=>l.value.config.Client.Access)),r=(0,t.EW)((()=>l.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),i=(0,t.EW)((()=>l.value.hasAccess("Reboot"))),u=(0,t.EW)((()=>l.value.hasAccess("Remove"))),c=(e,l)=>{M.s.confirm(`确认删除[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,P.Se)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},h=(e,l)=>{M.s.confirm(`确认关闭[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,S.NS)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},m=(e,a)=>e.showAccess&&r.value&&a>=0&&0==+(~BigInt(o.value)&BigInt(a)).toString(),p=e=>{a("access",e)};return{accessList:s,handleDel:c,handleExit:h,hasReboot:i,hasRemove:u,hasAccess:r,handleShowAccess:m,handleAccess:p}}};const X=(0,F.A)(W,[["render",V],["__scopeId","data-v-6638f97d"]]);var A=X,B=l(4232);const N=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),x={class:"flex"},z=N((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),U={class:"flex"},D=["onClick"],K=["onClick"],Q=N((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),O=[Q],G=N((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function $(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("Search"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("DeviceName"),h=(0,t.g2)("UpdaterBtn"),m=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(m,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",x,[z,(0,t.Lk)("span",null,[(0,t.bF)(s,{size:"small",modelValue:n.name,"onUpdate:modelValue":a[0]||(a[0]=e=>n.name=e),clearable:"",onInput:n.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(u,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(c,{onEdit:n.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",U,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,B.v_)(e.row.IP),1)],8,D)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},O,8,K)),G,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(h,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var q=l(167),j=l(3347),Y={emits:["edit","refresh"],components:{Search:T.vji,UpdaterBtn:q.A,DeviceName:j.A},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("ExternalShow"))),o=(0,i.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{a("edit",e)},u=()=>{sessionStorage.setItem("search-name",o.value),a("refresh",o.value)};return{handleEdit:s,handleRefresh:u,name:o,handleExternal:r}}};const H=(0,F.A)(Y,[["render",$],["__scopeId","data-v-5db71b03"]]);var J=H;const Z=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ee={class:"t-c w-100"};function ae(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"300"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[Z])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"12","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ee,[(0,t.bF)(i,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var le={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=(0,i.KR)(null),n=(0,i.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,P.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:n,ruleFormRef:l,handleSave:o}}};const te=(0,F.A)(le,[["render",ae]]);var ne=te,oe=l(7985);function re(e,a,l,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{modelValue:n.state.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:a[0]||(a[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var se=l(3363),de=l(9593),ie={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:de.A},setup(e,{emit:a}){const l=(0,i.Kh)({show:!0,loading:!1});(0,t.wB)((()=>l.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const n=(0,i.KR)(null),o=()=>{l.loading=!0,(0,se.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{l.loading=!1,l.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),l.loading=!1,u.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:l,accessDom:n,handleSave:o}}};const ue=(0,F.A)(ie,[["render",re]]);var ce=ue;const he={key:0};function me(e,a,l,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:"虚拟网卡",width:"160"},{header:(0,t.k6)((()=>[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")])),default:(0,t.k6)((e=>[n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",he,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}var pe=l(9636),we={emits:["edit","refresh"],components:{TuntapShow:pe.A},setup(e,{emit:a}){const l=(0,b.W)(),t=e=>{a("edit",e)},n=()=>{a("refresh")},o=()=>{l.value.showLease=!0};return{tuntap:l,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const ke=(0,F.A)(we,[["render",me]]);var ge=ke;const fe=e=>((0,t.Qi)("data-v-34275839"),e=e(),(0,t.jt)(),e),ve=fe((()=>(0,t.Lk)("span",null,"/",-1))),be=fe((()=>(0,t.Lk)("span",{style:{width:"2rem"}},null,-1))),Ce={key:0,class:"upgrade-wrap"},Fe={class:"w-100 t-c"};function Le(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("TuntapLan"),c=(0,t.g2)("TuntapForward"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[7]||(a[7]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.eW)("赐予此设备IP,其它设备可通过此IP访问")])),_:1}),(0,t.bF)(s,{label:"虚拟网卡IP",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),ve,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),be,(0,t.bF)(i,{modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":a[4]||(a[4]=e=>n.state.ruleForm.Multicast=e),label:"禁用UDP广播",size:"large"},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{prop:"upgrade",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.Upgrade,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.ruleForm.Upgrade=e),label:"我很懂,我要使用高级功能(点对网和网对网)",size:"large"},null,8,["modelValue"])])),_:1}),n.state.ruleForm.Upgrade?((0,t.uX)(),(0,t.CE)("div",Ce,[(0,t.bF)(s,{label:"局域网IP",prop:"LanIP",class:"m-b-0",style:{"border-bottom":"1px solid #ddd"}},{default:(0,t.k6)((()=>[(0,t.bF)(u,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(s,{label:"端口转发",prop:"forwards"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{ref:"forwardDom"},null,512)])),_:1})])):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Fe,[(0,t.bF)(h,{onClick:a[6]||(a[6]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Ee=l(5241);const _e=e=>((0,t.Qi)("data-v-71a71fe4"),e=e(),(0,t.jt)(),e),ye={class:"w-100"},Ie=_e((()=>(0,t.Lk)("span",{class:"yellow"},"此设备无法使用NAT转发,或只想使用端口转发",-1))),Ve={key:0,class:"green"},Pe={class:"wrap"},Se={key:1,class:"remark"};function Te(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-table-column"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("el-popconfirm"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",ye,[(0,t.Lk)("div",null,[Ie,n.state.testing?((0,t.uX)(),(0,t.CE)("span",Ve,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Pe,[(0,t.bF)(p,{stripe:"",data:n.state.forwards,border:"",size:"small",width:"100%",height:"300px",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":a=>e.row.ListenPort=a,onBlur:a=>n.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.ListenPort),1)],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":a=>e.row.ConnectAddr=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.ConnectAddr),1)],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":a=>e.row.ConnectPort=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.ConnectPort),1)],64))])),_:1}),(0,t.bF)(d,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":a=>e.row.Remark=a,onBlur:a=>n.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",Se,(0,B.v_)(e.row.Remark),1))])),_:1}),(0,t.bF)(d,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(c,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(c,{type:"primary",size:"small",onClick:a=>n.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Me={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({machineName:a.value.current.device.MachineName,forwards:0==a.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:a.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,a)=>{o(e,a.property)},o=(e,a)=>{l.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${a}Editing`]=!0,e["__editing"]=!0},r=(e,a)=>{e[`${a}Editing`]=!1,e["__editing"]=!1},s=e=>{1==l.forwards.length?l.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:l.forwards.splice(e,1)},d=e=>{l.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||l.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},u=()=>{clearTimeout(l.timer),l.testing=!0,(0,Ee._)({MachineId:a.value.current.MachineId,List:l.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var a=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=l.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let a=0;a{l.testing=!1,l.timer=setTimeout(u,3e3)}))};(0,t.sV)((()=>{u()})),(0,t.hi)((()=>{clearTimeout(l.timer)}));const c=()=>l.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:l,handleCellClick:n,handleEditBlur:r,handleDel:s,handleAdd:d,getData:c}}};const Re=(0,F.A)(Me,[["render",Te],["__scopeId","data-v-71a71fe4"]]);var We=Re;const Xe=e=>((0,t.Qi)("data-v-4abaaeaf"),e=e(),(0,t.jt)(),e),Ae={class:"w-100"},Be=Xe((()=>(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"填写局域网IP,使用NAT转发")],-1))),Ne={class:"wrap"},xe=Xe((()=>(0,t.Lk)("span",null,"/",-1))),ze={class:"pdl-10"},Ue={class:"pdl-10"};function De(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("Plus");return(0,t.uX)(),(0,t.CE)("div",Ae,[Be,(0,t.Lk)("div",Ne,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",null,[(0,t.bF)(s,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),xe,(0,t.bF)(s,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",ze,[(0,t.bF)(d,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",style:{"vertical-align":"middle"}},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ue,[(0,t.bF)(c,{type:"danger",onClick:e=>n.handleDel(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(c,{type:"primary",onClick:e=>n.handleAdd(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})])),_:2},1032,["onClick"])])])))),128))])])}var Ke={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({lans:a.value.current.Lans.slice(0)});0==l.lans.length&&l.lans.push({IP:"0.0.0.0",PrefixLength:24});const t=e=>{var a=+l.lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),l.lans[e].PrefixLength=a},n=e=>{l.lans.splice(e,1),0==l.lans.length&&o(0)},o=e=>{l.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},r=()=>l.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:l,handleMaskChange:t,handleDel:n,handleAdd:o,getData:r}}};const Qe=(0,F.A)(Ke,[["render",De],["__scopeId","data-v-4abaaeaf"]]);var Oe=Qe,Ge={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42,TuntapForward:We,TuntapLan:Oe},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,b.W)(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{IP:n.value.current.IP,PrefixLength:n.value.current.PrefixLength||24,Gateway:n.value.current.Gateway,ShowDelay:n.value.current.ShowDelay,AutoConnect:n.value.current.AutoConnect,Upgrade:n.value.current.Upgrade,Multicast:n.value.current.Multicast,Forwards:n.value.current.Forwards},rules:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e},c=(0,i.KR)(null),h=(0,i.KR)(null),m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.IP=r.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.Lans=c.value?c.value.getData():n.value.current.Lans,e.PrefixLength=+r.ruleForm.PrefixLength,e.Gateway=r.ruleForm.Gateway,e.ShowDelay=r.ruleForm.ShowDelay,e.AutoConnect=r.ruleForm.AutoConnect,e.Upgrade=r.ruleForm.Upgrade,e.Multicast=r.ruleForm.Multicast,e.Forwards=h.value?h.value.getData():n.value.current.Forwards,(0,Ee.ac)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handlePrefixLengthChange:s,handleSave:m,lanDom:c,forwardDom:h}}};const $e=(0,F.A)(Ge,[["render",Le],["__scopeId","data-v-34275839"]]);var qe=$e;const je=e=>((0,t.Qi)("data-v-4a28804a"),e=e(),(0,t.jt)(),e),Ye=je((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),He=je((()=>(0,t.Lk)("span",null,"/",-1))),Je=je((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),Ze={class:"calc"},ea=je((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),aa={class:"value"},la=je((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),ta={class:"value"},na=je((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),oa={class:"value"},ra=je((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),sa={class:"value"},da=je((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),ia={class:"value"},ua=je((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),ca={class:"value"};function ha(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway"},{default:(0,t.k6)((()=>[Ye])),_:1}),(0,t.bF)(s,{label:"网络和掩码",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"},onChange:n.handlePrefixLengthChange},null,8,["modelValue","onChange"]),He,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),Je,(0,t.bF)(i,{onClick:n.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("清除")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(s,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Ze,[(0,t.Lk)("p",null,[ea,(0,t.Lk)("span",aa,(0,B.v_)(n.state.values.Network),1)]),(0,t.Lk)("p",null,[la,(0,t.Lk)("span",ta,(0,B.v_)(n.state.values.Gateway),1)]),(0,t.Lk)("p",null,[na,(0,t.Lk)("span",oa,(0,B.v_)(n.state.values.Start),1)]),(0,t.Lk)("p",null,[ra,(0,t.Lk)("span",sa,(0,B.v_)(n.state.values.End),1)]),(0,t.Lk)("p",null,[da,(0,t.Lk)("span",ia,(0,B.v_)(n.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[ua,(0,t.Lk)("span",ca,(0,B.v_)(n.state.values.Count),1)])])])),_:1}),n.hasLease?((0,t.uX)(),(0,t.Wv)(s,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{onClick:a[2]||(a[2]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var ma={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("Lease"))),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,ruleForm:{IP:"0.0.0.0",PrefixLength:24},rules:{},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{(0,Ee.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,Ee.Nj)().then((e=>{r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,Ee.AE)(r.ruleForm).then((()=>{u.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),u.nk.error("操作失败")}))},p=()=>{(0,Ee.AE)({IP:"0.0.0.0",PrefixLength:24}).then((()=>{u.nk.success("已操作"),c()})).catch((e=>{console.log(e),u.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const pa=(0,F.A)(ma,[["render",ha],["__scopeId","data-v-4a28804a"]]);var wa=pa;const ka={key:0};function ga(e,a,l,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:"代理转发",width:"160"},{default:(0,t.k6)((e=>[n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",ka,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}const fa={class:"flex"},va={class:"flex-1"},ba={key:0,class:"point p2p",title:"打洞直连"},Ca={key:1,class:"point relay",title:"中继连接"},Fa={key:2,class:"point node",title:"节点连接"},La={key:1,class:"point",title:"未连接"},Ea=["title"],_a={key:0,class:"green gateway"},ya={key:1},Ia={key:0},Va={key:0,class:"flex yellow",title:"已禁用"},Pa={key:1,class:"flex red",title:"与其它设备填写IP、或本机局域网IP有冲突"};function Sa(e,a,l,n,o,r){const s=(0,t.g2)("Loading"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",fa,[(0,t.Lk)("div",va,[n.connections.list[n.item.MachineId]&&n.connections.list[n.item.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",ba)):1==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Ca)):2==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Fa)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",La)),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=e=>n.handleSocks5Port(n.socks5.list[n.item.MachineId])),title:"此设备的socks5代理"},[n.socks5.list[n.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:n.socks5.list[n.item.MachineId].SetupError}," socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),9,Ea)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[n.socks5.list[n.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",_a,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",ya,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1))],64))])]),n.socks5.list[n.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",Ia,[(0,t.bF)(d,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])):((0,t.uX)(),(0,t.Wv)(i,{key:1,modelValue:n.socks5.list[n.item.MachineId].running,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.list[n.item.MachineId].running=e),loading:n.socks5.list[n.item.MachineId].loading,disabled:"",onClick:a[2]||(a[2]=e=>n.handleSocks5(n.socks5.list[n.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.socks5.list[n.item.MachineId].Lans,((e,a)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:a},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",Va,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",Pa,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,B.C4)(["flex",{green:n.socks5.list[n.item.MachineId].running}]),title:"正常使用"},(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),3))],64)))),128))])])])}var Ta=l(9983),Ma={props:["item","config"],emits:["edit","refresh"],components:{Loading:T.Rhj},setup(e,{emit:a}){const l=v(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),i=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,Ta.bB)(),m=a=>{if(!e.config)return;if(o.value===a.MachineId){if(!i.value)return}else if(!c.value)return;const l=a.running?(0,k.R2)(a.MachineId):(0,k.qH)(a.MachineId);a.loading=!0,l.then((()=>{u.nk.success("操作成功!")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))},p=l=>{if(e.config||o.value==l.MachineId){if(o.value===l.MachineId){if(!r.value)return}else if(!s.value)return;l.device=e.item,a("edit",l)}},w=()=>{a("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:l,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:w}}};const Ra=(0,F.A)(Ma,[["render",Sa],["__scopeId","data-v-c1ea089c"]]);var Wa=Ra,Xa={emits:["edit","refresh"],components:{Socks5Show:Wa},setup(e,{emit:a}){const l=v(),t=e=>{a("edit",e)},n=()=>{a("refresh")};return{socks5:l,handleSocks5:t,handleSocks5Refresh:n}}};const Aa=(0,F.A)(Xa,[["render",ga]]);var Ba=Aa;const Na=e=>((0,t.Qi)("data-v-022e3781"),e=e(),(0,t.jt)(),e),xa={class:"upgrade-wrap"},za={class:"flex-1"},Ua=Na((()=>(0,t.Lk)("span",null,"/",-1))),Da={class:"pdl-10"},Ka={class:"pdl-10"};function Qa(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("Delete"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-button"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-form"),w=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(w,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"600"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",xa,[(0,t.bF)(s,{label:"此设备局域网IP",prop:"LanIP",class:"lan-item"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ruleForm.Lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",za,[(0,t.bF)(d,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),Ua,(0,t.bF)(d,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Da,[(0,t.bF)(i,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",size:"large"},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ka,[(0,t.bF)(h,{type:"danger",onClick:e=>n.handleDel(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(h,{type:"primary",onClick:e=>n.handleAdd(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])))),128))])),_:1})]),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Oa={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=v(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:n.value.current.Lans.slice(0)},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=e=>{var a=+r.ruleForm.Lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),r.ruleForm.Lans[e].PrefixLength=a},c=e=>{r.ruleForm.Lans.splice(e,1),0==r.ruleForm.Lans.length&&h(0)},h=e=>{r.ruleForm.Lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=r.ruleForm.Lans.map((e=>(e.PrefixLength=+e.PrefixLength,e))),(0,k._Q)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handleMaskChange:s,handleDel:c,handleAdd:h,handleSave:m}}};const Ga=(0,F.A)(Oa,[["render",Qa],["__scopeId","data-v-022e3781"]]);var $a=Ga;const qa={key:0},ja=["title","onClick"],Ya=["onClick"];function Ha(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"tunnel",label:"隧道",width:"76"},{default:(0,t.k6)((e=>[n.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",qa,[(0,t.Lk)("a",{href:"javascript:;",class:(0,B.C4)(["a-line",{yellow:n.tunnel.list[e.row.MachineId].NeedReboot}]),title:n.tunnel.list[e.row.MachineId].NeedReboot?"需要重启":"调整网关层级有助于打洞成功",onClick:a=>n.handleTunnel(n.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"网关:"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,ja)])):(0,t.Q3)("",!0),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"与此设备的隧道连接",class:(0,B.C4)(["a-line",{green:n.connectionCount(e.row.MachineId)>0}]),onClick:a=>n.handleConnections(e.row)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.connectionCount(e.row.MachineId)>0})},[(0,t.eW)("连接:"),(0,t.Lk)("span",null,(0,B.v_)(n.connectionCount(e.row.MachineId)),1)],2)],10,Ya)])])),_:1})}var Ja=l(83);const Za=Symbol(),el=()=>{(0,d.B)();const e=(0,i.KR)({timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(Za,e);const a=()=>{(0,Ja.r7)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1060)})).catch((()=>{e.value.timer=setTimeout(a,1060)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,Ja.gM)()},o=()=>{clearTimeout(e.value.timer)},r=a=>Object.values(e.value.list).sort(((e,a)=>e.RouteLevel+e.RouteLevelPlus-a.RouteLevel+a.RouteLevelPlus)).map((e=>e.MachineId));return{tunnel:e,_getTunnelInfo:a,handleTunnelEdit:l,handleTunnelRefresh:n,clearTunnelTimeout:o,sortTunnel:r}},al=()=>(0,t.WQ)(Za);var ll={emits:["edit","refresh"],setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.config.Client.Id)),o=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeOther"))),s=al(),i=((0,Ta.ZY)(),(0,Ta.mx)()),u=(0,Ta.FG)(),c=(0,Ta.bB)(),h=e=>{const a=[i.value.list[e],u.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return a},m=(e,l)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=l,a("edit",e)},p=()=>{a("refresh")},w=e=>{a("connections",e)};return{tunnel:s,handleTunnel:m,handleTunnelRefresh:p,connectionCount:h,handleConnections:w}}};const tl=(0,F.A)(ll,[["render",Ha],["__scopeId","data-v-49e16cac"]]);var nl=tl;const ol=e=>((0,t.Qi)("data-v-6ea047f9"),e=e(),(0,t.jt)(),e),rl=ol((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),sl=ol((()=>(0,t.Lk)("div",null,"光猫映射了端口后,可以直接连接,把TcpPortMap调到第一",-1))),dl={class:"t-c w-100"};function il(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-col"),u=(0,t.g2)("el-input-number"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]网关`,width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[rl])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{readonly:"",modelValue:n.state.ruleForm.RouteLevel,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.RouteLevel=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"调整层级",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[sl])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapWan,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapLan,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",dl,[(0,t.bF)(h,{onClick:a[4]||(a[4]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var ul={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=al(),n=(0,i.KR)(null),o=(0,i.Kh)({show:!0,machineName:l.value.current.device.MachineName,ruleForm:{RouteLevel:l.value.current.RouteLevel,RouteLevelPlus:l.value.current.RouteLevelPlus,PortMapWan:l.value.current.PortMapWan,PortMapLan:l.value.current.PortMapLan},rules:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(l.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,Ja.KW)(e).then((()=>{o.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:o,ruleFormRef:n,handleSave:r}}};const cl=(0,F.A)(ul,[["render",il],["__scopeId","data-v-6ea047f9"]]);var hl=cl;const ml={key:0,class:"point p2p",title:"打洞直连"},pl={key:1,class:"point relay",title:"中继连接"},wl={key:2,class:"point node",title:"节点连接"},kl={key:1,class:"point",title:"未连接"},gl=["onClick"],fl=["onClick"],vl={key:0,class:"point p2p",title:"打洞直连"},bl={key:1,class:"point relay",title:"中继连接"},Cl={key:2,class:"point node",title:"节点连接"},Fl={key:1,class:"point",title:"未连接"},Ll=["onClick"],El=["onClick"];function _l(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"forward",label:"转发/穿透"},{default:(0,t.k6)((a=>[a.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[a.row.isSelf&&(n.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",ml)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",pl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",wl)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",kl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,gl)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,fl)])],64)):n.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",vl)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",bl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Cl)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Fl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,Ll)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,El)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1})}var yl=l(743);const Il=Symbol(),Vl=()=>{const e=(0,d.B)(),a=((0,t.EW)((()=>e.value.config.Client.Id)),(0,i.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(Il,a);const l=()=>{(0,yl.a9)()},n=()=>{(0,yl.gz)(a.value.hashcode.toString()).then((e=>{a.value.hashcode=e.HashCode,e.List&&(a.value.list=e.List),a.value.timer=setTimeout(n,1020)})).catch((()=>{a.value.timer=setTimeout(n,1020)}))},o=e=>{a.value.machineid=e[0],a.value.machineName=e[1],a.value.showEdit=!0},r=()=>{clearTimeout(a.value.timer),clearTimeout(a.value.testTimer)};return{sforward:a,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:l}},Pl=()=>(0,t.WQ)(Il);var Sl={emits:["edit","sedit"],setup(e,{emit:a}){const l=w(),n=Pl(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,Ta.mx)(),m=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("edit",[e,l])},p=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("sedit",[e,l])},k=()=>{a("refresh")};return{forward:l,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:i,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:k}}};const Tl=(0,F.A)(Sl,[["render",_l],["__scopeId","data-v-26b3f87e"]]);var Ml=Tl;const Rl={class:"t-c head"},Wl=["title"],Xl={class:"t-c"},Al={class:"page-wrap"},Bl=["title"];function Nl(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-option"),c=(0,t.g2)("el-select"),h=(0,t.g2)("WarnTriangleFilled"),m=(0,t.g2)("el-icon"),p=(0,t.g2)("el-pagination"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("Delete"),g=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),v=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(v,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Rl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":a=>e.row.BufferSize=a,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.bufferSize,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e,value:a},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(n.state.bufferSize[e.row.BufferSize]),1)],64))])),_:1}),(0,t.bF)(i,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":a=>e.row.BindIPAddress=a,size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(u,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.BindIPAddress),1)],64))])),_:1}),(0,t.bF)(i,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":a=>e.row.Port=a,onBlur:a=>n.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Port),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Wl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Port),3))],64))])),_:1}),(0,t.bF)(i,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":a=>e.row.MachineId=a,onChange:a=>n.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:n.state.loading,"remote-method":n.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",Xl,[(0,t.Lk)("div",Al,[(0,t.bF)(p,{small:"",background:"",layout:"prev, pager, next","page-size":n.state.machineIds.Request.Size,total:n.state.machineIds.Count,"pager-count":5,"current-page":n.state.machineIds.Request.Page,onCurrentChange:n.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.machineIds.List,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.MachineName),1)],64))])),_:1}),(0,t.bF)(i,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":a=>e.row.TargetEP=a,onBlur:a=>n.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.TargetEP),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Bl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.TargetEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(g,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var xl={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=w(),o=(0,i.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:l.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{(0,h.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},s=()=>{(0,h.Oy)(o.machineId).then((e=>{o.data=e})).catch((()=>{}))},c=e=>{o.machineIds.Request.Name=e,m()},m=()=>{o.loading=!0,(0,P.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},p=e=>{o.machineIds.Request.Page=e,m()},k=()=>{s(),m()},g=(e,a)=>{b(e,a.property)},f=()=>{s(),u.nk.success("已刷新")},v=()=>{E({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},b=(e,a)=>{e.Started?u.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${a}Editing`]=!0)},C=(e,a)=>{if(e.Started)return void u.nk.error("请先停止");e[`${a}Editing`]=!1;const l=o.machineIds.List.find((a=>a.MachineId==e.MachineId));l&&(e.MachineName=l.MachineName),E(e)},F=e=>{(0,h.we)({machineId:o.machineId,Id:e}).then((()=>{s()}))},L=e=>{E(e)},E=e=>{e.Port=parseInt(e.Port),(0,h.nH)({machineId:o.machineId,data:e}).then((()=>{s()})).catch((e=>{u.nk.error(e)}))};return(0,t.sV)((()=>{s(),r()})),{state:o,handleOnShowList:k,handleCellClick:g,handleRefresh:f,handleAdd:v,handleEdit:b,handleEditBlur:C,handleDel:F,handleStartChange:L,handleSearch:c,handlePageChange:p}}};const zl=(0,F.A)(xl,[["render",Nl],["__scopeId","data-v-15b05a01"]]);var Ul=zl;const Dl={class:"t-c head"},Kl=["title"],Ql=["title"];function Ol(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("WarnTriangleFilled"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("Delete"),p=(0,t.g2)("el-popconfirm"),w=(0,t.g2)("el-table"),k=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(k,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.machineName}】的内网穿透`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Dl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(w,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"100"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(1<[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":a=>e.row.Temp=a,onBlur:a=>n.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Temp),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Kl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Temp),3))],64))])),_:1}),(0,t.bF)(i,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":a=>e.row.LocalEP=a,onBlur:a=>n.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.LocalEP),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ql)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.LocalEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"是","inactive-text":"否"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Gl={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=Pl(),o=(0,i.Kh)({bufferSize:l.value.bufferSize,show:!0,data:[],timerTestLocal:0});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{console.log(n.value.machineid),(0,yl.eX)(n.value.machineid).then((e=>{o.timerTestLocal=setTimeout(r,1e3)})).catch((()=>{o.timerTestLocal=setTimeout(r,1e3)}))},s=()=>{(0,yl.pY)(n.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),o.data=e})).catch((()=>{}))},c=()=>{s()},h=(e,a)=>{w(e,a.property)},m=()=>{s(),u.nk.success("已刷新")},p=()=>{const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,yl.Qs)({machineid:n.value.machineid,data:e}).then((()=>{setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)}))},w=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${a}Editing`]=!0)},k=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(e[`${a}Editing`]=!1,v(e))},g=e=>{(0,yl.DY)({machineid:n.value.machineid,id:e}).then((()=>{s()}))},f=e=>{v(e)},v=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,(0,yl.Qs)({machineid:n.value.machineid,data:e}).then((e=>{0==e&&u.nk.error("操作失败,可能存在相同值"),setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)})))};return(0,t.sV)((()=>{s(),r()})),(0,t.hi)((()=>{clearTimeout(o.timerTestLocal)})),{state:o,machineName:n.value.machineName,handleOnShowList:c,handleCellClick:h,handleRefresh:m,handleAdd:p,handleEdit:w,handleEditBlur:k,handleDel:g,handleStartChange:f}}};const $l=(0,F.A)(Gl,[["render",Ol],["__scopeId","data-v-7eb8e7cc"]]);var ql=$l;const jl=["onClick"],Yl={key:0},Hl={key:1},Jl={key:0},Zl={key:1},et={key:0},at={key:1};function lt(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("el-popconfirm"),h=(0,t.g2)("el-table"),m=(0,t.g2)("el-dialog"),p=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`与[${n.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,B.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,B.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,B.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(s,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(n.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(s,{property:"TransportName",label:"协议"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,B.v_)(e.row.TransportName)+"("+(0,B.v_)(n.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,B.v_)(n.state.types[e.row.Type])+" - "+(0,B.v_)(1<[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,B.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,B.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(s,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a=>n.handleNode(e.row)},(0,B.v_)(n.state.nodesDic[e.row.NodeId]||"选择节点"),9,jl)])])),_:1}),(0,t.bF)(s,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[n.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(c,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:a=>n.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(u,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(m,{modelValue:n.state.showNodes,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.showNodes=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"Name",label:"名称"}),(0,t.bF)(s,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",Yl,"无限制")):((0,t.uX)(),(0,t.CE)("span",Hl,(0,B.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,B.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",Jl,"无限制")):((0,t.uX)(),(0,t.CE)("span",Zl,(0,B.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",et,"无限制")):((0,t.uX)(),(0,t.CE)("span",at,(0,B.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"Delay",label:"延迟",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Public",label:"公开",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":a=>e.row.Public=a,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(s,{property:"Oper",label:"操作",width:"65"},{default:(0,t.k6)((e=>[(0,t.bF)(u,{type:"success",size:"small",onClick:a=>n.handleConnect(e.row.Id)},{default:(0,t.k6)((()=>[(0,t.eW)("使用")])),_:2},1032,["onClick"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var tt=l(9232),nt={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("TunnelRemove"))),o=(0,Ta.ZY)(),r=(0,Ta.mx)(),s=(0,Ta.FG)(),c=(0,Ta.bB)(),h=(0,i.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:o.value.currentName,currentRow:{},data:(0,t.EW)((()=>[r.value.list[o.value.current],s.value.list[o.value.current],c.value.list[o.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e),a("change")}),300)}));const m=e=>{n.value&&e.removeFunc(e.RemoteMachineId).then((()=>{u.nk.success("删除成功")})).catch((()=>{}))},p=()=>{(0,tt.W4)().then((e=>{h.nodes=e,h.nodesDic=e.reduce(((e,a)=>(e[a.Id]=a.Name,e)),{}),h.timer=setTimeout(p,1e3)})).catch((()=>{h.timer=setTimeout(p,1e3)}))},w=e=>{h.currentRow=e,h.showNodes=!0},k=e=>{const a={FromMachineId:l.value.config.Client.Id,TransactionId:h.currentRow.TransactionId,ToMachineId:h.currentRow.RemoteMachineId,NodeId:e};a.NodeId!=h.currentRow.NodeId&&((0,tt.uQ)(a).then((()=>{})).catch((()=>{})),h.showNodes=!1)};return(0,t.sV)((()=>{o.value.updateRealTime(!0),p()})),(0,t.hi)((()=>{o.value.updateRealTime(!1),clearTimeout(h.timer)})),{state:h,handleDel:m,hasTunnelRemove:n,handleNode:w,handleConnect:k}}};const ot=(0,F.A)(nt,[["render",lt],["__scopeId","data-v-7891b902"]]);var rt=ot,st=l(9383),dt={components:{Sort:E,Oper:A,Device:J,DeviceEdit:ne,AccessEdit:ce,Tunnel:nl,TunnelEdit:hl,ConnectionsEdit:rt,Tuntap:ge,TuntapEdit:qe,TuntapLease:wa,Socks5:Ba,Socks5Edit:$a,Forward:Ml,ForwardEdit:Ul,SForwardEdit:ql},setup(e){const a=(0,d.B)(),l=(0,i.Kh)({height:(0,t.EW)((()=>a.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:w,handleDel:k,clearDevicesTimeout:g,setSort:v}=(0,oe.r)(),{tuntap:C,_getTuntapInfo:F,handleTuntapEdit:L,handleTuntapRefresh:E,clearTuntapTimeout:_,getTuntapMachines:y,sortTuntapIP:I}=(0,b.O)(),{socks5:V,_getSocks5Info:P,handleSocks5Edit:S,handleSocks5Refresh:T,clearSocks5Timeout:M,getSocks5Machines:W,sortSocks5:X}=f(),{tunnel:A,_getTunnelInfo:B,handleTunnelEdit:N,handleTunnelRefresh:x,clearTunnelTimeout:z,sortTunnel:U}=el(),{forward:D,_getForwardCountInfo:K,handleForwardEdit:Q,clearForwardTimeout:O,handleForwardRefresh:G}=p(),{sforward:$,_getSForwardCountInfo:q,handleSForwardEdit:j,clearSForwardTimeout:Y,handleSForwardRefresh:H}=Vl(),{connections:J,forwardConnections:Z,_getForwardConnections:ee,tuntapConnections:ae,_getTuntapConnections:le,socks5Connections:te,_getSocks5Connections:ne,handleTunnelConnections:re,clearConnectionsTimeout:se}=(0,Ta.L2)(),{_getUpdater:de,_subscribeUpdater:ie,clearUpdaterTimeout:ue}=(0,st.d)(),{_getAccessInfo:ce,clearAccessTimeout:he,handleAccesssRefresh:me}=(0,R.Y)(),pe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let a=new Promise(((e,a)=>{e()}));if("tunnel"==e.prop){const e=U(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("tuntap"==e.prop){const e=I(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("socks5"==e.prop){const e=X(n.page.Request.Asc);e.length>0&&(a=v(e))}a.then((()=>{m()})).catch((()=>{}))},we=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=y(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,a)=>(-1==e.indexOf(a)&&e.push(a),e)),[]):n.page.Request.Ids=[],m(),x(),E(),T(),G(),H(),me(),u.nk.success({message:"刷新成功",grouping:!0})},ke=()=>{m(),x(),E(),T(),me(),u.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),x(),E(),T(),G(),H(),me(),r(),s(),F(),P(),B(),ee(),le(),ne(),K(),q(),de(),ie(),ce()})),(0,t.hi)((()=>{g(),se(),_(),M(),z(),O(),Y(),ue(),he()})),{state:l,devices:n,machineId:o,handleSortChange:pe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:we,handlePageSearch:ke,handlePageChange:m,handlePageSizeChange:w,handleDel:k,tuntap:C,handleTuntapEdit:L,handleTuntapRefresh:E,socks5:V,handleSocks5Edit:S,handleSocks5Refresh:T,tunnel:A,connections:J,handleTunnelEdit:N,handleTunnelRefresh:x,handleTunnelConnections:re,forward:D,handleForwardEdit:Q,sforward:$,handleSForwardEdit:j}}};const it=(0,F.A)(dt,[["render",s],["__scopeId","data-v-3d1c480c"]]);var ut=it}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/509.b1ccc755.js b/linker.tray.win/web/js/509.b1ccc755.js new file mode 100644 index 00000000..bc3b60cd --- /dev/null +++ b/linker.tray.win/web/js/509.b1ccc755.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[509],{9232:function(e,a,l){l.d(a,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var t=l(4);const n=e=>(0,t.zG)("relay/SetServers",e),o=()=>(0,t.zG)("relay/Subscribe"),r=e=>(0,t.zG)("relay/Connect",e)},743:function(e,a,l){l.d(a,{Ap:function(){return n},Co:function(){return o},DY:function(){return i},Qs:function(){return u},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var t=l(4);const n=()=>(0,t.zG)("sforwardclient/GetSecretKey"),o=e=>(0,t.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,t.zG)("sforwardclient/get",e),s=()=>(0,t.zG)("sforwardclient/refresh"),d=(e="0")=>(0,t.zG)("sforwardclient/getcount",e),i=e=>(0,t.zG)("sforwardclient/remove",e),u=e=>(0,t.zG)("sforwardclient/add",e),c=e=>(0,t.zG)("sforwardclient/TestLocal",e)},83:function(e,a,l){l.d(a,{$M:function(){return s},KW:function(){return r},gM:function(){return o},r7:function(){return n}});var t=l(4);const n=(e="0")=>(0,t.zG)("tunnel/get",e),o=()=>(0,t.zG)("tunnel/refresh"),r=e=>(0,t.zG)("tunnel/SetRouteLevel",e),s=e=>(0,t.zG)("tunnel/SetTransports",e)},2712:function(e,a,l){l.r(a),l.d(a,{default:function(){return kt}});var t=l(6768);const n={class:"home-list-wrap absolute"},o={class:"page t-c"},r={class:"page-wrap"};function s(e,a,l,s,d,i){const u=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),w=(0,t.g2)("Forward"),k=(0,t.g2)("Oper"),g=(0,t.g2)("el-table"),f=(0,t.g2)("el-pagination"),v=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),C=(0,t.g2)("TunnelEdit"),F=(0,t.g2)("ConnectionsEdit"),E=(0,t.g2)("TuntapEdit"),L=(0,t.g2)("Socks5Edit"),_=(0,t.g2)("TuntapLease"),y=(0,t.g2)("ForwardEdit"),I=(0,t.g2)("SForwardEdit");return(0,t.uX)(),(0,t.CE)("div",n,[(0,t.bF)(u,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(g,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),s.tuntap.show?((0,t.uX)(),(0,t.Wv)(m,{key:0,onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.socks5.show?((0,t.uX)(),(0,t.Wv)(p,{key:1,onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.forward.show?((0,t.uX)(),(0,t.Wv)(w,{key:2,onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"])):(0,t.Q3)("",!0),(0,t.bF)(k,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",o,[(0,t.Lk)("div",r,[(0,t.bF)(f,{small:"",background:"",layout:"total,sizes,prev,pager, next",total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])]),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(v,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":a[0]||(a[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":a[1]||(a[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":a[2]||(a[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":a[3]||(a[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(E,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":a[4]||(a[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(L,{key:5,modelValue:s.socks5.showEdit,"onUpdate:modelValue":a[5]||(a[5]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showLease,"onUpdate:modelValue":a[6]||(a[6]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(y,{key:7,modelValue:s.forward.showEdit,"onUpdate:modelValue":a[7]||(a[7]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(I,{key:8,modelValue:s.sforward.showEdit,"onUpdate:modelValue":a[8]||(a[8]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}l(4114);var d=l(3830),i=l(144),u=l(1219);function c(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(i,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网关",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.tuntap.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.socks5.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.forward.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["onSortChange"])}var h=l(7716);const m=Symbol(),p=()=>{(0,d.B)();const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(m,e);const a=()=>{(0,h.dS)()},l=()=>{(0,h.V1)(e.value.hashcode.toString()).then((a=>{e.value.hashcode=a.HashCode,a.List&&(e.value.list=a.List),e.value.timer=setTimeout(l,1020)})).catch((()=>{e.value.timer=setTimeout(l,1020)}))},n=a=>{e.value.machineId=a[0],e.value.machineName=a[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:l,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:a}},w=()=>(0,t.WQ)(m);var k=l(2173);const g=Symbol(),f=()=>{const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(g,e);const a=()=>{clearTimeout(e.value.timer),(0,k.$y)(e.value.hashcode.toString()).then((l=>{if(e.value.hashcode=l.HashCode,l.List){for(let e in l.List)Object.assign(l.List[e],{running:2==l.List[e].Status,loading:1==l.List[e].Status});e.value.list=l.List}e.value.timer=setTimeout(a,1100)})).catch((l=>{e.value.timer=setTimeout(a,1100)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,k.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=a=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(a)>=0||e.Lans.filter((e=>e.IP.indexOf(a)>=0)).length>0)).map((e=>e.MachineId)),s=a=>{const l=Object.values(e.value.list).sort(((e,a)=>e.Port-a.Port));return l.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:a,handleSocks5Edit:l,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},v=()=>(0,t.WQ)(g);var b=l(8104),C={emits:["sort"],setup(e,{emit:a}){const l=(0,b.W)();l.value.show="false"!=localStorage.getItem("tuntap.show");const t=v();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{a("sort",e)},r=()=>{localStorage.setItem("tuntap.show",l.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:l,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},F=l(1241);const E=(0,F.A)(C,[["render",c],["__scopeId","data-v-4b2df38c"]]);var L=E;const _=e=>((0,t.Qi)("data-v-6638f97d"),e=e(),(0,t.jt)(),e),y={class:"dropdown"},I=_((()=>(0,t.Lk)("span",null,"操作",-1)));function P(e,a,l,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("SwitchButton"),u=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),w=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(w,{label:"操作",fixed:"right"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[e.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(u,{key:0,onClick:a=>n.handleExit(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),e.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(u,{key:1,onClick:a=>n.handleDel(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(e.row,n.accessList[e.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(u,{key:2,onClick:a=>n.handleAccess(e.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",y,[I,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var V=l(9299),S=l(920),T=l(7477),M=l(2933),R=l(5962),W={emits:["refresh","access"],components:{Delete:T.epd,SwitchButton:T.L$q,ArrowDown:T.yd$,Flag:T.lNU},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,R.q)(),o=(0,t.EW)((()=>l.value.config.Client.Access)),r=(0,t.EW)((()=>l.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),i=(0,t.EW)((()=>l.value.hasAccess("Reboot"))),u=(0,t.EW)((()=>l.value.hasAccess("Remove"))),c=(e,l)=>{M.s.confirm(`确认删除[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,V.Se)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},h=(e,l)=>{M.s.confirm(`确认关闭[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,S.NS)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},m=(e,a)=>e.showAccess&&r.value&&a>=0&&0==+(~BigInt(o.value)&BigInt(a)).toString(),p=e=>{a("access",e)};return{accessList:s,handleDel:c,handleExit:h,hasReboot:i,hasRemove:u,hasAccess:r,handleShowAccess:m,handleAccess:p}}};const X=(0,F.A)(W,[["render",P],["__scopeId","data-v-6638f97d"]]);var A=X,B=l(4232);const N=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),x={class:"flex"},z=N((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),U={class:"flex"},D=["onClick"],K=["onClick"],Q=N((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),O=[Q],G=N((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function $(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("Search"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("DeviceName"),h=(0,t.g2)("UpdaterBtn"),m=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(m,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",x,[z,(0,t.Lk)("span",null,[(0,t.bF)(s,{size:"small",modelValue:n.name,"onUpdate:modelValue":a[0]||(a[0]=e=>n.name=e),clearable:"",onInput:n.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(u,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(c,{onEdit:n.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",U,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,B.v_)(e.row.IP),1)],8,D)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},O,8,K)),G,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(h,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var q=l(167),j=l(3347),Y={emits:["edit","refresh"],components:{Search:T.vji,UpdaterBtn:q.A,DeviceName:j.A},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("ExternalShow"))),o=(0,i.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{a("edit",e)},u=()=>{sessionStorage.setItem("search-name",o.value),a("refresh",o.value)};return{handleEdit:s,handleRefresh:u,name:o,handleExternal:r}}};const H=(0,F.A)(Y,[["render",$],["__scopeId","data-v-5db71b03"]]);var J=H;const Z=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ee={class:"t-c w-100"};function ae(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"300"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[Z])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"12","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ee,[(0,t.bF)(i,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var le={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=(0,i.KR)(null),n=(0,i.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,V.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:n,ruleFormRef:l,handleSave:o}}};const te=(0,F.A)(le,[["render",ae]]);var ne=te,oe=l(7985);function re(e,a,l,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{modelValue:n.state.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:a[0]||(a[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var se=l(3363),de=l(9593),ie={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:de.A},setup(e,{emit:a}){const l=(0,i.Kh)({show:!0,loading:!1});(0,t.wB)((()=>l.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const n=(0,i.KR)(null),o=()=>{l.loading=!0,(0,se.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{l.loading=!1,l.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),l.loading=!1,u.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:l,accessDom:n,handleSave:o}}};const ue=(0,F.A)(ie,[["render",re]]);var ce=ue;const he={key:0};function me(e,a,l,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:"虚拟网卡",width:"160"},{header:(0,t.k6)((()=>[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")])),default:(0,t.k6)((e=>[n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",he,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}var pe=l(9636),we={emits:["edit","refresh"],components:{TuntapShow:pe.A},setup(e,{emit:a}){const l=(0,b.W)(),t=e=>{a("edit",e)},n=()=>{a("refresh")},o=()=>{l.value.showLease=!0};return{tuntap:l,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const ke=(0,F.A)(we,[["render",me]]);var ge=ke;const fe=e=>((0,t.Qi)("data-v-34275839"),e=e(),(0,t.jt)(),e),ve=fe((()=>(0,t.Lk)("span",null,"/",-1))),be=fe((()=>(0,t.Lk)("span",{style:{width:"2rem"}},null,-1))),Ce={key:0,class:"upgrade-wrap"},Fe={class:"w-100 t-c"};function Ee(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("TuntapLan"),c=(0,t.g2)("TuntapForward"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[7]||(a[7]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.eW)("赐予此设备IP,其它设备可通过此IP访问")])),_:1}),(0,t.bF)(s,{label:"虚拟网卡IP",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),ve,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),be,(0,t.bF)(i,{modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":a[4]||(a[4]=e=>n.state.ruleForm.Multicast=e),label:"禁用UDP广播",size:"large"},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{prop:"upgrade",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.Upgrade,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.ruleForm.Upgrade=e),label:"我很懂,我要使用高级功能(点对网和网对网)",size:"large"},null,8,["modelValue"])])),_:1}),n.state.ruleForm.Upgrade?((0,t.uX)(),(0,t.CE)("div",Ce,[(0,t.bF)(s,{label:"局域网IP",prop:"LanIP",class:"m-b-0",style:{"border-bottom":"1px solid #ddd"}},{default:(0,t.k6)((()=>[(0,t.bF)(u,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(s,{label:"端口转发",prop:"forwards"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{ref:"forwardDom"},null,512)])),_:1})])):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Fe,[(0,t.bF)(h,{onClick:a[6]||(a[6]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Le=l(5241);const _e=e=>((0,t.Qi)("data-v-786fe646"),e=e(),(0,t.jt)(),e),ye={class:"w-100"},Ie=_e((()=>(0,t.Lk)("span",{class:"yellow"},"此设备无法使用NAT转发,或只想使用端口转发",-1))),Pe={key:0,class:"green"},Ve={class:"wrap"},Se=["title"],Te={key:1},Me=["title"],Re={key:1},We=["title"],Xe={key:1},Ae={key:1,class:"remark"};function Be(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-table-column"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("el-popconfirm"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",ye,[(0,t.Lk)("div",null,[Ie,n.state.testing?((0,t.uX)(),(0,t.CE)("span",Pe,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Ve,[(0,t.bF)(p,{stripe:"",data:n.state.forwards,border:"",size:"small",width:"100%",height:"300px",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":a=>e.row.ListenPort=a,onBlur:a=>n.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ListenPort),9,Se)):((0,t.uX)(),(0,t.CE)("span",Te,(0,B.v_)(e.row.ListenPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":a=>e.row.ConnectAddr=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectAddr),9,Me)):((0,t.uX)(),(0,t.CE)("span",Re,(0,B.v_)(e.row.ConnectAddr),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":a=>e.row.ConnectPort=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectPort),9,We)):((0,t.uX)(),(0,t.CE)("span",Xe,(0,B.v_)(e.row.ConnectPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":a=>e.row.Remark=a,onBlur:a=>n.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",Ae,(0,B.v_)(e.row.Remark),1))])),_:1}),(0,t.bF)(d,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(c,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(c,{type:"primary",size:"small",onClick:a=>n.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Ne={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({machineName:a.value.current.device.MachineName,forwards:0==a.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:a.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,a)=>{o(e,a.property)},o=(e,a)=>{l.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${a}Editing`]=!0,e["__editing"]=!0},r=(e,a)=>{e[`${a}Editing`]=!1,e["__editing"]=!1},s=e=>{1==l.forwards.length?l.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:l.forwards.splice(e,1)},d=e=>{l.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||l.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},u=()=>{clearTimeout(l.timer),l.testing=!0,(0,Le._)({MachineId:a.value.current.MachineId,List:l.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var a=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=l.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let a=0;a{l.testing=!1,l.timer=setTimeout(u,3e3)}))};(0,t.sV)((()=>{u()})),(0,t.hi)((()=>{clearTimeout(l.timer)}));const c=()=>l.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:l,handleCellClick:n,handleEditBlur:r,handleDel:s,handleAdd:d,getData:c}}};const xe=(0,F.A)(Ne,[["render",Be],["__scopeId","data-v-786fe646"]]);var ze=xe;const Ue=e=>((0,t.Qi)("data-v-4abaaeaf"),e=e(),(0,t.jt)(),e),De={class:"w-100"},Ke=Ue((()=>(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"填写局域网IP,使用NAT转发")],-1))),Qe={class:"wrap"},Oe=Ue((()=>(0,t.Lk)("span",null,"/",-1))),Ge={class:"pdl-10"},$e={class:"pdl-10"};function qe(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("Plus");return(0,t.uX)(),(0,t.CE)("div",De,[Ke,(0,t.Lk)("div",Qe,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",null,[(0,t.bF)(s,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),Oe,(0,t.bF)(s,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ge,[(0,t.bF)(d,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",style:{"vertical-align":"middle"}},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",$e,[(0,t.bF)(c,{type:"danger",onClick:e=>n.handleDel(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(c,{type:"primary",onClick:e=>n.handleAdd(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})])),_:2},1032,["onClick"])])])))),128))])])}var je={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({lans:a.value.current.Lans.slice(0)});0==l.lans.length&&l.lans.push({IP:"0.0.0.0",PrefixLength:24});const t=e=>{var a=+l.lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),l.lans[e].PrefixLength=a},n=e=>{l.lans.splice(e,1),0==l.lans.length&&o(0)},o=e=>{l.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},r=()=>l.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:l,handleMaskChange:t,handleDel:n,handleAdd:o,getData:r}}};const Ye=(0,F.A)(je,[["render",qe],["__scopeId","data-v-4abaaeaf"]]);var He=Ye,Je={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42,TuntapForward:ze,TuntapLan:He},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,b.W)(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{IP:n.value.current.IP,PrefixLength:n.value.current.PrefixLength||24,Gateway:n.value.current.Gateway,ShowDelay:n.value.current.ShowDelay,AutoConnect:n.value.current.AutoConnect,Upgrade:n.value.current.Upgrade,Multicast:n.value.current.Multicast,Forwards:n.value.current.Forwards},rules:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e},c=(0,i.KR)(null),h=(0,i.KR)(null),m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.IP=r.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.Lans=c.value?c.value.getData():n.value.current.Lans,e.PrefixLength=+r.ruleForm.PrefixLength,e.Gateway=r.ruleForm.Gateway,e.ShowDelay=r.ruleForm.ShowDelay,e.AutoConnect=r.ruleForm.AutoConnect,e.Upgrade=r.ruleForm.Upgrade,e.Multicast=r.ruleForm.Multicast,e.Forwards=h.value?h.value.getData():n.value.current.Forwards,(0,Le.ac)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handlePrefixLengthChange:s,handleSave:m,lanDom:c,forwardDom:h}}};const Ze=(0,F.A)(Je,[["render",Ee],["__scopeId","data-v-34275839"]]);var ea=Ze;const aa=e=>((0,t.Qi)("data-v-4a28804a"),e=e(),(0,t.jt)(),e),la=aa((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),ta=aa((()=>(0,t.Lk)("span",null,"/",-1))),na=aa((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),oa={class:"calc"},ra=aa((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),sa={class:"value"},da=aa((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),ia={class:"value"},ua=aa((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),ca={class:"value"},ha=aa((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),ma={class:"value"},pa=aa((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),wa={class:"value"},ka=aa((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),ga={class:"value"};function fa(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway"},{default:(0,t.k6)((()=>[la])),_:1}),(0,t.bF)(s,{label:"网络和掩码",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"},onChange:n.handlePrefixLengthChange},null,8,["modelValue","onChange"]),ta,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),na,(0,t.bF)(i,{onClick:n.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("清除")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(s,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",oa,[(0,t.Lk)("p",null,[ra,(0,t.Lk)("span",sa,(0,B.v_)(n.state.values.Network),1)]),(0,t.Lk)("p",null,[da,(0,t.Lk)("span",ia,(0,B.v_)(n.state.values.Gateway),1)]),(0,t.Lk)("p",null,[ua,(0,t.Lk)("span",ca,(0,B.v_)(n.state.values.Start),1)]),(0,t.Lk)("p",null,[ha,(0,t.Lk)("span",ma,(0,B.v_)(n.state.values.End),1)]),(0,t.Lk)("p",null,[pa,(0,t.Lk)("span",wa,(0,B.v_)(n.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[ka,(0,t.Lk)("span",ga,(0,B.v_)(n.state.values.Count),1)])])])),_:1}),n.hasLease?((0,t.uX)(),(0,t.Wv)(s,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{onClick:a[2]||(a[2]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var va={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("Lease"))),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,ruleForm:{IP:"0.0.0.0",PrefixLength:24},rules:{},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{(0,Le.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,Le.Nj)().then((e=>{r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,Le.AE)(r.ruleForm).then((()=>{u.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),u.nk.error("操作失败")}))},p=()=>{(0,Le.AE)({IP:"0.0.0.0",PrefixLength:24}).then((()=>{u.nk.success("已操作"),c()})).catch((e=>{console.log(e),u.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const ba=(0,F.A)(va,[["render",fa],["__scopeId","data-v-4a28804a"]]);var Ca=ba;const Fa={key:0};function Ea(e,a,l,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:"代理转发",width:"160"},{default:(0,t.k6)((e=>[n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",Fa,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}const La={class:"flex"},_a={class:"flex-1"},ya={key:0,class:"point p2p",title:"打洞直连"},Ia={key:1,class:"point relay",title:"中继连接"},Pa={key:2,class:"point node",title:"节点连接"},Va={key:1,class:"point",title:"未连接"},Sa=["title"],Ta={key:0,class:"green gateway"},Ma={key:1},Ra={key:0},Wa={key:0,class:"flex yellow",title:"已禁用"},Xa={key:1,class:"flex red",title:"与其它设备填写IP、或本机局域网IP有冲突"};function Aa(e,a,l,n,o,r){const s=(0,t.g2)("Loading"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",La,[(0,t.Lk)("div",_a,[n.connections.list[n.item.MachineId]&&n.connections.list[n.item.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",ya)):1==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Ia)):2==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Pa)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Va)),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=e=>n.handleSocks5Port(n.socks5.list[n.item.MachineId])),title:"此设备的socks5代理"},[n.socks5.list[n.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:n.socks5.list[n.item.MachineId].SetupError}," socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),9,Sa)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[n.socks5.list[n.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",Ta,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",Ma,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1))],64))])]),n.socks5.list[n.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",Ra,[(0,t.bF)(d,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])):((0,t.uX)(),(0,t.Wv)(i,{key:1,modelValue:n.socks5.list[n.item.MachineId].running,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.list[n.item.MachineId].running=e),loading:n.socks5.list[n.item.MachineId].loading,disabled:"",onClick:a[2]||(a[2]=e=>n.handleSocks5(n.socks5.list[n.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.socks5.list[n.item.MachineId].Lans,((e,a)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:a},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",Wa,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",Xa,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,B.C4)(["flex",{green:n.socks5.list[n.item.MachineId].running}]),title:"正常使用"},(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),3))],64)))),128))])])])}var Ba=l(9983),Na={props:["item","config"],emits:["edit","refresh"],components:{Loading:T.Rhj},setup(e,{emit:a}){const l=v(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),i=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,Ba.bB)(),m=a=>{if(!e.config)return;if(o.value===a.MachineId){if(!i.value)return}else if(!c.value)return;const l=a.running?(0,k.R2)(a.MachineId):(0,k.qH)(a.MachineId);a.loading=!0,l.then((()=>{u.nk.success("操作成功!")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))},p=l=>{if(e.config||o.value==l.MachineId){if(o.value===l.MachineId){if(!r.value)return}else if(!s.value)return;l.device=e.item,a("edit",l)}},w=()=>{a("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:l,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:w}}};const xa=(0,F.A)(Na,[["render",Aa],["__scopeId","data-v-c1ea089c"]]);var za=xa,Ua={emits:["edit","refresh"],components:{Socks5Show:za},setup(e,{emit:a}){const l=v(),t=e=>{a("edit",e)},n=()=>{a("refresh")};return{socks5:l,handleSocks5:t,handleSocks5Refresh:n}}};const Da=(0,F.A)(Ua,[["render",Ea]]);var Ka=Da;const Qa=e=>((0,t.Qi)("data-v-022e3781"),e=e(),(0,t.jt)(),e),Oa={class:"upgrade-wrap"},Ga={class:"flex-1"},$a=Qa((()=>(0,t.Lk)("span",null,"/",-1))),qa={class:"pdl-10"},ja={class:"pdl-10"};function Ya(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("Delete"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-button"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-form"),w=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(w,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"600"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",Oa,[(0,t.bF)(s,{label:"此设备局域网IP",prop:"LanIP",class:"lan-item"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ruleForm.Lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",Ga,[(0,t.bF)(d,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),$a,(0,t.bF)(d,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",qa,[(0,t.bF)(i,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",size:"large"},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",ja,[(0,t.bF)(h,{type:"danger",onClick:e=>n.handleDel(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(h,{type:"primary",onClick:e=>n.handleAdd(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])))),128))])),_:1})]),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Ha={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=v(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:n.value.current.Lans.slice(0)},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=e=>{var a=+r.ruleForm.Lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),r.ruleForm.Lans[e].PrefixLength=a},c=e=>{r.ruleForm.Lans.splice(e,1),0==r.ruleForm.Lans.length&&h(0)},h=e=>{r.ruleForm.Lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=r.ruleForm.Lans.map((e=>(e.PrefixLength=+e.PrefixLength,e))),(0,k._Q)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handleMaskChange:s,handleDel:c,handleAdd:h,handleSave:m}}};const Ja=(0,F.A)(Ha,[["render",Ya],["__scopeId","data-v-022e3781"]]);var Za=Ja;const el={key:0},al=["title","onClick"],ll=["onClick"];function tl(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"tunnel",label:"隧道",width:"76"},{default:(0,t.k6)((e=>[n.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",el,[(0,t.Lk)("a",{href:"javascript:;",class:(0,B.C4)(["a-line",{yellow:n.tunnel.list[e.row.MachineId].NeedReboot}]),title:n.tunnel.list[e.row.MachineId].NeedReboot?"需要重启":"调整网关层级有助于打洞成功",onClick:a=>n.handleTunnel(n.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"网关:"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,al)])):(0,t.Q3)("",!0),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"与此设备的隧道连接",class:(0,B.C4)(["a-line",{green:n.connectionCount(e.row.MachineId)>0}]),onClick:a=>n.handleConnections(e.row)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.connectionCount(e.row.MachineId)>0})},[(0,t.eW)("连接:"),(0,t.Lk)("span",null,(0,B.v_)(n.connectionCount(e.row.MachineId)),1)],2)],10,ll)])])),_:1})}var nl=l(83);const ol=Symbol(),rl=()=>{(0,d.B)();const e=(0,i.KR)({timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(ol,e);const a=()=>{(0,nl.r7)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1060)})).catch((()=>{e.value.timer=setTimeout(a,1060)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,nl.gM)()},o=()=>{clearTimeout(e.value.timer)},r=a=>Object.values(e.value.list).sort(((e,a)=>e.RouteLevel+e.RouteLevelPlus-a.RouteLevel+a.RouteLevelPlus)).map((e=>e.MachineId));return{tunnel:e,_getTunnelInfo:a,handleTunnelEdit:l,handleTunnelRefresh:n,clearTunnelTimeout:o,sortTunnel:r}},sl=()=>(0,t.WQ)(ol);var dl={emits:["edit","refresh"],setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.config.Client.Id)),o=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeOther"))),s=sl(),i=((0,Ba.ZY)(),(0,Ba.mx)()),u=(0,Ba.FG)(),c=(0,Ba.bB)(),h=e=>{const a=[i.value.list[e],u.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return a},m=(e,l)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=l,a("edit",e)},p=()=>{a("refresh")},w=e=>{a("connections",e)};return{tunnel:s,handleTunnel:m,handleTunnelRefresh:p,connectionCount:h,handleConnections:w}}};const il=(0,F.A)(dl,[["render",tl],["__scopeId","data-v-49e16cac"]]);var ul=il;const cl=e=>((0,t.Qi)("data-v-6ea047f9"),e=e(),(0,t.jt)(),e),hl=cl((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),ml=cl((()=>(0,t.Lk)("div",null,"光猫映射了端口后,可以直接连接,把TcpPortMap调到第一",-1))),pl={class:"t-c w-100"};function wl(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-col"),u=(0,t.g2)("el-input-number"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]网关`,width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[hl])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{readonly:"",modelValue:n.state.ruleForm.RouteLevel,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.RouteLevel=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"调整层级",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[ml])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapWan,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapLan,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",pl,[(0,t.bF)(h,{onClick:a[4]||(a[4]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var kl={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=sl(),n=(0,i.KR)(null),o=(0,i.Kh)({show:!0,machineName:l.value.current.device.MachineName,ruleForm:{RouteLevel:l.value.current.RouteLevel,RouteLevelPlus:l.value.current.RouteLevelPlus,PortMapWan:l.value.current.PortMapWan,PortMapLan:l.value.current.PortMapLan},rules:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(l.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,nl.KW)(e).then((()=>{o.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:o,ruleFormRef:n,handleSave:r}}};const gl=(0,F.A)(kl,[["render",wl],["__scopeId","data-v-6ea047f9"]]);var fl=gl;const vl={key:0,class:"point p2p",title:"打洞直连"},bl={key:1,class:"point relay",title:"中继连接"},Cl={key:2,class:"point node",title:"节点连接"},Fl={key:1,class:"point",title:"未连接"},El=["onClick"],Ll=["onClick"],_l={key:0,class:"point p2p",title:"打洞直连"},yl={key:1,class:"point relay",title:"中继连接"},Il={key:2,class:"point node",title:"节点连接"},Pl={key:1,class:"point",title:"未连接"},Vl=["onClick"],Sl=["onClick"];function Tl(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"forward",label:"转发/穿透"},{default:(0,t.k6)((a=>[a.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[a.row.isSelf&&(n.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",vl)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",bl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Cl)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Fl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,El)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,Ll)])],64)):n.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",_l)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",yl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Il)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Pl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,Vl)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,Sl)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1})}var Ml=l(743);const Rl=Symbol(),Wl=()=>{const e=(0,d.B)(),a=((0,t.EW)((()=>e.value.config.Client.Id)),(0,i.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(Rl,a);const l=()=>{(0,Ml.a9)()},n=()=>{(0,Ml.gz)(a.value.hashcode.toString()).then((e=>{a.value.hashcode=e.HashCode,e.List&&(a.value.list=e.List),a.value.timer=setTimeout(n,1020)})).catch((()=>{a.value.timer=setTimeout(n,1020)}))},o=e=>{a.value.machineid=e[0],a.value.machineName=e[1],a.value.showEdit=!0},r=()=>{clearTimeout(a.value.timer),clearTimeout(a.value.testTimer)};return{sforward:a,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:l}},Xl=()=>(0,t.WQ)(Rl);var Al={emits:["edit","sedit"],setup(e,{emit:a}){const l=w(),n=Xl(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,Ba.mx)(),m=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("edit",[e,l])},p=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("sedit",[e,l])},k=()=>{a("refresh")};return{forward:l,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:i,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:k}}};const Bl=(0,F.A)(Al,[["render",Tl],["__scopeId","data-v-26b3f87e"]]);var Nl=Bl;const xl={class:"t-c head"},zl=["title"],Ul={class:"t-c"},Dl={class:"page-wrap"},Kl=["title"];function Ql(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-option"),c=(0,t.g2)("el-select"),h=(0,t.g2)("WarnTriangleFilled"),m=(0,t.g2)("el-icon"),p=(0,t.g2)("el-pagination"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("Delete"),g=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),v=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(v,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",xl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":a=>e.row.BufferSize=a,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.bufferSize,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e,value:a},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(n.state.bufferSize[e.row.BufferSize]),1)],64))])),_:1}),(0,t.bF)(i,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":a=>e.row.BindIPAddress=a,size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(u,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.BindIPAddress),1)],64))])),_:1}),(0,t.bF)(i,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":a=>e.row.Port=a,onBlur:a=>n.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Port),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,zl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Port),3))],64))])),_:1}),(0,t.bF)(i,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":a=>e.row.MachineId=a,onChange:a=>n.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:n.state.loading,"remote-method":n.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",Ul,[(0,t.Lk)("div",Dl,[(0,t.bF)(p,{small:"",background:"",layout:"prev, pager, next","page-size":n.state.machineIds.Request.Size,total:n.state.machineIds.Count,"pager-count":5,"current-page":n.state.machineIds.Request.Page,onCurrentChange:n.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.machineIds.List,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.MachineName),1)],64))])),_:1}),(0,t.bF)(i,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":a=>e.row.TargetEP=a,onBlur:a=>n.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.TargetEP),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Kl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.TargetEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(g,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Ol={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=w(),o=(0,i.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:l.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{(0,h.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},s=()=>{(0,h.Oy)(o.machineId).then((e=>{o.data=e})).catch((()=>{}))},c=e=>{o.machineIds.Request.Name=e,m()},m=()=>{o.loading=!0,(0,V.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},p=e=>{o.machineIds.Request.Page=e,m()},k=()=>{s(),m()},g=(e,a)=>{b(e,a.property)},f=()=>{s(),u.nk.success("已刷新")},v=()=>{L({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},b=(e,a)=>{e.Started?u.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${a}Editing`]=!0)},C=(e,a)=>{if(e.Started)return void u.nk.error("请先停止");e[`${a}Editing`]=!1;const l=o.machineIds.List.find((a=>a.MachineId==e.MachineId));l&&(e.MachineName=l.MachineName),L(e)},F=e=>{(0,h.we)({machineId:o.machineId,Id:e}).then((()=>{s()}))},E=e=>{L(e)},L=e=>{e.Port=parseInt(e.Port),(0,h.nH)({machineId:o.machineId,data:e}).then((()=>{s()})).catch((e=>{u.nk.error(e)}))};return(0,t.sV)((()=>{s(),r()})),{state:o,handleOnShowList:k,handleCellClick:g,handleRefresh:f,handleAdd:v,handleEdit:b,handleEditBlur:C,handleDel:F,handleStartChange:E,handleSearch:c,handlePageChange:p}}};const Gl=(0,F.A)(Ol,[["render",Ql],["__scopeId","data-v-15b05a01"]]);var $l=Gl;const ql={class:"t-c head"},jl=["title"],Yl=["title"];function Hl(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("WarnTriangleFilled"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("Delete"),p=(0,t.g2)("el-popconfirm"),w=(0,t.g2)("el-table"),k=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(k,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.machineName}】的内网穿透`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",ql,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(w,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"100"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(1<[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":a=>e.row.Temp=a,onBlur:a=>n.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Temp),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,jl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Temp),3))],64))])),_:1}),(0,t.bF)(i,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":a=>e.row.LocalEP=a,onBlur:a=>n.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.LocalEP),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Yl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.LocalEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"是","inactive-text":"否"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Jl={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=Xl(),o=(0,i.Kh)({bufferSize:l.value.bufferSize,show:!0,data:[],timerTestLocal:0});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{console.log(n.value.machineid),(0,Ml.eX)(n.value.machineid).then((e=>{o.timerTestLocal=setTimeout(r,1e3)})).catch((()=>{o.timerTestLocal=setTimeout(r,1e3)}))},s=()=>{(0,Ml.pY)(n.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),o.data=e})).catch((()=>{}))},c=()=>{s()},h=(e,a)=>{w(e,a.property)},m=()=>{s(),u.nk.success("已刷新")},p=()=>{const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,Ml.Qs)({machineid:n.value.machineid,data:e}).then((()=>{setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)}))},w=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${a}Editing`]=!0)},k=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(e[`${a}Editing`]=!1,v(e))},g=e=>{(0,Ml.DY)({machineid:n.value.machineid,id:e}).then((()=>{s()}))},f=e=>{v(e)},v=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,(0,Ml.Qs)({machineid:n.value.machineid,data:e}).then((e=>{0==e&&u.nk.error("操作失败,可能存在相同值"),setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)})))};return(0,t.sV)((()=>{s(),r()})),(0,t.hi)((()=>{clearTimeout(o.timerTestLocal)})),{state:o,machineName:n.value.machineName,handleOnShowList:c,handleCellClick:h,handleRefresh:m,handleAdd:p,handleEdit:w,handleEditBlur:k,handleDel:g,handleStartChange:f}}};const Zl=(0,F.A)(Jl,[["render",Hl],["__scopeId","data-v-7eb8e7cc"]]);var et=Zl;const at=["onClick"],lt={key:0},tt={key:1},nt={key:0},ot={key:1},rt={key:0},st={key:1};function dt(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("el-popconfirm"),h=(0,t.g2)("el-table"),m=(0,t.g2)("el-dialog"),p=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`与[${n.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,B.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,B.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,B.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(s,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(n.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(s,{property:"TransportName",label:"协议"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,B.v_)(e.row.TransportName)+"("+(0,B.v_)(n.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,B.v_)(n.state.types[e.row.Type])+" - "+(0,B.v_)(1<[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,B.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,B.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(s,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a=>n.handleNode(e.row)},(0,B.v_)(n.state.nodesDic[e.row.NodeId]||"选择节点"),9,at)])])),_:1}),(0,t.bF)(s,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[n.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(c,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:a=>n.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(u,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(m,{modelValue:n.state.showNodes,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.showNodes=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"Name",label:"名称"}),(0,t.bF)(s,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",lt,"无限制")):((0,t.uX)(),(0,t.CE)("span",tt,(0,B.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,B.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",nt,"无限制")):((0,t.uX)(),(0,t.CE)("span",ot,(0,B.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",rt,"无限制")):((0,t.uX)(),(0,t.CE)("span",st,(0,B.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"Delay",label:"延迟",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Public",label:"公开",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":a=>e.row.Public=a,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(s,{property:"Oper",label:"操作",width:"65"},{default:(0,t.k6)((e=>[(0,t.bF)(u,{type:"success",size:"small",onClick:a=>n.handleConnect(e.row.Id)},{default:(0,t.k6)((()=>[(0,t.eW)("使用")])),_:2},1032,["onClick"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var it=l(9232),ut={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("TunnelRemove"))),o=(0,Ba.ZY)(),r=(0,Ba.mx)(),s=(0,Ba.FG)(),c=(0,Ba.bB)(),h=(0,i.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:o.value.currentName,currentRow:{},data:(0,t.EW)((()=>[r.value.list[o.value.current],s.value.list[o.value.current],c.value.list[o.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e),a("change")}),300)}));const m=e=>{n.value&&e.removeFunc(e.RemoteMachineId).then((()=>{u.nk.success("删除成功")})).catch((()=>{}))},p=()=>{(0,it.W4)().then((e=>{h.nodes=e,h.nodesDic=e.reduce(((e,a)=>(e[a.Id]=a.Name,e)),{}),h.timer=setTimeout(p,1e3)})).catch((()=>{h.timer=setTimeout(p,1e3)}))},w=e=>{h.currentRow=e,h.showNodes=!0},k=e=>{const a={FromMachineId:l.value.config.Client.Id,TransactionId:h.currentRow.TransactionId,ToMachineId:h.currentRow.RemoteMachineId,NodeId:e};a.NodeId!=h.currentRow.NodeId&&((0,it.uQ)(a).then((()=>{})).catch((()=>{})),h.showNodes=!1)};return(0,t.sV)((()=>{o.value.updateRealTime(!0),p()})),(0,t.hi)((()=>{o.value.updateRealTime(!1),clearTimeout(h.timer)})),{state:h,handleDel:m,hasTunnelRemove:n,handleNode:w,handleConnect:k}}};const ct=(0,F.A)(ut,[["render",dt],["__scopeId","data-v-7891b902"]]);var ht=ct,mt=l(9383),pt={components:{Sort:L,Oper:A,Device:J,DeviceEdit:ne,AccessEdit:ce,Tunnel:ul,TunnelEdit:fl,ConnectionsEdit:ht,Tuntap:ge,TuntapEdit:ea,TuntapLease:Ca,Socks5:Ka,Socks5Edit:Za,Forward:Nl,ForwardEdit:$l,SForwardEdit:et},setup(e){const a=(0,d.B)(),l=(0,i.Kh)({height:(0,t.EW)((()=>a.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:w,handleDel:k,clearDevicesTimeout:g,setSort:v}=(0,oe.r)(),{tuntap:C,_getTuntapInfo:F,handleTuntapEdit:E,handleTuntapRefresh:L,clearTuntapTimeout:_,getTuntapMachines:y,sortTuntapIP:I}=(0,b.O)(),{socks5:P,_getSocks5Info:V,handleSocks5Edit:S,handleSocks5Refresh:T,clearSocks5Timeout:M,getSocks5Machines:W,sortSocks5:X}=f(),{tunnel:A,_getTunnelInfo:B,handleTunnelEdit:N,handleTunnelRefresh:x,clearTunnelTimeout:z,sortTunnel:U}=rl(),{forward:D,_getForwardCountInfo:K,handleForwardEdit:Q,clearForwardTimeout:O,handleForwardRefresh:G}=p(),{sforward:$,_getSForwardCountInfo:q,handleSForwardEdit:j,clearSForwardTimeout:Y,handleSForwardRefresh:H}=Wl(),{connections:J,forwardConnections:Z,_getForwardConnections:ee,tuntapConnections:ae,_getTuntapConnections:le,socks5Connections:te,_getSocks5Connections:ne,handleTunnelConnections:re,clearConnectionsTimeout:se}=(0,Ba.L2)(),{_getUpdater:de,_subscribeUpdater:ie,clearUpdaterTimeout:ue}=(0,mt.d)(),{_getAccessInfo:ce,clearAccessTimeout:he,handleAccesssRefresh:me}=(0,R.Y)(),pe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let a=new Promise(((e,a)=>{e()}));if("tunnel"==e.prop){const e=U(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("tuntap"==e.prop){const e=I(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("socks5"==e.prop){const e=X(n.page.Request.Asc);e.length>0&&(a=v(e))}a.then((()=>{m()})).catch((()=>{}))},we=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=y(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,a)=>(-1==e.indexOf(a)&&e.push(a),e)),[]):n.page.Request.Ids=[],m(),x(),L(),T(),G(),H(),me(),u.nk.success({message:"刷新成功",grouping:!0})},ke=()=>{m(),x(),L(),T(),me(),u.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),x(),L(),T(),G(),H(),me(),r(),s(),F(),V(),B(),ee(),le(),ne(),K(),q(),de(),ie(),ce()})),(0,t.hi)((()=>{g(),se(),_(),M(),z(),O(),Y(),ue(),he()})),{state:l,devices:n,machineId:o,handleSortChange:pe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:we,handlePageSearch:ke,handlePageChange:m,handlePageSizeChange:w,handleDel:k,tuntap:C,handleTuntapEdit:E,handleTuntapRefresh:L,socks5:P,handleSocks5Edit:S,handleSocks5Refresh:T,tunnel:A,connections:J,handleTunnelEdit:N,handleTunnelRefresh:x,handleTunnelConnections:re,forward:D,handleForwardEdit:Q,sforward:$,handleSForwardEdit:j}}};const wt=(0,F.A)(pt,[["render",s],["__scopeId","data-v-3d1c480c"]]);var kt=wt}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/app.1dbd8a85.js b/linker.tray.win/web/js/app.1dbd8a85.js new file mode 100644 index 00000000..21039a0e --- /dev/null +++ b/linker.tray.win/web/js/app.1dbd8a85.js @@ -0,0 +1 @@ +(function(){"use strict";var e={8835:function(e,n,t){t.d(n,{E1:function(){return a},Iv:function(){return u},P$:function(){return c},ai:function(){return i},zj:function(){return r}});var o=t(4);const r=()=>(0,o.zG)("configclient/get"),i=e=>(0,o.zG)("configclient/install",e),c=e=>(0,o.zG)("configclient/export",e),u=()=>(0,o.zG)("configclient/SyncNames"),a=e=>(0,o.zG)("configclient/Sync",e)},4:function(e,n,t){t.d(n,{a1:function(){return v},e3:function(){return b},jH:function(){return C},zG:function(){return y}});t(4114),t(6573),t(8100),t(7936);var o=t(1219);let r=0,i=null,c="",u=1,a="";const s={},l={connected:!1,connecting:!1},d=()=>{const e=Date.now();for(let n in s){const t=s[n];e-t.time>t.timeout&&(t.reject("超时~"),delete s[n])}setTimeout(d,1e3)};d();const f={subs:{},add:function(e,n){"function"==typeof n&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(n))},remove(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o]==n&&t.splice(o,1)},push(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o](n)}},p=()=>{l.connected=!0,l.connecting=!1,f.push(w,l.connected)},h=e=>{l.connected=!1,l.connecting=!1,f.push(w,l.connected),setTimeout((()=>{v()}),1e3)},g=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((n=>{const t=new DataView(n).getInt8(),o=new FileReader;o.readAsText(e.data.slice(4,4+t),"utf8"),o.onload=()=>{let r=JSON.parse(o.result);r.Content={Name:r.Content,Img:e.data.slice(4+t,e.data.length),ArrayBuffer:n},m(r)}}));let n=JSON.parse(e.data);m(n)},m=e=>{let n=s[e.RequestId];n?(0==e.Code?n.resolve(e.Content):1==e.Code?n.reject(e.Content):255==e.Code?(n.reject(e.Content),n.errHandle||o.nk.error(`${n.path}:${e.Content}`)):f.push(e.Path,e.Content),delete s[e.RequestId]):f.push(e.Path,e.Content)},v=(e=c,n=a)=>{if(a=n,c=e,l.connecting||l.connected)return;null!=i&&i.close(),l.connecting=!0;const t=n||"snltty";i=new WebSocket(c,[t]),i.iddd=++u,i.onopen=p,i.onclose=h,i.onmessage=g},b=()=>{i&&i.close()},y=(e,n={},t=!1,o=15e3)=>new Promise(((c,u)=>{let a=++r;try{s[a]={resolve:c,reject:u,errHandle:t,path:e,time:Date.now(),timeout:o};let r=JSON.stringify({Path:e,RequestId:a,Content:"string"==typeof n?n:JSON.stringify(n)});l.connected&&1==i.readyState?i.send(r):u("网络错误~")}catch(d){console.log(d),u("网络错误~"),delete s[a]}})),w=Symbol(),C=e=>{f.add(w,e)}},9299:function(e,n,t){t.d(n,{BS:function(){return s},SZ:function(){return c},Se:function(){return l},VN:function(){return u},gC:function(){return d},jU:function(){return i},nD:function(){return a},rd:function(){return r},zp:function(){return f}});var o=t(4);const r=e=>(0,o.zG)("signInclient/set",e),i=e=>(0,o.zG)("signInclient/setservers",e),c=()=>(0,o.zG)("signInclient/info"),u=e=>(0,o.zG)("signInclient/setorder",e),a=e=>(0,o.zG)("signInclient/List",e),s=e=>(0,o.zG)("signInclient/ids",e),l=e=>(0,o.zG)("signInclient/del",e),d=e=>(0,o.zG)("signInclient/setname",e),f=e=>(0,o.zG)("signInclient/SetGroups",e)},3616:function(e,n,t){var o=t(5130),r=t(6768);function i(e,n,t,o,i,c){const u=(0,r.g2)("router-view"),a=(0,r.g2)("Api");return(0,r.uX)(),(0,r.CE)("div",null,[o.configed?((0,r.uX)(),(0,r.Wv)(u,{key:0})):(0,r.Q3)("",!0),(0,r.bF)(a)])}var c=t(3830);const u={class:"port-wrap t-c"},a={class:"pdt-10"};function s(e,n,t,o,i,c){const s=(0,r.g2)("el-input"),l=(0,r.g2)("el-button"),d=(0,r.g2)("el-dialog");return(0,r.uX)(),(0,r.Wv)(d,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:o.showPort,"onUpdate:modelValue":n[2]||(n[2]=e=>o.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,r.k6)((()=>[(0,r.bF)(l,{type:"success",onClick:o.handleConnect1,plain:""},{default:(0,r.k6)((()=>[(0,r.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,r.k6)((()=>[(0,r.Lk)("div",u,[(0,r.Lk)("div",null,[(0,r.eW)(" 接口 : "),(0,r.bF)(s,{modelValue:o.state.api,"onUpdate:modelValue":n[0]||(n[0]=e=>o.state.api=e),style:{width:"70%"}},null,8,["modelValue"])]),(0,r.Lk)("div",a,[(0,r.eW)(" 秘钥 : "),(0,r.bF)(s,{type:"password",modelValue:o.state.psd,"onUpdate:modelValue":n[1]||(n[1]=e=>o.state.psd=e),style:{width:"70%"}},null,8,["modelValue"])])])])),_:1},8,["modelValue"])}var l=t(1387),d=t(144),f=t(4),p=t(9299),h=t(8835),g=t(7477),m={components:{Tools:g.S0q},props:["config"],setup(e){const n=(0,c.B)(),t=(0,l.rd)(),o=(0,l.lq)(),i={api:`${window.location.hostname}:1803`,psd:"snltty"},u=JSON.parse(localStorage.getItem("api-cache")||JSON.stringify(i)),a=(0,d.Kh)({api:u.api,psd:u.psd,showPort:!1}),s=(0,r.EW)((()=>0==n.value.api.connected&&a.showPort)),g=()=>{u.api=a.api,u.psd=a.psd,localStorage.setItem("api-cache",JSON.stringify(u)),(0,f.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${a.api}`;(0,f.a1)(e,a.psd)},m=()=>{g(),window.location.reload()},v=()=>{(0,h.zj)().then((e=>{n.value.config.Common=e.Common,n.value.config.Client=e.Client,n.value.config.Server=e.Server,n.value.config.Running=e.Running,n.value.config.configed=!0,setTimeout((()=>{v()}),1e3)})).catch((e=>{setTimeout((()=>{v()}),1e3)}))},b=()=>{(0,p.SZ)().then((e=>{n.value.signin.Connected=e.Connected,n.value.signin.Connecting=e.Connecting,n.value.signin.Version=e.Version,setTimeout((()=>{b()}),1e3)})).catch((e=>{setTimeout((()=>{b()}),1e3)}))};return(0,r.sV)((()=>{setTimeout((()=>{a.showPort=!0}),500),(0,f.jH)((e=>{e&&(v(),b())})),t.isReady().then((()=>{a.api=o.query.api?`${window.location.hostname}:${o.query.api}`:a.api,a.psd=o.query.psd||a.psd,g()}))})),{state:a,showPort:s,handleConnect1:m}}},v=t(1241);const b=(0,v.A)(m,[["render",s],["__scopeId","data-v-08751c59"]]);var y=b,w={components:{Api:y},setup(e){const n=(0,c.v)(),t=(0,r.EW)((()=>n.value.config.configed));return{configed:t}}};const C=(0,v.A)(w,[["render",i]]);var S=C;const k=[{path:"/",name:"Full",component:()=>Promise.all([t.e(39),t.e(183),t.e(827)]).then(t.bind(t,3112)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([t.e(39),t.e(110),t.e(509)]).then(t.bind(t,2712))},{path:"/full/servers.html",name:"FullServers",component:()=>t.e(256).then(t.bind(t,256))},{path:"/full/transport.html",name:"FullTransport",component:()=>t.e(225).then(t.bind(t,3225))},{path:"/full/action.html",name:"FullAction",component:()=>t.e(424).then(t.bind(t,6424))},{path:"/full/logger.html",name:"FullLogger",component:()=>t.e(352).then(t.bind(t,352))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([t.e(39),t.e(183),t.e(110),t.e(76)]).then(t.bind(t,9256))},{path:"/no-permission.html",name:"NoPermission",component:()=>t.e(31).then(t.bind(t,4083))}],P=(0,l.aE)({history:(0,l.Bt)(),routes:k});var A=P,B=t(6161);t(4188),t(2355),t(1862);const I=(0,o.Ef)(S);I.use(B.A,{size:"default"}).use(A).mount("#app")},3830:function(e,n,t){t.d(n,{B:function(){return a},v:function(){return u}});var o=t(4),r=t(144),i=t(6768);const c=Symbol(),u=()=>{const e=(0,r.KR)({api:{connected:!1},height:0,config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Connecting:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],updater:{},self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const n=this.config.Client.Accesss[e].Value||-1,t=this.config.Client.Access||-1;return t>=0&&(0==t||+(BigInt(t)&BigInt(n)).toString()==n)}});return(0,o.jH)((n=>{e.value.api.connected=n})),(0,i.Gt)(c,e),e},a=()=>(0,i.WQ)(c)}},n={};function t(o){var r=n[o];if(void 0!==r)return r.exports;var i=n[o]={exports:{}};return e[o].call(i.exports,i,i.exports,t),i.exports}t.m=e,function(){var e=[];t.O=function(n,o,r,i){if(!o){var c=1/0;for(l=0;l=i)&&Object.keys(t.O).every((function(e){return t.O[e](o[a])}))?o.splice(a--,1):(u=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[o,r,i]}}(),function(){t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,{a:n}),n}}(),function(){t.d=function(e,n){for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,o){return t.f[o](e,n),n}),[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{31:"01e549ae",39:"695c2adf",76:"61170c94",110:"0106ebd8",183:"9a80af0b",225:"8a3da4f8",256:"8161f834",352:"678c694a",424:"f2a1d18e",509:"b1ccc755",827:"ca8f5e05"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{31:"64181b05",76:"a8147928",225:"4f041b3c",256:"4e351ac8",352:"56e27aad",424:"a59dc963",509:"8ac32231",827:"8be8ee26"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}}(),function(){var e={},n="linker.web:";t.l=function(o,r,i,c){if(e[o])e[o].push(r);else{var u,a;if(void 0!==i)for(var s=document.getElementsByTagName("script"),l=0;l(0,o.zG)("configclient/get"),i=e=>(0,o.zG)("configclient/install",e),c=e=>(0,o.zG)("configclient/export",e),u=()=>(0,o.zG)("configclient/SyncNames"),a=e=>(0,o.zG)("configclient/Sync",e)},4:function(e,n,t){t.d(n,{a1:function(){return v},e3:function(){return b},jH:function(){return C},zG:function(){return y}});t(4114),t(6573),t(8100),t(7936);var o=t(1219);let r=0,i=null,c="",u=1,a="";const s={},l={connected:!1,connecting:!1},d=()=>{const e=Date.now();for(let n in s){const t=s[n];e-t.time>t.timeout&&(t.reject("超时~"),delete s[n])}setTimeout(d,1e3)};d();const f={subs:{},add:function(e,n){"function"==typeof n&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(n))},remove(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o]==n&&t.splice(o,1)},push(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o](n)}},p=()=>{l.connected=!0,l.connecting=!1,f.push(w,l.connected)},h=e=>{l.connected=!1,l.connecting=!1,f.push(w,l.connected),setTimeout((()=>{v()}),1e3)},g=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((n=>{const t=new DataView(n).getInt8(),o=new FileReader;o.readAsText(e.data.slice(4,4+t),"utf8"),o.onload=()=>{let r=JSON.parse(o.result);r.Content={Name:r.Content,Img:e.data.slice(4+t,e.data.length),ArrayBuffer:n},m(r)}}));let n=JSON.parse(e.data);m(n)},m=e=>{let n=s[e.RequestId];n?(0==e.Code?n.resolve(e.Content):1==e.Code?n.reject(e.Content):255==e.Code?(n.reject(e.Content),n.errHandle||o.nk.error(`${n.path}:${e.Content}`)):f.push(e.Path,e.Content),delete s[e.RequestId]):f.push(e.Path,e.Content)},v=(e=c,n=a)=>{if(a=n,c=e,l.connecting||l.connected)return;null!=i&&i.close(),l.connecting=!0;const t=n||"snltty";i=new WebSocket(c,[t]),i.iddd=++u,i.onopen=p,i.onclose=h,i.onmessage=g},b=()=>{i&&i.close()},y=(e,n={},t=!1,o=15e3)=>new Promise(((c,u)=>{let a=++r;try{s[a]={resolve:c,reject:u,errHandle:t,path:e,time:Date.now(),timeout:o};let r=JSON.stringify({Path:e,RequestId:a,Content:"string"==typeof n?n:JSON.stringify(n)});l.connected&&1==i.readyState?i.send(r):u("网络错误~")}catch(d){console.log(d),u("网络错误~"),delete s[a]}})),w=Symbol(),C=e=>{f.add(w,e)}},9299:function(e,n,t){t.d(n,{BS:function(){return s},SZ:function(){return c},Se:function(){return l},VN:function(){return u},gC:function(){return d},jU:function(){return i},nD:function(){return a},rd:function(){return r},zp:function(){return f}});var o=t(4);const r=e=>(0,o.zG)("signInclient/set",e),i=e=>(0,o.zG)("signInclient/setservers",e),c=()=>(0,o.zG)("signInclient/info"),u=e=>(0,o.zG)("signInclient/setorder",e),a=e=>(0,o.zG)("signInclient/List",e),s=e=>(0,o.zG)("signInclient/ids",e),l=e=>(0,o.zG)("signInclient/del",e),d=e=>(0,o.zG)("signInclient/setname",e),f=e=>(0,o.zG)("signInclient/SetGroups",e)},3616:function(e,n,t){var o=t(5130),r=t(6768);function i(e,n,t,o,i,c){const u=(0,r.g2)("router-view"),a=(0,r.g2)("Api");return(0,r.uX)(),(0,r.CE)("div",null,[o.configed?((0,r.uX)(),(0,r.Wv)(u,{key:0})):(0,r.Q3)("",!0),(0,r.bF)(a)])}var c=t(3830);const u={class:"port-wrap t-c"},a={class:"pdt-10"};function s(e,n,t,o,i,c){const s=(0,r.g2)("el-input"),l=(0,r.g2)("el-button"),d=(0,r.g2)("el-dialog");return(0,r.uX)(),(0,r.Wv)(d,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:o.showPort,"onUpdate:modelValue":n[2]||(n[2]=e=>o.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,r.k6)((()=>[(0,r.bF)(l,{type:"success",onClick:o.handleConnect1,plain:""},{default:(0,r.k6)((()=>[(0,r.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,r.k6)((()=>[(0,r.Lk)("div",u,[(0,r.Lk)("div",null,[(0,r.eW)(" 接口 : "),(0,r.bF)(s,{modelValue:o.state.api,"onUpdate:modelValue":n[0]||(n[0]=e=>o.state.api=e),style:{width:"70%"}},null,8,["modelValue"])]),(0,r.Lk)("div",a,[(0,r.eW)(" 秘钥 : "),(0,r.bF)(s,{type:"password",modelValue:o.state.psd,"onUpdate:modelValue":n[1]||(n[1]=e=>o.state.psd=e),style:{width:"70%"}},null,8,["modelValue"])])])])),_:1},8,["modelValue"])}var l=t(1387),d=t(144),f=t(4),p=t(9299),h=t(8835),g=t(7477),m={components:{Tools:g.S0q},props:["config"],setup(e){const n=(0,c.B)(),t=(0,l.rd)(),o=(0,l.lq)(),i={api:`${window.location.hostname}:1803`,psd:"snltty"},u=JSON.parse(localStorage.getItem("api-cache")||JSON.stringify(i)),a=(0,d.Kh)({api:u.api,psd:u.psd,showPort:!1}),s=(0,r.EW)((()=>0==n.value.api.connected&&a.showPort)),g=()=>{u.api=a.api,u.psd=a.psd,localStorage.setItem("api-cache",JSON.stringify(u)),(0,f.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${a.api}`;(0,f.a1)(e,a.psd)},m=()=>{g(),window.location.reload()},v=()=>{(0,h.zj)().then((e=>{n.value.config.Common=e.Common,n.value.config.Client=e.Client,n.value.config.Server=e.Server,n.value.config.Running=e.Running,n.value.config.configed=!0,setTimeout((()=>{v()}),1e3)})).catch((e=>{setTimeout((()=>{v()}),1e3)}))},b=()=>{(0,p.SZ)().then((e=>{n.value.signin.Connected=e.Connected,n.value.signin.Connecting=e.Connecting,n.value.signin.Version=e.Version,setTimeout((()=>{b()}),1e3)})).catch((e=>{setTimeout((()=>{b()}),1e3)}))};return(0,r.sV)((()=>{setTimeout((()=>{a.showPort=!0}),500),(0,f.jH)((e=>{e&&(v(),b())})),t.isReady().then((()=>{a.api=o.query.api?`${window.location.hostname}:${o.query.api}`:a.api,a.psd=o.query.psd||a.psd,g()}))})),{state:a,showPort:s,handleConnect1:m}}},v=t(1241);const b=(0,v.A)(m,[["render",s],["__scopeId","data-v-08751c59"]]);var y=b,w={components:{Api:y},setup(e){const n=(0,c.v)(),t=(0,r.EW)((()=>n.value.config.configed));return{configed:t}}};const C=(0,v.A)(w,[["render",i]]);var S=C;const k=[{path:"/",name:"Full",component:()=>Promise.all([t.e(39),t.e(183),t.e(827)]).then(t.bind(t,3112)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([t.e(39),t.e(110),t.e(245)]).then(t.bind(t,424))},{path:"/full/servers.html",name:"FullServers",component:()=>t.e(256).then(t.bind(t,256))},{path:"/full/transport.html",name:"FullTransport",component:()=>t.e(225).then(t.bind(t,3225))},{path:"/full/action.html",name:"FullAction",component:()=>t.e(424).then(t.bind(t,6424))},{path:"/full/logger.html",name:"FullLogger",component:()=>t.e(352).then(t.bind(t,352))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([t.e(39),t.e(183),t.e(110),t.e(76)]).then(t.bind(t,9256))},{path:"/no-permission.html",name:"NoPermission",component:()=>t.e(31).then(t.bind(t,4083))}],P=(0,l.aE)({history:(0,l.Bt)(),routes:k});var A=P,B=t(6161);t(4188),t(2355),t(1862);const I=(0,o.Ef)(S);I.use(B.A,{size:"default"}).use(A).mount("#app")},3830:function(e,n,t){t.d(n,{B:function(){return a},v:function(){return u}});var o=t(4),r=t(144),i=t(6768);const c=Symbol(),u=()=>{const e=(0,r.KR)({api:{connected:!1},height:0,config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Connecting:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],updater:{},self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const n=this.config.Client.Accesss[e].Value||-1,t=this.config.Client.Access||-1;return t>=0&&(0==t||+(BigInt(t)&BigInt(n)).toString()==n)}});return(0,o.jH)((n=>{e.value.api.connected=n})),(0,i.Gt)(c,e),e},a=()=>(0,i.WQ)(c)}},n={};function t(o){var r=n[o];if(void 0!==r)return r.exports;var i=n[o]={exports:{}};return e[o].call(i.exports,i,i.exports,t),i.exports}t.m=e,function(){var e=[];t.O=function(n,o,r,i){if(!o){var c=1/0;for(l=0;l=i)&&Object.keys(t.O).every((function(e){return t.O[e](o[a])}))?o.splice(a--,1):(u=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[o,r,i]}}(),function(){t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,{a:n}),n}}(),function(){t.d=function(e,n){for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,o){return t.f[o](e,n),n}),[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{31:"01e549ae",39:"695c2adf",76:"61170c94",110:"0106ebd8",183:"9a80af0b",225:"8a3da4f8",245:"a0641292",256:"8161f834",352:"678c694a",424:"f2a1d18e",827:"ca8f5e05"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{31:"64181b05",76:"a8147928",225:"4f041b3c",245:"922d2586",256:"4e351ac8",352:"56e27aad",424:"a59dc963",827:"8be8ee26"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}}(),function(){var e={},n="linker.web:";t.l=function(o,r,i,c){if(e[o])e[o].push(r);else{var u,a;if(void 0!==i)for(var s=document.getElementsByTagName("script"),l=0;l + /// 本机局域网IP,当然你也可以使用0.0.0.0,但是使用局域网IP会提高打洞成功率 + /// + public Func LocalIP { get; set; } = () => IPAddress.Any; + /// + /// 服务器地址 + /// + public Func ServerHost { get; set; } = () => new IPEndPoint(IPAddress.Any, 0); + /// + /// ssl加密证书,没有证书则无法加密通信 + /// + public Func Certificate { get; set; } = () => null; + /// + /// 获取打洞协议列表 + /// + /// + public Func> GetTunnelTransports { get; set; } = () => new List(); + /// + /// 保存打洞协议列表 + /// + /// + public Action, bool> SetTunnelTransports { get; set; } = (list, update) => { }; + + /// + /// 获取本地网络信息 + /// + /// + public Func GetLocalConfig { get; set; } = () => new NetworkInfo(); + + /// + /// 获取远端的外网信息,比如你是A,你要获取B的信息,可以在B调用 TunnelTransfer.GetWanPort() 发送回来 + /// + public Func> GetRemoteWanPort { get; set; } = async (info) => { return await Task.FromResult(new TunnelTransportWanPortInfo()); }; + + /// + /// 发送开始打洞 + /// + public Func> SendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; + /// + /// 发送打洞失败 + /// + public Func> SendConnectFail { get; set; } = async (info) => { return await Task.FromResult(false); }; + /// + /// 发送打洞成功 + /// + public Func> SendConnectSuccess { get; set; } = async (info) => { return await Task.FromResult(false); }; + + private List transports; - private TunnelWanPortTransfer compactTransfer; - private ITunnelAdapter tunnelAdapter; + private TunnelWanPortTransfer tunnelWanPortTransfer; private TunnelUpnpTransfer TunnelUpnpTransfer; private ConcurrentDictionary connectingDic = new ConcurrentDictionary(); @@ -29,23 +77,22 @@ namespace linker.tunnel /// 加载打洞协议 /// /// - public void LoadTransports(TunnelWanPortTransfer compactTransfer, ITunnelAdapter tunnelAdapter, TunnelUpnpTransfer TunnelUpnpTransfer, List transports) + public void LoadTransports(TunnelWanPortTransfer tunnelWanPortTransfer, TunnelUpnpTransfer TunnelUpnpTransfer, List transports) { - this.compactTransfer = compactTransfer; - this.tunnelAdapter = tunnelAdapter; + this.tunnelWanPortTransfer = tunnelWanPortTransfer; this.transports = transports; this.TunnelUpnpTransfer = TunnelUpnpTransfer; foreach (var item in transports) { - item.OnSendConnectBegin = tunnelAdapter.SendConnectBegin; - item.OnSendConnectFail = tunnelAdapter.SendConnectFail; - item.OnSendConnectSuccess = tunnelAdapter.SendConnectSuccess; + item.OnSendConnectBegin = SendConnectBegin; + item.OnSendConnectFail = SendConnectFail; + item.OnSendConnectSuccess = SendConnectSuccess; item.OnConnected = _OnConnected; - item.SetAdapter(tunnelAdapter); + item.SetSSL(Certificate()); } - var transportItems = tunnelAdapter.GetTunnelTransports(); + var transportItems = GetTunnelTransports(); //有新的协议 var newTransportNames = transports.Select(c => c.Name).Except(transportItems.Select(c => c.Name)); if (newTransportNames.Any()) @@ -96,11 +143,10 @@ namespace linker.tunnel } } - tunnelAdapter.SetTunnelTransports(transportItems, true); + SetTunnelTransports(transportItems, true); LoggerHelper.Instance.Info($"load tunnel transport:{string.Join(",", transports.Select(c => c.Name))}"); } - /// /// 设置成功打洞回调 /// @@ -154,7 +200,7 @@ namespace linker.tunnel try { - foreach (TunnelTransportItemInfo transportItem in tunnelAdapter.GetTunnelTransports().OrderBy(c => c.Order).Where(c => c.Disabled == false)) + foreach (TunnelTransportItemInfo transportItem in GetTunnelTransports().OrderBy(c => c.Order).Where(c => c.Disabled == false)) { ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == transportItem.Name); //找不到这个打洞协议,或者是不支持的协议 @@ -163,7 +209,7 @@ namespace linker.tunnel continue; } - foreach (var wanPortProtocol in compactTransfer.Protocols) + foreach (var wanPortProtocol in tunnelWanPortTransfer.Protocols) { //这个打洞协议不支持这个外网端口协议 @@ -182,7 +228,7 @@ namespace linker.tunnel //获取自己的外网ip Task localInfo = GetLocalInfo(wanPortProtocol); //获取对方的外网ip - Task remoteInfo = tunnelAdapter.GetRemoteWanPort(new TunnelWanPortProtocolInfo + Task remoteInfo = GetRemoteWanPort(new TunnelWanPortProtocolInfo { MachineId = remoteMachineId, ProtocolType = wanPortProtocol @@ -270,7 +316,7 @@ namespace linker.tunnel try { ITunnelTransport _transports = transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.ProtocolType == tunnelTransportInfo.TransportType); - TunnelTransportItemInfo item = tunnelAdapter.GetTunnelTransports().FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false); + TunnelTransportItemInfo item = GetTunnelTransports().FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false); if (_transports != null && item != null) { OnConnectBegin(tunnelTransportInfo); @@ -283,7 +329,7 @@ namespace linker.tunnel else { connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); - _ = tunnelAdapter.SendConnectFail(tunnelTransportInfo); + _ = SendConnectFail(tunnelTransportInfo); } } catch (Exception ex) @@ -331,11 +377,11 @@ namespace linker.tunnel /// private async Task GetLocalInfo(TunnelWanPortProtocolType tunnelWanPortProtocolType) { - TunnelWanPortEndPoint ip = await compactTransfer.GetWanPortAsync(tunnelAdapter.LocalIP, tunnelWanPortProtocolType).ConfigureAwait(false); + TunnelWanPortEndPoint ip = await tunnelWanPortTransfer.GetWanPortAsync(ServerHost(), LocalIP(), tunnelWanPortProtocolType).ConfigureAwait(false); if (ip != null) { MapInfo portMapInfo = TunnelUpnpTransfer.PortMap ?? new MapInfo { PrivatePort = 0, PublicPort = 0 }; - var config = tunnelAdapter.GetLocalConfig(); + var config = GetLocalConfig(); return new TunnelTransportWanPortInfo { Local = ip.Local, @@ -492,6 +538,12 @@ namespace linker.tunnel { backgroundDic.TryRemove(GetBackgroundKey(remoteMachineId, transactionId), out _); } + /// + /// 是否正在后台打洞 + /// + /// + /// + /// public bool IsBackground(string remoteMachineId, string transactionId) { return backgroundDic.ContainsKey(GetBackgroundKey(remoteMachineId, transactionId)); diff --git a/linker.tunnel/adapter/ITunnelAdapter.cs b/linker.tunnel/adapter/ITunnelAdapter.cs deleted file mode 100644 index 54526770..00000000 --- a/linker.tunnel/adapter/ITunnelAdapter.cs +++ /dev/null @@ -1,103 +0,0 @@ -using linker.tunnel.wanport; -using linker.tunnel.transport; -using System.Net; -using System.Security.Cryptography.X509Certificates; - -namespace linker.tunnel.adapter -{ - public interface ITunnelAdapter - { - /// - /// 本机局域网IP,当然你也可以使用0.0.0.0,但是使用局域网IP会提高打洞成功率 - /// - public IPAddress LocalIP { get; } - - /// - /// 服务器地址 - /// - public IPEndPoint ServerHost { get; } - - /// - /// ssl加密证书,没有证书则无法加密通信 - /// - public X509Certificate2 Certificate { get; } - - - /// - /// 获取打洞协议列表 - /// - /// - public List GetTunnelTransports(); - /// - /// 保存打洞协议列表 - /// - /// - public void SetTunnelTransports(List transports, bool updateVersion); - - /// - /// 获取本地网络信息 - /// - /// - public NetworkInfo GetLocalConfig(); - - /// - /// 获取远端的外网信息,比如你是A,你要获取B的信息,可以在B调用 TunnelTransfer.GetWanPort() 发送回来 - /// - /// - /// - public Task GetRemoteWanPort(TunnelWanPortProtocolInfo info); - - /// - /// 发送开始打洞 - /// - /// - /// - public Task SendConnectBegin(TunnelTransportInfo tunnelTransportInfo); - /// - /// 发送打洞失败 - /// - /// - /// - public Task SendConnectFail(TunnelTransportInfo tunnelTransportInfo); - /// - /// 发送打洞成功 - /// - /// - /// - public Task SendConnectSuccess(TunnelTransportInfo tunnelTransportInfo); - } - - public sealed class NetworkInfo - { - /// - /// 本机局域网IP列表,可以通过NetworkHelper.GetRouteLevel 获取 - /// - public IPAddress[] LocalIps { get; set; } - /// - /// 本机与外网的距离,通过多少网关,可以通过NetworkHelper.GetRouteLevel 获取 - /// - public int RouteLevel { get; set; } - /// - /// 本机名 - /// - public string MachineId { get; set; } - } - - public sealed class PortMapInfo - { - public int WanPort { get; set; } - public int LanPort { get; set; } - } - - public sealed class TunnelWanPortProtocolInfo - { - /// - /// 协议 - /// - public TunnelWanPortProtocolType ProtocolType { get; set; } = TunnelWanPortProtocolType.Udp; - /// - /// 对方id - /// - public string MachineId { get; set; } - } -} diff --git a/linker.tunnel/transport/ITunnelTransport.cs b/linker.tunnel/transport/ITunnelTransport.cs index 1b03e538..ed78534f 100644 --- a/linker.tunnel/transport/ITunnelTransport.cs +++ b/linker.tunnel/transport/ITunnelTransport.cs @@ -1,7 +1,7 @@ -using linker.tunnel.adapter; -using linker.tunnel.connection; +using linker.tunnel.connection; using linker.tunnel.wanport; using System.Net; +using System.Security.Cryptography.X509Certificates; namespace linker.tunnel.transport { @@ -62,7 +62,7 @@ namespace linker.tunnel.transport /// public Action OnConnected { get; set; } - public void SetAdapter(ITunnelAdapter tunnelAdapter); + public void SetSSL(X509Certificate2 certificate); /// /// 连接对方 @@ -228,4 +228,32 @@ namespace linker.tunnel.transport } + + public sealed class NetworkInfo + { + /// + /// 本机局域网IP列表,可以通过NetworkHelper.GetRouteLevel 获取 + /// + public IPAddress[] LocalIps { get; set; } + /// + /// 本机与外网的距离,通过多少网关,可以通过NetworkHelper.GetRouteLevel 获取 + /// + public int RouteLevel { get; set; } + /// + /// 本机名 + /// + public string MachineId { get; set; } + } + + public sealed class TunnelWanPortProtocolInfo + { + /// + /// 协议 + /// + public TunnelWanPortProtocolType ProtocolType { get; set; } = TunnelWanPortProtocolType.Udp; + /// + /// 对方id + /// + public string MachineId { get; set; } + } } diff --git a/linker.tunnel/transport/TransportMsQuic.cs b/linker.tunnel/transport/TransportMsQuic.cs index 92e1ef8c..5f338d95 100644 --- a/linker.tunnel/transport/TransportMsQuic.cs +++ b/linker.tunnel/transport/TransportMsQuic.cs @@ -1,4 +1,4 @@ -using linker.tunnel.adapter; + using linker.tunnel.connection; using linker.libs; using linker.libs.extends; @@ -10,6 +10,7 @@ using System.Net.Sockets; using System.Security.Authentication; using System.Text; using linker.tunnel.wanport; +using System.Security.Cryptography.X509Certificates; namespace linker.tunnel.transport { @@ -46,15 +47,16 @@ namespace linker.tunnel.transport private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); private IPEndPoint quicListenEP = null; - private ITunnelAdapter tunnelAdapter; + public TransportMsQuic() { _ = QuicListen(); } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + private X509Certificate2 certificate; + public void SetSSL(X509Certificate2 certificate) { - this.tunnelAdapter = tunnelAdapter; + this.certificate = certificate; } /// @@ -72,7 +74,7 @@ namespace linker.tunnel.transport await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Warning($"msquic need ssl"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); @@ -132,7 +134,7 @@ namespace linker.tunnel.transport await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Warning($"msquic need ssl"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); @@ -661,7 +663,7 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"msquic not supported, need win11+,or linux, or try to restart linker"); return; } - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Warning($"msquic need ssl"); return; @@ -683,7 +685,7 @@ namespace linker.tunnel.transport IdleTimeout = TimeSpan.FromMilliseconds(15000), ServerAuthenticationOptions = new SslServerAuthenticationOptions { - ServerCertificate = tunnelAdapter.Certificate, + ServerCertificate = certificate, EnabledSslProtocols = SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, ApplicationProtocols = new List { SslApplicationProtocol.Http3 } } diff --git a/linker.tunnel/transport/TransportTcpNutssb.cs b/linker.tunnel/transport/TransportTcpNutssb.cs index fbaa60f1..8bb00438 100644 --- a/linker.tunnel/transport/TransportTcpNutssb.cs +++ b/linker.tunnel/transport/TransportTcpNutssb.cs @@ -1,4 +1,4 @@ -using linker.tunnel.adapter; + using linker.tunnel.connection; using linker.libs; using linker.libs.extends; @@ -54,13 +54,13 @@ namespace linker.tunnel.transport /// public Action OnConnected { get; set; } = (state) => { }; - private ITunnelAdapter tunnelAdapter; public TunnelTransportTcpNutssb() { } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + private X509Certificate2 certificate; + public void SetSSL(X509Certificate2 certificate) { - this.tunnelAdapter = tunnelAdapter; + this.certificate = certificate; } /// @@ -114,7 +114,7 @@ namespace linker.tunnel.transport /// public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) { - if (tunnelTransportInfo.SSL && tunnelAdapter.Certificate == null) + if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); @@ -278,7 +278,7 @@ namespace linker.tunnel.transport SslStream sslStream = null; if (_state.SSL) { - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Error($"{Name}-> ssl Certificate not found"); socket.SafeClose(); @@ -286,7 +286,7 @@ namespace linker.tunnel.transport } sslStream = new SslStream(new NetworkStream(socket, false), false); - await sslStream.AuthenticateAsServerAsync(tunnelAdapter.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); + await sslStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); } TunnelConnectionTcp result = new TunnelConnectionTcp diff --git a/linker.tunnel/transport/TransportTcpP2PNAT.cs b/linker.tunnel/transport/TransportTcpP2PNAT.cs index 42a5265c..46e854fa 100644 --- a/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -1,4 +1,4 @@ -using linker.tunnel.adapter; + using linker.tunnel.connection; using linker.libs; using linker.libs.extends; @@ -54,15 +54,15 @@ namespace linker.tunnel.transport private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); - - - private ITunnelAdapter tunnelAdapter; + public TransportTcpP2PNAT() { } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + + private X509Certificate2 certificate; + public void SetSSL(X509Certificate2 certificate) { - this.tunnelAdapter = tunnelAdapter; + this.certificate = certificate; } /// @@ -96,7 +96,7 @@ namespace linker.tunnel.transport /// public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) { - if (tunnelTransportInfo.SSL && tunnelAdapter.Certificate == null) + if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); @@ -217,7 +217,7 @@ namespace linker.tunnel.transport SslStream sslStream = null; if (state.SSL) { - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Error($"{Name}-> ssl Certificate not found"); socket.SafeClose(); @@ -225,7 +225,7 @@ namespace linker.tunnel.transport } sslStream = new SslStream(new NetworkStream(socket, false), false); - await sslStream.AuthenticateAsServerAsync(tunnelAdapter.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); + await sslStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); } return new TunnelConnectionTcp diff --git a/linker.tunnel/transport/TransportTcpPortMap.cs b/linker.tunnel/transport/TransportTcpPortMap.cs index 8b40cf41..731b68b6 100644 --- a/linker.tunnel/transport/TransportTcpPortMap.cs +++ b/linker.tunnel/transport/TransportTcpPortMap.cs @@ -6,7 +6,6 @@ using System.Text; using linker.libs.extends; using System.Collections.Concurrent; using linker.libs; -using linker.tunnel.adapter; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Authentication; @@ -44,13 +43,14 @@ namespace linker.tunnel.transport private readonly ConcurrentDictionary> distDic = new ConcurrentDictionary>(); - private ITunnelAdapter tunnelAdapter; + public TransportTcpPortMap() { } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + private X509Certificate2 certificate; + public void SetSSL(X509Certificate2 certificate) { - this.tunnelAdapter = tunnelAdapter; + this.certificate = certificate; } @@ -181,7 +181,7 @@ namespace linker.tunnel.transport } public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) { - if (tunnelTransportInfo.SSL && tunnelAdapter.Certificate == null) + if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); @@ -246,7 +246,7 @@ namespace linker.tunnel.transport SslStream sslStream = null; if (tunnelTransportInfo.SSL) { - if (tunnelAdapter.Certificate == null) + if (certificate == null) { LoggerHelper.Instance.Error($"{Name}-> ssl Certificate not found"); socket.SafeClose(); @@ -254,7 +254,7 @@ namespace linker.tunnel.transport } sslStream = new SslStream(new NetworkStream(socket, false), false); - await sslStream.AuthenticateAsServerAsync(tunnelAdapter.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); + await sslStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); } TunnelConnectionTcp result = new TunnelConnectionTcp diff --git a/linker.tunnel/transport/TransportUdp.cs b/linker.tunnel/transport/TransportUdp.cs index 2d20d676..9e4163ab 100644 --- a/linker.tunnel/transport/TransportUdp.cs +++ b/linker.tunnel/transport/TransportUdp.cs @@ -6,7 +6,7 @@ using System.Net; using System.Net.Sockets; using System.Text; using linker.tunnel.wanport; -using linker.tunnel.adapter; +using System.Security.Cryptography.X509Certificates; namespace linker.tunnel.transport { @@ -53,7 +53,7 @@ namespace linker.tunnel.transport public TransportUdp() { } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + public void SetSSL(X509Certificate2 certificate) { } diff --git a/linker.tunnel/transport/TransportUdpPortMap.cs b/linker.tunnel/transport/TransportUdpPortMap.cs index 50239408..05e790e3 100644 --- a/linker.tunnel/transport/TransportUdpPortMap.cs +++ b/linker.tunnel/transport/TransportUdpPortMap.cs @@ -6,7 +6,7 @@ using System.Text; using linker.libs.extends; using System.Collections.Concurrent; using linker.libs; -using linker.tunnel.adapter; +using System.Security.Cryptography.X509Certificates; namespace linker.tunnel.transport { @@ -46,14 +46,15 @@ namespace linker.tunnel.transport private readonly ConcurrentDictionary> distDic = new ConcurrentDictionary>(); private readonly ConcurrentDictionary connectionsDic = new ConcurrentDictionary(new IPEndPointComparer()); - private ITunnelAdapter tunnelAdapter; + public TransportUdpPortMap() { CleanTask(); } - public void SetAdapter(ITunnelAdapter tunnelAdapter) + private X509Certificate2 certificate; + public void SetSSL(X509Certificate2 certificate) { - this.tunnelAdapter = tunnelAdapter; + this.certificate = certificate; } Socket socket; @@ -197,7 +198,7 @@ namespace linker.tunnel.transport } public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) { - if (tunnelTransportInfo.SSL && tunnelAdapter.Certificate == null) + if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); diff --git a/linker.tunnel/wanport/TunnelWanPortTransfer.cs b/linker.tunnel/wanport/TunnelWanPortTransfer.cs index 5e6a734b..0b6c7798 100644 --- a/linker.tunnel/wanport/TunnelWanPortTransfer.cs +++ b/linker.tunnel/wanport/TunnelWanPortTransfer.cs @@ -1,5 +1,4 @@ using linker.libs; -using linker.tunnel.adapter; using System.Net; namespace linker.tunnel.wanport @@ -13,14 +12,10 @@ namespace linker.tunnel.wanport public List Protocols => tunnelWanPorts.Select(p => p.ProtocolType).ToList(); - private readonly ITunnelAdapter tunnelAdapter; - public TunnelWanPortTransfer(ITunnelAdapter tunnelAdapter) + public TunnelWanPortTransfer() { - this.tunnelAdapter = tunnelAdapter; } - - /// /// 加载所有外网端口协议 /// @@ -37,14 +32,13 @@ namespace linker.tunnel.wanport /// /// 你的局域网IP /// - public async Task GetWanPortAsync(IPAddress localIP, TunnelWanPortProtocolType protocolType) + public async Task GetWanPortAsync(IPEndPoint server,IPAddress localIP, TunnelWanPortProtocolType protocolType) { var tunnelWanPort = tunnelWanPorts.FirstOrDefault(c => c.ProtocolType == protocolType); if (tunnelWanPort == null) return null; try { - if (tunnelAdapter.ServerHost == null) return null; - TunnelWanPortEndPoint wanPort = await tunnelWanPort.GetAsync(localIP, tunnelAdapter.ServerHost).ConfigureAwait(false); + TunnelWanPortEndPoint wanPort = await tunnelWanPort.GetAsync(localIP, server).ConfigureAwait(false); if (wanPort != null) { wanPort.Local.Address = localIP; diff --git a/linker/config/Config.cs b/linker/config/Config.cs index a7cacdfa..dc9957ac 100644 --- a/linker/config/Config.cs +++ b/linker/config/Config.cs @@ -146,7 +146,6 @@ namespace linker.config public IConfig PropertyMethod { get; set; } } - public interface IConfig { public string Serialize(object obj); @@ -217,7 +216,6 @@ namespace linker.config } } - [AttributeUsage(AttributeTargets.Class)] public class JsonAotAttribute : Attribute { } } diff --git a/linker/plugins/relay/client/RelayTestTransfer.cs b/linker/plugins/relay/client/RelayTestTransfer.cs index f7181077..c090b153 100644 --- a/linker/plugins/relay/client/RelayTestTransfer.cs +++ b/linker/plugins/relay/client/RelayTestTransfer.cs @@ -12,7 +12,6 @@ namespace linker.plugins.relay.client /// public sealed class RelayTestTransfer { - private readonly FileConfig fileConfig; private readonly RelayTransfer relayTransfer; private readonly ClientSignInState clientSignInState; private readonly ClientConfigTransfer clientConfigTransfer; @@ -20,9 +19,8 @@ namespace linker.plugins.relay.client public List Nodes { get; private set; } = new List(); - public RelayTestTransfer(FileConfig fileConfig, RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + public RelayTestTransfer( RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer) { - this.fileConfig = fileConfig; this.relayTransfer = relayTransfer; this.clientSignInState = clientSignInState; this.clientConfigTransfer = clientConfigTransfer; diff --git a/linker/plugins/socks5/TunnelProxy.cs b/linker/plugins/socks5/TunnelProxy.cs index 0d85db7d..159cd493 100644 --- a/linker/plugins/socks5/TunnelProxy.cs +++ b/linker/plugins/socks5/TunnelProxy.cs @@ -54,17 +54,6 @@ namespace linker.plugins.socks5 if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Error(ex); } - /* - bool online = await clientSignInTransfer.GetOnline(connection.RemoteMachineId); - if (online == false) - { - foreach (var item in ip2MachineDic.Where(c => c.Value == connection.RemoteMachineId).Select(c => c.Key).ToList()) - { - ip2MachineDic.TryRemove(item, out string str); - } - RefreshConfig(); - } - */ await Task.CompletedTask; } /// diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index eb74b6cb..05044921 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -1,46 +1,73 @@ -using linker.client.config; -using linker.config; -using linker.plugins.tunnel.messenger; -using linker.tunnel.adapter; +using linker.plugins.tunnel.messenger; using linker.tunnel.transport; using linker.libs; using MemoryPack; using System.Net; -using System.Security.Cryptography.X509Certificates; using linker.plugins.client; using linker.plugins.messenger; using linker.plugins.tunnel.excludeip; +using linker.tunnel.wanport; +using linker.tunnel; namespace linker.plugins.tunnel { - public sealed class TunnelAdapter : ITunnelAdapter + public sealed class TunnelAdapter { - public IPAddress LocalIP => clientSignInState.Connection?.LocalAddress.Address ?? IPAddress.Any; - public IPEndPoint ServerHost => clientSignInState.Connection?.Address ?? null; - public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate; - private readonly ClientSignInState clientSignInState; private readonly IMessengerSender messengerSender; + private readonly TunnelExcludeIPTransfer excludeIPTransfer; private readonly ClientConfigTransfer clientConfigTransfer; private readonly TunnelConfigTransfer tunnelConfigTransfer; - public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer) + private readonly TunnelWanPortTransfer tunnelWanPortTransfer; + private readonly TunnelUpnpTransfer tunnelUpnpTransfer; + private readonly TunnelTransfer tunnelTransfer; + + public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, + TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, + TunnelWanPortTransfer tunnelWanPortTransfer, TunnelUpnpTransfer tunnelUpnpTransfer, TunnelTransfer tunnelTransfer) { this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; this.excludeIPTransfer = excludeIPTransfer; this.clientConfigTransfer = clientConfigTransfer; this.tunnelConfigTransfer = tunnelConfigTransfer; - } - public List GetTunnelTransports() - { - return tunnelConfigTransfer.Transports; - } - public void SetTunnelTransports(List transports, bool updateVersion) - { - tunnelConfigTransfer.SetTransports(transports); + this.tunnelWanPortTransfer = tunnelWanPortTransfer; + this.tunnelUpnpTransfer = tunnelUpnpTransfer; + this.tunnelTransfer = tunnelTransfer; + + tunnelWanPortTransfer.LoadTransports(new List + { + new TunnelWanPortProtocolLinkerUdp(), + new TunnelWanPortProtocolLinkerTcp(), + }); + + tunnelTransfer.LocalIP = () => clientSignInState.Connection?.LocalAddress.Address ?? IPAddress.Any; + tunnelTransfer.ServerHost = () => clientSignInState.Connection?.Address ?? null; + tunnelTransfer.Certificate = () => tunnelConfigTransfer.Certificate; + tunnelTransfer.GetTunnelTransports = () => tunnelConfigTransfer.Transports; + tunnelTransfer.SetTunnelTransports = (transports,update) => tunnelConfigTransfer.SetTransports(transports); + tunnelTransfer.GetLocalConfig = GetLocalConfig; + tunnelTransfer.GetRemoteWanPort = GetRemoteWanPort; + tunnelTransfer.SendConnectBegin = SendConnectBegin; + tunnelTransfer.SendConnectFail = SendConnectFail; + tunnelTransfer.SendConnectSuccess = SendConnectSuccess; + tunnelTransfer.LoadTransports(tunnelWanPortTransfer, tunnelUpnpTransfer, new List { + new TunnelTransportTcpNutssb(), + new TransportMsQuic(), + new TransportTcpP2PNAT(), + new TransportTcpPortMap(), + new TransportUdpPortMap(), + new TransportUdp(), + }); + + clientSignInState.NetworkEnabledHandle += (times) => + { + RefreshPortMap(); + }; + tunnelConfigTransfer.OnChanged += RefreshPortMap; } public NetworkInfo GetLocalConfig() @@ -70,6 +97,7 @@ namespace linker.plugins.tunnel MachineId = clientConfigTransfer.Id }; } + public async Task GetRemoteWanPort(TunnelWanPortProtocolInfo info) { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap @@ -118,5 +146,17 @@ namespace linker.plugins.tunnel return true; } + + private void RefreshPortMap() + { + if (tunnelConfigTransfer.PortMapLan > 0) + { + tunnelUpnpTransfer.SetMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); + } + else + { + tunnelUpnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address, 18180); + } + } } } diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs index a10d7941..83489ced 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker/plugins/tunnel/TunnelApiController.cs @@ -1,6 +1,5 @@ using linker.config; using linker.plugins.tunnel.messenger; -using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs.api; using linker.libs.extends; @@ -20,27 +19,23 @@ namespace linker.plugins.tunnel /// public sealed class TunnelApiController : IApiClientController { - private readonly FileConfig config; - private readonly TunnelWanPortTransfer compactTransfer; private readonly ClientSignInState clientSignInState; private readonly IMessengerSender messengerSender; private readonly TunnelConfigTransfer tunnelConfigTransfer; - private readonly ITunnelAdapter tunnelMessengerAdapter; private readonly TunnelExcludeIPTransfer excludeIPTransfer; private readonly AccessTransfer accessTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly TunnelDecenter tunnelDecenter; - public TunnelApiController(FileConfig config, TunnelWanPortTransfer compactTransfer, ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter, TunnelExcludeIPTransfer excludeIPTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public TunnelApiController(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, TunnelExcludeIPTransfer excludeIPTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, TunnelDecenter tunnelDecenter) { - this.config = config; - this.compactTransfer = compactTransfer; this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; this.tunnelConfigTransfer = tunnelConfigTransfer; - this.tunnelMessengerAdapter = tunnelMessengerAdapter; this.excludeIPTransfer = excludeIPTransfer; this.accessTransfer = accessTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.tunnelDecenter = tunnelDecenter; } /// @@ -51,11 +46,11 @@ namespace linker.plugins.tunnel public TunnelListInfo Get(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (tunnelConfigTransfer.Version.Eq(hashCode, out ulong version) == false) + if (tunnelDecenter.Version.Eq(hashCode, out ulong version) == false) { return new TunnelListInfo { - List = tunnelConfigTransfer.Config, + List = tunnelDecenter.Config, HashCode = version }; } @@ -67,7 +62,7 @@ namespace linker.plugins.tunnel /// public void Refresh(ApiControllerParamsInfo param) { - tunnelConfigTransfer.RefreshConfig(); + tunnelDecenter.Refresh(); } /// @@ -105,7 +100,7 @@ namespace linker.plugins.tunnel /// public List GetTransports(ApiControllerParamsInfo param) { - return tunnelMessengerAdapter.GetTunnelTransports(); + return tunnelConfigTransfer.Transports; } /// /// 设置打洞协议 @@ -116,7 +111,7 @@ namespace linker.plugins.tunnel public bool SetTransports(ApiControllerParamsInfo param) { List info = param.Content.DeJson>(); - tunnelMessengerAdapter.SetTunnelTransports(info, true); + tunnelConfigTransfer.SetTransports(info); return true; } diff --git a/linker/plugins/tunnel/TunnelBase.cs b/linker/plugins/tunnel/TunnelBase.cs index 734db4a8..82f09067 100644 --- a/linker/plugins/tunnel/TunnelBase.cs +++ b/linker/plugins/tunnel/TunnelBase.cs @@ -1,5 +1,4 @@ -using linker.config; -using linker.libs; +using linker.libs; using linker.libs.extends; using linker.plugins.client; using linker.tunnel; @@ -7,7 +6,6 @@ using linker.tunnel.connection; using System.Collections.Concurrent; using linker.plugins.relay.client; using linker.plugins.pcp; -using linker.client.config; namespace linker.plugins.tunnel { diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs index c44a83ad..cd92ede7 100644 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs @@ -2,26 +2,22 @@ using linker.config; using linker.libs; using linker.plugins.client; -using linker.plugins.decenter; using linker.plugins.messenger; using linker.tunnel; using linker.tunnel.transport; -using MemoryPack; -using System.Collections.Concurrent; using System.Net; using System.Net.Quic; using System.Security.Cryptography.X509Certificates; namespace linker.plugins.tunnel { - public sealed class TunnelConfigTransfer : IDecenter + public sealed class TunnelConfigTransfer { - public string Name => "tunnel"; - public VersionManager DataVersion { get; } = new VersionManager(); - public int RouteLevel => config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus; public IPAddress[] LocalIPs => config.Data.Client.Tunnel.LocalIPs; public IPAddress[] RouteIPs => config.Data.Client.Tunnel.RouteIPs; + public int PortMapLan => running.Data.Tunnel.PortMapLan; + public int PortMapWan => running.Data.Tunnel.PortMapWan; public List Transports => config.Data.Client.Tunnel.Transports; public X509Certificate2 Certificate { get; private set; } @@ -32,8 +28,7 @@ namespace linker.plugins.tunnel private readonly TunnelUpnpTransfer upnpTransfer; private readonly ClientConfigTransfer clientConfigTransfer; - public VersionManager Version { get; } = new VersionManager(); - public ConcurrentDictionary Config { get; } = new ConcurrentDictionary(); + public Action OnChanged { get; set; } = () => { }; public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer) { @@ -52,36 +47,10 @@ namespace linker.plugins.tunnel clientSignInState.NetworkEnabledHandle += (times) => { TimerHelper.Async(RefreshRouteLevel); - RefreshPortMap(); }; TestQuic(); } - public Memory GetData() - { - TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel(); - Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - Version.Add(); - return MemoryPackSerializer.Serialize(tunnelTransportRouteLevelInfo); - } - public void SetData(Memory data) - { - TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = MemoryPackSerializer.Deserialize(data.Span); - Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - Version.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var item in list) - { - Config.AddOrUpdate(item.MachineId, item, (a, b) => item); - } - TunnelTransportRouteLevelInfo config = GetLocalRouteLevel(); - Config.AddOrUpdate(config.MachineId, config, (a, b) => config); - Version.Add(); - } - public void SetTransports(List transports) { config.Data.Client.Tunnel.Transports = transports; @@ -96,16 +65,9 @@ namespace linker.plugins.tunnel config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List ips); config.Data.Client.Tunnel.RouteIPs = ips.ToArray(); config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); - DataVersion.Add(); + OnChanged(); } - /// - /// 刷新关于隧道的配置信息,也就是获取自己的和别的客户端的,方便查看 - /// - public void RefreshConfig() - { - DataVersion.Add(); - } /// /// 修改自己的网关层级信息 /// @@ -116,10 +78,9 @@ namespace linker.plugins.tunnel running.Data.Tunnel.PortMapWan = tunnelTransportFileConfigInfo.PortMapWan; running.Data.Tunnel.PortMapLan = tunnelTransportFileConfigInfo.PortMapLan; running.Data.Update(); - GetData(); - DataVersion.Add(); + OnChanged(); } - private TunnelTransportRouteLevelInfo GetLocalRouteLevel() + public TunnelTransportRouteLevelInfo GetLocalRouteLevel() { return new TunnelTransportRouteLevelInfo { @@ -172,16 +133,6 @@ namespace linker.plugins.tunnel } } } - private void RefreshPortMap() - { - if (running.Data.Tunnel.PortMapLan > 0) - { - upnpTransfer.SetMap(running.Data.Tunnel.PortMapLan, running.Data.Tunnel.PortMapWan); - } - else - { - upnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address, 18180); - } - } + } } diff --git a/linker/plugins/tunnel/TunnelDecenter.cs b/linker/plugins/tunnel/TunnelDecenter.cs new file mode 100644 index 00000000..a799dcea --- /dev/null +++ b/linker/plugins/tunnel/TunnelDecenter.cs @@ -0,0 +1,55 @@ +using linker.config; +using linker.libs; +using linker.plugins.decenter; +using MemoryPack; +using System.Collections.Concurrent; +namespace linker.plugins.tunnel +{ + public sealed class TunnelDecenter:IDecenter + { + public string Name => "tunnel"; + public VersionManager DataVersion { get; } = new VersionManager(); + + public VersionManager Version { get; } = new VersionManager(); + public ConcurrentDictionary Config { get; } = new ConcurrentDictionary(); + + private readonly TunnelConfigTransfer tunnelConfigTransfer; + public TunnelDecenter(TunnelConfigTransfer tunnelConfigTransfer) + { + this.tunnelConfigTransfer = tunnelConfigTransfer; + tunnelConfigTransfer.OnChanged += Refresh; + } + + /// + /// 刷新关于隧道的配置信息,也就是获取自己的和别的客户端的,方便查看 + /// + public void Refresh() + { + DataVersion.Add(); + } + public Memory GetData() + { + TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = tunnelConfigTransfer.GetLocalRouteLevel(); + Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); + Version.Add(); + return MemoryPackSerializer.Serialize(tunnelTransportRouteLevelInfo); + } + public void SetData(Memory data) + { + TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = MemoryPackSerializer.Deserialize(data.Span); + Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); + Version.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + foreach (var item in list) + { + Config.AddOrUpdate(item.MachineId, item, (a, b) => item); + } + TunnelTransportRouteLevelInfo config = tunnelConfigTransfer.GetLocalRouteLevel(); + Config.AddOrUpdate(config.MachineId, config, (a, b) => config); + Version.Add(); + } + } +} diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs index 705f3651..ed0aeea6 100644 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ b/linker/plugins/tunnel/TunnelStartup.cs @@ -2,12 +2,9 @@ using linker.plugins.tunnel.messenger; using linker.startup; using linker.tunnel; -using linker.tunnel.adapter; -using linker.tunnel.transport; using linker.libs; using MemoryPack; using Microsoft.Extensions.DependencyInjection; -using System.Net; using linker.tunnel.wanport; using linker.plugins.tunnel.excludeip; using linker.plugins.client; @@ -36,7 +33,6 @@ namespace linker.plugins.tunnel MemoryPackFormatterProvider.Register(new TunnelTransportInfoFormatter()); MemoryPackFormatterProvider.Register(new TunnelWanPortProtocolInfoFormatter()); - //管理接口 serviceCollection.AddSingleton(); //命令接口 @@ -44,30 +40,18 @@ namespace linker.plugins.tunnel //外网端口协议 serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - //打洞协议 serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config) @@ -83,36 +67,14 @@ namespace linker.plugins.tunnel public void UseClient(ServiceProvider serviceProvider, FileConfig config) { - ITunnelAdapter tunnelAdapter = serviceProvider.GetService(); - TunnelUpnpTransfer upnpTransfer = serviceProvider.GetService(); - - IEnumerable types = new List { - typeof(TunnelWanPortProtocolLinkerUdp), - typeof(TunnelWanPortProtocolLinkerTcp) - }; - List compacts = types.Select(c => (ITunnelWanPortProtocol)serviceProvider.GetService(c)).Where(c => c != null).Where(c => string.IsNullOrWhiteSpace(c.Name) == false).ToList(); - TunnelWanPortTransfer compack = serviceProvider.GetService(); - compack.LoadTransports(compacts); - - - types = new List { - typeof(TunnelTransportTcpNutssb), - typeof(TransportMsQuic), - typeof(TransportTcpP2PNAT), - typeof(TransportTcpPortMap), - typeof(TransportUdpPortMap), - typeof(TransportUdp), - }; - List transports = types.Select(c => (ITunnelTransport)serviceProvider.GetService(c)).Where(c => c != null).Where(c => string.IsNullOrWhiteSpace(c.Name) == false).ToList(); - TunnelTransfer tunnel = serviceProvider.GetService(); - tunnel.LoadTransports(compack, tunnelAdapter, upnpTransfer, transports); - TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService(); TunnelExcludeIPTypesLoader tunnelExcludeIPTypesLoader = serviceProvider.GetService(); ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService(); TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService(); + TunnelAdapter tunnelAdapter = serviceProvider.GetService(); + LoggerHelper.Instance.Info($"tunnel route level getting."); tunnelConfigTransfer.RefreshRouteLevel(); LoggerHelper.Instance.Warning($"route ips:{string.Join(",", tunnelConfigTransfer.RouteIPs.Select(c => c.ToString()))}"); diff --git a/linker/plugins/tunnel/config/Config.cs b/linker/plugins/tunnel/config/Config.cs index 3b9a5641..813b1492 100644 --- a/linker/plugins/tunnel/config/Config.cs +++ b/linker/plugins/tunnel/config/Config.cs @@ -5,7 +5,6 @@ using LiteDB; using MemoryPack; using System.Net; using System.Text.Json.Serialization; -using linker.tunnel.adapter; namespace linker.client.config diff --git a/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs b/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs index fad1e25d..bdc04ea4 100644 --- a/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs +++ b/linker/plugins/tunnel/excludeip/TunnelExcludeIPTransfer.cs @@ -1,8 +1,6 @@ using linker.client.config; using linker.config; -using linker.libs; using linker.plugins.client; -using MemoryPack; namespace linker.plugins.tunnel.excludeip { diff --git a/linker/plugins/tunnel/messenger/TunnelMessenger.cs b/linker/plugins/tunnel/messenger/TunnelMessenger.cs index a2a80fa5..d3497f96 100644 --- a/linker/plugins/tunnel/messenger/TunnelMessenger.cs +++ b/linker/plugins/tunnel/messenger/TunnelMessenger.cs @@ -1,7 +1,6 @@ using linker.config; using linker.plugins.signin.messenger; using linker.tunnel; -using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs; using MemoryPack; diff --git a/linker/plugins/tuntap/TuntapAdapter.cs b/linker/plugins/tuntap/TuntapAdapter.cs new file mode 100644 index 00000000..8c7780bd --- /dev/null +++ b/linker/plugins/tuntap/TuntapAdapter.cs @@ -0,0 +1,237 @@ +using linker.libs; +using linker.plugins.client; +using linker.plugins.tunnel; +using linker.plugins.tuntap.config; +using linker.tun; +using System.Net; + +namespace linker.plugins.tuntap +{ + public sealed class TuntapAdapter : ILinkerTunDeviceCallback + { + private List forwardItems = new List(); + private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0]; + + private readonly TuntapTransfer tuntapTransfer; + private readonly TuntapConfigTransfer tuntapConfigTransfer; + private readonly TuntapDecenter tuntapDecenter; + private readonly TuntapProxy tuntapProxy; + private readonly ClientSignInState clientSignInState; + private readonly TunnelConfigTransfer tunnelConfigTransfer; + private readonly ClientConfigTransfer clientConfigTransfer; + + public TuntapAdapter(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapDecenter tuntapDecenter, TuntapProxy tuntapProxy, + ClientSignInState clientSignInState, TunnelConfigTransfer tunnelConfigTransfer, ClientConfigTransfer clientConfigTransfer) + { + this.tuntapTransfer = tuntapTransfer; + this.tuntapConfigTransfer = tuntapConfigTransfer; + this.tuntapDecenter = tuntapDecenter; + this.tuntapProxy = tuntapProxy; + this.clientSignInState = clientSignInState; + this.tunnelConfigTransfer = tunnelConfigTransfer; + this.clientConfigTransfer = clientConfigTransfer; + + //初始化网卡 + tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this); + //与服务器连接,刷新一下IP + clientSignInState.NetworkEnabledHandle += (times) => tuntapConfigTransfer.RefreshIP(); + //配置又更新,去同步一下 + tuntapConfigTransfer.OnUpdate += tuntapDecenter.Refresh; + //配置发生变化,重启网卡 + tuntapConfigTransfer.OnChanged += RetstartDevice; + + //收到新的信息,添加一下路由 + tuntapDecenter.OnChangeBefore += DelRoute; + tuntapDecenter.OnChangeAfter += AddRoute; + tuntapDecenter.OnReset += tuntapProxy.ClearIPs; + tuntapDecenter.HandleCurrentInfo = GetCurrentInfo; + + //网卡状态发生变化,同步一下信息 + tuntapTransfer.OnSetupBefore += tuntapDecenter.Refresh; + tuntapTransfer.OnSetupAfter += tuntapDecenter.Refresh; + tuntapTransfer.OnSetupSuccess += () => { tuntapDecenter.Refresh(); AddForward(); tuntapConfigTransfer.SetRunning(true); }; + tuntapTransfer.OnShutdownBefore += tuntapDecenter.Refresh; + tuntapTransfer.OnShutdownAfter += tuntapDecenter.Refresh; + tuntapTransfer.OnShutdownSuccess += () => { tuntapDecenter.Refresh(); DeleteForward(); tuntapConfigTransfer.SetRunning(false); }; + + //隧道关闭 + tuntapProxy.OnTunnelClose += async (connection) => { tuntapDecenter.Refresh(); await Task.CompletedTask; }; + //收到隧道数据包,写入网卡 + tuntapProxy.OnReceivePacket += async (connection, buffer) => { tuntapTransfer.Write(buffer); await Task.CompletedTask; }; + //IP没找到,是否需要同步一下数据 + tuntapProxy.OnIPNotFound += (ip) => tuntapDecenter.Refresh(); + + } + private TuntapInfo GetCurrentInfo() + { + return new TuntapInfo + { + IP = tuntapConfigTransfer.Info.IP, + Lans = tuntapConfigTransfer.Info.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), + PrefixLength = tuntapConfigTransfer.Info.PrefixLength, + MachineId = clientConfigTransfer.Id, + Status = tuntapTransfer.Status, + SetupError = tuntapTransfer.SetupError, + NatError = tuntapTransfer.NatError, + SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}", + + Forwards = tuntapConfigTransfer.Info.Forwards, + Switch = tuntapConfigTransfer.Info.Switch + }; + } + + public async Task Callback(LinkerTunDevicPacket packet) + { + if (packet.IPV4Broadcast || packet.IPV6Multicast) + { + if ((tuntapConfigTransfer.Switch & TuntapSwitch.Multicast) == TuntapSwitch.Multicast) + { + return; + } + } + await tuntapProxy.InputPacket(packet); + } + + /// + /// 重启网卡 + /// + /// + public async Task RetstartDevice() + { + tuntapTransfer.Shutdown(); + await tuntapConfigTransfer.RefreshIPASync(); + tuntapTransfer.Setup(tuntapConfigTransfer.Info.IP, tuntapConfigTransfer.Info.PrefixLength); + } + /// + /// 关闭网卡 + /// + public void StopDevice() + { + tuntapTransfer.Shutdown(); + } + + // + /// 添加端口转发 + /// + private void AddForward() + { + var temp = ParseForwardItems(); + var removes = forwardItems.Except(temp, new LinkerTunDeviceForwardItemComparer()); + if (removes.Any()) + { + tuntapTransfer.RemoveForward(removes.ToList()); + } + forwardItems = temp; + tuntapTransfer.AddForward(forwardItems); + } + /// + /// 删除端口转发 + /// + public void DeleteForward() + { + tuntapTransfer.RemoveForward(forwardItems); + } + private List ParseForwardItems() + { + return tuntapConfigTransfer.Info.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList(); + } + + /// + /// 删除路由 + /// + private void DelRoute() + { + if (routeItems != null) + tuntapTransfer.DelRoute(routeItems); + } + /// + /// 添加路由 + /// + private void AddRoute() + { + List ipsList = ParseIPs(tuntapDecenter.Infos.Values.ToList()); + TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); + routeItems = ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.PrefixLength }).ToArray(); + + tuntapTransfer.AddRoute(routeItems, tuntapConfigTransfer.Info.IP); + + tuntapProxy.SetIPs(ips); + foreach (var item in tuntapDecenter.Infos.Values) + { + tuntapProxy.SetIP(item.MachineId, NetworkHelper.IP2Value(item.IP)); + } + foreach (var item in tuntapDecenter.Infos.Values.Where(c => c.IP.Equals(IPAddress.Any))) + { + tuntapProxy.RemoveIP(item.MachineId); + } + } + + private List ParseIPs(List infos) + { + //排除的IP, + uint[] excludeIps =//本机局域网IP + tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + //路由上的IP + .Concat(tunnelConfigTransfer.RouteIPs) + //网卡IP 服务器IP + .Concat(new IPAddress[] { tuntapConfigTransfer.Info.IP, clientSignInState.Connection.Address.Address }) + //网卡配置的局域网IP + .Concat(tuntapConfigTransfer.Info.Lans.Select(c => c.IP)) + .Select(NetworkHelper.IP2Value) + .ToArray(); + + HashSet hashSet = new HashSet(); + + return infos + .Where(c => c.MachineId != clientConfigTransfer.Id) + .OrderByDescending(c => c.Status) + .OrderByDescending(c => c.LastTicks.Value) + + .Select(c => + { + var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c => + { + uint ipInt = NetworkHelper.IP2Value(c.IP); + uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength); + uint network = ipInt & maskValue; + c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network); + hashSet.Add(network); + return c.Exists == false; + }); + + return new TuntapVeaLanIPAddressList + { + MachineId = c.MachineId, + IPS = ParseIPs(lans.ToList(), c.MachineId) + .Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(), + }; + }).ToList(); + } + private List ParseIPs(List lans, string machineid) + { + return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) => + { + return ParseIPAddress(c.IP, c.PrefixLength, machineid); + + }).ToList(); + } + private TuntapVeaLanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid) + { + uint ipInt = NetworkHelper.IP2Value(ip); + //掩码十进制 + uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength); + return new TuntapVeaLanIPAddress + { + IPAddress = ipInt, + PrefixLength = prefixLength, + MaskValue = maskValue, + NetWork = ipInt & maskValue, + Broadcast = ipInt | ~maskValue, + OriginIPAddress = ip, + MachineId = machineid + }; + } + + + } +} diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs index 6fb876ee..b023b410 100644 --- a/linker/plugins/tuntap/TuntapApiController.cs +++ b/linker/plugins/tuntap/TuntapApiController.cs @@ -22,28 +22,30 @@ namespace linker.plugins.tuntap private readonly IMessengerSender messengerSender; private readonly TuntapTransfer tuntapTransfer; private readonly ClientSignInState clientSignInState; - private readonly FileConfig config; private readonly TuntapProxy tuntapProxy; - private readonly RunningConfig runningConfig; private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly LeaseClientTreansfer leaseClientTreansfer; private readonly TuntapPingTransfer pingTransfer; private readonly AccessTransfer accessTransfer; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly TuntapDecenter tuntapDecenter; + private readonly TuntapAdapter tuntapAdapter; - public TuntapClientApiController(IMessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapConfigTransfer tuntapConfigTransfer, LeaseClientTreansfer leaseClientTreansfer, TuntapPingTransfer pingTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer) + public TuntapClientApiController(IMessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, + TuntapProxy tuntapProxy,TuntapConfigTransfer tuntapConfigTransfer, LeaseClientTreansfer leaseClientTreansfer, + TuntapPingTransfer pingTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, TuntapDecenter tuntapDecenter, TuntapAdapter tuntapAdapter) { this.messengerSender = messengerSender; this.tuntapTransfer = tuntapTransfer; this.clientSignInState = clientSignInState; - this.config = config; this.tuntapProxy = tuntapProxy; - this.runningConfig = runningConfig; this.tuntapConfigTransfer = tuntapConfigTransfer; this.leaseClientTreansfer = leaseClientTreansfer; this.pingTransfer = pingTransfer; this.accessTransfer = accessTransfer; this.clientConfigTransfer = clientConfigTransfer; + this.tuntapDecenter = tuntapDecenter; + this.tuntapAdapter = tuntapAdapter; } public ConnectionListInfo Connections(ApiControllerParamsInfo param) @@ -74,11 +76,11 @@ namespace linker.plugins.tuntap public TuntabListInfo Get(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); - if (tuntapConfigTransfer.Version.Eq(hashCode, out ulong version) == false) + if (tuntapDecenter.Version.Eq(hashCode, out ulong version) == false) { return new TuntabListInfo { - List = tuntapConfigTransfer.Infos, + List = tuntapDecenter.Infos, HashCode = version }; } @@ -90,7 +92,7 @@ namespace linker.plugins.tuntap /// public void Refresh(ApiControllerParamsInfo param) { - tuntapConfigTransfer.RefreshConfig(); + tuntapDecenter.Refresh(); } /// @@ -105,7 +107,7 @@ namespace linker.plugins.tuntap { if (accessTransfer.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false; - await tuntapConfigTransfer.RetstartDevice(); + await tuntapAdapter.RetstartDevice(); } else { @@ -131,7 +133,7 @@ namespace linker.plugins.tuntap if (param.Content == clientConfigTransfer.Id) { if (accessTransfer.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false; - tuntapConfigTransfer.StopDevice(); + tuntapAdapter.StopDevice(); } else { @@ -160,7 +162,7 @@ namespace linker.plugins.tuntap if (info.MachineId == clientConfigTransfer.Id) { if (accessTransfer.HasAccess(ClientApiAccess.TuntapChangeSelf) == false) return false; - tuntapConfigTransfer.UpdateConfig(info); + tuntapConfigTransfer.Update(info); } else { diff --git a/linker/plugins/tuntap/TuntapConfigTransfer.cs b/linker/plugins/tuntap/TuntapConfigTransfer.cs index a0e29406..58cdc15a 100644 --- a/linker/plugins/tuntap/TuntapConfigTransfer.cs +++ b/linker/plugins/tuntap/TuntapConfigTransfer.cs @@ -1,413 +1,128 @@ using linker.client.config; -using linker.config; using linker.libs; -using MemoryPack; -using System.Collections.Concurrent; using System.Net; using linker.plugins.client; -using linker.plugins.messenger; using linker.plugins.tuntap.config; -using linker.tun; using linker.plugins.tuntap.lease; -using linker.plugins.decenter; -using linker.plugins.tunnel; namespace linker.plugins.tuntap { - public sealed class TuntapConfigTransfer : IDecenter + public sealed class TuntapConfigTransfer { - public string Name => "tuntap"; - public VersionManager DataVersion { get; } = new VersionManager(); + public TuntapConfigInfo Info => runningConfig.Data.Tuntap; + public IPAddress IP => Info.IP; + public bool Running => Info.Running; + public TuntapSwitch Switch => Info.Switch; - private TuntapConfigInfo configInfo => runningConfig.Data.Tuntap; - public IPAddress IP=> configInfo.IP; - public bool Running => configInfo.Running; - public TuntapSwitch Switch => configInfo.Switch; public string DeviceName => "linker"; - - private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; private readonly RunningConfig runningConfig; - private readonly TuntapTransfer tuntapTransfer; private readonly LeaseClientTreansfer leaseClientTreansfer; private readonly ClientConfigTransfer clientConfigTransfer; - private readonly TunnelConfigTransfer tunnelConfigTransfer; - private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0]; - private List forwardItems = new List(); + public Action OnUpdate { get; set; } = () => { }; + public Func OnChanged { get; set; } = async () => { await Task.CompletedTask; }; - public VersionManager Version { get; } = new VersionManager(); - private readonly ConcurrentDictionary tuntapInfos = new ConcurrentDictionary(); - public ConcurrentDictionary Infos => tuntapInfos; - - - public Action HandleReset { get; set; } - public Action HandleSetIPs { get; set; } - public Action HandleSetIP { get; set; } - public Action HandleRemoveIP { get; set; } - - - private readonly SemaphoreSlim slim = new SemaphoreSlim(1); - public TuntapConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer) + public TuntapConfigTransfer(RunningConfig runningConfig, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer) { - this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; this.runningConfig = runningConfig; - this.tuntapTransfer = tuntapTransfer; this.leaseClientTreansfer = leaseClientTreansfer; this.clientConfigTransfer = clientConfigTransfer; - this.tunnelConfigTransfer = tunnelConfigTransfer; - - clientSignInState.NetworkEnabledHandle += NetworkEnable; - - tuntapTransfer.OnSetupBefore += () => { DataVersion.Add(); }; - tuntapTransfer.OnSetupAfter += () => { DataVersion.Add(); }; - tuntapTransfer.OnSetupSuccess += () => { DataVersion.Add(); configInfo.Running = true; runningConfig.Data.Update(); AddForward(); }; - - tuntapTransfer.OnShutdownBefore += () => { DataVersion.Add(); }; - tuntapTransfer.OnShutdownAfter += () => { DataVersion.Add(); }; - tuntapTransfer.OnShutdownSuccess += () => { DataVersion.Add(); DeleteForward(); DelRoute(); configInfo.Running = false; runningConfig.Data.Update(); DataVersion.Add(); }; - - } - - string groupid = string.Empty; - private void NetworkEnable(int times) - { - if (groupid != clientConfigTransfer.Group.Id) - { - tuntapInfos.Clear(); HandleReset(); - } - groupid = clientConfigTransfer.Group.Id; - - RefreshIP(); } /// - /// 更新本机网卡信息 + /// 保存启动状态,方便下次启动时自动启动网卡 + /// + /// + public void SetRunning(bool running) + { + Info.Running = running; + runningConfig.Data.Update(); + OnUpdate(); + } + /// + /// 更新本机网卡信息,会触发事件 /// /// - public void UpdateConfig(TuntapInfo info) + public void Update(TuntapInfo info) { TimerHelper.Async(async () => { - IPAddress oldIP = configInfo.IP; - byte prefixLength = configInfo.PrefixLength; + IPAddress ip = Info.IP; + byte prefixLength = Info.PrefixLength; - configInfo.IP = info.IP ?? IPAddress.Any; - configInfo.Lans = info.Lans; - configInfo.PrefixLength = info.PrefixLength; - configInfo.Switch = info.Switch; - configInfo.Forwards = info.Forwards; + Info.IP = info.IP ?? IPAddress.Any; + Info.Lans = info.Lans; + Info.PrefixLength = info.PrefixLength; + Info.Switch = info.Switch; + Info.Forwards = info.Forwards; runningConfig.Data.Update(); - TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength }; - configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); - await LeaseIP(); + SetGroupIP(); - if ((oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running) + if ((ip.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running) { - await RetstartDevice(); - } - else - { - AddForward(); + await OnChanged(); } - GetData(); - DataVersion.Add(); + OnUpdate(); }); } - public Memory GetData() - { - TuntapInfo info = new TuntapInfo - { - IP = configInfo.IP, - Lans = configInfo.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), - PrefixLength = configInfo.PrefixLength, - MachineId = clientConfigTransfer.Id, - Status = tuntapTransfer.Status, - SetupError = tuntapTransfer.SetupError, - NatError = tuntapTransfer.NatError, - SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}", - - Forwards = configInfo.Forwards, - Switch = configInfo.Switch - }; - tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - TuntapInfo info = MemoryPackSerializer.Deserialize(data.Span); - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Debug($"tuntap got {info.IP}"); - } - - TimerHelper.Async(async () => - { - await slim.WaitAsync(); - try - { - DelRoute(); - tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); - Version.Add(); - AddRoute(); - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Error(ex); - } - } - slim.Release(); - }); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - TimerHelper.Async(async () => - { - await slim.WaitAsync(); - - try - { - DelRoute(); - foreach (var item in list) - { - tuntapInfos.AddOrUpdate(item.MachineId, item, (a, b) => item); - item.LastTicks.Update(); - } - var removes = tuntapInfos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); - foreach (var item in removes) - { - if (tuntapInfos.TryGetValue(item, out TuntapInfo tuntapInfo)) - { - tuntapInfo.Status = TuntapStatus.Normal; - tuntapInfo.LastTicks.Clear(); - } - } - Version.Add(); - AddRoute(); - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Error(ex); - } - } - finally - { - slim.Release(); - } - - }); - } - - /// - /// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来 - /// - public void RefreshConfig() - { - DataVersion.Add(); - } /// - /// 刷新IP + /// 刷新IP,会触发OnChanged事件 /// public void RefreshIP() { TimerHelper.Async(async () => { - IPAddress oldIP = configInfo.IP; - byte prefixLength = configInfo.PrefixLength; + IPAddress oldIP = Info.IP; + byte prefixLength = Info.PrefixLength; - await LeaseIP(); - while (tuntapTransfer.Status == TuntapStatus.Operating) + await RefreshIPASync(); + + if ((oldIP.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running) { - await Task.Delay(1000); + await OnChanged(); } - - bool run = (oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running - || configInfo.Running && tuntapTransfer.Status != TuntapStatus.Running; - - if (run) - { - tuntapTransfer.Shutdown(); - tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength); - } - DataVersion.Add(); + OnUpdate(); }); - } /// - /// 租赁IP + /// 刷新IP,不会触发OnChanged /// /// + public async Task RefreshIPASync() + { + LoadGroupIP(); + await LeaseIP(); + SetGroupIP(); + OnUpdate(); + } private async Task LeaseIP() { - if (configInfo.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo)) + LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(Info.IP, Info.PrefixLength); + Info.IP = leaseInfo.IP; + Info.PrefixLength = leaseInfo.PrefixLength; + runningConfig.Data.Update(); + } + + private void LoadGroupIP() + { + if (Info.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo)) { - if (tuntapGroup2IPInfo.IP.Equals(configInfo.IP) == false || tuntapGroup2IPInfo.PrefixLength != configInfo.PrefixLength) + if (tuntapGroup2IPInfo.IP.Equals(Info.IP) == false || tuntapGroup2IPInfo.PrefixLength != Info.PrefixLength) { - configInfo.IP = tuntapGroup2IPInfo.IP; - configInfo.PrefixLength = tuntapGroup2IPInfo.PrefixLength; + Info.IP = tuntapGroup2IPInfo.IP; + Info.PrefixLength = tuntapGroup2IPInfo.PrefixLength; } } - LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(configInfo.IP, configInfo.PrefixLength); - configInfo.IP = leaseInfo.IP; - configInfo.PrefixLength = leaseInfo.PrefixLength; - runningConfig.Data.Update(); - - tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength }; - configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); } - /// - /// 重启网卡 - /// - /// - public async Task RetstartDevice() + private void SetGroupIP() { - tuntapTransfer.Shutdown(); - await LeaseIP(); - tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength); + TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = Info.IP, PrefixLength = Info.PrefixLength }; + Info.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); } - /// - /// 关闭网卡 - /// - public void StopDevice() - { - tuntapTransfer.Shutdown(); - } - - - // - /// 添加端口转发 - /// - private void AddForward() - { - var temp = ParseForwardItems(); - var removes = forwardItems.Except(temp, new LinkerTunDeviceForwardItemComparer()); - if (removes.Any()) - { - tuntapTransfer.RemoveForward(removes.ToList()); - } - forwardItems = temp; - tuntapTransfer.AddForward(forwardItems); - } - /// - /// 删除端口转发 - /// - private void DeleteForward() - { - tuntapTransfer.RemoveForward(forwardItems); - } - private List ParseForwardItems() - { - return configInfo.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList(); - } - - /// - /// 删除路由 - /// - private void DelRoute() - { - if (routeItems != null) - tuntapTransfer.DelRoute(routeItems); - } - /// - /// 添加路由 - /// - private void AddRoute() - { - List ipsList = ParseIPs(tuntapInfos.Values.ToList()); - TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); - routeItems = ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.PrefixLength }).ToArray(); - - tuntapTransfer.AddRoute(routeItems, configInfo.IP); - - HandleSetIPs(ips); - foreach (var item in tuntapInfos.Values) - { - HandleSetIP(item.MachineId, NetworkHelper.IP2Value(item.IP)); - } - foreach (var item in tuntapInfos.Values.Where(c => c.IP.Equals(IPAddress.Any))) - { - HandleRemoveIP(item.MachineId); - } - Version.Add(); - } - - private List ParseIPs(List infos) - { - //排除的IP, - uint[] excludeIps =//本机局域网IP - tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - //路由上的IP - .Concat(tunnelConfigTransfer.RouteIPs) - //网卡IP 服务器IP - .Concat(new IPAddress[] { configInfo.IP, clientSignInState.Connection.Address.Address }) - //网卡配置的局域网IP - .Concat(configInfo.Lans.Select(c => c.IP)) - .Select(NetworkHelper.IP2Value) - .ToArray(); - - HashSet hashSet = new HashSet(); - - return infos - .Where(c => c.MachineId != clientConfigTransfer.Id) - .OrderByDescending(c => c.Status) - .OrderByDescending(c => c.LastTicks.Value) - - .Select(c => - { - var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c => - { - uint ipInt = NetworkHelper.IP2Value(c.IP); - uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength); - uint network = ipInt & maskValue; - c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network); - hashSet.Add(network); - return c.Exists == false; - }); - - return new TuntapVeaLanIPAddressList - { - MachineId = c.MachineId, - IPS = ParseIPs(lans.ToList(), c.MachineId) - .Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(), - }; - }).ToList(); - } - private List ParseIPs(List lans, string machineid) - { - return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) => - { - return ParseIPAddress(c.IP, c.PrefixLength, machineid); - - }).ToList(); - } - private TuntapVeaLanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid) - { - uint ipInt = NetworkHelper.IP2Value(ip); - //掩码十进制 - uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength); - return new TuntapVeaLanIPAddress - { - IPAddress = ipInt, - PrefixLength = prefixLength, - MaskValue = maskValue, - NetWork = ipInt & maskValue, - Broadcast = ipInt | ~maskValue, - OriginIPAddress = ip, - MachineId = machineid - }; - } - } } diff --git a/linker/plugins/tuntap/TuntapDecenter.cs b/linker/plugins/tuntap/TuntapDecenter.cs new file mode 100644 index 00000000..a43f2b9c --- /dev/null +++ b/linker/plugins/tuntap/TuntapDecenter.cs @@ -0,0 +1,126 @@ +using linker.libs; +using linker.plugins.client; +using linker.plugins.decenter; +using linker.plugins.tuntap.config; +using MemoryPack; +using System.Collections.Concurrent; + +namespace linker.plugins.tuntap +{ + public sealed class TuntapDecenter : IDecenter + { + public string Name => "tuntap"; + public VersionManager DataVersion { get; } = new VersionManager(); + + public VersionManager Version { get; } = new VersionManager(); + public ConcurrentDictionary Infos => tuntapInfos; + + private readonly SemaphoreSlim slim = new SemaphoreSlim(1); + private readonly ConcurrentDictionary tuntapInfos = new ConcurrentDictionary(); + + public Action OnChangeBefore { get; set; } = () => { }; + public Action OnChangeAfter { get; set; } = () => { }; + public Action OnReset { get; set; } = () => { }; + + public Func HandleCurrentInfo { get; set; } = () => { return null; }; + + private readonly ClientConfigTransfer clientConfigTransfer; + public TuntapDecenter(ClientConfigTransfer clientConfigTransfer, ClientSignInState clientSignInState) + { + this.clientConfigTransfer = clientConfigTransfer; + clientSignInState.NetworkEnabledHandle += NetworkEnable; + } + string groupid = string.Empty; + private void NetworkEnable(int times) + { + if (groupid != clientConfigTransfer.Group.Id) + { + tuntapInfos.Clear(); + OnReset(); + } + groupid = clientConfigTransfer.Group.Id; + } + + public void Refresh() + { + DataVersion.Add(); + } + + public Memory GetData() + { + TuntapInfo info = HandleCurrentInfo(); + tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); + Version.Add(); + return MemoryPackSerializer.Serialize(info); + } + public void SetData(Memory data) + { + TuntapInfo info = MemoryPackSerializer.Deserialize(data.Span); + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Debug($"tuntap got {info.IP}"); + } + + TimerHelper.Async(async () => + { + await slim.WaitAsync(); + try + { + OnChangeBefore(); + tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); + Version.Add(); + OnChangeAfter(); + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } + } + slim.Release(); + }); + } + public void SetData(List> data) + { + List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + TimerHelper.Async(async () => + { + await slim.WaitAsync(); + + try + { + OnChangeBefore(); + foreach (var item in list) + { + tuntapInfos.AddOrUpdate(item.MachineId, item, (a, b) => item); + item.LastTicks.Update(); + } + var removes = tuntapInfos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); + foreach (var item in removes) + { + if (tuntapInfos.TryGetValue(item, out TuntapInfo tuntapInfo)) + { + tuntapInfo.Status = TuntapStatus.Normal; + tuntapInfo.LastTicks.Clear(); + } + } + Version.Add(); + OnChangeAfter(); + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error(ex); + } + } + finally + { + slim.Release(); + } + + }); + } + } +} diff --git a/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs b/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs index 3d0c9b21..2e64fb03 100644 --- a/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs +++ b/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs @@ -1,28 +1,25 @@ -using linker.client.config; -using linker.libs; +using linker.libs; using linker.plugins.tuntap.config; -using linker.tun; using System.Net.NetworkInformation; namespace linker.plugins.tuntap { public sealed class TuntapDeviceStatusTransfer { - private readonly RunningConfig runningConfig; private readonly TuntapTransfer tuntapTransfer; private readonly TuntapConfigTransfer tuntapConfigTransfer; - private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter; + private readonly TuntapAdapter tuntapAdapter; private ulong setupTimes = 0; - public TuntapDeviceStatusTransfer(RunningConfig runningConfig, TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter) + public TuntapDeviceStatusTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapAdapter tuntapAdapter) { - this.runningConfig = runningConfig; this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; - this.linkerTunDeviceAdapter = linkerTunDeviceAdapter; + this.tuntapAdapter = tuntapAdapter; tuntapTransfer.OnSetupSuccess += () => { setupTimes++; }; CheckTuntapStatusTask(); + } private void CheckTuntapStatusTask() { @@ -41,11 +38,10 @@ namespace linker.plugins.tuntap if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) { LoggerHelper.Instance.Error($"tuntap inerface {tuntapConfigTransfer.DeviceName} is down, restarting"); - linkerTunDeviceAdapter.Shutdown(); await Task.Delay(5000).ConfigureAwait(false); if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) { - await tuntapConfigTransfer.RetstartDevice(); + await tuntapAdapter.RetstartDevice().ConfigureAwait(false); } } } @@ -53,18 +49,19 @@ namespace linker.plugins.tuntap { NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName); return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing(); - } - private async Task InterfacePing() - { - try + + async Task InterfacePing() { - using Ping ping = new Ping(); - PingReply pingReply = await ping.SendPingAsync(tuntapConfigTransfer.IP, 500); - return pingReply.Status == IPStatus.Success; - } - catch (Exception) - { - return false; + try + { + using Ping ping = new Ping(); + PingReply pingReply = await ping.SendPingAsync(tuntapConfigTransfer.IP, 500); + return pingReply.Status == IPStatus.Success; + } + catch (Exception) + { + return false; + } } } diff --git a/linker/plugins/tuntap/TuntapPingTransfer.cs b/linker/plugins/tuntap/TuntapPingTransfer.cs index c58b83cc..91bab2a8 100644 --- a/linker/plugins/tuntap/TuntapPingTransfer.cs +++ b/linker/plugins/tuntap/TuntapPingTransfer.cs @@ -1,10 +1,8 @@ -using linker.client.config; -using linker.libs; +using linker.libs; using linker.plugins.tuntap.config; using linker.tunnel.connection; using System.Net.NetworkInformation; using System.Net; -using linker.config; using System.Net.Sockets; using linker.libs.extends; using linker.plugins.client; @@ -17,19 +15,21 @@ namespace linker.plugins.tuntap private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapProxy tuntapProxy; private readonly ClientConfigTransfer clientConfigTransfer; + private readonly TuntapDecenter tuntapDecenter; - public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ClientConfigTransfer clientConfigTransfer) + public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ClientConfigTransfer clientConfigTransfer, TuntapDecenter tuntapDecenter) { this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapProxy = tuntapProxy; this.clientConfigTransfer = clientConfigTransfer; + this.tuntapDecenter = tuntapDecenter; PingTask(); + } private readonly LastTicksManager lastTicksManager = new LastTicksManager(); - private readonly LastTicksManager lastTicksManager1 = new LastTicksManager(); public void SubscribePing() { lastTicksManager.Update(); @@ -49,7 +49,7 @@ namespace linker.plugins.tuntap { if (tuntapTransfer.Status == TuntapStatus.Running && (tuntapConfigTransfer.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay) { - var items = tuntapConfigTransfer.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running); + var items = tuntapDecenter.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running); if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect) { var connections = tuntapProxy.GetConnections(); @@ -61,7 +61,7 @@ namespace linker.plugins.tuntap using Ping ping = new Ping(); PingReply pingReply = await ping.SendPingAsync(c.IP, 500); c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1; - tuntapConfigTransfer.Version.Add(); + tuntapDecenter.Version.Add(); })); } } diff --git a/linker/plugins/tuntap/TuntapProxy.cs b/linker/plugins/tuntap/TuntapProxy.cs index cebea36b..088248c9 100644 --- a/linker/plugins/tuntap/TuntapProxy.cs +++ b/linker/plugins/tuntap/TuntapProxy.cs @@ -1,5 +1,4 @@ -using linker.config; -using linker.tunnel; +using linker.tunnel; using linker.tunnel.connection; using linker.libs; using System.Collections.Concurrent; @@ -9,40 +8,34 @@ using System.Buffers.Binary; using linker.plugins.client; using linker.plugins.tunnel; using System.Buffers; -using linker.client.config; using linker.plugins.relay.client; using linker.plugins.pcp; namespace linker.plugins.tuntap { - public sealed class TuntapProxy : TunnelBase, ILinkerTunDeviceCallback, ITunnelConnectionReceiveCallback + public sealed class TuntapProxy : TunnelBase, ITunnelConnectionReceiveCallback { + + public Func OnTunnelClose { get; set; } = async (connection) => { await Task.CompletedTask; }; + public Func, Task> OnReceivePacket { get; set; } = async (connection, packet) => { await Task.CompletedTask; }; + public Action OnIPNotFound { get; set; } = (ip) =>{}; + + private uint[] maskValues = Array.Empty(); private readonly ConcurrentDictionary ip2MachineDic = new ConcurrentDictionary(); private readonly ConcurrentDictionary ipConnections = new ConcurrentDictionary(); private readonly OperatingMultipleManager operatingMultipleManager = new OperatingMultipleManager(); - - protected override string TransactionId => "tuntap"; - private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter; - private HashSet ipRefreshCache = new HashSet(); + protected override string TransactionId => "tuntap"; - private readonly ClientSignInTransfer clientSignInTransfer; - private readonly TuntapConfigTransfer tuntapConfigTransfer; - - public TuntapProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter, ClientSignInState clientSignInState,RelayClientConfigTransfer relayClientConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer) + public TuntapProxy(ClientConfigTransfer clientConfigTransfer, + TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, + ClientSignInTransfer clientSignInTransfer, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, + RelayClientConfigTransfer relayClientConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer) : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer) { - this.clientSignInTransfer = clientSignInTransfer; - this.linkerTunDeviceAdapter = linkerTunDeviceAdapter; - this.tuntapConfigTransfer = tuntapConfigTransfer; - - tuntapConfigTransfer.HandleReset += ClearIPs; - tuntapConfigTransfer.HandleSetIPs += SetIPs; - tuntapConfigTransfer.HandleSetIP += SetIP; - tuntapConfigTransfer.HandleRemoveIP += RemoveIP; } - + protected override void Connected(ITunnelConnection connection) { connection.BeginReceive(this, null); @@ -64,8 +57,7 @@ namespace linker.plugins.tuntap /// public async Task Receive(ITunnelConnection connection, ReadOnlyMemory buffer, object state) { - linkerTunDeviceAdapter.Write(buffer); - await Task.CompletedTask; + await OnReceivePacket(connection, buffer).ConfigureAwait(false); } /// /// 隧道关闭 @@ -75,9 +67,8 @@ namespace linker.plugins.tuntap /// public async Task Closed(ITunnelConnection connection, object state) { - tuntapConfigTransfer.RefreshConfig(); + await OnTunnelClose(connection).ConfigureAwait(false); Version.Add(); - await Task.CompletedTask; } /// @@ -85,12 +76,12 @@ namespace linker.plugins.tuntap /// /// /// - public async Task Callback(LinkerTunDevicPacket packet) + public async Task InputPacket(LinkerTunDevicPacket packet) { //IPV4广播组播、IPV6 多播 if (packet.IPV4Broadcast || packet.IPV6Multicast) { - if (connections.IsEmpty == false && (tuntapConfigTransfer.Switch & TuntapSwitch.Multicast) == 0) + if (connections.IsEmpty == false) { await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet))); } @@ -127,53 +118,6 @@ namespace linker.plugins.tuntap await connection.SendAsync(packet.Packet); } - - /// - /// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁 - /// - /// - private void SetIPs(TuntapVeaLanIPAddress[] ips) - { - var dic = ips.GroupBy(c => c.NetWork).ToDictionary(c => c.Key, d => d.Select(e => e.MachineId).ToList()); - foreach (var item in dic.Where(c => c.Value.Count > 0)) - { - string machineId = item.Value[0]; - ip2MachineDic.AddOrUpdate(item.Key, machineId, (a, b) => machineId); - - if (ipConnections.TryGetValue(item.Key, out ITunnelConnection connection) && item.Value.Count > 0 && machineId != connection.RemoteMachineId) - { - ipConnections.TryRemove(item.Key, out _); - } - } - maskValues = ips.Select(c => c.MaskValue).Distinct().OrderBy(c => c).ToArray(); - - } - /// - /// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁 - /// - /// - /// - private void SetIP(string machineId, uint ip) - { - ip2MachineDic.AddOrUpdate(ip, machineId, (a, b) => machineId); - if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId) - { - ipConnections.TryRemove(ip, out _); - } - } - /// - /// 移除 - /// - /// - private void RemoveIP(string machineId) - { - foreach (var item in ip2MachineDic.Where(c => c.Value == machineId).ToList()) - { - ipConnections.TryRemove(item.Key, out _); - ip2MachineDic.TryRemove(item.Key, out _); - } - } - /// /// 打洞或者中继 /// @@ -199,7 +143,7 @@ namespace linker.plugins.tuntap if (ipRefreshCache.Contains(ip) == false) { ipRefreshCache.Add(ip); - tuntapConfigTransfer.RefreshConfig(); + OnIPNotFound(ip); } if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { @@ -210,7 +154,10 @@ namespace linker.plugins.tuntap } - private void ClearIPs() + /// + /// 清除IP + /// + public void ClearIPs() { ip2MachineDic.Clear(); ipConnections.Clear(); @@ -220,5 +167,52 @@ namespace linker.plugins.tuntap LoggerHelper.Instance.Debug($"tuntap cache clear"); } } + + /// + /// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁 + /// + /// + public void SetIPs(TuntapVeaLanIPAddress[] ips) + { + var dic = ips.GroupBy(c => c.NetWork).ToDictionary(c => c.Key, d => d.Select(e => e.MachineId).ToList()); + foreach (var item in dic.Where(c => c.Value.Count > 0)) + { + string machineId = item.Value[0]; + ip2MachineDic.AddOrUpdate(item.Key, machineId, (a, b) => machineId); + + if (ipConnections.TryGetValue(item.Key, out ITunnelConnection connection) && item.Value.Count > 0 && machineId != connection.RemoteMachineId) + { + ipConnections.TryRemove(item.Key, out _); + } + } + maskValues = ips.Select(c => c.MaskValue).Distinct().OrderBy(c => c).ToArray(); + + } + /// + /// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁 + /// + /// + /// + public void SetIP(string machineId, uint ip) + { + ip2MachineDic.AddOrUpdate(ip, machineId, (a, b) => machineId); + if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId) + { + ipConnections.TryRemove(ip, out _); + } + } + /// + /// 移除 + /// + /// + public void RemoveIP(string machineId) + { + foreach (var item in ip2MachineDic.Where(c => c.Value == machineId).ToList()) + { + ipConnections.TryRemove(item.Key, out _); + ip2MachineDic.TryRemove(item.Key, out _); + } + } + } } diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs index dd00031e..00ad55b9 100644 --- a/linker/plugins/tuntap/TuntapStartup.cs +++ b/linker/plugins/tuntap/TuntapStartup.cs @@ -36,7 +36,9 @@ namespace linker.plugins.tuntap serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config) @@ -57,7 +59,7 @@ namespace linker.plugins.tuntap TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService(); TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService(); - tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, tuntapProxy); + TuntapAdapter tuntapAdapter = serviceProvider.GetService(); } public void UseServer(ServiceProvider serviceProvider, FileConfig config) diff --git a/linker/plugins/tuntap/TuntapTransfer.cs b/linker/plugins/tuntap/TuntapTransfer.cs index d991c275..c31e34d8 100644 --- a/linker/plugins/tuntap/TuntapTransfer.cs +++ b/linker/plugins/tuntap/TuntapTransfer.cs @@ -1,7 +1,5 @@ -using linker.client.config; -using linker.libs; +using linker.libs; using System.Net; -using linker.plugins.client; using linker.plugins.tuntap.config; using linker.tun; @@ -28,12 +26,20 @@ namespace linker.plugins.tuntap this.linkerTunDeviceAdapter = linkerTunDeviceAdapter; } + bool inited = false; public void Init(string name,ILinkerTunDeviceCallback linkerTunDeviceCallback) { + if (inited) return; + inited = true; + linkerTunDeviceAdapter.Initialize(name, linkerTunDeviceCallback); AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown(); Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown(); } + public bool Write(ReadOnlyMemory buffer) + { + return linkerTunDeviceAdapter.Write(buffer); + } /// /// 运行网卡 diff --git a/linker/plugins/tuntap/lease/LeaseServerTreansfer.cs b/linker/plugins/tuntap/lease/LeaseServerTreansfer.cs index 069493c6..ff0cc54d 100644 --- a/linker/plugins/tuntap/lease/LeaseServerTreansfer.cs +++ b/linker/plugins/tuntap/lease/LeaseServerTreansfer.cs @@ -4,7 +4,6 @@ using System.Net; using linker.libs; using MemoryPack; using System.Collections.Concurrent; -using linker.libs.extends; namespace linker.plugins.tuntap.lease { diff --git a/linker/plugins/tuntap/messenger/TuntapMessenger.cs b/linker/plugins/tuntap/messenger/TuntapMessenger.cs index a089fd16..dbe0ee41 100644 --- a/linker/plugins/tuntap/messenger/TuntapMessenger.cs +++ b/linker/plugins/tuntap/messenger/TuntapMessenger.cs @@ -17,8 +17,10 @@ namespace linker.plugins.tuntap.messenger private readonly LeaseClientTreansfer leaseClientTreansfer; private readonly TuntapPingTransfer pingTransfer; private readonly IMessengerSender messengerSender; + private readonly TuntapAdapter tuntapAdapter; - public TuntapClientMessenger(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, LeaseClientTreansfer leaseClientTreansfer, TuntapPingTransfer pingTransfer, IMessengerSender messengerSender) + public TuntapClientMessenger(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, + TuntapProxy tuntapProxy, LeaseClientTreansfer leaseClientTreansfer, TuntapPingTransfer pingTransfer, IMessengerSender messengerSender, TuntapAdapter tuntapAdapter) { this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; @@ -26,6 +28,7 @@ namespace linker.plugins.tuntap.messenger this.leaseClientTreansfer = leaseClientTreansfer; this.pingTransfer = pingTransfer; this.messengerSender = messengerSender; + this.tuntapAdapter = tuntapAdapter; } /// @@ -35,7 +38,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.Run)] public void Run(IConnection connection) { - _ = tuntapConfigTransfer.RetstartDevice(); + _ = tuntapAdapter.RetstartDevice(); } /// @@ -45,7 +48,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.Stop)] public void Stop(IConnection connection) { - tuntapConfigTransfer.StopDevice(); + tuntapAdapter.StopDevice(); } /// @@ -56,7 +59,7 @@ namespace linker.plugins.tuntap.messenger public void Update(IConnection connection) { TuntapInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - tuntapConfigTransfer.UpdateConfig(info); + tuntapConfigTransfer.Update(info); } /// diff --git a/version.txt b/version.txt index b14fafd5..e2ac7227 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.3 -2024-12-12 00:29:09 +2024-12-12 17:37:53 1. 优化UI,显示网络计算IP数 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 3. 优化网卡的端口转发