From 86c0a2d28b0249f5bec85231bb0a3c5dfaa98b66 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 5 Mar 2018 17:14:42 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/user.py | 4 +- apps/i18n/zh/LC_MESSAGES/django.mo | Bin 29645 -> 29732 bytes apps/i18n/zh/LC_MESSAGES/django.po | 85 +++++++++++++++-------------- apps/users/views/group.py | 4 +- docs/_static/img/structure.png | Bin 0 -> 29785 bytes docs/index.rst | 21 ------- docs/intro.rst | 48 ++++++++++++++++ docs/user_guide.rst | 4 +- 8 files changed, 98 insertions(+), 68 deletions(-) create mode 100644 docs/_static/img/structure.png diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 999b9e016..875c17710 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -26,14 +26,14 @@ signer = get_signer() class AssetUser(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) - username = models.CharField(max_length=16, verbose_name=_('Username')) + username = models.CharField(max_length=128, verbose_name=_('Username')) _password = models.CharField(max_length=256, blank=True, null=True, verbose_name=_('Password')) _private_key = models.TextField(max_length=4096, blank=True, null=True, verbose_name=_('SSH private key'), validators=[private_key_validator, ]) _public_key = models.TextField(max_length=4096, blank=True, verbose_name=_('SSH public key')) comment = models.TextField(blank=True, verbose_name=_('Comment')) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) - created_by = models.CharField(max_length=32, null=True, verbose_name=_('Created by')) + created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) @property def password(self): diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index c38fdb5c95de35a3b356c579efeb49a768e2b168..2b2f10466b85d7e953bebde9576bae7ee32ee9b7 100644 GIT binary patch delta 10553 zcmYk?2YgT0|HttgBZ!C@D@KSB5`+j%jEWJdQ6u(hh!I;P+9JPx5v5j9TCGu|)F@h8 z&59Z|TC-MdEj8LwN?Wb}>;1hS{kxCf$Mby7Irp4%&m9rJ9=++a^p=n3Qh{vmI~+gx zI8F&{k=JpiWpSMJQmS>FFG3w>GOoihShtenoTTqgT!1sf$f>VZ#c={LYgNZ7jm3~t zoM^Kb`jSsU&GR1Sa2${GxixGtcOh$V_F+~$jk)j~mc{F+0eq`DPEHKL+!${8OQ?Ra zsD8aM8;(ULbS7Xvd>0Ebzq62n9~B$T-I$;J5cb6%FfTTWaGX4tfLy%O6SLzKq>D2X zwU9kn5RanzUqvn8S5*Ip=#PJ40P{OJsyj|$EQ}hU3I<>_s$)EAp!U|Dg!##bq82_D z)qg5#r{Xw>-`sPU#@QCx_+wOebj|LU;AI_@`*ndedW_y%g?d#HgQqHf7k zYxj?I7aoXOP;pehVAO=6SO{aSz5{B9dPK7S8fYLDnrO6j7>~N5sg}=0ZSfM+maan$ zn2FlKGpHTBj+*!v)Odej5I#fgKu}G0;wq?H5aXes6}Cm~#6asX0t=9jL!J1(<;zhM zZnOIRsEN;_CcchZ;2qR>Pf-t_ZIwD_ar>EH)^~LLFPR5tX*I)$RLrqvJ+TDp)QRB8p@B812f+ik~xxE}SIZAER- zAuNs;Q1|)|)P#ScuFR*dJFq|MAuEQu!f@0Cbx@z!#;Eh+QS-D$T~G&9KTmfGII!~FZS{RrKcD*Ud48xJDTHb-jWw_uYT><5Tb+i*a3tzNW?@Oa z|C=f39-T6;qORl@)WRNOQT!LRkRrTWx<#c?TN#1c!P=+=$Dtn5ww5PjD0v#H{{mG1 zrP4!T0|iZ(iTctVM1Ed47f~JaH*lZ!U<@a(jk==VsC(QWHSl26g`}bP;X`ftG}MJG zGFPE?cq4k$kV!!vK{b4j+Tt7LJ=E6zfm)DntUF;KYKu#tCa#M5F4Qqwp~g!xQ&9ap z);=|s{ntttQK6Ntwhp^dS9k=q^~bR>-bOua)f&1FXLIyUfVwp)s0EHR-$5;W4r*tY zTm25yLJv3exL10ailJ28!W8V($Q|$yY9~&hZqWs-h*wb$T`pFog%(2Hf?}wJ1fv!b zin{l;F&ieL`t?CAV33D`9+oj!5!}l1ql{uTZ{R1(QybM;x z_85j^P`7rqxfyl-SLnSJ$0=wFFJX4Pi@M?m=HI9-%ogYND})-LENb9L)I#fFFt);M zI1DS{2rP>WQLkSn>eKxLGOow@-7Pp-o4NxPM4eC`LogoGa1d6&t5_9t#@p7KiCB^P zNytxDXC3nM$N3p^V8|=(!opCuE&_|{{jWno_o|(BNWv`S$(R)fTKiDct$7Q5aWd-5 zHWRf2t5I9J3w5gwTl*!{m-J86h2?MN_N$5BpZ~EGw8aUidzgg5I0yCAZbc1v6xHtv zY9YU&CVq;#!hq(kg)tX-Db%e9#oSm0b*rOM&sDd;d>Tp%q_7P53iv;Kx?) z+tS^Ee8}VCgrF8W05$O2sEOxbPW%kB<3`k#ZbOZC%<3|$A%r8(A9YsAGr!2o|{({=kN2m*UX7&CZ+#M;1 zx&@v}6x1QwjI)LW%abf0X89P@#M8{#<~(x=YP^-^X4C@rVh{Y@@~Dp91$vx#3ZXQ# zMGZU}OW`=wK#NhgWG&{wOjN&P<{9%6s{fDX1M?Z`O8q;z?IlooCCsJwKiVo9S%(BO z(Hv}!GAE+0Xtw3cE#GMQ0n`FdnHQ}6nzcVdJv&)C(~tR`aw=e$Sp&Vd#PT@QQ{B?) zJD?Vjghlan)Q4(1>YmRs7nsYMtv7%Tm5{iUyWMGX4H8*%|qrH^M-lf z{1o!N%MV$826f&g)Q;UZpQ8Hb=;@9VU# z(elBTr=jlYSj(rFAEL%tX8CH=0=`6jsE$~E(b|7A|LMj4YbAb3u0>EMmP0)(wNVo` zwe~isiF%lQ%t2-<>ikg{g40mruS1Qu%lsC#Nnq9iR!-@HSSK-l^<~HJb!KUg;TA4FKWJHSXuA?bqc;z1oU$aG)tfc4lyH8C)TsPHR`qN zZYG|Rh=)R!*`^;*WE&g+X+ za1sWgXA1=lbP}}_cTrdH3=3o4A?{DV3fP2vDCWXVs0HsvO}roV%j!wXZ&~{z)V+R+ zSux8{_jgBMWE_uEfPw}pfq5|mwU9{Ez;RZefLdshwWp&#Ow&>Q)|%VRgIJ0B)2M#W ztiIGRclHNbd`!P%&Rze5dl&D!spPf>4!|8V!bvZ#JFPz$STzGCei zEbnW1D(au&oD2#YXrDD)Fz=uS{2Mi3_EdL41yBnukGiK(sD9C?ooa;Y-^}c2^}Wr3 zsQ$xK*?;fWQV~W)23En(Q3G5wZ=+6ljCzWF(g=*@k5R;NB^6iH{<`5TBs_CT_E8A4lUv~Xpd=?fU*RfUC|G8UsW?F|cmX}1mM)!$%v_%nF2)#mUaXRwr zo->j1XyRMSI%*R=y(Jz%vp#-8pLX~P<|A~>)c$`-vfj;|A5dShGStOkB91_Pc&ZXl zi22kd5tWF;L>odsD_%VMQTIBbBfrakw>q8rH>fM3_UHG%kaez&eThf3?ZLx#@-fOM zC?6p7HPbPLy4*x5LPrB)4CT8@IO43H-#!03N?M&N0tk;Ef9xXsX;_2JiNe-tG3DpS zco`f?0>=>VQ{F~YB#x4Ec$^+2Izn&(QN{As z*p+Bcd_?f-FcpNWmMSHr>hww?Do`Bb6?F@^ZS>TgpnNa#4`;xw=} zr5=6vbyTp*Ih0QkEeU;^pAj*%^+O$7D8FZYw~=S1{1?Vso%*~%xj6Pv!ZDIKLERTb zB<25E-&o!M(^QUsqx`bBhUdW)N31>E>Z+0dNjZ%;NA$7wwq{@I zCJ-MJbBQ*({~;7~45HID+=&t1n*aZ!F~wcf`w|<7P2{IhM;-G#rjU;&5-2yadi8mQ zh$o6tx7q5OOWpr{6u!fu#3pO3i>c&!F%RnaobqZS$W6WfSynglFD*Yq`BP#Av6H&t zgom<@VZ;u~zv58Lz(eQ>rJ$of$yVYY%3Fwos^qvx-Sgws=LItxZR3bu#3$5sB0i%W zKvc3mFX30@Z{uEEM+{IMkxRuuDh?7kiJC+zv53a!M^*BHBz|~+7*BZyzHS{>QGW5b zN;2OnGH9DktXH2|$14`}d`ck;F-$ca-H8#D_Y?iSHSQnBVKH_8!&cT;Ez5~M#7OEA zG5LiyQfCeMJ?u@qMJyu!hzKP<^WJU>O^6R@{E7I2(D4T`fclGAK@}WJh;OJXLFiaO zyhl7HGO1gN1+Xmo;5gLLjo3guB(B)G6rI=fxILf{PUR>}v&J%%Hxi{SUxtl|>z32x zwACLRbEvC}^N6#m;F#p%{Xh0qoJ^lfL`Nc;{BNQ&G4=W5IE{wFRNTNfQAb0{7l`e| z74jU!TA~(Fkh&Fko!CPp5G$!`ggUZQ*3sI<`QGwO%g^I2!sq0Mw?lK5%hPXo&mn1j zdI$GRP3@DmVQh;TS^OfaL_`HwkBX@oy&N^8`t zb*Rx$yG2{$D0Q^w_kW)&pW}0$&$;rwulv5Adp*zlChh6!dp;-c`gqcUGtPIoZu>Y+ zA*>tdIFo%Hr+*REI?l(Djx!af;5f`x(s9nwcRnt`KBdX2&lK%Ax$z2y;v?i1C#Z~T z9Qu=YL(S6{GdYgOnQRR+&17T^&JxUkn=lJ*#c)hT4UmSJ@g-)(jAh+CC#qk5RKKd2 z5!)dXI-M{l_QYJw?~J4nK*e-(0S1w;#Gbef1F>K^$H|VRk0iRLKa~N zu0i$RjatAFRR0s04bNf@=69}9$b-M32JkCS0|ucwhM@+EMzzOd5H>(9ydA24chpG@ zMcp?RbK+Fgqxlr|2)1Hg+=U(uc$$I+x{6xqT@1npr~&^*y$+dU+yNp`^<_{ys)AZz zb!$&R9d#nAUkB89Jun}RL_OMBF`U0T%(IS5&CkuRP|tWTYUPJe1D`-WlJnMn3$^fv zs0BSn^?Qz*(5awj%{zgrFM~Rv$`v?&4OE8;O_XRII-+*e-SQ!*BOZ-9(kZ9`7o$#a zGwK9WQ4<_SjduzQ;ziU6JV8zDSJ8b0!5#`)VJXx})IoJjfb)n60NvHGQ` ziMOC8PDL&7JJfjRQ74mz8uun@VSiZec|kz~`d4xX3N{O)I!2-vP#!fw9n^_6!4T|# zdNhMjnMvc1+v+MJ}hC&z>DX1IIqjqxDyk|Z|P2{}koaYG zelF^nu0SnlJ8A>ppibzxXALR_6%{HzjhcH=T2M*H9$COrO}pGL@lHS z=EjDY2RorYmcvowB%wAi8#T@X)O{;a{We82ArJ3X1_WYLePYcG?Qnza45}J*<5QYC&UA{U&-SXuzqckJ&8L#4E7?rl6kn zDb$2#P&>PX8u%9KC3}S0VaBTN1RqBdLxwGdAw3c9g6>X|o1J>#*M z7pI{XwhHxxy~Xd5h!eUTIJI5R2e=;onrSc+P} zI@A$vNA2JMYQm$aewR@9-9Vkl18e^iW5_dAcNZRqI_d<>k1bFe>4$~&`JX{SNBM=h z8+BBNQ4^fNe0Tx1kl#^{=ugy9X6Cb|6AVNxxCrVcEoFI4j3iG$^&gJvKSp{eOrxL) z7h^75j{Kf*wxc@!f_mGZV-yC~bazx0^^9ww2Cj$NNCJ9aKGc!-Ky74{IRSOT)6t`b z#T4XfRKu63Bi?HsLLL1n)PmAb6Fx+}8&6Ra``2>67edSk)Ohh`BUHaO*517q=dYEH zqCzW8vJMMS&ulg7=+|Ri{1)}HWvcDIoW;;P0qW5-LM^a`*%`I)L8z1USp7WI7uc%W z9(SiZsTf4XetZwh)o}-0i8_f5s7I875x5)m(*2BD=mXS=JVGtxIcgzVwVr(-s$UgU zziOxj)b&u%%hDDL<3QAjOh+BQjvz~&Ea0mL~LDY_qndeYPcoo&}0cwE1Py=VJ?=CbqhLJ~LMr?>Bu_=b* zNYuw~G3sUBhK%cRj=Kft3TnsqQ8&E8Vi?xIafV@CEP=bR3|>d?(Kd9gf)UhrL4Kh+ zQ;^>?&H>DXFHsB2(8zssnK7R}{~;9gtfEjI;?WmtVg{^Z?F~>z-5UL|E9#rA4{G5_ zs3T2AJ*rjKz6145dIq(zUr_zBHRe9%ck)xv5tl|i!*~qCL8!NO7HYsXsD8Up3;7;3 z@p;q^@0h<~7V>AP4LMER{(h)O7=(J~LeZn0SE8T+>Y{d(fC1PGb;A(sf#ai$-!cjaBwLI8O*LYx!Dp6YAu)p*FD3>W^b?^0TN%a1Yh)d2R*2 z)^0;Esv+F+vX<9CO`KpRn(fUlsQY@G!%+*IfSqu@H;yrb_%^pRqg* z^-|yVP|!qAtRX{3cY**jFKU3|sD7m_kGJ;PW^=3Wh!OPbX8AO84(cm-5$Yw}h}wwf zBn9s?wTk=ZbJWCs@3YmY@eqWad}&g^XMz06^#lOFHp9%mW_4ZINb zOJkYk8&KZ|TTv@LZS_B4Ecq?ePKxmDqKRvw`X!)Q z@(QSDTGR5zW*gM~-7W8jTEHmOOFhl<&#Zm3xz{|}mGjqx7p&t=)U$bpn$W+S+ny6O zQDL*VS=x+2O&p8GFab60VAObH%}-D#z65jQ4i5!&Jb?xAlI8zKP3YU*ZO?+bA&=!z zSd=^#)vp6;!ClS%<_L2fYM!a6g)Ttd=h;9(&vq+nfIX;=2eAmAvHTCz4X;oGWaJOR zVwe|0F&=ea2eUV-|8Uf}V^BMvWcACCaXijitJsYiV83}1b##}_Ur_`6g&H`dr`x}P z8G)*=h`KKxD`OMXxD!wdpNV=oSE9c@|0lf#{){%Spl-Nf{*JowKb8mfazA#3%m_2a ztcF@ZL)6aOnqAHQ<_Pru{vSs{6HYegp(b2`8fcrV}7?1wA!=`nY)xv!EGiRx)d2HSTL}eu5hBxV4`} zKk{oBg}3`~{+cMbulr9bp{N^*o260hF{rn{24=*!t-U?!1iGO54MXj8yyc56Ux(_q z-#lmD>1&_=7gT5f|9YHOEd20+u_16wpnyHwL{5)!hKcl|+o}xaMegoY5-oR+`hN$nE z5vXxIb13M>ji?>$!#sEj8{%!Ohh+x3@5nIJ4nIUqJQ4K|sdFq}XYJci&pH(|-~r5v zhcFACLB{boS14%W8>odmMh)yY$gK}Xtu!3f9*_EBYKH1Jz#MH(#*);}L-pHd^*^ER z|JCwWUU~ijgWZYpqE;4RmPhS0-mGmlLQVV@YQT3e5C>ys9ETcb3hD&rVoqFyAL0ho z{UzT+=65Pn&;WHX4iixW&p-{d!rC{QspfHOzk(X@w)xoF|FJx9h&z5EtVO>l)Te16 zdjI}UvJUf56Rt)L_$3BoDr$kJP|q?A)$a!CgdU*!KQW!5Zhdw$7pi|j%iqA#C((@msge#5?we5y9x61k0a;4iSpSHX_d41v? z%k$t1@`^_T zmsm_3B;SHJ2wkIzC&X{W9@_MU(~n5MzNfAx3Ew^5s}lJLN}gu?c!SVyJ6-=K=6Fm0 z`%#b12MAq3#C@VGxqjErB0i+N)7nX$e-YZ)*GlYKO8YKC-ydIMDYC!>e6@3F=9EffV!nxrY}h@ zlCOzqq88DLx(mbr;yXfDJh7TsMHC|X66J{L^gluThw>+QmC)4$`w+t{cWZepujT8~ zpZ~A4uA(6)af+Bk{w?+;))O;`7-AaXM_U6MZ7%sG$|F%%1cqV-+(E>7Yx(7agUEj% zx>6oV+#)>w{5VQwD)BpIUCAy^dFp0bIg0XL%9V*nRu^IBFze7K{o0;hF#T!k`C468 z@^~NbYvR`a4P&gsMjL1@`FyK;pE~{RmuUH?tZdd=UBhEdir8(yQ~B9V(ozYbA2O(fI4h&V^QO+MK=bisvIK2KX+E2qSMQJXgR40aMtv|bkn(l>85`nNEJl1wv?O$W zKm>YA{J&y2mMB2nwK`7)3TL_5mpDoJd!mswercxBriH#DUx!2Rfwf)12Gn&RDih_1 zkBDB>-y^=GoR4^eXiZ+6&~=M^ygvUuNc>0&5Z#GsMDr2iFe)9scH2`$iE=kTK#*c`W@q;R#|j<+Hen7(;nD>grGVCNbMhop&jR6A45Qf~&Q2nV&~UX1f*M+I^IV z67z`9h)UjC_eXw+q^>pb`nAH6J$O82Q)K4iDW?*Wd;?;lV=9N0uN+sYVoJy6%fkcj aZBM$jXWiY@q\n" "Language-Team: Jumpserver team\n" @@ -74,7 +74,7 @@ msgstr "选择节点" #: assets/templates/assets/admin_user_list.html:24 #: assets/templates/assets/label_list.html:16 #: assets/templates/assets/system_user_list.html:26 perms/models.py:17 -#: terminal/backends/command/models.py:11 terminal/models.py:116 +#: terminal/backends/command/models.py:11 terminal/models.py:122 #: terminal/templates/terminal/command_list.html:40 #: terminal/templates/terminal/command_list.html:73 #: terminal/templates/terminal/session_list.html:41 @@ -116,11 +116,11 @@ msgstr "密码和私钥, 必须输入一个" #: assets/templates/assets/system_user_detail.html:58 #: assets/templates/assets/system_user_list.html:24 common/models.py:26 #: common/templates/common/terminal_setting.html:67 -#: common/templates/common/terminal_setting.html:88 ops/models.py:31 +#: common/templates/common/terminal_setting.html:85 ops/models.py:31 #: ops/templates/ops/task_detail.html:56 ops/templates/ops/task_list.html:34 #: perms/models.py:14 perms/templates/perms/asset_permission_detail.html:62 #: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:15 -#: terminal/models.py:141 terminal/templates/terminal/terminal_detail.html:43 +#: terminal/models.py:147 terminal/templates/terminal/terminal_detail.html:43 #: terminal/templates/terminal/terminal_list.html:29 users/models/group.py:14 #: users/models/user.py:35 users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_detail.html:63 @@ -352,7 +352,7 @@ msgid "Default asset group" msgstr "默认资产组" #: assets/models/label.py:14 perms/models.py:15 -#: terminal/backends/command/models.py:10 terminal/models.py:115 +#: terminal/backends/command/models.py:10 terminal/models.py:121 #: terminal/templates/terminal/command_list.html:32 #: terminal/templates/terminal/command_list.html:72 #: terminal/templates/terminal/session_list.html:33 @@ -408,7 +408,7 @@ msgstr "Shell" #: assets/models/user.py:269 perms/forms.py:25 perms/models.py:19 #: perms/models.py:76 perms/templates/perms/asset_permission_detail.html:136 #: perms/templates/perms/asset_permission_list.html:69 templates/_nav.html:24 -#: terminal/backends/command/models.py:12 terminal/models.py:117 +#: terminal/backends/command/models.py:12 terminal/models.py:123 #: terminal/templates/terminal/command_list.html:48 #: terminal/templates/terminal/command_list.html:74 #: terminal/templates/terminal/session_list.html:49 @@ -606,9 +606,9 @@ msgstr "激活所选" #: common/templates/common/basic_setting.html:59 #: common/templates/common/email_setting.html:60 #: common/templates/common/ldap_setting.html:60 -#: common/templates/common/terminal_setting.html:108 +#: common/templates/common/terminal_setting.html:103 #: perms/templates/perms/asset_permission_create_update.html:72 -#: terminal/templates/terminal/terminal_update.html:47 +#: terminal/templates/terminal/terminal_update.html:48 #: users/templates/users/_user.html:44 #: users/templates/users/first_login.html:62 #: users/templates/users/forgot_password.html:44 @@ -689,7 +689,7 @@ msgstr "自动生成秘钥" #: assets/templates/assets/asset_create.html:57 #: assets/templates/assets/asset_update.html:61 #: perms/templates/perms/asset_permission_create_update.html:49 -#: terminal/templates/terminal/terminal_update.html:41 +#: terminal/templates/terminal/terminal_update.html:42 msgid "Other" msgstr "其它" @@ -702,9 +702,9 @@ msgstr "其它" #: common/templates/common/basic_setting.html:58 #: common/templates/common/email_setting.html:59 #: common/templates/common/ldap_setting.html:59 -#: common/templates/common/terminal_setting.html:106 +#: common/templates/common/terminal_setting.html:101 #: perms/templates/perms/asset_permission_create_update.html:71 -#: terminal/templates/terminal/terminal_update.html:46 +#: terminal/templates/terminal/terminal_update.html:47 #: users/templates/users/_user.html:43 #: users/templates/users/user_bulk_update.html:23 #: users/templates/users/user_password_update.html:58 @@ -1195,7 +1195,7 @@ msgid "Public key auth" msgstr "秘钥认证" #: common/forms.py:159 common/templates/common/terminal_setting.html:63 -#: terminal/forms.py:21 terminal/models.py:19 +#: terminal/forms.py:29 terminal/models.py:19 msgid "Command storage" msgstr "命令存储" @@ -1205,8 +1205,8 @@ msgid "" "other storage and some terminal using" msgstr "设置终端命令存储,default是默认用的存储方式" -#: common/forms.py:165 common/templates/common/terminal_setting.html:84 -#: terminal/models.py:20 +#: common/forms.py:165 common/templates/common/terminal_setting.html:81 +#: terminal/forms.py:31 terminal/models.py:20 msgid "Replay storage" msgstr "录像存储" @@ -1263,17 +1263,11 @@ msgid "Test connection" msgstr "测试连接" #: common/templates/common/terminal_setting.html:68 -#: common/templates/common/terminal_setting.html:89 +#: common/templates/common/terminal_setting.html:86 #: users/templates/users/login_log_list.html:50 msgid "Type" msgstr "类型" -#: common/templates/common/terminal_setting.html:90 -#: users/templates/users/reset_password.html:57 -#: users/templates/users/user_profile.html:20 -msgid "Setting" -msgstr "设置" - #: common/views.py:20 common/views.py:46 common/views.py:72 common/views.py:102 #: templates/_nav.html:66 msgid "Settings" @@ -1430,7 +1424,7 @@ msgstr "执行历史" #: ops/templates/ops/adhoc_history.html:52 #: ops/templates/ops/adhoc_history_detail.html:58 -#: ops/templates/ops/task_history.html:55 terminal/models.py:124 +#: ops/templates/ops/task_history.html:55 terminal/models.py:130 #: terminal/templates/terminal/session_list.html:77 msgid "Date start" msgstr "开始日期" @@ -1742,10 +1736,11 @@ msgid "Close" msgstr "关闭" #: templates/_nav.html:9 users/views/group.py:28 users/views/group.py:44 -#: users/views/group.py:62 users/views/group.py:79 users/views/login.py:200 -#: users/views/login.py:249 users/views/user.py:57 users/views/user.py:72 -#: users/views/user.py:91 users/views/user.py:147 users/views/user.py:300 -#: users/views/user.py:312 users/views/user.py:348 users/views/user.py:370 +#: users/views/group.py:62 users/views/group.py:79 users/views/group.py:95 +#: users/views/login.py:200 users/views/login.py:249 users/views/user.py:57 +#: users/views/user.py:72 users/views/user.py:91 users/views/user.py:147 +#: users/views/user.py:300 users/views/user.py:312 users/views/user.py:348 +#: users/views/user.py:370 msgid "Users" msgstr "用户管理" @@ -1819,11 +1814,11 @@ msgstr "输出" msgid "Session" msgstr "会话" -#: terminal/forms.py:27 +#: terminal/forms.py:37 msgid "Coco ssh listen port" msgstr "SSH 监听端口" -#: terminal/forms.py:28 +#: terminal/forms.py:38 msgid "Coco http/ws listen port" msgstr "Http/Websocket 监听端口" @@ -1839,51 +1834,51 @@ msgstr "SSH端口" msgid "HTTP Port" msgstr "HTTP端口" -#: terminal/models.py:91 +#: terminal/models.py:97 msgid "Session Online" msgstr "在线会话" -#: terminal/models.py:92 +#: terminal/models.py:98 msgid "CPU Usage" msgstr "CPU使用" -#: terminal/models.py:93 +#: terminal/models.py:99 msgid "Memory Used" msgstr "内存使用" -#: terminal/models.py:94 +#: terminal/models.py:100 msgid "Connections" msgstr "连接数" -#: terminal/models.py:95 +#: terminal/models.py:101 msgid "Threads" msgstr "线程数" -#: terminal/models.py:96 +#: terminal/models.py:102 msgid "Boot Time" msgstr "运行时间" -#: terminal/models.py:119 terminal/templates/terminal/session_list.html:74 +#: terminal/models.py:125 terminal/templates/terminal/session_list.html:74 #: terminal/templates/terminal/terminal_detail.html:47 msgid "Remote addr" msgstr "远端地址" -#: terminal/models.py:121 terminal/templates/terminal/session_list.html:100 +#: terminal/models.py:127 terminal/templates/terminal/session_list.html:100 msgid "Replay" msgstr "回放" -#: terminal/models.py:122 terminal/templates/terminal/command_list.html:55 +#: terminal/models.py:128 terminal/templates/terminal/command_list.html:55 #: terminal/templates/terminal/command_list.html:71 #: terminal/templates/terminal/session_detail.html:48 #: terminal/templates/terminal/session_list.html:76 msgid "Command" msgstr "命令" -#: terminal/models.py:125 +#: terminal/models.py:131 msgid "Date end" msgstr "结束日期" -#: terminal/models.py:142 +#: terminal/models.py:148 msgid "Args" msgstr "参数" @@ -2269,6 +2264,11 @@ msgstr "重置密码" msgid "Password again" msgstr "再次输入密码" +#: users/templates/users/reset_password.html:57 +#: users/templates/users/user_profile.html:20 +msgid "Setting" +msgstr "设置" + #: users/templates/users/user_create.html:4 #: users/templates/users/user_list.html:16 users/views/user.py:72 msgid "Create user" @@ -2351,7 +2351,7 @@ msgstr "取消" #: users/templates/users/user_group_granted_asset.html:18 #: users/views/group.py:80 msgid "User group detail" -msgstr "资产组详情" +msgstr "用户组详情" #: users/templates/users/user_group_detail.html:86 msgid "Add user" @@ -2562,6 +2562,10 @@ msgstr "用户组列表" msgid "Update user group" msgstr "编辑用户组" +#: users/views/group.py:96 +msgid "User group granted asset" +msgstr "用户组授权资产" + #: users/views/login.py:56 msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" @@ -2634,4 +2638,3 @@ msgstr "密码更新" #: users/views/user.py:371 msgid "Public key update" msgstr "秘钥更新" - diff --git a/apps/users/views/group.py b/apps/users/views/group.py index fb279b582..958c00ccc 100644 --- a/apps/users/views/group.py +++ b/apps/users/views/group.py @@ -92,8 +92,8 @@ class UserGroupGrantedAssetView(AdminUserRequiredMixin, DetailView): def get_context_data(self, **kwargs): context = { - 'app': 'User', - 'action': 'User group granted asset', + 'app': _('Users'), + 'action': _('User group granted asset'), } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/docs/_static/img/structure.png b/docs/_static/img/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..90476014cc132e1a936e23b2b05295feab934f92 GIT binary patch literal 29785 zcmeFZbyQXF_b$39K|nx3N=iXW1nH1e!mWgKgGzUIia~>dbP5O}rF4T*A|NH*ASF`L zedqS`{na_=cg8tm+;RW9jKR>cS$nNF<~!#zpJ&b${7_Nu0zNf9f*==A_oP)21dAI% zFq!bq!6%%D?`Ytk^Y-_&oe+e86#a{VBqmcL2m^wWmQr(1{ypI#sW&hoxUrr>WomT( z*6&-A=PpSPR*^8;l%Z62dMyhcWXRHo7u3|Z)|cB3v<_A_S6U@ekMR{0xJ+e~`B?j8 z3<`2SekqBkt%Zq!`P{{y%Cv5sKH>BEV&=xq#=R{i)9+%7<5P82X7N+wPU|>9|Nqbb z*$S}Y;XNht4_Xkgc`LKNQ%Q1A-Z-g(Wh7vS5n%Eo|H22d;kLn zfit1BG#O5!5iuE~n z@YQQD7+KlO&1(tryEjl#e`GmSFtxBBy>6S+W(=9dail6AL@{w_7h_WxdUKO=>IMD$X)KhYSXy45QC&^VRkwYK`pT8=SSAY@2ZzlM zAt51dn6$T*SubMJA{V=SGFa~;^scD>w!M!JqT8DrjL7)HWamr*7;4GL$zSHA`BFcK zMerwAo5;1Odrp6pFY*kWQK zJPCvn2klDspK&N8qnHX9@bY!Io;gAUKXl zkuae8T5f0-zUj7xt8xEzb=(D{s;Y|Qd3(2GSZL^7Z*Nh=d~bCuPW0}li(SI}7hCEbN#X?0fPrNTFA(e}u!9c7O6~E6=g@l`b|7V+=1LT?e;}GgA)YKc@ zey2_%M!p??qutkr?=`mJN;bUb)^o{`v1xFEx8Gp{lP4dAb#MOPqNhf1@Kl z-3XMJE~uFNGx6l$sdjLbdBk)RXE2N;`{{`FX;QB_hrLLO+m!cK7wgTNE#G2p1k$@M z+Y3c_44bH`l448QS5B-AT)uqSTb8hw?4OY*GMknh&}H^&aYncMmN_kcuT8n_7NM;f zmDSK;T*|l<3HO^ozS%)h}4?!QFD=DKj!x*@b18t8ssmjQ- zXg&>%VlDlbZTZrbj2w&j4~2$?@|y5yWBIrK`ST}P5?7XwV&jW1Y|6E3_-y~al=dQ2 zVAFW7v;Q!)STNuP+)7$uyp~9q`get|WxV$WP5{ygXM4Dys_q?4xchCx2DR;h3{vs;s(zxeJff1*Z5Dn>W|Kwx@ z{mGKthPx>5#f4gykSFE6=C%Fie7;xlzI>K!a}xD#iypAN;LIv5jnRaDt_;a@X;hRg z3HD4=eSN*FGFb&YoU_ z6|xq6ga|KSBj~R`C`|bAgE3 zY!6$?{VvIKzc+Dl-79Hrs)tC z9FdO+D%#q@-g^0ZRhQJ&)tfp7^R=-M)*CnOqEPLX^YwGTOS;9IS||*|ii>&Bo3*sM zno?$S^;#l(YH$M6`th=`*onV6wK;|!6W$jY#T?QM)_UCOa7kSLBsj~}E-UuS@8V{s z&Q1k2^0hX@MOFq2o^_cvmD`Llpf0Ud&P6yJ!O;-h?Bwm1%vGD6^jdGhA{OCd9H~aN@6|yW zl*Kvb20lCLqB}oSALb2IuGb%Z^gZ#c{qyYx;$NU!@uVw}fB2IT?wkAb_DP?j^CCxZi*^k*&Jf3R}ci;God)JemmRO3!@jB{5!rL`o(?@>3);tNZ3QlR#Qjum) zn1jy~_By=AmWtOj^hX#N8LoJrA}HdDeRE+!_n58mWinbpuWPEMlD&CSZ)QLDDq z^;lh7DLp-!jEoHQvOGCEJppSc!N%B|^x~TIT)8Q_H|~T-Ox$)oPLC%#iQE}m>Xj&6 zcdh96!9xAe=g+aFWn^ZGJ2>y^>rb4YAen8wVkd2F&2j0{rH`gv)ZTyES^6n&UhLhT zO^9dXNs#wmqUgGv!Fo#6xD)-}@-p_!I$h-Ag#wMEQ?oRm!F8Jk7g;RAJ8_1-!lx(e zesiDN=$g>}sbg$(6roXY_P)l**tYs0r=M0;Gm5EFkCQd#J|*F~e63HIeuw>O8(#>x z9@UG*^%(Q`;7_X}5;xh{w6B5N4q(t@LiK$?l@qtnGGj=3dmr0Nxx4Rkx3z5EyLXS$ zmzJKMIBx(yvW@h^(UP>niU0)#h1oab;&Vtib2OWi$Psg55k%A8;9_L>-1G%0l2hR+ zuHSpF+l?#FPLCW$OyaKIylGP@dhHq}($m|^eOz5vcTzdjKRzB7DRD}9LnFTtLKH*D zY%mU8wdnl(ydkoW*+~2D-Mbc;|22f-F_9q!Z_2rI=h6o(F_7@^a2VFK{+}RL^UeO? zpa?k%|CUdPf6S9G`2^D`zq30@84(c4ZMH~cz`%>NQ8H4C+en8HgDW*g zMLEA_LQ!+SF2N59V(4M0#Q zVF=0Kn_BC+^HcR-f#G1Yd@r1ydZK2%{zi(=?#NRj#w__Zv*KR!&iG1=jf6EHZEbC~ z;0)FaL_`tQqCI1`DagPkJR?V*J&kx_UO1gVc`fmwiHV65{H8a>^NJrXG5-AdlYx!x zJU>7GaIFXLcZsuO$w2<~_^yRk$u>!8>9#Vk#sdUXPEiQ%V_EK`;eJP1z(#J%i zm~7(OjfWuq40*&gaNvC*K<}@<{0ppPeEIT)4=_8N7C%f9tZAQ$u@p0bqzdE}^O%x{M^#yE?XfEi{lX(I|7bC~ zZX#te`kOay^mjhom%bYL&uaff$KxSZvJgutlJ6KjjHtdCIEJHOYw7l$~jL;HI(7b+cVsxmKGwdiC6f50Zj# zawo`B_<-fv^w;sgnd`T$h=T`MA+}N^wigHp^4P(fichRu!&m=jDO(u;5V3}w5ljms zGl;=!re)*k_HFj;ncp2+AM)~OVInDzBVaZ{IJ|?35{K`PlsYf>y-(2LQhxvFZ&Jcn zzJn;nG3C-WzJMiADH-uLF4r(nR#patrGo5X+TV+Ee%3UjC8oQ=g0Jy6`GM3X|EJ@D z4P9i8+&h(%Cv6e56HkNQ*4B=npZ*MStYY5rARM0U#4yW%&-|~UPS-8Wx00^5ne*8~ z)L}<7ljO4t+WOlH^=m$0j5}t0BI&|OR+RnsG^s1rq5+Sao&8rsV@WXj(=DRt_{`%5 zypA%R0*8!q4h{}O2L@>n;0Ef4dV6~pbKbqPiEkZ_0uxtEYdyuxNKb!s=De4Xl5&FK zAGEv{ht327#%j+l>*ftm_xJawNjNX{h&_Au>w!e{oHmnR&s{a00-kAGnzUjPzU7;TlO@aJ#EP{*mhsMT^B3MIgYbGYA3)pd|cgvzX=6hpe zVjPek8LXq@wr**DosL!BPyG_~I1L~1Bz!?Cy-i-fe!a-4Q);gJ;6aDd*w|RwpBO8? zL{%pzCpY)0`e5Y#I?Ep_+-ASpx>7VjSaho0Z70kB!^v=;aFxL~`rBN`IHTr&j4nzDAzM z`edC%P*|9r-ouAIzi(<7!}o}g3l}bEQWCx#V(E`FDDndjHZm|NArRUZk5y zN`cqj+RbxF!%mft3Gyl}&98^6{?E&oFGFYN=7x56ckAaIt31I*OX^m~K79BP<)-Qwcn zQ#DOZH*o}z`kVQMg|%A=^3=%Jj*hY0wT>^YadL6l*#R&bX>V^Q7Ubg_pLVUe37FPG zBxUW}_V#vHU0oeL+})?fbv0zrvW#tHWMskTXxFFBwqozYz^{$BZ{I!>N=&Dv;zFUF zenyqeBnvkIIfoFe`TE@H>1j6%zR!CeZGdg9tp*~uZhiFOIcaWg)}y1Pt%EVJ@{fWs9^*%@6Ln9*_ z!hO^T1-_j7b~JRKMrIY?SqSh!s~ zkOh-eva+($L?mTpTSL)@S%)LmZwCzHegCqpwS`3$BR~JnRU{}lxQYXyU1rDpufp71 zwr$-ZL%98^3Rt6n#-D3=0pn+#Vcq5?;()00Yy@<}Tb>-4`T3p6adUH9ox{boyOLKg z&#dYtnkp3*)rd@ql14{ImvqcKx&R6+Ft@d>r$G3q6{_W#L#?f>yoNOed3m>F%5;2+ z;YPQvU!Q*srv|%BCnf3CD|;U~xwhC(vu~%bqxxK>NMdpR#Tn5pQ3eIE-dgav)IU7z zuHfl;Xh*@J^>O^kr(+|4Tl6ljuJx2uRN8~Ry_@4&tL*ITFS%F+le#PsN*bE+`I~=A zD=H)=`un$vmX?;*4}ZbX)Vw=OiVN z?VTMPAVofGx{IDzmR08$6xcMqW|Z@dhLyREFmqpppvOh*O!)STAg2k>$RA)RY>DlK zz?(=}z_CHHva_>i0=2X`V)s;4Ro8nh%S^~a=leFPLo!%}Q@)e0>&j?pX=O}#L0}d# z48Wqa3q_}wTbkG7=9oiR_#mPwka!9gfxOLci&G;jCr852(9n+?p%Hbr=SOzFilgI+ zx$omkSdw`Iv5>30efsq21Tae4Y0=S6jj;6ujnnR{uo*}Ca?yHfYHI6#`r*CiG=Fph z!I`-S%4V{?>6qvC@$o4d7#b@2IAVSCXm4GD7f$JDODM$|aUEnv!v8{L!OF6?}GsG_+Sew(9!e+ zu|Q)*69LTbkf_HQ83FF>V@=HwF~nv5#@?FbgTg?n>vRCH%qeX~%ptozd+_$*(&*UO z8TLA_A@a!F{JnP3kVFa?OcgjJ?_^HdIZN=4VgdrYf1(vdEEa`!E;ThZMZ;e0ksYz1 zgOo=IiZERxZ@@z!sViS4w-~sQG$H%xMi1CKo)ks5$N|f`caYxMmYRKVc6Alc99r=s zy>jJf?(^r*ezc!B-Nf!?SM*2)Md{<1=a_9dB%uREOiUrJ$f-#mmck zHVpH|u;2FJHPXLAN=J7}n>TPcZ#;C7p1vWwq2bJMb=(`aU|`7GhNCR|!t+Q?Ds@^08WB1pbY z8tw)XO%O@WPcg%)wdLmKuHZ;LM7yD1D=Xc<*VoU;&<^8NLrZIz2^F=jL+)W^wUSa_ z4pIBFn@!N!)}vMrMR`r2>n=dNor(lBP7 z(V1140y)B3s$(M>F-bi#S7YzX7f3`~J+kMSfh!+THtshjJ6d5krE<3CSfv*h8EFV; zNC#Zg13+;xfaoUX9m^o^r90>U`}gmmObE%e;FbL1r>n1{VMwAEL>k7pj(*&8=gRX2 ze)WT2H?*;`8pA^bk_t@r)+RzRh5;W&3KR5BOw`$!n}4+~({X#;%&U@^m{@3QNqyv) zDCV{Mb98lA1OY}Y0fD`Ky6&DPOZ*q^GLBtmVL8kH^l8&Ftn&RSV3pCgD!JqsuV9%{ zhs^ojf%&=+1sbgfaWbv*>i?9@bbv(iR%pwg)35tENo{jfG#(1_1_lNbT02KaM^h{7 z>wb2%;t=q;u+ylo?BQ{$52#Ub^ zn_m4F()w0#LKB2}9Rq_&jE%Dd^koaLJp9~>t2#|f_%$^(x$vE7&`wUeKe(X>ty=t* zZAhEJHRXa3g2sG|f`UWVeAKI;H>m3rls6aYB!7P7p7;L!*I3BBU%?TL+#@frH1t9) zlJ3MnP*i>V_%Ve)B?9pISP?KzgHC}!=V|QUyN8FPozJMAffcLG!YJ8kGFzUI#F=I$?W~g%a zZc`b!g;C(E0w-)M=D)sX?C#pgM$iAE0u|S9Vhmsey7oqwop&)wkmnXh{Cs3}R|it5+c$5nUPL}wmW{qjPWEndaAoQ4 z?DYNwL0@oZXGdbtoKNP{r%w_I-`&xgN>DadbUX>{URxj`y6FV7q`0q;6WUY2>G={aj@__H}9hJ&K%NC7~Rd!D*>nx)O9;5oAV{U1H8NfN3a50 zg!AuY628<#zYvPK9|N8>O`Vl&Q!!`D9+oLhM^|?U_unsKVs0)2+&4Zsd1?A^Ty;zgDv@o^RMdS5*54Us`#b&cBPY z%MFVb>D5C^Mv$D#YH3koOG)bLUQraDC;K@+AFjJr;<~EC#KZ(*d(Cg2amS9Ez>Z69 zTqjNe@z$L49}Yu`k(>J>vFHYp>U(H$JkRC#83_CfnY}`$RZ4&zH&!+_fX2X%>%d8n zFBc^l0nkK+-FEEhGap$5L?_U{sl=%oHpvmWw6Z?vUX{#Wl^mg2{6) zA5ERr|FkpqFfn<@1WcxokdR)RrfJ34fm@P!#O#X`@Ec@&MD*feps?TtAaw@BflU~| z^ilZT`nOtuRt}bogW&#lm?*1x<%I3=;ZTF@g9ii|CN%u{8 z5-Pic%v-?*jsFvpE>TQe=)ZxPgx%_p{UD%s5oBd2)yGw z4*1j(g99A4)8%MN{BtWHS1W(Ki2c?uipdSFH=6YN7D?=SolGcy3krx?ckd!HCv&2K zOR0GhtUc0=81VU~xVj+8QbtqBw+Bw{2TaOln?<+Udt zY!>@{@n!zu#TL%T+%IFjc5N0k`SK}Tk=RGACuGO}6b^Ke1_uY9e(dA!u&5x`^J zg&=2K>so*6A~Nxp*TTWUDF6U;1McRh17JxVl5lcB!l_dtZ-8N0+1lD7riNSk`uaku z*2jhMwQU&Jvd-Yl8UmpvloB`#uFCei>7Oc|(x zKnS>8xoRJhzkT}_2E?A5ii%3=#=rw5B|mWyk;7x4Ot!jAo!lY2zK&)pU`O+>+?)&x z3+ti|Z*>RclmVp^@>P0tX|G>z{**on4j@LKvkW%;7rD$Jy5#_N>XM#%`|)J^!ks&J zzTAW)q38okzo8gmMWoer*W1b4yrb zbF;Ivg_gi|fQV#If#d)U)jK*`%?YylyBc|@iLQ^&$pz#PVGtB_!$pEJ%(0N@cBcKk95_#1U0oBP#a+W7l;;^# zu1E_=bE}RmuBdQJDw59|$j0&?u$)-G;Utn$r@AZ%T+U2oWhFf^5z*Q!ruK!Ku~ua| z&lvDRo<7CcQX4&pCBAUM1=AnE>qfmD7E&>`nwQsOSw@9C2eQiOd%RG}cPz*VFc^LF z_iT%RDN*IVfA2mL(Ys5E!}3=bP`%~&A^85gZ+$B}O6y}4>qo%M83K%n_I5$@&BVmS zT!6)e{9qFzA^Y$8_RUiUYe&=aY97!)<-f4ma@&-WW1~vAWP;mX}40!FnE4A9N za+-#Q4V_7iAS@e|+<(VIBV?cc)wJZoO`X!Ed9X#6D_5@g5hB1dn@lpvU_CO=SWT4A z&$N+v@p6BE{|t==ryA`J)5liVu#k5u3BT-xyo>t1J8+~vdKp?e@bv=uGQ6?F$R5KE zTGVnOB;AX`G!bGT1(*S3GsFj($p!J($kR72(`onax?LSS-PLnpsH z*vg=3$*Lky_t=v80IktTZ$=l*IskKU3a2!$RwnWJ^XFqe9oJF#SO}1K7!1rnuV_s1 zfSVZ~8>{I`qM^We2=0&~Z@{w2eKmW@-p+3Q3h*G^f$$;bLo~bt*VbSO*_BXnahK_B zzFW68P>zm&RKe4&hv%}2ih8%W!$~29BcDO_B{Xd@wKqEv7UV8q_p_A5#Ar%Mv+zjv=nj*Jv8*XqqVtzzR3x&X%e(mlqGOTsqJktUy^>9># zCZY~pK{xR9g5X~3w++uBfS=>Q{(VzpVs-!m)AX$D=z>z{nc=Fc4D8l?V`HQ1v(Fn! zkV!-M@LPkF!yXJrnRNB!Xs-x!8kSsd~$Mb|91CMl-CF9ln5#z-rp@nN}x`}yx zVC5)qo4)KeLUaMT8XAK~kQqo^G5Vwem|Gjd#ez>7M@U9iuX*gDW*@kn%VcCUm=Ti; zT4XY)ya7(Ck%V=P62QG3A)%p1q?az){?X0e+f5PI$Y->Bar^t9p!Q~w;8lsopvZO9 z8a=A<6K-ocAIu6m5oiJ)(Yg8k%Yy(uBSi)*Ba-@jsk^n>xD~ikgWskvCPnb}cgr&* zntFe4q~RS@BL#c7NJVu(i}dyMJS+f`cy5WShE&mo%I;fu(HXFLDX?5OfT~ObcU1Ld z%y!&@8=2m8_e2;(MUTgjCoIFY=Z)sol3wwDv>Ga0`c(KhBqE}|$E%hNvc^6zK$nS$ z30+g+)0tU{FzH%gf6Rn(Q&>0-Jgt z!e-zg=Y>QDu0t|(6}=@d?p$277y4DFs{b-A7`<6l21Qe^(EA8BQ#@kr1r8#dR_^%KdjbkiRam zqHUfxVOdBc&!q_FpmhI!^*7xt)V+I^KE*4qnAiw~4!v;^ZjenXQnh|aBVdTNx2Cec z*yAgjZ=6W9fSRQb5g`F|&^K<%`M`8!R#pxtf|Pd)cJ_#I3<{4@e4xH)9m?nKf^g=C zOCmTb0sw6iO)ziPDS?XA0MnEdlz`t4L7B*?AiuvL9mP`+tWewN^m)f3RDi384?rY!009qTw`~eg`#a1|mcpRJ7NDml?i;)2N?ww?*Z`5FVRzzU8w=y#|M%mt<2sm zj379Q7QiQS9bC$Ugiu-q=tgy+P=+SZqs@BT)sJ(IJj z7WvQ5hMFIKq(X0tbNVxejDza{F$TdhYoM0aSyOXp3t(zRxF!(-B;vlt{rlg}q2)!W z^#L%rAKYbn~envf>P%J zw3!EU`u60LbzV_X1BP6~D@-8~92N)_4l(ylpw#oMFfXqLUvd$9lO4{EUoMyd9vG5? zNQw>Q9u0P&bdvaw>B_~vd9&>Vl0b?|?vEP1!d>8Z=}~>3N=(s*Ce0N}Z<;Q%Ders)?43Jc zsrep$4GpJ`VAs}JfK{FX^*;x#w7>@xR%N3vkmsNPgec!pizqjU>lm2TEdrGFqo-$M z3az#obf(`IvnEd~7%;NACdad8`dSeCJbYp$Uedh7Eu-0rdw>%si|d1n!fS=B@c-5~%vAn`xFgx)=H zFM;Sxb$4&iFISD7qTRSyN{S@P=VU*7`p3`^*H&5puR$jo-va@C8-$Q^qGMuLUfKoC zxz-#ZP$`=&LPIpQQu_J=pbyNXE&&7qEZ?^5Tt1xy+GaYWMY__`&G-rO%qx&E<~B6= z)j&ROB`@De1!@stx^7gKJ@P&`w;iNN1tT1hZ=Oj$E2|(dTPZ1ZTY1*`-ZeE{u!8al zlty0Jz!+znX^GFwid?RmsmGWn6Y3X&6lm0Zl|XI6e*2+ZU3bf&eBv7%`6*2Qq6ukk z)s1OqsGUn3YE7)>`Tm9+L3@gBIPC=fsenGrfS(tatx~w1GyO0fywWIqTMTUiNRWEo z00B5PU-4oCNS~XK3@A2Ggq@iHW7ci^RRUAdH8%datW)5c3o4l)vI2`70noqZCV7Vd z0`m!k(oS)dqN4Bp%-$so)-O#>q42A@zsK)br?0QC>z^q&5ezgv5n=&^x&|n!4%-VD zfoLEAe#Tu~RJ4}F|4wEvhk~NwsX91B+4brq_-lm+>E5;V>QJ!E&lQvZBW8S3%ngMH zbO_Y%o(cF5vz-O@l+L27@cvl?jjE!Q30u3JI#(eYa_FbJs zd4`!(wrbkJ3C;sm%nnL0cJTtzOGm5+&|;KPv!?`9qU2x3mKuONJpswf6M4midYzhj z>h(^=!d{5x0^naw>z2ktU6wqqC|&PwCL2)**Sg;D;a&TgI*k#t=HDt=PY&eVSD zl27>D)$})>b*JsXMU`)UldGBEkXDjH0~sz*k-G^fIFBCyb0v(F%E-w0fKyyV`$<(h zdQZ4XxNNkz4t>1~Byehm+Io89{J>rXG7m=>+ts`~jd2#4P_Hki4rf;QSK?t+_g}LP z0o%^#5y4Y5Q|Zyx=z8WD5t{IM%&a@?Q-o2X!C#hsYg9{Bvo)cQ$0RwRiA_kFuMVB$ z1}&6*$}S8Od}s1O2q#e09$?v~Kw$LG+u>chcNHbpbTf(^M0>n7babkL3q9uY|A%)J zZo_#I^&j^JLis;63;iE;6#d^_Lmk>EFx8R&8+@!t@qgYlx5Pc0jGq!Zc4Rn+`IiYQyS{ z|0WxTfzVJ$Z}Tg%WNJe_qhT4wzVRh>iJiggi6ugGL9IV-2aCW3Ta?|+J^9g0%TUl= ze_N_-$m}|01~TWKevn^TxvvWa*YZgOt?c{5eWV(2@6! zz5#m?7Z)diDVcb}x=6>&&9?%aaS{~bCT#wyoLH+cy+M~DISY4`C&9+`ckx~KIcrt? z5jz(U&;psEKjE1pDrypoG~S|V*_dy|b#-(Ab9&3+!|#p3tBG4ebmro`NnP{Exrj`* zHXNMrcDl9zhK=7dd`~Xj#ef3ID{UoV=A3YQ5BW>jkGIsWIOsimmC)(%8>*kyzu)KE zf}SRPyqtdF1$u^@{(}YU);nb8G{k&qRTFD$EKD>MWY)|MG=6I8>I1wtK6jD=*UZ3v zpkpAXm;o<3G5F;5#scjVA_(v=&(XF$4Kgb< zx^(xcz%g!cMJE$_7*=nLPMy|E9tm->8izU2^z*^rF-!!KZeaYtc+a08uMYV!>nrpE zK(Puv2IY3$o)6W}%JhdkgAVfjP|1svh&_E_oq>LplTUi zI8b2@a9B;zMXOBF?UVLZddE%D*sxrClb9a~DSdq}Auv4QOu9C{y62L(B<#}4Z;(b~ z9-Jp>=(apxD4X@e5~7mSL!P9!J7EYh;C<1AImMZlRB`uUbV<>WzI|czWWhoHIeEl+ zx{|ldOA*@4+|gu>OtQ=&v$v7&Df2shd?eVPnen~|qgRt|No#>5BABF=o10OH`OdH? zEvcyKU9FEaCGt<0*&d?gp~HqhimC2ZN=kUmS~Wo^1(z%oo?E|^RQ>5%(>pQ}Y%^B= zxIbF~M0=H7e7E1jj|rTuoiN&@muBMQwP8GF^^xe2uuw*78w}I`tj*DO7}9t9Y|iKS zDiEpCi)e0^)^qCOhk9}xf9st7D!v|vuFLSfK%*z7Fpty&ac1|uE$T`|LqT{D2aQz!pp1%(Y z!kg;Ymu%&3vzLEJSW1JXap^Y(6|<8RakWn z8ZSj+IkW?KzYAdj?et=7mB`t>Kftf(Z}hq2&l)lUT>;qBP(!1Lu@P>emF9cMW?Qo= zFz$P_s#WK?WACA^e)(@x7ql5c<*LxhcK>F7+9?@S8YBK70?izPHiq~|L=cU8ET-(Y zaQQwp>4<&Y9(5fk4GhFxlk26di zRy=HqH zar87nWroCUGtck@AG*q#NR>n}5a`ai0keHZd)t+8sJpAH1vKi-iiVR5(1LN-*qCY3 zW04kVq%uo>N-S|~U%9qdzgIUi1Wl^+e#e^|5P!l|L5_~+Im@yTcVDYo1j1~yP2%+8 z{dbp;bT#%*P*9J^$vSmG!YaFOVHOr#pxQ9P!m_XAME8bKuR4SFIb%=Q za5@{x_0e<3GTHN2u2z}lWuR|fuJ|3y$HCU{$8ze2Y(aZZJQtNTuSs#+8Z^b(L(|S| ze#!SQ(3KV3aJo~ZRqrkQU1*LF-Q3kydIarw_M0sfnfdvI6_cJfJiWXEk9^^N4)DDU z_%Kpzci6tFX{Hg~^D^HNH+OsLfC%P62N@Gh|2j0_gs%Indo``vR?U--`<@R*L2($no2)CZhASh=XZ8A^~rL89pLHTW~egDfgk1ebWj21 zzL?@>4{fzXEVnWtMcrSu^9yzA7Ndan;uhh>m7oCTvG{ccdxan8U3}pS=l0PTpC~ z#^&av?~#r5@JEaWI1wMc4;*XHPLJGS4K|xem8Q4*mFNqPpv2+H)$+H(hHqxu)kF7G5Bs%K7w?9#}4_r6}FY%!7Drk zr~lb4vydM8irtsq22MMRT!c=N!a`1O09TbKyJL|x-Be7ZGMi-3VjA0SOmRP|bi-Zb zVEP&HNBfyOZ(?H5XLlHEsj{JZbk!9wu~GK(gCnrwr|33rka*nZV>DlObPF%iBs+Z< z7Mcs=-GKI|h|$5hO&TZDRZF5wBIR za6&`ixcgi<;?I)ieF=^aH=X-52Jp9Ub8{{BJAN6D_K&;55dp(XfB$~z`4RPcO`Ch$ zjP#T?^O2y@hqf(a@u5X(2%&-q17_p67&Ye7zuF^_>AnYCEznafBD&}e?W~m4)OYmt zX`y7Mr>_qaDmz{T1g^`2aBb*bB!P!d7sau&3@c(%QD3H_@0%lW%y*$S#;JO zl2xp%YC)90-aQP!j56j9!olf~k(9>64q`T5JUYU1OM3PEH|EGl$I5~G&&_+Lre@*< zyh#T?k5Uud_}n)hK{?$@`Iv40Y)fdKp7h~Y#>n^DC8kkXKs>CBn5D%qU1w(gR?Oi8 zZLigEdR)5rhwepz1hNALWqEph0BJ}x)5$DFLyxMGnEE_LKQzRq!x0hOZ~_u;r)KIz z(P}VXxx#j08$6o=t%!3E^ou%j~pd> zluDYo51+>$W3j`f%mHy0nzml>V*Eab&KGEeJ`V0oLByyA`^w{|JAF-Yb}uZe5ic&y zX6z8^Vd(Zp=vneayXaYNANVw9%(X>6=wp*8A*L0{a+~y!gWkt97w|$4qC{MOzlYvH zEv|;+V(5mwNGt3p4NO?i_HsWKOD>c!6Cdup=LA(V*+e^&jIo{OjP?G!gkom`ubgVO z{P|-V>%`1*r^xk&v--i44Yi^zf(5r$(7Nx8rae2+i{wwnIk!%SO3@p({k`TBlk9hT z@N^x@4~)Z>B+T)qo0-n+Eve=9ia95c=Fkvi)I$7p5+CKL!; zQDo+=Cr6g^%nJbooOs?-wH{7T8S>462DGMS*rb66Tygna zJo&m3ZUWx$Ek{S+V1cex9l1HQY4EhF2~)kv60jLvn*RLEkw&h@Z9TSoG0)-o&G?}q zfnVg^938*1DJ>o`aCM3{jlVu^fca=!!ZIx0m5 zbxg})gC4P~+n#ksOk%MK2_qwv{ZqyHzaPyR$Lyj?oR?Loj6hYTjW^WL$Oe*;{cla` z^pu2J%(^-H5Bv3~Xy!z2BiWc$DB;9Ct-FzDF*+hte$9uEg`ZztaNPcxX?Lo=6=^>h z1BxXg)T*dX;MU1XQ3Is!iPmEp{n;$%o&d0?qAVbs-+7;6GbZ+DYfJN`mDf&LH^>z4 z0iflK4`o$%D=50GIea+Tuuds?UM+!pR7Gbc^ua*`M39xnr&uEP)BZ$sqVK^)vkMDr zuh%+doZWz?#bjZp0E09?JXhFe=-%svCmV3NFxJxw*-Oer(hca^)m;|q747$_V1}%q z|C3Q$sZkqISF*6G#L-AMQ_66Ip!G0ANAZtp7ps`KxDLw9(o#MTQ96ZWA?2gp)#&cU zel+a-QQ%QjwLo2F-g}3XS^gnB49jo+cC^bNX%2MJ=|6rvLkey`Zn%8)HJ^dXLt^61 z1MhELT>~EU3IKT5=5I=e|17pvM5G9B(|LDnDNyxSAhdUJyX@ zdm(!f8%*S~rrujHK#7eq2&AYFJWx(U$$ckDz@~3wrm4(jMdQF*9CR=9mXOP%eo|Tx>wFmrd9_Fl3F9_i_iulo~EQ*Zrux_ z*)vbE*`}b2jHPf-F?cJ(Xt7CX1ieHdH0eTd6i#gJ%GQb6U*qo{6n^mj$O+rGFc624 zTPW{vclFA?I2#)ZY90soH|O{rW~J+P26ZhbYpXoBm)^Rp4C0j4!;V?@q)U0u2D6}T z84j!z_|nKVKXQZ_}<=bgx767rIm z-oWHAA-^Ow;rQ6Qh^Z(m$FH`EL0QpYirXZWIZqa8!w(k4qa0&j1whGzQ+i4E-7m(>!^_JBpENVSjg9qwr=in; z!NWuVO2vOxR&@NzEC6p0Liu%>?S#nu;-b}$_sUUZLFxPJQSJblt}`*c&&ap~DNBE; zMZe|vOKw@PaX4B~h!HH^t)NxWtetzlHEtJ%miT;f4^&47t^ zY;j4+4uqOKcr%D4M1Yuijt(evi=t^$hQ3vGW#zX}Z|?X>7)i!Rq(t7E!LGh{VnSY9 z!Cd$SXkgO{1Z-xTg9oxl$_obaG#`j;LbYp1NPOKq8}gh$fe>M^)HW_g7&y6OFTh)| z7(Vng!#_w6J0H9;3qdmQ;SvP#e}9J*3;z9&KaW45@@LA00F9dRJM+;|*n%pOF^yAU zHa3f?M1HG!;s=l6dX~4r7z`*!8kT|bRhtiwpAVL=`l%ai!%kD&M^7CoWKcXO8C7aK zQSH+juP()L7zu*2-AWw;JW~gTg7=ZbN|_`SrvyeJSqFC`ncg}$)fwVxjTec7@4r`q zabk)?E<6!6nEd2*WSzl!s{H_r^&u%Nhx>p+B{7gsR8S7s~KjF%oX{-QNG< zzokbEBfIwZ&k$&B-;}EN#et7btI{WihZ+Wq;UGcskn+mA(y(-wuR4LOMgQu@IAy<{ zN-=l#YZL8orWD3@mSx#|+D_Othy&B1#PVD#~r_xWHJiw^#1j!dh{>4G#96 zLLEjLwM8t$%Mx5_$e%AQ^=6*h?bT?@>5D)YH6J(kCNoMqsxaC)CQIP-pf$ec2A7?- zMwttx(FgB!!&XX2-kjw7Oi^cVN(YPc)nTMbOu{+JoNdx%p|M8SzS+x5e-aX79yZI= z%KBZx$NhTU2{lo_KTBX@Y+R{NaA&)Pg2i^pWNbHEg#1DcB%Ny+AnzPqzrfe3$C7*B ztgq6+2olQspch&8Wd$elS!6((4~1+fsG+?tFRymzP5_|W&AB$TrT_Wkh(@6xgY?0v zcixzmS{*4t!zM^SwoLASd$S!%e$O|soCG;wW!q4W&c?zb2U{Ff%FoU1kTT|S029+Q z(;nQ4vgL)Y^&j;LQbT%9;f2+|*ueoWAlm($Mu|!_Z>Ql^SNl-JfM24P^9I7Fmr|$6D=t>5Q8CA9`a}(7-d^- zQv-Ftr{8YbCi)13$b4IL#}X8bNRNkr$7$Z1(ZbnLO#MJaNu_v9X66k$lTA6tjUk8R zQ-h*C)e3@NlXYHqpbQ@qMOyrSbOj-oN9w& z)2_s4wnJpL;OFnD{6Ecoc{G*n+x9J`Q8Y`GVi$!XA{isuGFHf3=6R?jWN1(ns%;)Z zC^JPNLPaF0%w^L+2u)%aJ>fmB-sk!K-t`UdAMYRE`ku9(wY2xXr|UYe^E{5@Jg@Uc zVY5cc3y8vV8jG}4R31jM4y=B+7{;!#-@4v2!R^(p_g9##+NG=ZT3PY_<#O^{5|4ml zSWE^Kkv%T#f^^i)FodkNB9S|LEFQZ|Ta^B~F3x4NUW8KSgLCNBNLLT<7GJ+yrovqL z4kY-G!b3~xvA*)ji`_ceDP{k3{N@SB;JXv^Gshu>7*3D+l@5pOem(6Tz!#1hk(YdCkK0LER>p>@p0`~SH*!$iV-8k9vTZ11fVuj2 zRd^TXV)@=VIcjBVXGcg+j^v9X(Z2o0`ZR2j)}$N#6}Y3$tTp>U<`y&2`Bac^eU12O zSroKc^>}rfGcuYIWk#Ow((O*G#%S`QS{2bV9b3(PnNGV^l1zrNu`&}T$OvI1v*2HOABuCGeywMIw?ic??4UVB~KygUoPj_8B&?m?@g z=?rv{D(E_DiKX7KikTt}VYNl@vV7X5tyN_f9qYK{Knvc$o3w3fB)I$po_J<~pFTyM zW7A&5UGKvDL+}nipy-S~*{=IO#fAlD+1OS?Vzd4IaCCO^`ufHkT2*oRiO)HxlHP8y zNyme4u%K%IV!<1l<9?n-437%}!t7Ti`S1lM*lTn5{9=CJr?!`Ya9djTFPzU zUzRO(%Phb4{W9j5q9j6#7gL!u2?>2*4#T5IB{{tap z$EYCTwp5j~GxBR15q`pPxWEE~fCv2|MnW6>kydDKr>c~&z#zBI%ZI>Xjj zlTL3oFfzXZOgjPzDcf@=v&0K(ne(Stx5)@kT*CQ1Ps^?jI`Fiyu@ws3T^KHFq*Is3 z6u?e`^`1FmrB;s@5X4Fx(7yIrAyNbfA31WJX-kDjgyE8rw#H6fce33oS%y6jzRF<} zcc8d&@=9erJqlGb8K6u0_(#2+5rWKtuR_Xq8gMb_usK-&LuhQqsiov|yaXh4803ZQ zG`f+Ip}_!XWp7-ye7OdrYU+n+IEWFvz<%QE?j5tg>*CWZv3FCT4hk04h^A^_VNn3< z{CI!tdG3B@bNb#~tzEw3S&EY%B8&gxq69X3oM#gdLS4+CyMy`i4z5%1J&5I*d73Tl zppH%igo_)X$Gn4s{ry9cx{A%9xi`_qPBVS)<;BkurJd0s65jB%qmj8+^hT{X5(en| zH8n3H4UtCM7xR(m0jH{M8W@|Iw_QzVChC=DS(00$Wj~doMlS(!t*`i0)OZIR-sx%) zAgR;yq@BO8QEO{nOZg9c8u7Q<7SbbgAB14$hpg5*u4vIs+^vy{+wF zuZ{9@P*wv-2W>a@t@8TPZ47HyLO~8c55e*d2oQ(p<4pmrXqHI zdCBkHechtc*AddTbXA9E(q@?@qq&Z}K@+OW*ad9X$hftk*Osv@_Le3id2+}5tA%#F zk+w=Z{oCbo2V_bE%QD{BOan(^q-u3EPhBj<$7SE>?RY)G#bj&XpT!MKnOf+PDw<4*I(_EP1t$tCgyZjskJ!N z7$m9$>BAVJ=uX73j~BNTyu9x-wz)Hl$TH9;0}dxB>0lSR?7*Fc=k8k+GHKL$1ZchV z#r$%!lgB)E#ISSUQ=Fc#=2tv*2qLL{YQvQb2r@*CK~2~2%j-3c`OFa(NAgTdp`{YB z|CUe(Cs%J8v(m3ry!>NYYuDPK3FQuUDo8dqGBSOQTiJC@pa}RIy%)&}&i;1K8h&%t zd_w2Q!(BIGEpkxbL4+8KLYZw0CNwNDvobwsF^l9?>)at!mJcL2KYz#17UBhG2ES@? zYV@(mpaML{>8~TaUippzXniPs^n(WUNFAV8UTLQ&p*d+bP);;8G(gucL|wU(ids)G z(-JL!(_GIrbv#gRFoKOGuEsG2gMYDe`;m~NT=_rer0h!sbl~5CFl4-j+j!SRK!i0+ z+~L_<>(q)c3im*x6ZIPrHmmdq2e&G@V8}7U+4e<1bnEHi{Pm9IaJZ^~OahYII2P8< zO%a;S4islO>Oye@7*>^?%nE?xyTJ0&vo6a#PQ<6tgiQtEb1r~z2F=AOBA*!;mC zXSgL;YTqq~*r?G^{CM%97*>uDS?pML-W5qEP00$T(4D}p{Ltg&jc3JLjA}dqFnW4= z+YDMrhq0lDbJw-iuM7Nif^NVEJAmN!vMu|7t+8SDi@}it2M->9_PHDbW&>8+dlp*R zWFW(063e}*FmTG5lV9#2@hk{h=3AVgX#eV4HM9!O44qK47_Ac!U_*clIT8quRkBQmV}EHOmS6@Ho_0W2aYsER6k zr?*x9l?vY1Gcr&hzNhQfk+W!2nM=|E3?XpMD^l7maVY58zROQ(AxhHPatyZgfB5hb z!BC-(MWpu6rEe7%M$aiM_=#-^`L}G}EL|wy}l2}TV!Bwkr%gPST=4iIQaOz9TiBJ{9oE}UqA`7X}Yl4{jcpWXXq7jrG1O{vXE zfStvozW*+x1H$eUav2fFp)^U=jic4kXVNCL_-bI(2T`V&$P1pa(-~a%Extzldi5k8 zdp7@<0Ct+=FqSB<{K;E4byEt6=w|89iY74+m~%KMw*b{7qjhVDAB*7InFfDAM9|Zn zNbt`o>0|jyBl+|BO{FQ|bO+|WErTBE#6rhF=ciF3MBxQtZqGNB3Fq6nA8_W4W95Ye zuuWKHC3(KlW!IwEo{#79iB?v#*Y zVn!w7BF(>WSt*;M_)tj3RE({^*w6vOvKx8E{2GhaO4j|Z^-Q`M92}g#VBx~AqrR1a z5w#rZa!YE4TQe^UW$UIWnpB;-w|R4pVv!vxQxfF7a){yl!Dxzqj z#SpRu2O(uU_dJI`l(w#0BxYQs2B>fi5Js=>C=xeGJKW#ok%a@U9s#r}?bwpBJ%Eex zK{i5h=Jzq}6h(8C`pWmq!97rFJl0{a%e``k+Oi{GR|i&0)Wrc}A8XZ?iC?kB5MPRH z-Yf}Hh|R*S6aM4Pd%?O|Cr&9Mr}s7v%d6O?Vd;VR882A#!c#L?%v-hvB9nO&ns|GR z!pU!`4bPrQ!F$XXtw4D|WOTHx)3Q%~*zSJwK&H-s(#)7r)9=Z#@IKl0Ve~WHzGUJz zU+roz%_n`Map+|>tQxI6+bV^VtJjA5mVRSjEJzQDp?AQ1u)q%bXpltHx(P)ZZBHE! z1WeQbX}`drS@;gony&3K!Y=(NNl8hk?hX{5==J}FhlB8B8;{(MdL2&>vW@K)fgt}N z70EyR&|~cYmha~os8VX%plMw}I7PB6mmu4LMEAv7TQ_fRflOq8=C*CV|Azz*Z!BP{ zLux1_ybI`Nkz*d&0uo4X`8(@#t8y*`E`9+1pp5?_V`l@ja8&uShHpegEl0<JGDB&h&GMc01{xbEn?~hN}z{YZ&@5d&k+`46Zj<;(2_Jzw33qxq& zjs5)c`q=<@w~^_;zILK+A_F?ft-5}cEX;vWO8CdkM7NeW32P_Uu;+DtS4hscearm; zidr^E-Vv~m0sUoZ+jkH{)23>3Hi73JY<{2fy5uAT7X5GGt1Z}nhdd7v4JmE|66P@Y zE53j$UCetDg;tLuLw3v(KkR8KJWj;N4T}Z;d+qffTJ?XCX8&J)&3Jc$4G<&`R5H^b z8LAntCU{&Eq0x_&Dq&Ui=PtC433HA{5}SsPto0j zbJ22P!wN6~kGF{rMPZdkM=H4gp5C%&MR|L?w%$Nw+EYJV3ENGh@a$!I*gUkIZkg<~ z+FEN{_+mm0K~KBwhaL7mMK~=Jb!o?lzsHCRNG9ck`ndO$d(n>M&ZdIqK@6srJQ!iE z)acT0bV;+JsDnh|zWPwZ#H?ogB61t{j%AlXrWwF6%I9vmR&<42lCXOWX?t3&;u7k>W%rd_)NODcpfBBR>y*K73Qt@><;nN-_MJ{67LYq6sMOew`V z8h3S_+|?O0S1b4)=pNSKUA&S!KcVGU;F%49QS9kJYdn2!(m2D-*`*6{i~X|CQ4UaG zUL7zcUh0gyTT1SZ8wTe=-+Im`abprQm#Z!=+M=-Z0@I74tQKNGvl3}TMsBN?gd?B) z9)IxYP2nf+?Pk?KeIymQ&8+6@>QSzy!aM5CWK7yruQ*DvB;LSv`S zv12sa&IlWS3}LYSr}E&W5+y37*6^RgJtbWn$_TDoM~l33Nq9Atsz}Cy6Jx>Jpt*AC zjBr>+san(`O7Al6F_lBDVYe#&#jS%|(fijWmf;df=l;1wD5g|r_dl0_fJ7NAp)FjZ zFG(qv(aOv*4@+gzY_LzP1JJLgDBriEt8aAT(On7aXPSkbOhGdycC0N{$K{p=M&;SR zNInwESZ#gh@WV5{Z*@eAL~|>cn9S~n82;a;0-7C2QQmU-hQ92rfPzs#IY{(-a_Vq{ zfMx*y?Q5|ilU#NdnW%}YYxE^&=8Sf$3CMP%*8f%cGk#>&6_;9BUC?^dg-tNEURH!tijCA^lAzZ+4o^k_ZgngUfjM z5XK(N1w|?0aL>!a#vcSRD_LRq<`Ez57~ch9pg zRXo)%dh}>FIWvXdk3K2ru06-DU-a_Ya@uzB82o%2`MC~ySaR0I8NPQB-fa0&H!9C9 zqVFTn$M}o}xzrrcyyOg`msZ0JM6-YhgiOT z=bZhhpjOqSMapKO7lh*_)JgWevBWCe*0`sqfQ{0VfjQMimW43TZQK5|tGH=N*qZsX zkF;da6O;n0gtSjo#GJhC{#KEMPNK7-L1;99v)`9{dr4vBwJ{mD?kohaEnBzhqFm;* z*RRY%ub}Y*omL*Z9`7(XC z8sjcTFCZ!S>=I_OPZl2M!(|4&tDofyKh=zSrfj%BZB&#;p@0MO&Uk0_v_Yq3V5JMQ z;Fu!ifs-GyH;rjmO5!RzF4)murz)L(t-3jCJSKz@j84WmXiO*-IDLvAIv~;}RmeU_ zS=EN54zME{Lh$}`Ujqe@CMtgo=VmI9272W7edXZt<3xkv2JE6l%>j;n?MG_$f`wN*?Z#17$czUa!e7#4soxGJvnrr@KH<;N zkp%O2lyK8>l|aad5cR6Wdj~?+@CAvDqUi}M1M^il$&D{+Ec&&^TFU*6JY>SHE=SLOc2J~xi?#7RK`EXwo-%) z=(0cOtoJN2iD}>5&E&L?dKS3bB1OLl0el!zLnmIpGFP584hWBw%;4^3B>K z-AUKt5V2QK|8^h`9(l{gAnu_v{(Uw@VIo*a&OW@HEjO1>x;KK|*I#1zCAJ!Ck>Q30HVk{Fb@d8UfI zzUv%I^i=J*Z7PGweg#CYb;PakO4@{=i&>FxVb9h$;rRN#$#`4i%d4%+HJp~0^ak-< zh1`J`G?7#^NjQ*ZW?-O|Pk-YbQ>4a*Bw-u3R_CFBV~8ZFa>J}3*k>cb(*+7u7r~zk z@qdIXaN_J5_xbuk6_IQY9OwPio}KYctw9Jc15nddoXj9a%w))wW+q>d>e6BG=XNmr z?D*~W!YP4;V@)|y9j#uF@GF}(kkFYu|JBc7h za*e*IMkdM)YR(6dO$|eJBygh`{TJSo<25}wI06;_iqKtLl)UR=gyo;KoVMi&x&*%T zOj=*!nz_b$Y1#WF9zRIA1o8lxzx#CHBT2hDlKdsP1kZT5NV(3l69mewzsM4P4J&9* zRbgj+=`n2yJ#PbP&7?ZOKe`_|u2fS0s+h8M+h^Q`fr^SsWyh*Kn7A&(#@H|&4FSG} zOK?J`7WNKios{ox65Wk*5WFLxTb%vwwmJtW^9hRn<){ElmW!?aCv74qhSVcUvdC8) zi}{2@`?#gyu!6WBAC1zIYfjQIShKX=a~zA`5nBK0e()wyW(oTY2ejHHV@3z+J@3Gf zXMSFAVY&?*r7J%}vn$5&4GVUlT!HoVZT0g`lr$0L-9T|Wp4Em~0`)VWjh&-SPIDP; z`Za{1bU^<`cn$%n0`-PRcbg*pXQqDoPO&<3r6e|?)S?-iMOM}2I1R45$GFov!m?PO zt&*v8ZSA+oQ(VlFYe&N75C610a%6q{_S6&Va-J&F@EuYoJ{`iY%|plx<&V8D`&Tk0 zVTOZk6C$7XhCW?8ikoJoplO(h_iLF!)o($b(_loBWH1oGdB_#34oRF!Kb$u{Ho$oTl3Ls~P{FFLB& zYtuaVTivR4)i#m^uQ9rm2B;a2Z5VIlV)r4X0If`PsFuG8RYiJlZ?ubq2phkIoc(Ro zSY!d^(cyVSiJHAhJk6$AybYmNKu%&QJEfwbt6Qz#vS;*!QIW%e8uJFKZCP&BI+Hm` zvmk$P&qmOnUiRJNZM3L~K?H+t^3hI=3i|aJ+-dg1nV?3*Imb8meU9|(&@Xz2(L+n3 zQ@tk?@ROR9AC$nnh&~rD>k43Y0(E-l{y8P#Xi3bmlk$-?1RaLxYQtru zxdKCljc`ek)eLkUA34Svg@xK{%Yh7im`XkG~QH=gTVMGm3< z=F+3#Z=~i&I_|HIvggF*#A%e>E+IFarBB`bR4(^{z_5w MJvwRyyAPlF4`_ + + +Coco +```````` +实现了SSH Server 和 Web Terminal Server的组件,提供ssh和websocket接口, 使用 Paramiko 和 Flask 开发。 + + +`Github `__ + + +Luna +```````` +现在是Web Terminal前端,计划前端页面都由该项目提供,Jumpserver只提供API,不再负责后台渲染html等。 + +`Github `__ + + +Guacamole +``````````` +Apache 跳板机项目,Jumpserver使用其组件实现RDP功能,Jumpserver并没有修改其代码而是添加了额外的插件,支持Jumpserver调用 + + +Jumpserver-python-sdk +``````````````````````` +Jumpserver API Python SDK,Coco目前使用该SDK与Jumpserver API交互 + +`Github `__ + + +组件架构图 +++++++++++++++++++++++++ +.. image:: _static/img/structure.png + :alt: 组件架构图 diff --git a/docs/user_guide.rst b/docs/user_guide.rst index 92b68a066..97d9810b3 100644 --- a/docs/user_guide.rst +++ b/docs/user_guide.rst @@ -1,7 +1,7 @@ 用户使用文档 -=========== +============= -这部分给您介绍Jumpserver的用户使用方法。 +这部分给您介绍Jumpserver的用户管理模块的使用方法。 .. toctree:: :maxdepth: 1