From 1fa5c8d6eefad581c1ef7cf10c6421aa27c2a537 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Fri, 3 Jul 2026 14:41:42 +0300 Subject: [PATCH] Backup for MikroGig created successfully at Jul 03 14:41:42. --- .../20260703/20260703144138-Binary.backup | Bin 0 -> 196628 bytes MikroGig/20260703/20260703144138-Config.rsc | 3386 +++++++++++++++++ .../20260703/20260703144138-Diff-Config.rsc | 234 ++ 3 files changed, 3620 insertions(+) create mode 100644 MikroGig/20260703/20260703144138-Binary.backup create mode 100644 MikroGig/20260703/20260703144138-Config.rsc create mode 100644 MikroGig/history/20260703/20260703144138-Diff-Config.rsc diff --git a/MikroGig/20260703/20260703144138-Binary.backup b/MikroGig/20260703/20260703144138-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..04a18911e8d42386cbdb5a585158af845080101e GIT binary patch literal 196628 zcmV+aKLEh*sF8CN00RJx(ibGrSXUyI!>dL?zg}hl0002|`~Q9*2L%9F!s&Ks1!Pd1 zV8*Oyn-lq1X3$5=98!rqBn=j&cCZ0Mc2m*;d=!N^61H$J@Rtmwns;g2D947b0(-nd z?39(P-YfAMa~p@|>E+h;^qf45XS@jftflTDgNsKNs`$20R_0cR7<3yW&S==A&a&FjqLgES(4TB`#2Ng;gtNQsLYf`=^ zS1A4i{R6gQPBI``r~;Rs4NhvX*#TpKC>=f{MC`betNzZX*ENPZB5N8LVwteV&V%@} zhks$vl)qEfD$=<%Oc2k`)q%?!0ZLte?Q`PYy5=v2GUGFm2$E3qHzeD_63&MkN3SK- zQ6)+JQ}4vz${bJ;sIi8p@{hQLW>0k?jp+2{->^#qx?ELvx-k@G-qT>l(6VQPMppvA zpU#5@@<2PfeEfS{1^a?`*enE% zIS6ur*sf9ye&ruA>%2y$WPe@|2h+G$FyRU9*kSbP;x`-Z1A{7fJ!oIe)~_Y^ECEG_ z3z9>G^*qt=4{g;PBZZ6b^(Z9HD4jUkP8#+-xJv`q<|T|<@LyqbPrudO-9RMUeI5hlx5 zkXjUWx7icn{AU<8!K1^g38NDZVUPd34sXJ6a#A5^e*)y3j(Oq2ojwa;njAq`0K@mw z*zMP46gq8;+&C-0dYOm?1ok_vQmKbR|DkxkceKR`J)NtnsXJ!A+R^*X`B;dbF}{)@ z5h9W%K_lMver+Ogo43~l*5CWUpMHsj*7vV1!XDgOoSY?G1Td+?GV$sN`?sF^1m<*S zJu@uh&zuBj3hM~pGu~e9@uYZNvvBTryxpA1RO2e(Hfj1Mh$cHf#AJoH`FS+rvZ<{L zbQx^0SSS^~H=p-j;Ujl!QoSq16xyNtc2iVcw7XF5Fy4MIM-8Nys|IM4^Vei=1@Bo2 zTD9Ht(L~G_(wlFmtzLdub^Iy+>`4_@mOn>VdvEa5^!i-8>sn|W^c zU+lfZYa`Yx<0y|IVyfYcI;NA=vAe`yMAjnt3>PCFlpFgJg-!e?)^w}r1z-t<5b?W& z{n{;j<=K~oD?gYK74YloIU4YAjjRZ&E-vy>RYx#$uG8ALg*_0a)4zr@HH<^0$s_C* z*m0EEwAT#@3ExDPT}eC({?^ntlT3CmN|)us69~NLxgBZN>|ZGcsEv>8=F>Vc`J`M% zx~E;o12lNic4c6f5}j{%Jf5x17~z$kcD_Q3Yg1WX2owjeCD_ryQ%!`-@}EP~nD(Wl zhmP|0UTRZQ)Z~&XjB&TS4dXh(?I7dI6oyQ}F=cgKHBli6vro@{!7o}Njf5JyM(%C30!`v7Vs#0J(~jd3#T8~5V&u^?oXXPR&GZmc{sOv6Z>vl-sVp!zj=#-?N?yyOfi}YWc5Oa$%is>tr z;R~NiM$%3P`sl1a3I-GmvO~OG3vOXjt{8cUbL$lPpT;$sv0Yw>AMO=;!7@7#71XP( zzKs94sDv39^qX4|dKQ}BBsCkPEq(c<3Rb2E2Adns<)!(s%>W(#p^ioZ55u*084R_t zemT>5NV~4iw{M6K^w0O_o)jO=ds30eX4^zenAmr@2IAe zIV^CcKUXxYh`D-s^2XnYmV2>*^BQ>2Jj} zQ>^&V>I&jeZ?5_QUJ+m9xk)kWjDWENKsZ9d~w z03Q!F@|gh@jJ1pk`MF#2u)JrM6!7#(f#sqg`N5UBi?h=HMz`jWyeQcF}aGQ+&=BrD{7wS~neUU+1O>5uekbz3Mf?=cQEykAkfDE?(koq%bMjXO5aQ*(s37>eS_N=!;tV^ePLTXZfK1{usqUYWzX$;;l|0P zqHgRvdrMa(wYt}J(0%GreR67x6uVy-GG{u?ATrcodpM!7iDIvKNEhI1cPs7UTO9g9 z#|Xq%7w4?tmz)4O7@mUw_k!$^EyfP=xtPwwKfib)D(CcNJVv)5P`sSxNfh61n#<0s z|1R3YsCwr-ptZLA`x>36`%@inKeDIDF}yM;WbEyA>5B59?F}8U20-$TQiK&=8M6C5 zM>mXwBk9z*EyOtv)Z9pTBx-r>hDNI40=sFU*(a~o6C1Dx(u(lfD3ZTBF!=*h8kY?XCDYVAB~4W;n6F0> zDH;!Fs|EYOkcv4;r{F`9N@s&~<6mLc1BKAitN2u4R#wWYKxk9%lj3532fl~7(@nQp z+ahtO!gxB@$Kzb-3oes9N((1h7ZP8+WqKl4?XN%4X_n}&#o zGu5n!*mh3dGbmX!N%JQoBky-v&^~7kSaABZf3`}^UY56k&S?N2;Mg+s%~8@PABQ3w zXM~{hyA281cEdJj7^~+nWxBzm3|C)sp1`@8j_DV^Wtj7B1fF0gfOmLhUI@c@(XdOZ zp1oC_#(NEhQyUX0F!iwq9{+su@q`SHyz>*RxQKj0pmOnQ;#bSSgCXod)oKyF5&67i zy3IgJhMa0Hkb<5pGX-@Q%Xi+?QF4co>NnXX!v7C^v+}elWlVkfjd8gt;oJA`VnvJ7 zJm=p(>88DV`^-PBYxFGmMV*^zA^T6Z{{7?QpS{|$S1jszXE!kF9?Sx#ioCO0pI`v# zZy$sIq_q|(=>S@}H-qlScWh;H5Z*qMG#3H#^*ztOFDoe7-xwzyK{MgF^&!A3o3CCl zR~Wx&nrvyvfU4P_jCl`>x{nsJeG8P#=p(U(lObapS|R2y%cVrlF4VK_$gb?DaSDy8 z@oW}A^j7l!W|e-P`p|H@U${VOM)$A|hEYmFaPMp_#wjyq45=sr4W+CjQs2Z;N8O** z+gvh$H_(oRqoK_O>0?O}pd|@+UjoUUW}^J{I%*6X!GzQ~cE(h73F|W!`Xm*An*Jn6 zsqlqPtP3U?Kn z;2wYX@u!Z4feh6#mi>b!o)Z~zE8^r1hyPW z|Cg(paaUu6TC9NeuP*j&6X1v8Y8MO=9HOL9k8(khOJ%9Cp=K#3wZJHZYIDN>1E@`mCs=LWpSIm6eZyT8|<6~&6bT>&D27^J>2fMus z$1gs(3kFVGV6seal{k5l+MyTXSjK1VbLonEvckVLphBL>=dE2heP!>vd~w8T(9sd3 z&>hHwp*+>f;^oP*r}^&=nc|saj2NgI@6WA+^IP*nn1nbL54yfnxN(!TU*91Pm`k3> zcF>4M0LI?WERs7D#9ai2bw!g|pZim2C%I`mKEzPtjf?$K0)rg6x#jw#L9kfRjy)!h z^m8L5Nu5IUbWF8xL;HY*@+B9WKtF4ybt}qq^Tm15FnS)?CFoc{T4;`D&dOjS7jB=4 zDEU&;8$qE3AkJyK3(Yjr#05(Yg+ezVs0yc$i06~h=yDb9&GnhW4Ji8oIO)QUH}$2L zcPA%~`RbOJ3}lA-=24g|i;ZhSx^Jr2_UNAezEuNLGPk<`99CJk!8O(SJ*l&ChkGgb zt=?+Nyeq=s;~gcG!5OyMp+U14!CMOomzJbOMb&xXdhRe(Kix-A6b=)pzj2TrVABi! z6{@eomi-(@@=MpwTRA3BHL%_``gzNXE97LBr_L=BMXm--IOdQ1{`T~d-#|1ki{TrK z^5W=2a7te}CqDBcA5MLya)FBVMPFA;4LRKW=;P>TobLzjN_E$6yR5KY`<9w>${-IA zljUbltqJZGlo4@>}<;S{yb0tjpLy7zddQ;1_!@|n&wmu&YEG- zV`oX=ayaKG68kknBEz^m>QC@U{Ma@_UaBXV`o?sz8po9B(F!QyV0K_5*Rim}(FULN z`0tt%6g3;-Xt~ejh}I3Kq1v-Sqla!%{pRZ5YT!L zkmj=PFD*hledhM@_q(li$lAiUuS-t@yqxRVUBO`d9EzX+B!zZAC`)_t^qh zh55ho{myFxA~iR6V+Inx{y^dfect<-ZgLRn#u6Jgz?{>n$M zLKf@3K1^b9-?e>`ruM#+Nf!9!NJZk) z(dR#lMa>~l)#LkRGjfEr{Y^y6am%w%&0Xc69gu(gQr8?jZ>ugDF`|prGijcd<%{YG zduUV++Hw*Dd@}o9&lFXW9wCHESNsTb?WYov9)>?BeBq_wtbZQ*lE3ze8Y)fXSsp|w z#l#4(|k=71UaRCBSxbX@Lt%fs^RyKVieTG2*k{qal z42=S^;v6@Ecn3S|`Y}Z*IH-vFqMK5se5wJyq`TbKWcMsK`6O-YrF;SI=%7w~#-D4q zY&}bt?eJc2xYZI!cwL}UvV6I%!y=is!Z?lephh%P_sp%`KYT?4@%okab|}W5GiI$$X!N&GVDnp`rt$RB~fN3n!(q zp|g%w03@7_dOv({hspAFW25fBzkU0!(}tocmKR5uC#(a=J_gZl9dBiBaB6Kh8idzJ zC^U?CrrVq{i%7A7F?~t`g_@LV-s}nVJ5#LEnX4lC3pt65tQkHFUu#5n%=Rrd7FqQ2 zSG*j3XRsL=wC*$i5Rq5QWMER^v)BgNM33J@{(!8ZPItQW)cZ{QVNRcns!n)En) zFT+&DiOh0H-o4}k-$ifqh;49Hwf-JPk1z5H;P1RjZ(}v!*ZEGwgW2x8>ad*roBzOG z>t$a`qacWsARnwa9y*l9UIUSR>08x=tCYaY*;fv0PA)A_d-_bj5?$=JyVJ8@0XbWOP{KGETXgy^BhmBhx)EzPXCWGfMO?7H{YAbpva6W6oU}tf@h5h>Q zw{$}!OFnLK)e@T*SOiapv#OJHo(Cw}m5{!gyJ91uCUIv2{Q*K0pynt4pA#@R@u~A8e(hndz!?dk4&CKylD|r zqI0{s(BIC?Wq3k&r?sRWnZrU= zRH60=Bts&0OLJBg#Z$`adFAdgj1Y}+|Eb{4T;pc) zxy+xu@qMFmf%)#k6nY5wIFMj;Z%F)WjX*7vX?7~*l;t7dDEUqRE+knxifpka>R9MN zmKgDmfJt1QaeLrb^d%g{?{Sw=AGrr34!~_30{3}swb=_)^u3P|jQTRU))?Fx@L(6_ z@H_9o)0;V1`_Tnne8H|JJ+MbIP|9{1g<{FJjofe@Q2cxgQ^X-6MgucO?Ms`fm`jq&yF`EuqQe|&b!coRo^pu9nXI~(w}E1;%A?`*o*ep+uT2n8dqis*z+L}0}gsh0w5 zA+SO;I`$I?UUS}_lUckFl|ZN%btZv!UvJzj#m`Er&8$II=E!Pq+x^QIWU0zyn`9=e z4$l=?0YuE{TwcL{bDBF|KcEg=6+b+JwoF7O($IF(lUWEu^W7+xQKDVVo%l(-L?{fh z+=5zvo$6!mV&s)hFxH?SBHpH5mZxpOW;56C2T>q(+n?DQ&DHC2JcPCSs%x$hzv%hM z0JB3(URU#`;dZ)2*Y6z@+$F4kP+U;#A&c*@=KcrYul9G~olk8SDXDgTtN+Y?0kOf* znl)yFrm9sZ?8xYO*rHBV18^aFK>{^~N;>+^3O^$IYuP74EDkjMvPq9MhEpwWKBxLF zTJyLNeagZ5KGl|7kRf={{)WkKKY5T!kH%xtR-m%Sm(t&Z@d-}5f&piyf#lu$i24rw z+VsFDfJ(F>)U)N-Y4MLyL~<}Hszhb&^0*`8tMG*`gI`&$qItAJmdIA zm*rt(N8_J-59%NoL#ZTWZT5&dTIyW@%$ianb0htnmNxDD^$AUYOWglQb6v<5@hnr0 z78dGW&UIRZlGLsb1q{m_n&cS_GXj8`Bc#yCdld5Ga6%xGoA770<{7N4RagH8%rtig zt`b)kZAO1MP!2j1`()`XLW<}oVEq?(@2c$|krjKswVf_Z{>dINdgUt`0B97nVjcRh;^ zsORvc=%mi~u3RqF3K(2eIh0%ZPJNvv9ak8bV>WtcqPp*JKy~ZYBI+j~wA#lz6DR`8 zjoG9i2C^e+-^rWDUPrHYcZ1}O^7S$7Mdd!J^j>s}MpfpfJ-zO*5q!WV#+!8C;PG%rr}SO3y}-RO-+p=&8XYbCcp` z;24>%d&bYL?MT~w-RN|DJ7jrS1R`m`$II*d0{CzB5}I_~@fN1LV+s(>QuAvDuqb4M zqoF63_FF6<7KsIE7w-lkv~DCL_^C$oGuv*SpNAo-;6cxVD`QYQ<79mIwx|yPR8dgCVL=prQ$MeIdR%j(n#=mPl{aaK%koV>Jr_O4C)LgI5S|}h95bG}gdg`& zpkQnHp}&vt?J_Z7%19eYnUduWFmSiV8M20EdN#}9Ui5UIaeb>eiE(P+EE5MKf8Blt zMa+ekWKx!P#-yRMHM%(Il^+N>i@+RiwJU=k&YFIJ(?B}JFjU(QCea(#R|Lgkn!Cne zv1yq&H>9N}?FT{e95zG+dQz~c8VK0G16w2(i6jG8QX!hdHxM#~IH0;ev0~F|)>S!;I zqL%;j-PTnT0x;T6bDlx`f^{SPC4d=ZWK7KSAr`;KN$%ndu6y0Fih=WPSgQXxs$}jb zXwDr$Y=gozSlz4F02yk_NOZ3%A4OeNhlibB*p10SQ*Z@^*}a`+Wv0O&P46cy#``94 zI8K&mH(;f^O?PIEIGDX?Ka3UW4zYLM)DnhRrVVd41Pj_5I1kBxZ6Ip0W~q6B|A zja-%9(7K5}NXfitogEgUz)@T|&q5nU#@VcK<^Paj@X;f}i$4!Li@?aCStT;L@UC!<=FREvtP%&Py#jqzsF3(jVu(m0Uw*ra~&9Y`?gFzaaf?@rU2_r!;FJ2L$6 z7{aGj(zTPND>;C+!aX33)#@po`*WXWWS(e@7b^?If68xC!u{d7DnJyka^IxYr$Ug#k6ffa)ibn-15|6fFU&LUiYMOi7kbOn$PBCo;i zd0+PJSS4Td=CaVyCn_Se{_p=r-hNSSp;1st05GMBL=QIwY;E&^UtN9hx#8MWv5K_; z29^9RS@@^!L90X(vXbHHuwBR88_MAu!eMl(ROXw$sqF?$=xtpRNqY5dL?_Fzjb#4Lt6a8 znC{lNVf&}NEHOA$K^zl&oBr3s{y6iW?O}`VSi}0%YdVf- zG^{b$c$S={K!35tajbI;xR+{9mKX0s85}s4+J1y_S?kltm8BiYQiLi!*&f3+I^c0h z+y3c$y7)QEn*Y+?TKo*T(D%F0Lo4?2;OJ}mikd+u|5^~PV~&L5S^);b`>&I{5x|0i zDyZ1iCjU%?j6-twR4F*}`gq|*`-+6H!8WoR8Mw)j1=g&vkz6caPr(eBKruxeT;}i= z&1(1Mab;O83wlGXpKe2EWZ-`&z3I&DNhbW?>UlP}P+Iu|BS}#FkI%ESOR6N#T2O$t zhL)aAp@n5M-*VIlTMC*aQ;Pgwpl)RBx^F24RAjs8SXD?1g!#{iFd-fc!5dtXJ{lt6 zJVEA*m-wuO2ET#)(aF+Admt)BX)=1{TMy91Ox}oZ<2)FVC-xnT0aVs%NQ-WSA71xd z|2UagF0#K^9+YJ?>)t6(lgT3UQKjLVjASc(JZ3CbfnFj@)&Ub!GpPB@F)^fVxytQ9L5l?VSym?f4Ng$>0&$8Kble!5 z$QmnxfJ{)*5;^>l2>o$v z5Snx1<(&H_g#tvzj13aJ<=^KHEmm+JG%nyJ<9qQ8iU(gb^L;NTbv0E~m3j&stgt|Rk7 z1ebe#+iM=`eiRcRRF|ntBg1J_-jlgXG$~`M(Zu}h4Fa)HF`39e@l(6M`~7hJ2IEsQ zsyLtBK=T(`^NdDqyBk2dxf874R!ZfY>w8)l>Mlip*E<4bwQS_cXH|F89aG0?OjeN* z2NgB4XIu?)HE6)Ii{XC-f!{bBjL2|Af*qJ(1mJg5RCXrKt*;quaHpVX!~ZC`w`eK| z>z%bg@v<=}#3(Q?q|N{u#JiALc0{BH`znq5)}ev)wHkIu46flx)lFUPtVrh#2SKy7 zx}5RM-$Pw4IS1abLfQ6^-;E2EHrrk=+}cb>T#;E}c%EGd)y&Q?sXa zs_@E&~o30)(sWbS(-kX1J5DTO_i~LS8a! zr~R}JwKdlA?M+R$#y2If|65tNUG=M#Ky!b`e_1q3ZNCB>WIjYYb`YenR&RX}(G{(V zdoL8*h6}A=SPvuS{Ig-N7#csK*&SKn0RTUp$jW!(sNo;ky=8+tE5cWp3{YDwG1*38 z*Bgz9^`|dPhQw)*R1|lGpXnT2gRVlrHa%-a&3Z3_q!8*lFzJ(cRtjZ=myxhhKXJFo zd=HHnF4{cp%VFBqd^#s(G+Q<@tha#p3{Q&a5KReZ+a{|j`YaC0hge9X@csX$o=_KA za}yM9vWTZhi_N}NGj!3t(>xgc6qXxYIhOvtO8L6Gh#^&hSg?nb{QqUfoE!%y=|0#OGITTeh=fFac<51YAj| z7Ay}NVk*eQ2Zuq-uh#_XHt~Jvq@wV~7@0uGssa!jV$HGTL_9m3aKBRaU;~>DpyKKr zD)WI5{gE!EG?4b`l>Q^r?SY9$P>$9!?c?Ka>}(0_Z7$H*te+O5|?fWSK672NvAwSyr|IX`>HUaCB*mK=3}{VolLC)Jwe~WUYksExK)wvb_@a8p67o?5Z{K(rOM3- zk5M6>)Ns)D;;?NzA0gKns!Z1ff8hTcZ}ejV(h3KPmS8oTgGW!jmn@$3ctC1=kPg;~ zLi#wPfne>5OZ`NTOJ{RjIVb}5!ONIHzh(i9bf!|`Bh%d~{BY#O$o8eW#Q@EPf?@mg z%7A4AgI*d%!~CkauG1a`LBHGk`IjeJOlX@7Tpt3!wy`Zy66*g#+9^2(Dc-b7zY118 zzYboKA^m8&V%dsqgrGNlel^{;RVzK#N!9wjjS(R5k}@g$tle$RyHlpI0XXR4n5pI1 zLt(!(-V{-AH(0+Vzkvm;xZ89gj>`|_^PyUt8M({cN(3{l(Tt#v7Ha&R?e7FXmJ9ntF3{iz$qQ5&ljbw)6sB2*h>AVuzwtd zDlT3sl-j8dPjr0YqfEpG2tQtoi~l zy{Y2~48vfqB3XIJ4_%K4^@4T?x*KRGw#m)gHc7obddpzkFT0mA4a)mI_qlNIOM{+) z$6^&CKdYU?R$Xz{cY+0TkiE`L8)ceK@!!9t)o38wR!+J~p+E2ZMd{sF4Y;Du*Qj1R zd)>U4zwMO@ZOnR{40h&T+(}Kjkj^oBvXkln`6mFt=m5H$gT1Wml$GVK_)?Mqre}+h=&^^>SMgO^>&b`N`6T&| zE9`ldM1P7~UI~g=v}|#Q0Y4Z53_VJGvpo+H9eSO4MTsQ zy}(o|DA*=Ekvgo+_82PjKg-X`jLaqGEl+En9_L^r^Mp0iXp>2B#_}b4)@YW;%KA7o ztn&sjA1M0674fBffYMF)QGxz<&&xaHAB}DNZCR{-Pw??jiq^ajK7`d$xwK%pJqIPL zgQ1#{v!R2%gjrz&f1|22#fR3y$Nhg3a@t#>)=kcGpCfDy0 zyji@u$DlgFQASMDMDgB!64}JA$?2DGnairq_Yu^nrb!XWchB1DW=+;(_Ac>+m#W35 z@?gYNQCd^-j-cH|7+e$aXmA0^yOV3~IuTXJ4K=I&mOJ-#;=^bIcTZJ5;Sx;BD;)%k zQB{XUMHh_flB!>YDoSuxuS|P+Gcqr_AR|AxuHK1NUFv85o|Bt|jU0`Kf98naCS1kh zgsG!mnIb}Rh8#AKLd4i6rvhbO6bAE_^Z!Zt$-j}Z%Xt}fE9oAI7mm3l5}N&0zYY>= z041}^F%;U}0nxP`4V_xJCo;D>-;_AZK{B~ReS6Yuj|Feqt^@J9cwyfisR}n{W$jn~ z&RGQAvaU^SW%=)^nre3qfCSHE1c(JNlxJz+Q3*=cSBlxz2ceID zE{b((n9;b-Qqu`E2OEfmtsH1ZR=m=xikSObyft-FUyN75_8W)=0B82XPqcmPZZf+i z#3V&=XGSrLAg1fRYSGYL>jgB3zkD=eNOAhQ6WBN6h%~x!2N~!omQ0S$GpNbrqbZwZ2vho?>aNfo_thu} zmrw*p#Vq15gopLCz&oBe_wD&_vIX5!qEB3H>CDr$4)6(HB%`k`FQtvGuctNcg1_W3TwGTWX^|PQ_k0J$or;7i<2O|8}Qt;WD&kl9~0$1 z0ZBNpHi4HCt3{Gj?l}1^ISSl{>fMbsNp{wqE?d1^Gn?<0-GV4VUt0J%lQs{9{~bD1 z_ATp>0rZbOfIdbLTn%!`;L=1R!bp$&cDIWQ@#(xK5<1BNqkgS8Z0#-OZq#?b|7Jw(Z&Xrda z+oUFGvd;Cg%7_my(``<+0uUh+cc2mgBB(6@%V6T0vEA@}IC{n7o{Ep#%H z_B#pqWoOB=@f;x7;HLb|JGy(z!v?+>>^|lnpem|b@p5Z0GlF412jxYcwVb-tQtmEXpS=hvdJnD;K6{gXv>{iY?H}7&<>!ZR zaJI-gQEv%!q&|Jn5Lv3!Xtv&TMDXtGQ_)o97`>UQIhUL>nLxy-O^=S49-lIEFedtf z>G})I(Sq0d@a&Fp!w3*EGpm2&_+{>{RUBF()EBgPko)y>5p**&?M^15Q_#4Qyf@!b zO1ILeRKnm9QSOk;0uOKcL0Md!TrC+ooV)K7)V^)vF4_buYFH}-#QhK?m{$S1y$lJW zzX!u@*bnCKs7rA2hV4$tC$cQ5en=Qrj7E6LvRE*-b1aW`5QC&VQRU8aK;$EIJkQKm-_e_*%F{F=dci3T8r2nZB$qXYT zv(1$TtpU7RP$bcK6B6@_+DcDlsh4aFf)^GbNwqu|_$Fea-`xcB?0eUFxFchbxT?xY zxT*Q(YNlgUd*fBU&(c80&t|G`08kI))zUf`h&5trXxWW|h##u$D4v-S9Tm?!7l4f1T+phB%Q?1~n$&kYvig=y@ z1A}(*2pf&^CJ8Ng2~Z<4rGhc1^nm9&2wFSc71Vyszq59$3Yz&m3tzr83O7bJYT-V!q=cUiCp?ZV=fA?ZE~&t=Wq4AHRTm0Fw}U+4WZ-vABghFcZy^bT#N}#X z_%wS3z~!XtCfVhmLT+XV^5|{j7xVtQZ*8WMup(2(^4**<&n5Zzx3To1CC9NEzZ7M{ z!lbrbq!bdyVT()Z7zq-m{Pq}QcbG7xwo0wf5DKq*puFuCLv2W8NDkuS9T)-YDI$@S}{!sh@;6T4L zG1Ih1X~iE_8DbO%30F%EK+-ubXK=&{Vs5zM1bUQ_mgP@Mz!>_FU;600Bz5A;j^7NK zC4ccUbmWjC*_32UdO1_wir)!$CC{fn?J0~HK*Gx<@W}#t--2sdjB^cBb(!)OjR-UT z-j##-E3ekPT~~Db3n&_Db82fJkQnr!8tF8*M@@KHNktM9oH#c!$lfa?RFc`-^5Gea z_|EbpBUnC4xzV;#vK51;{gOlLWqeie34*EIWbQf;W3n)XNi&pQ1-P5X7dm;{j4flcNkssnD;l!8$)D_+;x!LPfp>q?+;~Wm3X3p{^g5h}6W(V|ee7uK* zF`eGs4-Azi9hZ9K&rsN~u_ORm3|+~7%qrU013$`>?*q2B89^Z9GClF1!Z;JwRa9W+ zWk3^2i7e8$t@?9M+5exP2>u1{<+fZuc-XNjgb>|K~r9w?rDCL;X z)J_59?fzq_nmZMA}ziX-p`nSqH_iZ-7oDfEMvw=wp34V`HKpux)I}-J{ zm=d7A3%12iBJ3xGw|)D@XBsR_B$cVpA7~fJlu_29$G$`?v#G?ns_o>&QvD-(E2$-C|dggxXb#OHg ze(Zpuk<1}VK4eETEwRj&@j(BMmD}%%Rn*Sxjz}5$N_5ckE|}?f2RG-%mCcmgl5gSh zTqzankM3pQnO&}xGpwibk?}ohY#WiYUdh^ZgX>V1Hd#M2=?$UZH7Esho>Y1PgQd{I z|0(b&Z9pl+QPaS&Dq{sLHMW-6LGSrpC7p@r2ipqQrXcbL?YX%W$<0bBq}w(70^VX*A8?S3=XJmZHfBUYPANX}fM$ zh!F1SD?VYqD)C83jT-mr78KYw-UH=P?RXs?&!_|DF=myu27!kDNB4Bf!|{qKrWga30yg- z0BM$%q;5n`O)hjH#@M})VKfM+@0>4UfFd{?sc#S@zYQ^-AkO1bj546!U(*-4c72N8 zz{q||KV#^zb%7=~Gyj#{Mlhn;5+a9~d}DRph3*~TgWyyT`}$Ci9OR)PQw0!RBPhXj zUjwA;UWn-1zMWOcC0jHL%OD@YwjrW6afeHd!9z_*C+#`<=dsVcmrL7XAicc4mSG}{ zO(q(cr2rfYvV%1!={GizE=K!|AbyU0p#C0){&S3rF6Bk+KOf<4IMje1&qA(g zVc$1@qwYm9y!`zpDs7b9)%i{2aj3x2BV z7*FoKl(f1`HR5uc#t|UL6MJKsJCu@QufPSLHwVdBY95^(V_rQgQ#L{Sbw}H$*$Hp9 zw(RQF@ACH-m z?ny6*P*lt|+0ZrB;kaBTP zg{$43nbMYrLjp?~>WO~u&RPb4^bF`fI30G45wJ6{ZOZl-S+-XdnXVaGfpMx)G3D+*Mb1-0OO7#C;O1E zYutpK5hA2m3avgCO_mpmG+`-TvzR`5KxTk8S+~p|Au@SXFnA}8bXS)+opNK8pzH>X zUN9hiJ!4p??T+ybt9BH_&<5+ih+h;=stz|zybG@$1t;6YlCeKB^M=W57b*a zz2h1z+}{111njo|*%V)Qql-iwzPqcwwOR;{!jqnNN~1M=ZzxmAFC_0}Lw^7ybU}}k zO|V}C?)ocAW#&U@5vt!t#%lS}6WHBT>5O=N-OK?!#eKISjo<1k&Anf;g<7JTqv@FW zA2Iu)773K@7G{Kj6m$!&jfERQnLuCNLZl7hl7>@iPB1!Y4^O!`ZgzLgBE}@n*y2t8 z|Na!<(7=(O$0W_iEG`oiV4vAFFXSU)bF8j~*LW|UWNb>+2fe}Prfsp4JIhZGJ=y{4 z3*o^ex?BZS2afqWk1k=?Q-lIM6Uw%d6HhDHcO9Ih7b9yMuJMA$&PO&0r~aV1IZSnw zz9*CX!`WO=0wgC0jmSRH=cX_4l;mqu$JlI^K>E#rMyJ99VK+f@MZG<|vn*&54DX7{ zLi$HBsuWr(LED|Wyw#<1L2a$E>})P1x&e*pED03}hjDMaFa4_t%oVWo9`tF0+RjcS z%`VF6vp~yA`YB)KvbBg1xDJZn5kgcqaffCIYiqSo#mN*x+(c3A(H?MD$$K_f>bNM9 z37PAE^-+*0TsA6?hvFv_YPw1Ou=EVB-o`S#I8x#lj+8%^zR|rRWyph)O*Xq5UkGn< zAx$Z~Gf7uH7XFy+Iew`oCr*}i1wUcQQNaIEKu~Rjlj5WeeEgfl zy8j4RJ?pKo?+qL#F^z?`rh7O__cNYh7IqblP3NSY%PlA`(?&xyS~u>&n~l`&?bery zi0j6T=`xB5txOn64q~2D!=Ym$OJmlmg*Y~na0a<}9g3h2Z@m)TvZv#*tP?9s>!;l> z4`5r~@d)Dt&}pX5M;x)6!AVaP>U~YswnPpe^VSODfeyF5xITj&&ZXmoQpBNjAKy<| zbmK~~cI;&aJtpikc5MQei=X(Ap)Fo}B=g}BhUwYfS{x5{e50}+c|n+fjYL3S z3BvMc4i_{3?oowtU-$iNRz;UbG<;qd#9?24fG1zm%?J4hsRNnD^1$?qbi@A}VPZ_x zG~e5DC~TB1|HEI1X@o6dG5ilLtb#W!#pg;|J;fce_#vP6>x5Brlhm7gK0`^zg0dyKJX$9v90ocH-rRH;NIqA#aD3%^F-``WoAt#;gzCnEj;xi~_8MeZzREfn ztdBJ6hTVhFd!uJER=qLg2x0-Xt0m2ECsk=9>4E*c?iuIYvYRpS7olESvZ3HF0{RZXWS1to3G7>p=IM@Xk5mxfmLE$l(pr+FPx7Cc3o z)HgB8WMoL<{S`0)OX}#CaXZa@-{c;1F9LYLB>5p}l>m&kf43R#Xu{=IRipEsWB?_O z4;aK2lQIh$pIb)(Y&^0A@kGPRQHXip8cpzu`GYn?X^QT`qx67i+KffwEi;fdjzY;C zx`zQIXUi`$##WD(r0J3R-+6Tkho%rVY`*hY8(U9$Uy<6;^k8rk-5p=8{{u*F1DG>r zv_A5;(D>T6{J?lxe{Eu1stPS<8MMy#{HJiUg3?$8LU<7gPIG7fn3Fza@5A9y#>x!w zO|K@+=N}*Q&npA5%D8257*mP<2~|-EvW<-=@Gt+oFe@SJNw5biAmlvro6MBc9g#xO z+;Mqtz-RsEQ5?zp?c)Aj513cm84-Uk zhMPp`bB{$h_S2PseMiM*Qu9hznwe*5J%fY>#2%SM!!FZ%eH$eWSKRNz=7L|H$|aYQ ziBVZ}>0Aj1EfnMbA=J<^VJ*Rf+{{k_!JmWRGt1=oGRimi9Hy1qk;}p`w?_XZEJLy7kgHEla2ZINtX>Y2RLLV&Q{UUt32sxu?EYWB~y|#wMGYJTAe=p_(aL zYFn->YBc-Wbrc{c-ggHF;8mdWnW-~gJMEHxvzOThJN#O|I$+L?x+F+>dzub$e zQsOZi*#j&7ebHSGU(S7vTrQL?+-3_eLQA_Xevn!JVcp75;43GyCzLYlmX>4z$x3UF zg>qSw6lMI?k>V)+u--KXQrEll@y2AMWq=;=V<>fCnO1Te34{5#%t|?;^~Ded6!2$6 z6A?!Jn{*+~hym&^>SLj2>x7AeM3t2InkuVY0|beDZcr&`d2bp0c>Fz9FF+SzH=Bl_ zo(R|P8SlVxW{q8UTVZc;xcB)W*gxFz+R~JIU@V_Eww$+6j6fMg^eioNT36XvWJw-0 z589x-NE)k9Q26zh&KkOA+C=P4IjTvqlP8{<^)+F77j5|gA5vV@;(*@0oQA=wxj19r z#2R#gF+}PA>8XahggP4nbgJsV=f-0}wkp$2D8+!-l3yx(mSusTW$`iYa}VYkH*oP} zbKQf#B_jfS+;n=&8a`q&8E;OHvfi1})&|Q@Dx1Y!&{eQ#6qptt!s|t>59q$HM^~0$ z?m3&e3o+nWES-LqNi^U~O9i{);s7aQ&Upneos#IwmR9_(g+7l?JP6gOb%S8~H>^sC z8%Xe10)a7dJnmE3S3gjOow!)==_QI+^KSLc5}znmVOXmfz$QaS%9KOl+!(Z!2M;G& zmtkLqzI|*!phIIJRlQlP#Y7`N-W$e`g%7|?_a|K|!Q#N}yP=s7w*K~Wod25m$-X#F zg3e5U{PlO)cjck)Fg{Y|cTBoe8uHG#+y_z7MFy8*;W~30ENftN z3dCVcxea3Bt>@f>Wtz&_6=ojzJDUX76xeKE33Zn(KW$b~ez@Y^8``H5M#bfi!~t{B zSFFGIASQAtW>gNwRY>vNaRi<+jVHKznJ5WUtWlT~d|1v>K%#HU|!)8>A-p{HYQbqDE# zk%Zycb4@QR@|D3*Sn2=;L|OQ$7C2aR=0RRj(x9G1QpGV5p{eG#jI4uRqajBhbGooY z`af|mCVgSmu=FjnY?B~jdu>i>gS>@$!v6atiKSAZrLO@qkm4gV*EzuoR}`Yow44j? ztdsq*pCT}859kd5=L@;b!9=TPTp&0QB+CS@Q3w>+7^F`QT&|z!34YKVi12^SBQPr9 z;MtWv=9eZOP0cj`b`Av~1PJRiE0ie5zbU+jwx3fEeo;&FG>v@ODDgG3^2b>H?j=~H zwlv)~4*p0kEv!@SX83t%D(}Eu{T_`+5oP_eKL;vVr4Y@dL1(naGcX<|VMMB+K8US-w+w2tFpt^KjylP}2) zwo?RliIDI`PS4})iS?CqTib%b<`>-x< z3bQ{8D%$5+sSl_!sB?5~qt%{o9pu)T6(hq-c03xyVUs`eV4Nvk|AY`q*dAA~^wa5< zif1_S$cYjms!a7$;XpfrA~spgCmTGS^6VhuMS}4p?c8UVReI1B5k_}8FmE}B;f%l| z!3uLb7i9f>UeDLFxDbSHVnK6v+x2xH_ob)Q>#;1%H=TG^y)V& zA3m5@q~h3i$Ty#~dP{Oewu<8j6J@#>A;&=HWASrQC)uEcio7NHIX&4Ts>cYv^+ub- z!56T$Z1()SBm`5eql0DI=|Fh)OiBp&KYmwr!C;Y(rrZnG55?e>0LR0GssxbGGVJsm zY5j>l4b{X~RbpxjG2v=OkqJ6IYh+=uNVY&O__1~tiIoJz# zB}+Cvwn~zmF$p=gaCJxG=vt4mx@Y&K0<-~Q+&S=yw$U)m?0(;eo<7~ZQvXQ|`Ui|* zhC1*H2_mLF^icAGjG_2IIxh15ddU+nBqzyj6-0~VL!5K7K0q2Y>;iK>HL(DZJ$-$E zJBzy1*EG2l$O%9!jqk8Dv5dFAe%lxl{@FK3f}WDA`R;vMRPeoS9nF%g)wNdQ+%68) zU!(q+ldA|IDD^sv06;p;CTQ3M13ZOvv2I7~F_7%KfwHVy)=>si7#jP1sd(K?53Mw4 zXc7$sQh^tBX4JyS)EhXswnk56Rbk$4nW`}zY%KWyPnezazgHab^^+zCQc~k!l)tv5piRtyk6Rq1~LXHmw z@Tc2IuE=`riK(RCMTcegP4+0<5^ZwoN^p-^ENHC1`s(b2$aHn;2`k)rn{VO~l8gsVty5p6E-uuqFvZp{=uA@D&lLzX8 zj3ixYXl+1^dP`va$_BrNKX0i`hkX1*o2g?ku2|z}+$dMSFf&dO3&qhA%>eyeoRErE zVt|;1@_ut@`wMb#!s3u(rjr|mmztp_T5F_E%8cZU>3b}UeI>W@dpLuZHB+Q%yb8_G z>Kw?&m6UP$*H5@6RoTSt`J@A$2)XYu^Y_~}a>Ysyv8M%5m##e`dc{mz@n{x~ftjP6 zUQRc6TfMY>dp@K;a*_Rnp%qgx30D~U>h&Fd_pSPgoQLhxeIWuRy&~pF7E`oE;#X&q z2$N9uK-RU@Y)c1v1UZ@#gu)HA4MF1YRq(>996c$_SDF$TdiREqAt7qyPkEW2Pr(y% zNrVMw4YNGOSbdA)j$a7%NY~U}1l=}o%wfDijzB2-&BZtSJCQ*ZXlSFk4DMG%Px}EI zB}2T5VaOHVHJ?8xdyF-@^Z)D83z29 zGcdMCGH)bps9*60iIN8t2g~R5(NDK+R();0?)(IpSH73Iy0ww(Dl!n04Xwr*ebfeH zQ@l!RFWBYycgigx#V3`~j;z@=DZLjCVj_g}3g;Sh8p|bDluqcm_mXR;zU7L;6`%NAVX#bpzl(=MDrE4RG3wE6Z6J-7qmA?QWG{#_;R^GHhK z{Q^Zx;Zj4BZ8q7!kSf>{U zIXbdU?~Gn?r+k2Jq*6TB5h(81ES1lt!{rMz*-<{yax0fh;6S^1Z6hVh4AcE@VU&qX z_Ft=$D%P9BU||Wu26+qj=VV1lk(rChgz1z5LuVh51dA_pJ4e)Nk{Iu}$zS2Yzq-Lv zlh?65&Z<-cbu zb;9}JAw@{^G5`4y7^Lwp-ft|rkHE6{r;h@2)vM32Jc2^fmJ_@*5DyPFtDTIJCXrXL zm=pGbc19+a5yfK|5VUH$mZP{)WR|xwi!4%z1@jxledo^Gdf1HX)b$Tmbf##{))Sdc ze+zJ5Meqqkl`I0rEIVB5NjT8Jdp7iUXek74>UrA@cPUQm7i7z&**q-&=PLw{+gC@L z)9G>j{rTRdm8V+p|Hd|DmzRhZHd}xavH<{7tfnWt4!}jAy+$hWbU>+;(6)}N$41#d zh=B^c$2#vF%HmNO!&D{yxu5$F!pSgLt4O{|1Ps! zYt05eDk{W;6F{hRyLb|wAtqHbz*zWzsn28o)qLhrjX>j8=M$?V23eMMPFCyM{OSA` zvMw70?n)Pi^|AnsMm#^u*em8BpGttV3Z6nxX(2_qU0-LIuH)@4cbswOYH!D{5T8`oP8 z6yVfu(2~ zj;|zk9MN8y%Y~ZZ92_u-_i3nnl^sgkCj6tEgNx&7tK0Lis95s-Bg|1VM+J?v&T-HS zJ4xEa&gZ<6g&s)p<#iM=M^K`RbA$}xkEqPg_;oO30jtIoW8}(>sw})RnK_c)M>Ze| zKr(Kl>RGce5{hXJU8x=OdzT({um$F4fK$;}(QKi1iDLzfDXlKvM5mY7!)_CYYmI4aqhJ}_vBm@Bj~Jixhs8eQv+N&h+#S&*D z^=VaAeH|AliS#m!Jl#ATRduicn-TdOY^jF1IzmhN$MN=T$o_A+u>|fbvWRIxH@6d@ zkE2ca)jTh6NvBL9gZcv(-@>4@A0#o}|L2HB<+OiZ5QcBXNJQf@{R|t#gn9bE?Y$bcQT=)^=V<+Wd*Y)g6RT+beMCm)GA_*eT_x{j_TF#(|!6nICayFje z-kD01HjP1N%bAc+c-%1f!T;~JL2t{EAKr%nQ}$aPfj`56bT-pfP^^1y*A|bBvg3*l z^MA@8Q)3G}6n0flEQINAZD&ron$9{_qV)PoPMDQjtlu#eltW4ML3^y^_)pB<^2#Hu z2|lccHgtdexOcOEeN|f$pB_?8gZi0Bqd!YY+Z=!>jj}nj$l(Ti*yjM_!F*BrD1-(M z_!0^I_OYODMA7~)_B9D-Lg}UbcND|MgWRbxdO;1SQ0Xvo>KCE1HMMY*%&(7ok2YRF=PZ%9kqR0bNpU150b2jie@6 zFryjKoUHGKgm&QykSPv85y{PfP?K0?!ePl0(<)+7y#d>IyG@t5c#Xq;oELu31)(H_ z55wpaM}jpmcln4S>DppEClAGEu9){`{SS;#R>LQfORrNwhx9xgqbVc-b|G=Vw-pmtdFSVRF1BO;AbB@wtBDEK%;`CxYhx*o6PcHB zmjF)^Y5w(fqr+4;52J?D&Oq+DzCFULv`t3V>0%_k5)cyzZKYx4iBm=G7ZW5TVMnGS z+;oK3N2baAjq&i=Oyv}iC*49A_TPIMJiQfKiS#;d;Iq#+(c-m}(`N+X_ z>%yE_z`ygC;xCIm%Z%5L)-5daW(_4Wh1=s)JjIi0e6`d2Vq^P}92DM?^x8B=H;)I!IwErIA1Xykavu zOs_m?c6=F>(fYFzm4NPF;_={#e|awpRp7awc_$MZlOvkD{vxygAvEB-_7i366uNRv@ zaOQ&r*ebA%^QQveO0l;1#%sVq|tH?k$TLjWy>|Q>HSh#vHJKM;C<*Ubc7;Bed zRszrhcJqcb(S}WuGer9VnTxrUWgnIF=QQNlDH|Q!>Pw(rX@6B97Eph|p4rK8-v9Cica4uBPJRyx= z)zOZtU3(V`O)?+>>T3j3ZM_`^Pm3FXfPhZ}KrykD0s9KU!^cJG1FL;XcPe<`Ugu2S zU9EADBM=5PWLcb|V|2bhnib+9DsY)Ac4X`5=&$?9N8*__zT-Z*1BY6QE4)XEYl^^8SC{ZcWVHt$CQ-oNHivW0GI z$_&(Zps^u{Qrxkrj)g&*`?wr9{@7DH+b0CH2T(Ap3O+0X#J0CYU3V(cnI1(9(?YAS5C$B>!lnS7IAbK=9 zYG4ID_gdIzFz(S$Ds_A1B=zgzmYjv;q)3Kgy$7hj08 z^43(Zc_B2|f(p*V0RE}T!FhJ~RoiI>{-JvYsjSnQ3t6^C)Np`RX13i)0RcaEIQ4eX zB0-z*@o4v-2gT)!k7)+?dcW~c02ZGW!pWmmNtbgdeOG~MjLhMlLG&R3z_hk%r8K~v z2>|;b2DjRk+*aTZ8_%#HZH&j=fP4di;YGk6Y(&)J8)Sf6oywUlzXCVYIB<|hSHY9w zm=WgyY5Hq=HoqmM``0tntb6K3UVn$uxZG%07P%>9SZ&r+tZx_(+;UO#e8kHWsYBUy z!Q&}{yC$;;bwTG0iY>^a zjEdYLw4rfTni9zPLRq4Us;9apHHI`TIY1sijjj`$eP=at)odVCaZ74g-8y^5D%w}m z`I@CK->++w2U9>11*;wWYpoZACL6EQ(PCL29J6>R6(m(Q|KiyTPR)1|X+$|zt+qzJbsy@v`jZ!*f+CvE17{Jn!3mqhGLJ~{!{mf({w z=?|cg<*8pd5UfP9%4JYw|3^Vvv?%u%itXx|Re54JU$sy$w-SYliIC?*9h-4tC3K^8 z3GHWV?Q7b`>>ZK#K+zhxnJk=zcv(P#C1gV?+~n}rSS7;s3BgNa3ajTUK?xa-@yo#l~M;Zt%s;46V!vDuu^Z(j4~6QOGdQf zKjug0hCW#vjL0~$t|Svh9$}1aL(4KZE+c^D`#VS?Z;W=R3KJ2TKfM?Lh3WSYZwyyX zlI;B?-4`(OP2L_EO-9+ICrKx~7YFLfmqmuF)sC^4J${HhpdDde^AXjIeFU0`NJdUS zuD+~x=+6Z`q@#si8Ve7 zQ29kM1~F<|S5X<(3AV&lx;S9`g9=hF%6g;7U$H3|MQ51RV zxU(MnK%w^P@xNW;NO;LcX7_>=I125<*eX%%R_Vs1&#O{j!+;t5ox#ExkAb#aROon0}VjM=65dK&=VM z2K!2rSb1eR;|AdoCwZ5ozWloAQ&OeuT*};z+Vjp2fZyOCPK;~&XL*nX;tm}`m%NH>@ohZNFrzdAj^Wg4N0Qjr^ikx*bEZvItQ~t8|PTEGNjnUgK}g<#(bOVb*|9{(6q0(pITu zD9YQ0B+#g~^OaIhDQbVr&v;MA<{UecQ0V^vtjHLk z8Gz@kZvrZrGa(zmjOG_1v!{P_gYF1Of0#V~=kw$f`d0DN)uG?6ykz zPbM47y_ln9f6b+0>N!jD)%?ztVQnH0jd3Vo#E>trI?CcMO7g ze@q3^1#CEvqK~Sd{|#?ehDSF+RyPAZi<(b~-JBT^ zj+!CAUrw!Yy8dxDoO|mAL|9(2i5U*c!1o>0gLv=pOP#|W4Of(8m?4XLSv8GMvf`=V+O;{O>GjH(kP?u!rBUJhA__jz95h9kA+W=DM*-&Se)om#{?{`3`-&DnJ zEjd-!{uPv$TXe>=n^%;mMoP&;3U2`_%FhLuc1`7>qCjx`<|zda+B1aHr@GAfoC8$c zhlLG5vZCb;v~OxI;}3I}E9iJk>yu2jN%-?n&BDWt% zs!BuC_UN{O79h#dp82l$Q;=1n&lS+xyH_v7EQR1__|b>&V*2fA_kogOCqF~Oje1zZ z)It6qvUfXG;f7`OeQU!*{;K#a#?IAg5*UTFHrRSbn+dt5h@+nG2+V7H-<8{8wsM5I zUU2nE31Q)osm1ny94uC!uZV4<;;@240q&w_?A+P#%A!UZ~v9EO&E#jQfPmjB8$u%&$*HsufU7|vMD9zG&^ zry9oW03~2uzlo6qn5*(?uzi*26Ifgaa@>iA${569i5+-R*LrenrcxER&g)*TU#NCr z$#>iCQ(w%j%T-WlPfceV?>dAbkCmgLlmYx8)R|wj{x$vDAm~1Zi|N?qhtW#{N8!z# z;hGY{dI{iIsP3T$d=i8WM;<#Ls7yvM3d4M>k4arLbZlW3`*y%)NK3Ps z)iDdyR+H{N8`Uz~FoVQLPjw7c7B4n9!P5>+qfI4&dV2seiwB;060IKbSsB(ERIyF0 zRk(r>HVq2%UV^`0)wFHY1Hgv}p)ac0@5?RURJ%>To1$y=Sbp7`l5Qo#ueuad)~+R) z8Ns3RPjIPiU{#es1-PR*=?nw!&55(&i(Eg8M(!wT32v@yCO8xT@{D+VJ0-ibn@Yp~ zHoB+1nrA$yd_MpSWa@2%UzzhB~i42)>h#EeyVCLu-CU zuM1PR$&Qnmau7CiL&cMX&?AOLs)c13a#mU;aCf|F4teEF+*Aie3`vZJfKbUguEvVw zz4IODx*tFmKJSn+fu&!Y!%3CiWE3GZ4LA=?^Bm1xYOpO$|OOS1^Tbb@H zjVR138U6kmKkk+($hlT}OXM}aO1FukrAu5;jN}W1i@={EbNT-VJp!0pfEA!QeW4BD zW0X7}IYa={HVX5g+{&ugZHr5%miTTKHm|VftktNt!mk)r@gM3nZXM%YgaV7Vsyvj+ z;AM-xS>n7&SueWN6+7tpLU~o6_zQ{bg?@Lqa*&V46AyCXfM7p~uh|`+14ix>O zk@BT`47`T6--cmf$A}Ujn-VG~V69G-jy#`W4tU$p$P6P3T!5Y4JmQSEuXTbF_~uLs z)*p;Fn?(x{eI;xcFFatVUBn^c-^3RJbMORR3`@v#A(*_}hsN9qq|}HFM{1>tO;kys6tu7Ltu6i1?<6#%VOwICjoCw#xCH zr8ys*z&5RGe6`VPJzYQD<;kf<50Pjij)@K{8W|44FEU1+B~t9B)bl#qnCgTA`#zM? ziYADeW{&kB*&$4&m`Iw*^dKX7Lp-N*1(emv*zne&!wcfNH70I+zO~d6A4(**n&xGh zjco>R+{JJz7$w+L5DPi9MPUwXH&_Gnc&x|9RDqQZ_p+lAV7z+^16bONi9<7QuaFU- zh4P58unC1hM_=={+hajWG%QNgp5{TupQm|&MUu+2@z??wj^Dh;I6~+@^J!z=X8oph zu^2!xZpzY-(piRqe_TEcy-mz;J8FW}Kvy$xDT&cB!Sodk~wl zMvZ(o5Sa<(=c%6ocEeRV65t?G3S+#UBxCc3O=JK(?$4+7CO_k$a6&t(Kn{{t3#FzF z_F2(_fNe}-xKjZSmNMbSB7L!e3f-LeJ!hTdjsA5yJW%FLQ^EsWwEu1k%6-66yB)L?QTmT1Qi;z? ztj^qcZY!=re?U1~gtkU1!cv+%L@vOiK}e!pI(F7D|9g$ti{=imPYADRqG-ckfmt?X0E^; z9GC*j>fya2QW)JPd-W2DkvI;n0yf7J*^$k&CGrsvRsiBEN;55-l((fcL zIL|*N5p?@7p+a-UpjvPsuxfN`JemPym;5`faNa4Gm{UGHI)PxTnNgrk)4Dj-9m%ra zS%=~qQnNajF-(eG&5u|rnfj}%jQ?r`vZn%AQeQAxWbtZr&lvYLi&pyOP5598J!OlL zLaJEJ5>U}!K{w6#NVoKv#x=Y(OKE^3gl&&ZT8yDnJ?~FmcuVLpXB!~=-f8~-8PY)N z%uDtR$ZTQ@(8+#$x?_ntIDrfaqKruufeK#kWwm-YX$^S9{xq z)aTPDzkBc6k}sy1&Loz^e6`H3eO5909#s=3x;|LoD>e73885)kxrP-v=#be9{|hNT zf|4FTg>)obpL0eHH22RpFuF>EXZ-JHsHvW6jG*Y?T%6-M-Ecj<^3Ka)3X4FJX^+)g zDJom<$oBoYdhn){je}j{B9jIPdNT;?lgL!Dv$LYX3lcIJLo)XM+?w)aZaXuZ|LfP~ zJ+&1+zqYZe(KS1pr_^EtA{PBksNkWsKHyOAx&>NG92nF_DXDiram0(2VW;0_iZG7* z@_wa%DOk!HbvzN<;VJbF{jki%E0;UJr+< zKiQngx2j)F zvRP7KD3dEAUp>~(ad7_br%rERP!R>Fc039w^_TK~Y);7=-p|v0P^%~Fndb#87<o2Ub0)UI zUMMSlWR35WB1QNOdPcBVG<(R@f?7z;F3Uuwhy^{ey=qxi%{flxO4=Nwmou{KeWS=q zY}&o@1ipnc@*9j=4@1>V2+cq4KnBZ2{e&GE>UtrWVhk;Hd5%z02<(bh`E9PHj&uzj z=hpW}$|pT5V_H5S5-S3I|FL&NvhgwiUiCFmsI^xV>waVc70-NeA`N)a99O{v^ss)O z*UxcCGNL6mV=cOaVI{8=oO5cJwuAsp9a?LNd^AeC%}h;iT4T(KJu>a{p9kD|g#1zM zF;$52K1}^e$zYMX-@X|wqz`D$)0D*2H}d5Bz6fFLKcbJ~EnrE8VR7*738q5R8XOJZ zG3>Lk+iM~jt3hoPwieuq++UXtGh?)%_9v%H1>Vo!IuPS~M#@URD|2>$Nw#k%>LfP8 zmA;6e`ZptLZT`;)slnQaq@>t=iksBN_7Pt1Q5VjQ;o?_Ijy{w!>{o2)8cf7O%09j# zIwy`YE_P*4Ga*A5KkAW)w487FsF}E^2oR=%^es0} zVN;lxM^mr}q|>}1TGto5sDXJ{PGJMu#Qs(FhxkZ^>h7%0?@BaEHKZET7xlo2WxSam z_85y(VVPZO)?5OL8*Z6Cf0FLhXSkI3&y8N;3jIz_G)BP+vM#$K^Qhz3=&{dbT8>1_ zkH#W~Vy$6g1VXEx@6RyJn^r8N0At2ce~dakbLwf!(OvK%@i@}C=V!aU&m+fmh*_x5 z)GtCp`i~zbAGGlmd0%%T7ONLWBD6&z^R6h>poxmb%ZZ|PPwMhn^cn!#3h{v`v-BH( zSoI@X|AT68RH8RO0~nWfgGW<0vV%Kje&0%_cH&??=+B zQSkqRyHKkW7?&rs${2zlL{b-CU9Ra>7dB}9e;BXme)+Mwo1*|YsJxJBLXX88bYzg3sbHE^vb_-p?ha?ME$;C9 zgx#I9MIf-+#pyUs?Ornwrpj69id^eX`farv&0$KriS-50Ci6r zW)?bNx+bF1UgVPB!tH+{@87p=LL&5qPY*?*IL!stOwfcX}h&v4v4o`Jn$}`V=6F^ ziuXCK{BOh-uk8)*vV%UkogejZ!QdNz>l$%YvlwxP@HQsc`a8KeYcZ>$n|JGzL?Gb5 zV(w0i0djOV3blkqSMQoUeEeAlVvbbymdya(hgj~YH)(oM;a|{3=`6rO>&`1caCMFw zrmE-vluFIIRSrB{r6N`$vr2(#z7sXbv7&O9ltj7_^pXVCm^;(Kum4I8N;KZdm1BS2 zM;DV7q<3-jjEW#C%HJNDl`)5DAda5RxsyF!aQTo z26vaTVcLaTu3EUgFG47k{cs5A39!>_-8L5uGduXBRbDj;`F}<5iSa(4dG^X|oC7kY zDPDE~1;seao7$|rBy-_`ktfSay6eDJwd*;c9__t6tOv}3QE}$zYsah`OMSZSOkAL;O|Ni*QHRT(gU@SZp_*4vTA%|Ycw7!|1$&F&F)hM+0@S3( zj@{iJ%~?(j2S8odIT5Yo9G#3ORECAT$^4ddQ((1-M~b(fjOUxG8tQlo2ov6|r=haV z-SOsUl4(Hamx}(T#W;7zKaeJAK0DR~Q#azgf1TTlPai;9)^ zAr2ldYZRweh;l;1wL-yN-=Lcxp1*ntGHM)l^dn<_M*P?;D~I8?{gc8gL4swRb>j3< ztz7M5PUo{!>KUNpKhseN>ADRy%I%1S#qY4JMahDUZ;)G_b%Z^PpLKrny&$v%Y2Bw) zn=9%|Kzmrd$H}ELhR32*O5M7Z#0-e@OM?&g0*)P>Yo(9A$VvUJWkVB_>hbb%Qt8Ti zwqwtGIktV;y$E9RgyNq|Mmc|PiuT*J7rCD+Q2rEa+_prLqQQbegN8Gjh|aB#uS-p% zpuzU&b;ydyl{)(h8Uf@DJ*^z%@1cNdtel%iDqHRynmb!buZLYc)9Fy@uHCha-aY1G z<&sLM&hUj%7sY~y(!vS7QTYAl5}|3@Ts3I(n3tE$(QnyubA|Q6T-w8C8~5jEyJ?VU zuWCETFJwKCxu<_o$oz{2BI5}l$bOcQGWklkqV0me4PLHGesdk*lJ*}67=fEKzDDQP z?0$wR_GC;X;x^%iTHLN_@L-mc$Mftsz9F)I71NaXzgVYc1H`6r$ynKb!;=vOkUEv; zA=d1STR!MI0PKx%%5fK-9O%92U!@Oo#^okuts}}TDDpdkVjJWqvZtZdVx?FP&t##u z=_UaGqjG|1P+d{p>tKuP9(}c~(xNGmgkp(VgtHL20o=|wTfQ;=6VDG1W#np+qB5dj zG{06+g$`&nA&>3e=}DqY^klTuNVEMO;B*acs1%`Up)reBCSpGu_#{!bCUHA8TNVq9 zvHxL3pj373%%O~&wwEnq)-Ri2qB>sr11rU!Ez#0b)@^D*#{rv59b0Y*zLl8skCQf* zHH}>wcGNYjRi|NywSh*KpG{2@7196V!q~-;Szp%6gc)76&e2bh$#GYln8~;Li)t;5 zDTj)39wl4=I^IRMq0=L4yS0ony#}cVk9HuX<6TFU*2`yUfz@sOFht0i{}S3{k4=@_zrVg!TEAE!|C~imA%g z)rX*N0!;L?4^)H2J+utHk3pe(zh|Py_5|Tr&c{qKb}pUG+?Q(FcZu%dT`$|B>{kR7 z1{e30pinqQ5oE=Eirl|_i%~9@Knm$<`KK*i-*$H8qpRA#B=bvXB?v+BRlr!y%`U!T z7j;D%C1aQ-M?IQylI~vjyh^G&1=*!v;mAfiWO~h_IV(5Eb|Hr6P_Yc35bNTEDX#Pi2pgI=!LGw!1G)##ICCOYLPOJ4J`m6jh#X#-&Vg)mgYCCU(OBW%L&dsAi z3HLMjNBVHAWx5I7r&wsN=-+Y~JrBfnj0_dtmN2~6)h|Hc6i}oDoo?NSK@!}_ULr>A zq^W`4-(a}zVgs#%xiti?Y}WYN=S2^g)!&W4qsfP#KQqGo9BU*s-*r`C3>h*Zd!Svy z3a2Rf2CHu$oTaH^L9MI;Su)upOLYL=c)jS~P_Yc<#2L{;Fld;l{NPfSOiRb&?a?F_ z0bE(MfbwV#jZzYru8@y!jY*&x#-@F#!E!D+c!#_e#u|MzL9`D1S76u1PSvlvgp}hN zr0#Ln9v{1>ym(b>Rm|bJ{IOW>! zZnm8g6J-XAPRV%!NtNkk=cwpn6qlU@=I@AApYfEUv zGTRrb`i%u?18>Y;UE)y54+rBq`+mgYnqW3ICm&kh@A)Z$d~;nmXGrO?OOG{58o8Hl5tiRxD+kCTG2Qlp0hf0U<1E&O{~| zvp#g)b#;Tmxt`CaHp)@#LQ&~VGrO)jE2^ zdBhbk;?AAv&NVrGs%#-Von;Oln>@ObUK!@vzi|e0)yZ1Np#Sd-@a}AI*~d;S(YOyf zi{X*1ciMjnJ^gVI*uyJn8*ijI-s=H-YX*38byFG#&9edNr)sWP3Wc{nw1$%WH?^na z*KGR<<3V62)KWxTTrBxZM|fi9hRh+WD?_5@qs#O!o62L}{mC$8Z#CQ7`nU;z4!@&5 z?tv^MgCRG1Z11nGkn$_(E#chNh0L~^pNSfae1;oZw#~o>#lQR@J9o4(LPM;fdIg1z~&V&cq#4h8NfK=g1u_1W{V#dz0=g z7r%C7T^A4x?}{!Zk_yM2T@u_@kUWj{*-;l$yGRFwYfQj)h>mN ze&7Cufb~O)lN;@}YAs6|Y-aV;>Yuq49e+}B|)9*m|C_hdU6G4E#mUBQKvgL``Y*URamzkD3s3PCNBiWXoQee{I|6RSD^IjAA`*RD+Jbk z02gF>;Q}W!j<#BX4-F=~0N!A7y`UBL5ZjGcmc6aN-(CRcKyr#FAB|Xz zaeg~WEzuJvZfV$nL<-0PpHD%1GsKknBB&fYj?GgJ7@x6)2lilE- ztR~vWELfZ;0L%6@f(0Ez;qxbJQw5j9A%f>X@Kz1)Jr1TqZD6_8oQeKT_*y2(SRmbU zCE%jUMYf<-jE23-+)h;dgnyhFCaqhxJRcW_^0-@B+-{l<9#}tDjAM zxN$f$NW^0wy!h@6Cf=~Ec|Vh=jFD?goKKzVteqw7K%(!*IvEM2Pv_h4DjcC~k4|rxgv(4yG_8 z20*B@s9GTX_HX&VJ*ZqggA5Ol;#}J4pn&!hpDVJsCeOD4htblY%Av zzpOZuIm1n(n2hr3IsKME>@GO9-7HE@_p)s-87!KrP_ft%6*m{0#eu7|D$SL4VK1&D zg9k}^sSY*Yv%vvpDVzYmKXoWt2o7lejV`0wBMq%cL@PcjX12ztIal5m#FW_k-qsdK zYKs-*)K)MsUM)U)!L6B=p)Xx5!O77jR){2riU1#}I$kMPY^K`}E*k10L#GdVGBaFe z_BG$8?-n0n3=2YPxXKizb3Cy5){TrywmVT>y33C+o9-#R4uW#6OfF?$jiLr`l# z1+go(c1Jko>HCNm+Bv8yTs|*cTs`?)q#&TGPvmQzoyF5)n99OsFvx@x`ev=FeaQQL`Lm&To`DVm`REEppqK)Ut~p_xGq*8w100`)zZnz~O-VZeT(&&SftsGxs7J zXMbL!lt2Cs6MaULB4#+tor2SL=pcdC`U)}f7SHvn^MeJ-8k-qR2>uF*RM&-KtDdi! zUQqQsFIG@bC05o!a8pcWk>T22gPT{){%1`m?{&hPm-yI$p!^SE!W~nBlpbrpRI<#q zT=JKrVE1Xpu@B(+0x0)0FA-NDfV-%kdoohIG1l7LyqqX_U&``LcS;}cSOQag#FR#P z$0+(U*8*x3OHxyn5A@cc5X7U~!i5~UKc^nq@_`c|F!yPn0^-85f8_+abY^}o`C&kd z6g8j5OzWP`NEJ;PGf=!a;)}gZgRoIB(@-GEBPqQ@4hj@1Lsam4ut|#aPf|N3MT>iw z2_XLPNbFC4pC!==v2hbBf?^2xK3&Zx=*ajE>RdfetKT4N{eyx4rT`?zg!o&e!Gj|N zdM>aq;*6JK?^vy+MkU<@hCf{}g+Q*GlCL#;fm)?Ti1G+guFz^m1+OkEMo(Jv*{g01G3#72o?ua_zK?2jOoZ0tzY=4J_D1Vm;l{$)Lpe>xR zycColjAV8*vB$h zF2^B@9?ngL97N&Nb*ciQW_*2xuO^>5aL%A}h#Kx*pxK9$lB#{rvlN~Y@f-?~(;{Qk z-`iR!k)H6xaJi4*6ju`B5{Tx1QtlJLOajUvbpb!0P&HtUK{pa*G8O}vJ1YD6@P;5- z>x}Jz4%|a+^~iJSm7fh(of}+f%@%qFPhr)FN$JI_mRbp6T{tzgY@_I05#Z+>4U{L~ zf;Gs)Ko;PzSZCq^Zu4vF87wY<>G|Fr^+V~NRu{GXjk3ji3LL)qJj_eC4d{I2BRw_L zv<1-+7Y5>u3WyGi2)UdxK1f1CrW|*Vg^&Ty(Do9@!}){5!m(dm7F4XsoSwJ_n9G8BEUA)>sSvh_NXTAX#`oSUNlIH4pbX~oS;vLrN=kPUz}c?~~w&a3W!FSl8~ zYe>gtY<;I)VCBkJGZ|&+?u7fqNm$$`1QN%l+p)zl85`o>K~25-7{T682Z%1-^P3X7QH(}d zv;ibC1Ied22QFXWAY|#BML0p|xf-NvGwl3@p$U zL?DXzfWG!t#iU?ZhdXoqRj`RI>2@#nSjpnBB6OAmnE-T4UM$&TvWJaf%fV~(97L-j zzuFBdIxGoul*({^Ih$Cz=0vgGo-8DcPmuUZil9W4lrG{5j#>YmF7&rA)-3gHJuA1* z6J%nv42mzCYEYJ4SDA&4w0-ormlO}DFCb+GMiN7hm$8>-m=E!SlD9Y$d9FD$lxMZA3I#!g^H=q&Zs5)GsZL#wSC0I&3>A{ z2zzoBqfNH$qc|ns;moUBDW0!Pei9`fSzlWqBif|RV^^LM`{hy%&R9$%Fdc(B2=6%d zr9`ltnixYHy?Wle^{3Dq!syTS_@#-|DFQ^l^Ow_J_U6hQB{;>R!4(|$Ylr?V)NB8` z_PKlMyw-Ah!6mvP}U9-VG+Ii)CIGj&5H=P2@)=cxn1Le@C z_?}|;%mT5;Y{-xkDUmYsK=PzOCtfa3s*=U6Zan$dIuOðL;CZFYZ-oW{hM8E-C| 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 literal 0 HcmV?d00001 diff --git a/MikroGig/20260703/20260703144138-Config.rsc b/MikroGig/20260703/20260703144138-Config.rsc new file mode 100644 index 0000000..c21dd94 --- /dev/null +++ b/MikroGig/20260703/20260703144138-Config.rsc @@ -0,0 +1,3386 @@ +# 2026-07-03 13:41:40 by RouterOS 7.23.1 +# software id = 2961-C4ZZ +# +# model = RBD52G-5HacD2HnD +# serial number = HCX084RAVFA +/interface bridge +add admin-mac=18:FD:74:6E:58:14 auto-mac=no name=Bridge-LAN port-cost-mode=\ + short +/interface wireless +# managed by CAPsMAN +set [ find default-name=wlan2 ] country=belarus mode=ap-bridge name=wlan1 \ + ssid=vados wps-mode=disabled +# managed by CAPsMAN +set [ find default-name=wlan1 ] country=belarus mode=ap-bridge name=wlan2 \ + ssid=vados5g wps-mode=disabled +/interface ethernet +set [ find default-name=ether1 ] mac-address=48:8F:5A:8E:1A:BC +/interface veth +add address=172.19.75.210/30 container-mac-address=62:7E:B9:A5:75:B6 dhcp=no \ + gateway=172.19.75.209 gateway6="" mac-address=62:7E:B9:A5:75:B5 name=\ + veth-awg-VDSina +/interface wireguard +add listen-port=14710 mtu=1420 name=wg-awg-VDSina +/disk +add mount-point-template="[tmpfs]" slot=ram tmpfs-max-size=64 type=tmpfs +/interface list +add name=WAN +add name=LAN +add exclude=LAN include=WAN name=Internet +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroTik +/routing table +add disabled=no fib name=r_to_vpn +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add comment="Script for setup routeros script system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros script system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe true;\r\ + \n:global RunOnce (a);\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs false;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n\r\ + \n :local UrlSuffix \$Identity;\r\ + \n :local UrlDir \"certs/\";\r\ + \n :local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\"); \ + \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" ||\ + \_\\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n /tool/fetch (\$CertUrl . \$CertFileName) dst-path=\$CertFileName\ + \_as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n /certificate/set name=\"Root-YE\" [ find where common-name=\"Roo\ + t YE\" ];\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :local Script \"mod/AM-Certs-By-Ident\";\r\ + \n \r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetch \ + check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".\ + rsc\") output=user as-value ]->\"data\");\r\ + \n /system/script run \$Script;\r\ + \n :global tmpAddCerts;\r\ + \n :while ([ \$tmpAddCerts ] = true) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n :delay 1s;\r\ + \n :put \"Removing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix (a);\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\" . \$Identity . \"/\ + \");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass (a); #{\r\ + \n# \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass (a); # {\r\ + \n# \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n#};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/728/bebacfc7\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 11:00:05 30.06.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 140;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global MiniDateTimeStamp;\r\ + \n:global MicroDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global GetRandom20CharHex;\r\ + \n:global GetRandomNumber;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global ExitError;\r\ + \n:global ExitOnError;\r\ + \n\r\ + \n:global FetchHugeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global FileExists;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if ([ :len \$updateChannel ] > 0 && \$CurrentChannel != \$updateChann\ + el) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\r\ + \n }\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set currentUpdateChannel \$Channel;\r\ + \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\r\ + \n :local StatusPkg \"undefined\";\r\ + \n :log info (\$0 . \" Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n :set ROsVerAvail [ :tostr [ /system/package/update/get latest-version \ + ] ];\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [ /system/pac\ + kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\r\ + \n :return true;\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitCheckUpdates do={\r\ + \n :global IsCheckUpdates;\r\ + \n :global PkgUpdStatus;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n :global arrDeviceInfo;\r\ + \n :local Status \"\";\r\ + \n :local Update;\r\ + \n :local WaitCount 0;\r\ + \n :if ([ \$IsCheckUpdates true ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n :while ((\$Status = \"\" || \$Status = \"finding out latest version...\ + \") && \$WaitCount < 60) do={\r\ + \n :delay 1s;\r\ + \n :set WaitCount (\$WaitCount + 1);\r\ + \n :set Status [ :tostr [ /system/package/update/get status ] ];\r\ + \n }\r\ + \n :set Update [ /system/package/update/get ];\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n :if ((\$Update->\"status\") = \"New version is available\") do={\r\ + \n :set PkgUpdStatus true;\r\ + \n } else={\r\ + \n :set PkgUpdStatus false;\r\ + \n }\r\ + \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\r\ + \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\r\ + \n }\r\ + \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\r\ + \n :if (\$Status = \"\" || \$Status = \"finding out latest version...\") \ + do={\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n :global arrDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devBuildTime;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global currentUpdateChannel;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :local DeviceInfo;\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local VersionString [ :tostr (\$Resource->\"version\") ];\r\ + \n :local ChannelStart [ :find \$VersionString \" (\" ];\r\ + \n :local RouterBoard;\r\ + \n :local IsRouterBoard false;\r\ + \n :local RunningMode \"\";\r\ + \n\r\ + \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\r\ + \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\r\ + \n :set runningChannelVersion \$VersionString;\r\ + \n :set runningVersion \$VersionString;\r\ + \n :set runningChannel \"\";\r\ + \n\r\ + \n :if ([ :typeof \$ChannelStart ] = \"num\" && \$ChannelStart >= 0) do=\ + {\r\ + \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ + \n :local ChannelRest [ :pick \$VersionString (\$ChannelStart + 2) [ :\ + len \$VersionString ] ];\r\ + \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ + \n :if ([ :typeof \$ChannelEnd ] = \"num\" && \$ChannelEnd >= 0) do={\ + \r\ + \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :do {\r\ + \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\r\ + \n# :set RouterBoard [ /system/routerboard/get ];\r\ + \n :if ((\$RouterBoard->\"routerboard\") = true) do={\r\ + \n :set IsRouterBoard true;\r\ + \n }\r\ + \n } on-error={}\r\ + \n }\r\ + \n\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get mode ];\r\ + \n } on-error={\r\ + \n :do {\r\ + \n :set RunningMode [ /system/device-mode/get running ];\r\ + \n } on-error={\r\ + \n :set RunningMode \"\";\r\ + \n }\r\ + \n }\r\ + \n :set devRunning \$RunningMode;\r\ + \n\r\ + \n :if (\$IsRouterBoard = true) do={\r\ + \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\r\ + \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\r\ + \n :set devRbSerialNumber [ :tostr (\$RouterBoard->\"serial-number\") \ + ];\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n :set devRbRevision \"\";\r\ + \n :set devRbSerialNumber \"\";\r\ + \n }\r\ + \n\r\ + \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\r\ + \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\r\ + \n\r\ + \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\r\ + \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\r\ + \n :set (\$DeviceInfo->\"model\") \$devModel;\r\ + \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\r\ + \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\r\ + \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\r\ + \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\r\ + \n :set (\$DeviceInfo->\"running-channel-version\") \$runningChannelVers\ + ion;\r\ + \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ + \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ + \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ + \n :set (\$DeviceInfo->\"current-firmware\") [ :tostr (\$RouterBoard->\"\ + current-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"upgrade-firmware\") [ :tostr (\$RouterBoard->\"\ + upgrade-firmware\") ];\r\ + \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ + \n :set (\$DeviceInfo->\"installed-version\") [ :tostr (\$Update->\"inst\ + alled-version\") ];\r\ + \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ + \n :set (\$DeviceInfo->\"update-status\") [ :tostr (\$Update->\"status\"\ + ) ];\r\ + \n\r\ + \n :set arrDeviceInfo \$DeviceInfo;\r\ + \n :return \$DeviceInfo;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :global CommitBrief;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Info [ \$GetArrDeviceInfo ];\r\ + \n\r\ + \n :if ([ :typeof \$Info ] != \"array\") do={\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :return ( \\\r\ + \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location\" (\$Snmp->\"location\") ] . \"\\n\") ]\ + \_. \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact\" (\$Snmp->\"contact\") ] . \"\\n\") ] .\ + \_\\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board\" (\$Info->\"board-name\") ] . \"\\n\" . \ + \\\r\ + \n [ \$FormatLine \" Arch\" (\$Info->\"architecture-name\") ] . \"\\\ + n\" . \\\r\ + \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\r\ + \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial\" (\$Info->\"serial-number\") ] . \"\ + \\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"nlevel\ + \")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \" Channel\" (\$Info->\"package-channel\") ] . \"\ + \\n\" . \\\r\ + \n [ \$FormatLine \" Installed\" (\$Info->\"installed-version\") ] .\ + \_\"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" Running\" ((\$Info->\"running-version\") . \ + \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ + \n ([ \$FormatLine \" Running\" (\$Info->\"running-version\") ] . \ + \"\\n\") ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ + \n (\$Info->\"installed-version\") != (\$Info->\"latest-version\"))\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Info->\"latest-version\") ] .\ + \_\"\\n\") ] . \\\r\ + \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ + \n (\$Info->\"current-firmware\") != (\$Info->\"upgrade-firmware\")\ + ) \\\r\ + \n ([ \$FormatLine \" Firmware\" ((\$Info->\"current-firmware\") .\ + \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:set GetRandom20CharHex do={:global EitherOr; :return [ :rndstr length=[\ + \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ + \n:set GetRandomNumber do={:global EitherOr; :return [ :rndnum from=0 to=[\ + \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n\r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n :local JobName [ :jobname ];\r\ + \n\r\ + \n :do {\r\ + \n :log debug (\$0 . \" Trying to detect public IP using default serv\ + ice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={:log error (\$JobName . \" Failed to \ + detect public IP using default service: \" . \$Url . \".\")}\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed to detect public IP using default serv\ + ice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n :log debug (\$0 . \" Trying to detect public IP using fallback ser\ + vice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={:log error (\$JobName . \" Failed to\ + \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ + \n :if (\$PubIpAddr = false) do={:set PubIpAddr \"not-detected\"} else=\ + {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n\r\ + \n :global CertificateDownload;\r\ + \n :global ParseKeyValueStore;\r\ + \n\r\ + \n :if ([ :len \$UseFor ] = 0) do={\r\ + \n :log warning (\$0 . \"The intended use is undefined!\");\r\ + \n :set UseFor \"undefined\";\r\ + \n }\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n :log warning (\$0 . \"This system has low free flash space but \" . \ + \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n :log warning (\$0 . \"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n :log info (\$0 . \"Certificate with CommonName '\" . \$CommonName . \ + \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n :log info (\$0 . \"There are \" . \$CertCount . \" Certificates with\ + \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n :log info (\$0 . \"Certificate chain for '\" . \$CommonName . \"' \ + is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global ScriptUpdatesBaseUrl;\r\ + \n :global ScriptUpdatesUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :log info (\$0 . \"Downloading and importing certificate with \" . \\\ + \r\ + \n \"CommonName '\" . \$CommonName . \"'.\");\r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-header\ + -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$ScriptUpdatesBaseUrl . \"certs/\" . \$FileName . \$ScriptUpdate\ + sUrlSuffix) \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n :log warning (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0 && \\\r\ + \n !(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" \ + || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ + \r\ + \n [ :len [ /certificate/builtin/find where common-name=\"ISRG\ + \_Root X1\" ] ] > 0)) do={\r\ + \n :log error (\$0 . \" Required certificate is not available.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl mode=https http-head\ + er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n url=\"https://mkcert.org/generate/\" http-data=[ :serialize to=jso\ + n ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n :log error (\$0 . \" Failed downloading certificate with CommonNam\ + e '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n :log warning (\$0 . \" Certificate with CommonName '\" . \$CommonNam\ + e . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n :log warning (\$0 .\" No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FileExists do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local Type [ :tostr \$2 ];\r\ + \n :global FileGet;\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={ :return false; }\r\ + \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\r\ + \n :if ([ :len \$Type ] = 0 || \$FileVal->\"type\" = \$Type) do={ :return\ + \_true; }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]; }\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ + n \$Path ] ]; }\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ + :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n :log error (\$Name [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\$\") \ + \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set ExitOnError do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :local Error [ :tostr \$2 ];\r\ + \n :global IfThenElse;\r\ + \n :log error (\$Name . \" \" . [ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\ + \\\$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with erro\ + r\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \$E\ + rror) \".\" ]);\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n :local mikro [ :tobool \$1 ];\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :local Return;\r\ + \n :if (\$mikro = true) do={\r\ + \n :set Return ([:pick \$yyyy 2 4] . [:pick \$dd 0 1] . [:pick \$HH 0\ + \_1] . [:pick \$mm 3 4] . [:pick \$ss 6 7]);\r\ + \n } else={\r\ + \n :set Return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ + \r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileVal false;\r\ + \n :do {\r\ + \n :set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n };\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\r\ + \n :log error (\$0 . \" Directory '\" . \$DirName . \"' is not a direct\ + ory.\");\r\ + \n :return false;\r\ + \n };\r\ + \n :onerror Err {\r\ + \n /file/remove \$DirName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing directory '\" . \$DirName . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n };\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :log debug (\$0 . \" Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\r\ + \n :log debug (\$0 . \" ... which does not exist.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n :log error (\$0 . \" File '\" . \$FileName . \"' is not a file.\");\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\r\ + \n :log error (\$0 . \" Removing file '\" . \$FileName . \"' failed: \"\ + \_. \$Err); :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\$0 . \" Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Creating disk of type tmpfs failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n :log debug (\$0 . \" Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n :log debug (\$0 . \" ... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n :log warning (\$0 . \" Making directory '\" . \$Path . \"' failed: \ + \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n :log warning (\$0 . \" This \" . [ \$IfThenElse ([ :pick \$Caller \ + 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n :log error (\$0 . \" A script named '\" . \$Script . \"' does not ex\ + ist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n :log error (\$0 . \" More tickets than running scripts '\" . \$Scrip\ + t . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n :log warning (\$0 . \"No symbol available for name '\" . \$Name . \"\ + '!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set FetchHugeFiles do={\r\ + \n :local ScriptName [ :tostr \$1 ];\r\ + \n :local Url [ :tostr \$2 ];\r\ + \n :local CheckCert [ :tostr \$3 ];\r\ + \n\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n\r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName \ + \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue;\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$Url . \" - \"\ + \_. \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$Url . \" did\ + \_not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global CommitBrief;\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (\" . \$GlobalScriptsUrl . \"; \" . [ \$\ + CommitBrief ] . \")\");\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nNews and\ + \_changes are not available.\");\r\ + \n\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={ :set GlobalConfChanges; \ + } else={ :global GlobalConfChanges (a); }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={ :set GlobalConfMigrati\ + on; } else={ :global GlobalConfMigration (a); }\r\ + \n }\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n} }\r\ + \n\r\ + \n# load modules\r\ + \n:foreach Script in=[ /system/script/find where name ~ \"^(global-functio\ + ns\\\\.d|mod)/.\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' f\ + ailed to run: \" . \$Err);\r\ + \n }\r\ + \n } else={\r\ + \n \$LogPrint error \$0 (\"Module '\" . \$ScriptVal->\"name\" . \"' fai\ + led syntax validation, skipping.\");\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Every Day Set Global Environment Variables\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n # signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n\r\ + \n:log info (\$0 . \"Global configs ready!\");\r\ + \n} do={\r\ + \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ + \n}\r\ + \n" +add comment="Download custom Certificates By Routers Identity " \ + dont-require-permissions=no name=mod/AM-Certs-By-Ident owner=\ + mod/AM-Certs-By-Ident policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-Certs-By-Ident\r\ + \n# Script comment: Download custom Certificates By Routers Identity \r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n#:local ScriptName [ :jobname ];\r\ + \n#\r\ + \n# CloudFlare\r\ + \n#/tool/fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobalR\ + ootCA.crt.pem;\r\ + \n#/certificate/import file-name=DigiCertGlobalRootCA.crt.pem passphrase=\ + \"\";\r\ + \n#/tool/ fetch mode=https url=https://cacerts.digicert.com/DigiCertGlobal\ + G2TLSRSASHA2562020CA1-1.crt.pem;\r\ + \n#/certificate/import file-name=DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt\ + .pem passphrase=\"\";\r\ + \n# Quad9\r\ + \n#/tool/fetch mode=https url=\"https://cacerts.digicert.com/DigiCertGloba\ + lG3TLSECCSHA3842020CA1-1.crt.pem\"\r\ + \n#/certificate/import file-name=DigiCertGlobalG3TLSECCSHA3842020CA1-1.crt\ + .pem passphrase=\"\";\r\ + \n:global tmpAddCerts true; \r\ + \n\r\ + \n:global GlobalScriptsUrl;\r\ + \n:local UrlSuffix [/system/identity/get name];\r\ + \n:local UrlDir \"certs/\";\r\ + \n:local CertUrl (\$GlobalScriptsUrl . \$UrlDir . \$UrlSuffix .\"/\");\r\ + \n\r\ + \n:log error \$CertUrl;\r\ + \n\r\ + \n:local CertName \"DigiCert-Global-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-CA\" [ find where common-na\ + me=\"DigiCert Global Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-CA\" [ find where commo\ + n-name=\"DigiCert Assured ID Root CA\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G2\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Assured-ID-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Assured-ID-Root-G3\" [ find where commo\ + n-name=\"DigiCert Assured ID Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G2 TLS RSA SHA256 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-G3-TLS-ECC-SHA384-2020-CA1\" [ f\ + ind where common-name=\"DigiCert Global G3 TLS ECC SHA384 2020 CA1\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G2\" [ find where common-na\ + me=\"DigiCert Global Root G2\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Global-Root-G3.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Global-Root-G3\" [ find where common-na\ + me=\"DigiCert Global Root G3\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-ECC-P384-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-ECC-P384-Root-G5\" [ find where com\ + mon-name=\"DigiCert TLS ECC P384 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-TLS-RSA4096-Root-G5.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-TLS-RSA4096-Root-G5\" [ find where comm\ + on-name=\"DigiCert TLS RSA4096 Root G5\" ];\r\ + \n\r\ + \n:set CertName \"DigiCert-Trusted-Root-G4.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"DigiCert-Trusted-Root-G4\" [ find where common-n\ + ame=\"DigiCert Trusted Root G4\" ];\r\ + \n\r\ + \n:set CertName \"GTS-Root-R4.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"GTS-Root-R4\" [ find where common-name=\"GTS Roo\ + t R4\" ];\r\ + \n\r\ + \n:set CertName \"Go-Daddy-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Go-Daddy-Root-Certificate-Authority-G2\" [ find \ + where common-name=\"Go Daddy Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"ISRG-Root-X1.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"ISRG-Root-X1\" [ find where common-name=\"ISRG R\ + oot X1\" ];\r\ + \n\r\ + \n:set CertName \"Root-YE.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Root-YE\" [ find where common-name=\"Root YE\" ]\ + ;\r\ + \n\r\ + \n:set CertName \"Starfield-Root-Certificate-Authority-G2.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"Starfield-Root-Certificate-Authority-G2\" [ find\ + \_where common-name=\"Starfield Root Certificate Authority - G2\" ];\r\ + \n\r\ + \n:set CertName \"USERTrust-RSA-Certification-Authority.pem\";\r\ + \n/tool/fetch mode=https url=(\$CertUrl . \$CertName);\r\ + \n/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n/certificate/set name=\"USERTrust-RSA-Certification-Authority\" [ find w\ + here common-name=\"USERTrust RSA Certification Authority\" ];\r\ + \n\r\ + \n:global tmpAddCerts (a);\r\ + \n\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"GTS-Root-RX.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#internet\r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n#:set CertName \"ISRG-Root-X2.pem\";\r\ + \n#/tool/fetch mode=https url=(\$AmScriptsUrl . \"certs/\" . \$CertName);\ + \r\ + \n#/certificate/import file-name=\$CertName passphrase=\"\";\r\ + \n\r\ + \n\r\ + \n#/ip/dns/set allow-remote-requests=yes doh-max-concurrent-queries=100 do\ + h-max-server-connections=20 use-doh-server=https://security.cloudflare-dns\ + .com/dns-query verify-doh-cert=yes;\r\ + \n#/ip/dns/static remove [find where address=1.1.1.1];\r\ + \n#/ip/dns/static add address=1.1.1.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 1\";\r\ + \n#/ip/dns/ static remove [find where address=1.0.0.1];\r\ + \n#/ip/dns/static add address=1.0.0.1 name=security.cloudflare-dns.com com\ + ment=\"cloudflare-dns IPv4 2\"\r\ + \n#/ip dns static add address=2606:4700:4700::1111 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip dns static add address=2606:4700:4700::1001 name=security.cloudflar\ + e-dns.com type=AAAA\r\ + \n#/ip/dns set servers=\"1.0.0.1, 8.8.4.4\";\r\ + \n#/ip/dns set servers=\"\";" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n:global GlobalScriptsUrl;\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.86.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.86.pub\";\ + \n" +add dont-require-permissions=no name=awg2-webui owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + :put \"Download image, and save him to usb1/tmp\"\ + \n#/tool/fetch url=\"https://ros.vados.ru/docker/awg2-webui-arm.tar\" dst-\ + path=usb1/tmp/awg2-webui.tar\ + \n\ + \n:put \"1. Create veth interface\"\ + \n/interface veth add name=veth-awg address=10.9.9.2/24 gateway=10.9.9.1\ + \n\ + \n:put \"2. Create bridge and add veth\"\ + \n/interface bridge add name=br-awg\ + \n/interface bridge port add bridge=br-awg interface=veth-awg\ + \n\ + \n:put \"3. Assign IP to bridge\"\ + \n/ip address add address=10.9.9.1/24 interface=br-awg\ + \n\ + \n:put \"4. NAT: masquerade container traffic\"\ + \n/ip firewall nat add chain=srcnat src-address=10.9.9.0/24 action=masquer\ + ade\ + \n\ + \n:put \"5. Port forward: UDP 443 \? container (AmneziaWG QUIC mimicry)\"\ + \n/ip firewall nat add chain=dstnat protocol=udp dst-port=443 \\\ + \n action=dst-nat to-addresses=10.9.9.2 to-ports=55055 in-interface=eth\ + er1\ + \n\ + \n:put \"6. Port forward: HTTPS 9443 \? container Web UI\"\ + \n/ip firewall nat add chain=dstnat protocol=tcp dst-port=9443 \\\ + \n action=dst-nat to-addresses=10.9.9.2 to-ports=443 in-interface=ether\ + 1\ + \n\ + \n:put \"Create environment list..\"\ + \n/container envs add list=awgui-env key=WEB_USER value=vados\ + \n/container envs add list=awgui-env key=WEB_PASS value=zoomzoomrulezz\ + \n/container envs add list=awgui-env key=SECRET_KEY value=RanDomSecret32Sy\ + mboLs2325272931q\ + \n/container envs add list=awgui-env key=AWG_ENDPOINT value=10.30.30.10:44\ + 3\ + \n\ + \n:put \"Load and start container...\"\ + \n/container add file=usb1/tmp/awg2-webui.tar interface=veth-awg hostname=\ + awg2-webui \\\ + \nroot-dir=usb1/awg2-webui envlist=awgui-env start-on-boot=yes logging=yes\ + \_shm-size=4M\ + \n\ + \n:put \"Start...\"\ + \n/container start 0\ + \n\ + \n:put \"Verify...\"\ + \n/container print\ + \n\ + \n:put \"Should show: status=running\"\ + \n\ + \n/log print where topics~\"container\"\ + \n\ + \n:put \"Should show: AWG started, nginx running\"\ + \n" +add comment=Generator dont-require-permissions=no name=AWG-VDSina owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# ============================================================\r\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\r\ + \n# 2026-06-30 22:08:12\r\ + \n# ============================================================\r\ + \n\r\ + \n# 0. Check prerequisites\r\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\r\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\r\ + \n :error \"Usage: /system/device-mode/update container=yes\"\r\ + \n}\r\ + \n\r\ + \n# Auto-detect storage\r\ + \n:global awgDisk \"disk1\"\r\ + \n{\r\ + \n :local usbFree 0\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \r\ + \n } else={\r\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\r\ + \n :put \"USB found but not mounted. Format as ext4\?\"\r\ + \n :put \"Press 'y' to confirm:\"\r\ + \n :local key [/terminal/inkey timeout=30]\r\ + \n :if (\$key = 121 || \$key = 89) do={\r\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\r\ + \n :delay 3s\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n } else={ :put \"Format failed, using disk1\" }\r\ + \n } else={ :put \"Using disk1\" }\r\ + \n } else={ :put \"No USB, using disk1\" }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 1. Uninstall script\r\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local storageDisk \"disk1\"\r\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n }\r\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ + \n /container/stop [find where interface=veth-awg-VDSina]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg-VDSina]\r\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n }\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\r\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\r\ + \n }\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ + \n}\r\ + \n\r\ + \n# 2. Network infrastructure\r\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\r\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\r\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\r\ + \n\r\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \r\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"4CHyNhbOs923/E\ + yNDguMXJXdghL2I3UyzXPwrANVgHs=\" listen-port=14710 disabled=yes\r\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"RNvF7T1cg5tyXcY\ + QnD9N5BEp6e20vVJQTv0GMjyvHU0=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\r\ + \n/ip/address/add address=10.9.0.3/32 interface=wg-awg-VDSina\r\ + \n\r\ + \n# 4. Container environment variables\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":44044\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\r\ + \n\r\ + \n# 5. DNS\r\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ + \n# NOTE: replaces existing DNS configuration\r\ + \n/ip/dns/set servers=8.8.8.8\r\ + \n#/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina dista\ + nce=1 comment=awg-VDSina-dns\r\ + \n\r\ + \n# 6. Download, create and start container\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \r\ + \n:if (\$awgDisk != \"disk1\") do={\r\ + \n :local tmpPath (\$awgDisk . \"/pull\")\r\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\r\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\r\ + \n}\r\ + \n{\r\ + \n :local arch [/system/resource/get architecture-name]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local suffix \"\"\r\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ + \n :local file \"\"\r\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\r\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\r\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\r\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \r\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\r\ + \n :local filePath \$file\r\ + \n :if (\$awgDisk != \"disk1\") do={\r\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\r\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\r\ + \n }\r\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\r\ + \n :local freeStorage 0\r\ + \n :if (\$awgDisk = \"disk1\") do={\r\ + \n :set freeStorage [/system/resource/get free-hdd-space]\r\ + \n } else={\r\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\r\ + \n }\r\ + \n :if (\$freeStorage < 262144) do={\r\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\r\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\r\ + \n :error \"Insufficient disk space\"\r\ + \n }\r\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \r\ + \n } else={\r\ + \n :put (\"File already exists: \" . \$filePath)\r\ + \n }\r\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\r\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\r\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\r\ + \n /file/remove \$filePath\r\ + \n :local freeMem [/system/resource/get free-memory]\r\ + \n :if (\$freeMem < 16777216) do={\r\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\r\ + \n }\r\ + \n /container/start [find where interface=veth-awg-VDSina]\r\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\r\ + \n :put \"Waiting for container to start...\"\r\ + \n :delay 5s\r\ + \n /interface/wireguard/enable wg-awg-VDSina\r\ + \n :put \"WireGuard interface enabled\"\r\ + \n :put \"Installation complete!\"\r\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\r\ + \n /ping 109.107.177.79 count=10 interval=1\r\ + \n :put \"\"\r\ + \n :put \"======= NEXT STEPS =======\"\r\ + \n :put \"\"\r\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ + \n :put \"\"\r\ + \n :put \" Route a single host:\"\r\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Route a subnet:\"\r\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Remove a route:\"\r\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\r\ + \n :put \"\"\r\ + \n :put \" Show all tunnel routes:\"\r\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Uninstall:\"\r\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\r\ + \n :put \"=========================\"\r\ + \n}\r\ + \n\r\ + \n# 7. Verification\r\ + \n# /container/print\r\ + \n# /interface/wireguard/print\r\ + \n# /interface/wireguard/peers/print\r\ + \n" +add comment=awg-VDSina dont-require-permissions=no name=awg-VDSina-uninstall \ + owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local storageDisk \"disk1\"\r\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n }\r\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ + \n /container/stop [find where interface=veth-awg-VDSina]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg-VDSina]\r\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n }\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\r\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\r\ + \n }\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/container +add comment=awg-VDSina envlists=awg-VDSina-env file=\ + usb1/pull/awg-proxy-arm.tar.gz hostname=awg-VDSina interface=\ + veth-awg-VDSina layer-dir=/usb1/docker name=awg-proxy-arm root-dir=\ + /usb1/awg-VDSina shm-size=4096.0KiB start-on-boot=yes +/container config +set layer-dir=/usb1/docker memory-high=200.0MiB memory-max=2048.0KiB \ + registry-url=https://registry-1.docker.io tmpdir=/usb1/pull username=\ + amsternl +/container envs +add key=AWG_CLIENT_PUB list=awg-VDSina-env value=\ + "NAonhRSuFIrFpNKTs5X32ItcvFuO1kiJUigQZb95YlE=" +add key=AWG_H1 list=awg-VDSina-env value=472437748-472438637 +add key=AWG_H2 list=awg-VDSina-env value=707808381-707809250 +add key=AWG_H3 list=awg-VDSina-env value=1609078552-1609079495 +add key=AWG_H4 list=awg-VDSina-env value=1012329484-1012329741 +add key=AWG_I1 list=awg-VDSina-env value=\ + "" +add key=AWG_I2 list=awg-VDSina-env value="" +add key=AWG_I3 list=awg-VDSina-env value="" +add key=AWG_I4 list=awg-VDSina-env value="" +add key=AWG_I5 list=awg-VDSina-env value="" +add key=AWG_JC list=awg-VDSina-env value=9 +add key=AWG_JMAX list=awg-VDSina-env value=920 +add key=AWG_JMIN list=awg-VDSina-env value=105 +add key=AWG_LISTEN list=awg-VDSina-env value=:44044 +add key=AWG_PREV_DNS list=awg-VDSina-env value=8.8.8.8 +add key=AWG_PREV_TMPDIR list=awg-VDSina-env value=/usb1/pull +add key=AWG_REMOTE list=awg-VDSina-env value=109.107.177.79:55055 +add key=AWG_S1 list=awg-VDSina-env value=90 +add key=AWG_S2 list=awg-VDSina-env value=136 +add key=AWG_S3 list=awg-VDSina-env value=45 +add key=AWG_S4 list=awg-VDSina-env value=27 +add key=AWG_SERVER_PUB list=awg-VDSina-env value=\ + "o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +add key=AWG_STORAGE list=awg-VDSina-env value=usb1 +/disk settings +set auto-media-interface=lo +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ip neighbor discovery-settings +set discover-interface-list=Internet +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface detect-internet +set detect-interface-list=static internet-interface-list=Internet \ + lan-interface-list=LAN wan-interface-list=WAN +/interface list member +add interface=ether2 list=LAN +add interface=ether3 list=LAN +add interface=ether4 list=LAN +add interface=ether5 list=LAN +add interface=wlan2 list=LAN +add interface=wlan1 list=LAN +add interface=ether1 list=Internet +/interface wireguard peers +add allowed-address=0.0.0.0/0 client-allowed-address=::/0 endpoint-address=\ + 172.19.75.210 endpoint-port=44044 interface=wg-awg-VDSina name=peer7 \ + persistent-keepalive=10s public-key=\ + "o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-18FD746E5814 discovery-interfaces=Bridge-LAN enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +add address=172.19.75.209/30 interface=veth-awg-VDSina network=172.19.75.208 +add address=10.9.0.3 interface=wg-awg-VDSina network=10.9.0.3 +/ip dns +set allow-remote-requests=yes servers=8.8.8.8 +/ip firewall nat +add action=masquerade chain=srcnat src-address=10.9.9.0/24 +# in/out-interface matcher not possible when interface (ether1) is slave - use master instead (Bridge-LAN) +add action=dst-nat chain=dstnat dst-port=443 in-interface=ether1 protocol=udp \ + to-addresses=10.9.9.2 to-ports=55055 +# in/out-interface matcher not possible when interface (ether1) is slave - use master instead (Bridge-LAN) +add action=dst-nat chain=dstnat dst-port=9443 in-interface=ether1 protocol=\ + tcp to-addresses=10.9.9.2 to-ports=443 +add action=masquerade chain=srcnat src-address=172.19.75.208/30 +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set irc disabled=no +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip hotspot walled-garden +add server=*1 +add server=*1 +/ip ipsec settings +set accounting=no +/ip ipsec policy +set 0 disabled=yes dst-address=0.0.0.0/0 src-address=0.0.0.0/0 +/ip ipsec profile +set [ find default=yes ] dpd-interval=2m dpd-maximum-failures=5 +/ip proxy +set cache-administrator="" max-cache-size=none port=80,443 src-address=\ + 0.0.0.0 +/ip route +add check-gateway=ping disabled=no distance=2 dst-address=0.0.0.0/0 gateway=\ + 10.30.30.81 routing-table=main scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api address=10.30.30.0/24 disabled=yes +set api-ssl address=10.30.30.0/24 disabled=yes +set www-ssl port=18443 +set www address=10.30.30.0/24 disabled=yes port=18880 +/ip service webserver +set graphs-plain=no rest-plain=no webfig-plain=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set enabled=yes +/ip upnp interfaces +add interface=Bridge-LAN type=internal +add forced-ip=109.107.177.79 interface=*A type=external +add interface=lo type=internal +add interface=wlan2 type=internal +add interface=wlan1 type=internal +/ipv6 nd +set [ find default=yes ] advertise-dns=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system clock manual +set time-zone=+03:00 +/system identity +set name=MikroGig +/system logging +add action=email disabled=yes regex="* added|changed|removed *" topics=\ + system,info +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes use-local-clock=yes +/system ntp client servers +add address=10.30.30.81 +add address=10.30.30.10 +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +add address=time.google.com disabled=yes +/system scheduler +add comment="Every Day Set Global Environment Variables" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment=Generator name=awg-VDSina on-event="# ============================\ + ================================\r\ + \n# AWG Proxy -- MikroTik RouterOS (protocol: v2)\r\ + \n# 2026-07-01 00:03:43\r\ + \n# ============================================================\r\ + \n\r\ + \n# 0. Check prerequisites\r\ + \n:if ([:len [/system/package/find where name=\"container\" disabled=no]] \ + = 0) do={\r\ + \n :put \"Container package is not installed or disabled. Install it and \ + reboot.\"\r\ + \n :error \"Usage: /system/device-mode/update container=yes\"\r\ + \n}\r\ + \n\r\ + \n# Auto-detect storage\r\ + \n:global awgDisk \"disk1\"\r\ + \n{\r\ + \n :local usbFree 0\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] free] \ + } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n :put (\"Using USB: usb1 (\" . (\$usbFree / 1048576) . \" MB free)\")\ + \r\ + \n } else={\r\ + \n :if ([:len [/disk/find where slot=\"usb1\"]] > 0) do={\r\ + \n :put \"USB found but not mounted. Format as ext4\?\"\r\ + \n :put \"Press 'y' to confirm:\"\r\ + \n :local key [/terminal/inkey timeout=30]\r\ + \n :if (\$key = 121 || \$key = 89) do={\r\ + \n /disk/format-drive usb1 file-system=ext4 label=usb1\r\ + \n :delay 3s\r\ + \n :do { :set usbFree [/disk/get [find where mount-point=\"usb1\"] \ + free] } on-error={}\r\ + \n :if (\$usbFree > 0) do={\r\ + \n :set awgDisk \"usb1\"\r\ + \n } else={ :put \"Format failed, using disk1\" }\r\ + \n } else={ :put \"Using disk1\" }\r\ + \n } else={ :put \"No USB, using disk1\" }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# 1. Uninstall script\r\ + \n/system/script/add name=awg-VDSina-uninstall comment=awg-VDSina source={\ + \r\ + \n :put \"Uninstallimg AmneziaWG...\"\r\ + \n :log info \"Uninstallimg AmneziaWG...\"\r\ + \n :local prevDNS \"\"\r\ + \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ + env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ + \n :local storageDisk \"disk1\"\r\ + \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ + ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ + \n :local prevTmpdir \"\"\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ + Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ + \n }\r\ + \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ + \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ + \n /container/stop [find where interface=veth-awg-VDSina]\r\ + \n :delay 7s\r\ + \n /container/remove [find where interface=veth-awg-VDSina]\r\ + \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ + \n :if (\$prevDNS != \"\") do={\r\ + \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ + \n :put (\"DNS restored to: \$prevDNS\")\r\ + \n }\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n /container/config set tmpdir=\$prevTmpdir\r\ + \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ + \n }\r\ + \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ + \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ + \r\ + \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ + \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ + \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ + a\"]\r\ + \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ + \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ + \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ + \r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ + \_} on-error={}\r\ + \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ + out.rsc\")] } on-error={}\r\ + \n :if (\$storageDisk != \"disk1\") do={\r\ + \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ + n-error={}\r\ + \n }\r\ + \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ + \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ + \n}\r\ + \n\r\ + \n# 2. Network infrastructure\r\ + \n/interface/veth/add name=veth-awg-VDSina address=172.19.75.210/30 gatewa\ + y=172.19.75.209\r\ + \n/ip/address/add address=172.19.75.209/30 interface=veth-awg-VDSina\r\ + \n/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.19.7\ + 5.208/30\r\ + \n\r\ + \n# 3. WireGuard interface (MikroTik derives the public key automatically)\ + \r\ + \n/interface/wireguard/add name=wg-awg-VDSina private-key=\"QCMsDU98Gm+nhn\ + kYRcAN/dyczDYHOLsX3PfBRFjWBF4=\" listen-port=14710 disabled=yes\r\ + \n/interface/wireguard/peers/add interface=wg-awg-VDSina public-key=\"o5Ig\ + Cl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\" preshared-key=\"b39T9K2/LR8vNtY\ + AZw+sLRze6yGlS3EaZhAa7wiFB20=\" endpoint-address=172.19.75.210 endpoint-po\ + rt=51820 allowed-address=0.0.0.0/0 persistent-keepalive=10\r\ + \n/ip/address/add address=10.9.0.2/32 interface=wg-awg-VDSina\r\ + \n\r\ + \n# 4. Container environment variables\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_REMOTE value=\"109.107.1\ + 77.79:55055\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JC value=\"9\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMIN value=\"105\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_JMAX value=\"920\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S1 value=\"90\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S2 value=\"136\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H1 value=\"472437748-472\ + 438637\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H2 value=\"707808381-707\ + 809250\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H3 value=\"1609078552-16\ + 09079495\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_H4 value=\"1012329484-10\ + 12329741\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_SERVER_PUB value=\"o5IgC\ + l1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_CLIENT_PUB value=[/inter\ + face/wireguard/get [find name=wg-awg-VDSina] public-key]\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S3 value=\"45\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_S4 value=\"27\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I1 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I2 value=\"\"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I3 value=\"\ + \"\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I4 value=\"\"\ + \r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_I5 value=\"\"\r\ + \n\r\ + \n# 5. DNS\r\ + \n{ :local rawDNS [/ip/dns/get servers]; :local prevDNS \"\"; :foreach s i\ + n=[:toarray \$rawDNS] do={ :if ([:len \$prevDNS] > 0) do={ :set prevDNS \"\ + \$prevDNS,\$s\" } else={ :set prevDNS \$s } }; /container/envs/add list=aw\ + g-VDSina-env key=AWG_PREV_DNS value=\"\$prevDNS\" }\r\ + \n# NOTE: replaces existing DNS configuration\r\ + \n/ip/dns/set servers=109.107.177.79\r\ + \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ + ce=1 comment=awg-VDSina-dns\r\ + \n\r\ + \n# 6. Download, create and start container\r\ + \n/container/envs/add list=awg-VDSina-env key=AWG_STORAGE value=\$awgDisk\ + \r\ + \n:if (\$awgDisk != \"disk1\") do={\r\ + \n :local tmpPath (\$awgDisk . \"/pull\")\r\ + \n /container/envs/add list=awg-VDSina-env key=AWG_PREV_TMPDIR value=[/co\ + ntainer/config/get tmpdir]\r\ + \n /container/config set tmpdir=\$tmpPath memory-high=200M\r\ + \n}\r\ + \n{\r\ + \n :local arch [/system/resource/get architecture-name]\r\ + \n :local ver [/system/resource/get version]\r\ + \n :local dotPos [:find \$ver \".\"]\r\ + \n :local rest [:pick \$ver (\$dotPos + 1) [:len \$ver]]\r\ + \n :local endPos [:find \$rest \".\"]\r\ + \n :if ([:typeof \$endPos] = \"nil\") do={ :set endPos [:find \$rest \" \ + \"] }\r\ + \n :local minor [:tonum [:pick \$rest 0 \$endPos]]\r\ + \n :local suffix \"\"\r\ + \n :if (\$minor <= 20) do={ :set suffix \"-7.20-Docker\" }\r\ + \n :local file \"\"\r\ + \n :if (\$arch = \"arm64\") do={ :set file (\"awg-proxy-arm64\" . \$suffi\ + x . \".tar.gz\") }\r\ + \n :if (\$arch = \"arm\") do={ :set file (\"awg-proxy-arm\" . \$suffix . \ + \".tar.gz\") }\r\ + \n :if (\$arch ~ \"x86\") do={ :set file (\"awg-proxy-amd64\" . \$suffix \ + . \".tar.gz\") }\r\ + \n :if (\$file = \"\") do={ :error \"Unsupported architecture: \$arch\" }\ + \r\ + \n :local url \"https://github.com/timbrs/amneziawg-mikrotik-c/releases/l\ + atest/download/\$file\"\r\ + \n :local filePath \$file\r\ + \n :if (\$awgDisk != \"disk1\") do={\r\ + \n :set filePath (\$awgDisk . \"/pull/\" . \$file)\r\ + \n :do { /file/make-directory (\$awgDisk . \"/pull\") } on-error={}\r\ + \n }\r\ + \n :if ([:len [/file/find where name=\$filePath]] = 0) do={\r\ + \n :local freeStorage 0\r\ + \n :if (\$awgDisk = \"disk1\") do={\r\ + \n :set freeStorage [/system/resource/get free-hdd-space]\r\ + \n } else={\r\ + \n :do { :set freeStorage [/disk/get [find where mount-point=\$awgDis\ + k] free] } on-error={}\r\ + \n }\r\ + \n :if (\$freeStorage < 262144) do={\r\ + \n :put (\"WARNING: Low disk space (\" . (\$freeStorage / 1024) . \"K\ + B free). Need at least 256KB.\")\r\ + \n :put \"See: https://github.com/timbrs/amneziawg-mikrotik-c#insuffi\ + cient-disk-space\"\r\ + \n :error \"Insufficient disk space\"\r\ + \n }\r\ + \n :put (\"Fetching: \$url -> \" . \$filePath)\r\ + \n /tool/fetch url=\$url dst-path=\$filePath http-max-redirect-count=10\ + \r\ + \n } else={\r\ + \n :put (\"File already exists: \" . \$filePath)\r\ + \n }\r\ + \n :local rootDir (\$awgDisk . \"/awg-VDSina\")\r\ + \n /container/add file=\$filePath interface=veth-awg-VDSina envlist=awg-V\ + DSina-env hostname=awg-VDSina root-dir=\$rootDir logging=no start-on-boot=\ + yes comment=awg-VDSina\r\ + \n :if (\$minor > 20) do={ [:parse \"/container/set [find where interface\ + =veth-awg-VDSina] shm-size=4M\"] }\r\ + \n /file/remove \$filePath\r\ + \n :local freeMem [/system/resource/get free-memory]\r\ + \n :if (\$freeMem < 16777216) do={\r\ + \n :put (\"WARNING: Low memory (\" . (\$freeMem / 1048576) . \"MB free)\ + . 16MB+ recommended.\")\r\ + \n }\r\ + \n /container/start [find where interface=veth-awg-VDSina]\r\ + \n :do { /file/remove [find where name=\"console-dump.txt\"] } on-error={\ + }\r\ + \n :put \"Waiting for container to start...\"\r\ + \n :delay 5s\r\ + \n /interface/wireguard/enable wg-awg-VDSina\r\ + \n :put \"WireGuard interface enabled\"\r\ + \n :put \"Installation complete!\"\r\ + \n :put \"Ping test: 109.107.177.79 via AmneziaWG tunnel. repeat 10 times\ + \"\r\ + \n /ping 109.107.177.79 count=10 interval=1\r\ + \n :put \"\"\r\ + \n :put \"======= NEXT STEPS =======\"\r\ + \n :put \"\"\r\ + \n :put \"Route specific traffic through the AmneziaWG tunnel:\"\r\ + \n :put \"\"\r\ + \n :put \" Route a single host:\"\r\ + \n :put \" /ip/route/add dst-address=8.8.8.8/32 gateway=wg-awg-VDSina \ + comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Route a subnet:\"\r\ + \n :put \" /ip/route/add dst-address=100.0.0.0/8 gateway=wg-awg-VDSina\ + \_comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Remove a route:\"\r\ + \n :put \" /ip/route/remove [find where comment=awg-VDSina-tunnel dst-\ + address=8.8.8.8/32]\"\r\ + \n :put \"\"\r\ + \n :put \" Show all tunnel routes:\"\r\ + \n :put \" /ip/route/print where comment=awg-VDSina-tunnel\"\r\ + \n :put \"\"\r\ + \n :put \" Uninstall:\"\r\ + \n :put \" /system/script/run awg-VDSina-uninstall\"\r\ + \n :put \"=========================\"\r\ + \n}\r\ + \n\r\ + \n# 7. Verification\r\ + \n# /container/print\r\ + \n# /interface/wireguard/print\r\ + \n# /interface/wireguard/peers/print\r\ + \n" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2026-07-01 start-time=02:03:59 +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com diff --git a/MikroGig/history/20260703/20260703144138-Diff-Config.rsc b/MikroGig/history/20260703/20260703144138-Diff-Config.rsc new file mode 100644 index 0000000..da6add5 --- /dev/null +++ b/MikroGig/history/20260703/20260703144138-Diff-Config.rsc @@ -0,0 +1,234 @@ +19,21c19,20 +< add address=172.19.75.210/30 container-mac-address=62:7E:B9:A5:75:B6 dhcp=no \ +< gateway=172.19.75.209 gateway6="" mac-address=62:7E:B9:A5:75:B5 name=\ +< veth-awg-VDSina +--- +> add address=172.19.75.210/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ +> gateway=172.19.75.209 gateway6="" name=veth-awg-VDSina +23c22 +< add listen-port=14710 mtu=1420 name=wg-awg-VDSina +--- +> add disabled=yes listen-port=14710 mtu=1420 name=wg-awg-VDSina +2626a2626,2717 +> add comment=awg-VDSina dont-require-permissions=no name=awg-VDSina-uninstall \ +> owner=vados policy=\ +> ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ +> \n\ +> \n :put \"Uninstallimg AmneziaWG...\"\ +> \n\ +> \n :log info \"Uninstallimg AmneziaWG...\"\ +> \n\ +> \n :local prevDNS \"\"\ +> \n\ +> \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ +> env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\ +> \n\ +> \n :local storageDisk \"disk1\"\ +> \n\ +> \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ +> ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\ +> \n\ +> \n :local prevTmpdir \"\"\ +> \n\ +> \n :if (\$storageDisk != \"disk1\") do={\ +> \n\ +> \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ +> Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\ +> \n\ +> \n }\ +> \n\ +> \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\ +> \n\ +> \n /ip/route/remove [find where comment=awg-VDSina-dns]\ +> \n\ +> \n /container/stop [find where interface=veth-awg-VDSina]\ +> \n\ +> \n :delay 7s\ +> \n\ +> \n /container/remove [find where interface=veth-awg-VDSina]\ +> \n\ +> \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\ +> \n\ +> \n :if (\$prevDNS != \"\") do={\ +> \n\ +> \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\ +> \n\ +> \n :put (\"DNS restored to: \$prevDNS\")\ +> \n\ +> \n }\ +> \n\ +> \n :if (\$storageDisk != \"disk1\") do={\ +> \n\ +> \n /container/config set tmpdir=\$prevTmpdir\ +> \n\ +> \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\ +> \n\ +> \n }\ +> \n\ +> \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\ +> \n\ +> \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ +> \n\ +> \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\ +> \n\ +> \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\ +> \n\ +> \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ +> a\"]\ +> \n\ +> \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\ +> \n\ +> \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\ +> \n\ +> \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ +> \n\ +> \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ +> \_} on-error={}\ +> \n\ +> \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ +> out.rsc\")] } on-error={}\ +> \n\ +> \n :if (\$storageDisk != \"disk1\") do={\ +> \n\ +> \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ +> n-error={}\ +> \n\ +> \n }\ +> \n\ +> \n :put \"Uninstall AmneziaWG Proxy complete!\"\ +> \n\ +> \n :log info \"Uninstall AmneziaWG Proxy complete!\"\ +> \n\ +> \n /system/script/remove [find where name=awg-VDSina-uninstall]\ +> \n\ +> \n" +2742c2833 +< \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":44044\"\ +--- +> \n/container/envs/add list=awg-VDSina-env key=AWG_LISTEN value=\":51820\"\ +2780,2782c2871,2873 +< \n/ip/dns/set servers=8.8.8.8\r\ +< \n#/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina dista\ +< nce=1 comment=awg-VDSina-dns\r\ +--- +> \n/ip/dns/set servers=109.107.177.79\r\ +> \n/ip/route/add dst-address=109.107.177.79/32 gateway=wg-awg-VDSina distan\ +> ce=1 comment=awg-VDSina-dns\r\ +2894,2947d2984 +< add comment=awg-VDSina dont-require-permissions=no name=awg-VDSina-uninstall \ +< owner=vados policy=\ +< ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ +< \r\ +< \n :put \"Uninstallimg AmneziaWG...\"\r\ +< \n :log info \"Uninstallimg AmneziaWG...\"\r\ +< \n :local prevDNS \"\"\r\ +< \n :do { :set prevDNS [/container/envs/get [find where list=\"awg-VDSina-\ +< env\" key=\"AWG_PREV_DNS\"] value] } on-error={}\r\ +< \n :local storageDisk \"disk1\"\r\ +< \n :do { :set storageDisk [/container/envs/get [find where list=\"awg-VDS\ +< ina-env\" key=\"AWG_STORAGE\"] value] } on-error={}\r\ +< \n :local prevTmpdir \"\"\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n :do { :set prevTmpdir [/container/envs/get [find where list=\"awg-VD\ +< Sina-env\" key=\"AWG_PREV_TMPDIR\"] value] } on-error={}\r\ +< \n }\r\ +< \n /ip/route/remove [find where comment=awg-VDSina-tunnel]\r\ +< \n /ip/route/remove [find where comment=awg-VDSina-dns]\r\ +< \n /container/stop [find where interface=veth-awg-VDSina]\r\ +< \n :delay 7s\r\ +< \n /container/remove [find where interface=veth-awg-VDSina]\r\ +< \n /container/envs/remove [find where list=\"awg-VDSina-env\"]\r\ +< \n :if (\$prevDNS != \"\") do={\r\ +< \n :do { /ip/dns/set servers=\"\$prevDNS\" } on-error={}\r\ +< \n :put (\"DNS restored to: \$prevDNS\")\r\ +< \n }\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n /container/config set tmpdir=\$prevTmpdir\r\ +< \n :put (\"Container tmpdir restored to: \$prevTmpdir\")\r\ +< \n }\r\ +< \n /ip/firewall/nat/remove [find where out-interface=\"wg-awg-VDSina\"]\r\ +< \n /ip/firewall/nat/remove [find where src-address=\"172.19.75.208/30\"]\ +< \r\ +< \n /ip/address/remove [find where address=\"172.19.75.209/30\"]\r\ +< \n /interface/veth/remove [find where name=\"veth-awg-VDSina\"]\r\ +< \n /interface/wireguard/peers/remove [find where interface=\"wg-awg-VDSin\ +< a\"]\r\ +< \n /ip/address/remove [find where interface=\"wg-awg-VDSina\"]\r\ +< \n /interface/wireguard/remove [find where name=\"wg-awg-VDSina\"]\r\ +< \n :do { /file/remove [find where name~\"awg-VDSina.+tar\"] } on-error={}\ +< \r\ +< \n :do { /file/remove [find where name=(\$storageDisk . \"/awg-VDSina\")]\ +< \_} on-error={}\r\ +< \n :do { /file/remove [find where name=(\$storageDisk . \"/ru_ranges_time\ +< out.rsc\")] } on-error={}\r\ +< \n :if (\$storageDisk != \"disk1\") do={\r\ +< \n :do { /file/remove [find where name~(\$storageDisk . \"/pull\")] } o\ +< n-error={}\r\ +< \n }\r\ +< \n :put \"Uninstall AmneziaWG Proxy complete!\"\r\ +< \n :log info \"Uninstall AmneziaWG Proxy complete!\"\r\ +< \n /system/script/remove [find where name=awg-VDSina-uninstall]\r\ +< \n" +2951,2955d2987 +< /container +< add comment=awg-VDSina envlists=awg-VDSina-env file=\ +< usb1/pull/awg-proxy-arm.tar.gz hostname=awg-VDSina interface=\ +< veth-awg-VDSina layer-dir=/usb1/docker name=awg-proxy-arm root-dir=\ +< /usb1/awg-VDSina shm-size=4096.0KiB start-on-boot=yes +2960,2986d2991 +< /container envs +< add key=AWG_CLIENT_PUB list=awg-VDSina-env value=\ +< "NAonhRSuFIrFpNKTs5X32ItcvFuO1kiJUigQZb95YlE=" +< add key=AWG_H1 list=awg-VDSina-env value=472437748-472438637 +< add key=AWG_H2 list=awg-VDSina-env value=707808381-707809250 +< add key=AWG_H3 list=awg-VDSina-env value=1609078552-1609079495 +< add key=AWG_H4 list=awg-VDSina-env value=1012329484-1012329741 +< add key=AWG_I1 list=awg-VDSina-env value=\ +< "" +< add key=AWG_I2 list=awg-VDSina-env value="" +< add key=AWG_I3 list=awg-VDSina-env value="" +< add key=AWG_I4 list=awg-VDSina-env value="" +< add key=AWG_I5 list=awg-VDSina-env value="" +< add key=AWG_JC list=awg-VDSina-env value=9 +< add key=AWG_JMAX list=awg-VDSina-env value=920 +< add key=AWG_JMIN list=awg-VDSina-env value=105 +< add key=AWG_LISTEN list=awg-VDSina-env value=:44044 +< add key=AWG_PREV_DNS list=awg-VDSina-env value=8.8.8.8 +< add key=AWG_PREV_TMPDIR list=awg-VDSina-env value=/usb1/pull +< add key=AWG_REMOTE list=awg-VDSina-env value=109.107.177.79:55055 +< add key=AWG_S1 list=awg-VDSina-env value=90 +< add key=AWG_S2 list=awg-VDSina-env value=136 +< add key=AWG_S3 list=awg-VDSina-env value=45 +< add key=AWG_S4 list=awg-VDSina-env value=27 +< add key=AWG_SERVER_PUB list=awg-VDSina-env value=\ +< "o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +< add key=AWG_STORAGE list=awg-VDSina-env value=usb1 +3012a3018 +> add interface=Bridge-LAN list=LAN +3014,3017c3020,3022 +< add allowed-address=0.0.0.0/0 client-allowed-address=::/0 endpoint-address=\ +< 172.19.75.210 endpoint-port=44044 interface=wg-awg-VDSina name=peer7 \ +< persistent-keepalive=10s public-key=\ +< "o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +--- +> add allowed-address=0.0.0.0/0 endpoint-address=172.19.75.210 endpoint-port=\ +> 51820 interface=wg-awg-VDSina name=peer4 persistent-keepalive=10s \ +> public-key="o5IgCl1/G6xbl6j7sPaP4ZNYREeYOmqZjKbm+v0b9jU=" +3025c3030 +< add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +--- +> add address=10.30.30.86/24 interface=ether1 network=10.30.30.0 +3027c3032 +< add address=10.9.0.3 interface=wg-awg-VDSina network=10.9.0.3 +--- +> add address=10.9.0.2 interface=wg-awg-VDSina network=10.9.0.2 +3029c3034 +< set allow-remote-requests=yes servers=8.8.8.8 +--- +> set allow-remote-requests=yes servers=109.107.177.79 +3060c3065,3067 +< 10.30.30.81 routing-table=main scope=30 target-scope=10 +--- +> ether1 routing-table=main scope=30 target-scope=10 +> add comment=awg-VDSina-dns distance=1 dst-address=109.107.177.79/32 gateway=\ +> wg-awg-VDSina -- 2.52.0