From aff22439c461588f8dd3379b8a57c00705ac2c73 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Mon, 4 May 2026 20:01:04 +0300 Subject: [PATCH] Backup for MikroMaster created successfully at May 04 20:01:04. --- .../20260504/20260504200001-Binary.backup | Bin 0 -> 253773 bytes .../20260504/20260504200001-Config.rsc | 4064 +++++++++++++++ .../20260504/20260504200001-Diff-Config.rsc | 4390 +++++++++++++++++ 3 files changed, 8454 insertions(+) create mode 100644 MikroMaster/20260504/20260504200001-Binary.backup create mode 100644 MikroMaster/20260504/20260504200001-Config.rsc create mode 100644 MikroMaster/history/20260504/20260504200001-Diff-Config.rsc diff --git a/MikroMaster/20260504/20260504200001-Binary.backup b/MikroMaster/20260504/20260504200001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..9b861538dd2e41977b96a31522614627eeb06181 GIT binary patch literal 253773 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∋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

)JyFBvl zV|WmFjYl;CeyPFL;mjySZ#Z3@_Z5_x1u){83C;g1h*zsIhT9a5f%$D-LRsr#H(HAp(v?e&)_1@aQ3ZTGgnMg>T$ z3t>P`-FZym{nCIMA1z$zJ2GP%V`*m``Bmpsr=iGQBQ9<7?($0P@qqq)*(gA?8hlJn zFNj35wv?U(UjN|X$~E%uco&ufh6NoX03sm0=UwXw?taF0&>RZKc&4N_2x~D~z_qp6 z8`Sm+#3;q}Nw8{13k~0AWW7%~8Byu$n7>{fnUWcSWA$Qbo-nP;I zbnJG+%TbwpLfw)(l7VyXpKJ^hp-|piBmo0L9CL=9Z$^I%r|HcQVhBe%H}G#ozEIh* z16n3Kqz*??T>eUA^RPxyQt|u%esPOn+xnMEr+83&$`R0L^R9k4mAGlHr90VzG-CdD ztEe*x$ONiPl$Hmr-MPsj(r8mgX8H7bYQVx}Q^SW-FkA6pPQ*z$cHLy1(Dm-_dD4-g zahxZcMi!-Qbep;k2nN{=91&+n)RIxpKoX~dkiPxU3FI)Bg8iaVem7WHdA?|Omvg0V zB1z2a>YUG5yZ)8d?~yE!o0?qwrbIc4ZsCtI(8C3Lk@qg79nHD&?=V;-Pg)zW^xOl^ zQwo?y-!)sci2-_A;ULD*6p;SzOZyfQl-@EF=heTVOVnfSFbpNDY-o+f2^IIq_j^eIAOxbL|EqEUUy z?OXFHgM8qXS}_6_IUPyOX;g9~hjUN{%~Z=KX2573D_64t=hlpI-gYeh?N#qhm+Ff( z@cj+I>i<`Oe@iXuEk6`YMbUprgaa;uWzB|INonlF=uDC$4=P0WuRW-Q54!*El9AYcYMzZbUxCb3tV(M!tIngQr(Eq9CCm zpv5w{!-e2^(J~8atIAHgBB4!zcu@kk45}9i`!5@#HDkIXr;b4(|g*eBEtPy2b}}XmL4- zoZh=@Z=9@hlMK`J&JjNRH1gZcXE_qU)s+_hUh_Z8!kq zO!dhXNn3L~X{3nveFkS4v5EdF(>>q;$f- zXUC9s4ZBOKC>!mX(*c}+cdS#L?T)wp>AezFkt(Kd&9SKy)p71QMD=`20PQ3^j8q$Z zG`LO_KmG-5c(E1lNUMl$pli-{G?=zbBo~WYBOMba^)3&lz_tyeb!J@hgSzs6jy@mE23}Smlx%caN#`;C7QEa+eCH2c*dEBlJcT?k z-En%h*&R9Wh3Zw`7vr{-&~}13XoF%3C<^PCn!p5r6dR;TpZ9NXm1%x_4xOYoKXy4^zcMMR^U8>4`jz%D= zoFyg^({9!aPknu;8uPz5_r>wx(SnI`brIONj>CBf-}>y-DWf!-`-XDp&#G5 zby0yte`p{!F8dy@%~|D8x)OIXfY)a?J2K$Owngu=A93N*|BDjl}UU%cdS`` z)RsNAwMezcp;j453NNfViareP!m_W<$!R%ISDmp~9w~9Ogcf5eja|j*Z1S)FB4^f% z1QhOCNC!}cS1dfjYKHNZFi(hY-}`o4(gy|aODzl04iD#<;D=f z?1G%$j_>!o>aJXm!fT)HTRYeLOi%bqen8|T(6v%_`%Vi-c>q=LNtKmy^MsB=)dqM| zOMFTFORyO6Rk%W3%FdFD*b=F&58E;*=E}(GmtySSwCPeR4NvX)G2_hlD`d9p2z0sT zU*)Zb?2efuija_u9ML#f?|d4rWJ*AH7&bDLvOqn8rE_3L=NxCj(D9P@^WaP>ASZ=mU|<5T7#180s`CME22$xXN435a zT5s*P3s&T3`T~4!5lFeTNxjJh$Bek^JFH8=+IZ#@QLd*y)P|vx8TK-mYoGkJW)`O# zDk@eLM^cX30u2b9T^_ogY7SX1r5t3^V1veb<$K8g$UzF2j&fSj!b?J+Cx+FM@a|4< zIfZA(WEb;S>zo&1(Q>sdm)q4k`X%c!Ke~#!M_F?~AvHz_pBeUZAK5nvsvUulJdQz- zlV83=fE(Is$b>4mL0n#8H7S!@L%~Y871Vf572+2PMBZAtI`@ z!7`5AycZwXGtFodn%9oRdvyL9;UIL(M|MsDk#lSbPX2N# zx;E)dvfUh8i}l+Rrvj=8auqo=Au+9!l6vb0x9*C#MAw)gXo` zRGZ(I{ctJ<*b!o}S4F+;ZzI*}fcoo!We}fblq;AsYWJ%bheifT&KFieFxLLUG9qQT zTvcgldRrro?SJc^Z6MEj7t%KtR+s~kteQx=7*uw>+Nrah0IG=;dWNR%;M6~lR_3Yi zSBpZ>M>0)1z+u%T&Kye~5xfXpgg5z=xNMy8=Le@nophQ%(2f_w#d@mLfuRFamGQ!= z&3~qtH9G=(dy{H77hZQ!?9S6uM{ShcY}veoa!m3Bv{patWu55kf?8%bi4P1(1#%RN z%Jaaq(7|HsL@g_x(%vknyS`(!gt@bD)*@pfsaI8%SvJ#y6C=h>XTFl9$v?z5@y-_%j`njak1hwIj0Sa8{JwAZQjdVdq>EPW^~xbK4q0Y2pDA>6|oHY1jZ=^#Gz)W($&e^@I33;mIo> znl~1~-HxI%oi5dY3i=X|%jT@ehOyLva71M@1pc{syrrd0N+=O!q&Il-fZ}FZbNM!+ z$)?K63uhA*&W!r`V+k?p{bMj|!?8MF+JA>E`wskVI6XtF4puPLmIJ-M2%>P4Km}GS zc+}-FBOhuUf`k9@ppVJjv3Y?i&fdJ5KEOKO&iQ_#uO`F{Plyi zhk(bD5`yP63II?tp_&a^%yL_k^>u|;RD-D;(2mLnfyaHk5!OtFqqBPS4#-vM8C=kvxO_VtwP zG)T}!h}k`MZudi(D8pHg5|=bJzd;01K>8Xh?06o(lZ>9M2-wPq9^HaFiLHLxE0B=f zMrmo(q2c9yAoPVUHtU|?uIZq^;BP-lc)#0I?8yGJo4%&=hx}4+Eig;#Xo$np0U0m+ zU+X@f5#^XNa}9uEtZ3$6fN{=Jb$WWO6hSkm_A0ZO)1F_ke_U`9M%jd9)G$1)yXgP} zYGu&t(5JqjlNmu60W_&vVs=-V2jieKYZJ03hB!#_P;npV6*J9obgLudy%N-)Ti%9| zIDq_<`3I6-t)`X|zjC0?Y2TpiP|#uk(`Uo&2qL)Bz_IO9| zU>ppBgwyu_Iy34+Aj%xMA7I+5?T&*hdE2&B*LMWglcFx*Kq%uGVM# zgQ=7PW4Q}%*>W)mREL)%cY^Y`JQoHPp`8t16QGDcXeM4pYXNap!9ufAPj+$_qB-~rEBe#Zv{rTb@Z@rBl6`i=DODh!M7D1im)1QHlwuQepP*(`4}c`WJ0I@6}K4eyc_0^1rWkUv;_8; z{#2ChEL+TLi~|WoCK{yBR}k5K1^0%GvHKRkc(DMO_4jaDF$~>EpL#CxjZ^Kw7JY1> z=GRJgh*Gj){xBszW1FPZ=>d}>z_s5bbHRtD`fu7~pc##lTPv}l(i1%v`aj?WLkEp! zjMuKsk=puw!iMts0MHfK_wu}fK2pier4QHn9bb;qG%VY5`tVA2$1eJgL2V-S-o{eb8^rLvoBx4 z4WdJZ1Fo8Dk)g8$dH-g{t3eN4!BN!)3r6@uB!~Am(~N-MqCzDOjCEATXRbhB=$-(@ zJAiNVh%p}jx{dLlh*5Lfxc^6{)DSc)GsfmO3JR2$-8q}{inY2?Wbl3@*F)EdyaCe^ z<+As~D+U5lBQD-2ixqQ5#S{j$X+cEr4ERVov69wxx3-H%ijeusl$t6XotD~k%=SK{ z_j5F%hwyOp{a84G5gL`l77>Fq8tRd<;-A&BPaNAXCOM{u?BW!qqFLpS8j;#p<#EAD zMGe3Ru7M(}6ivrIyg?$<2ts7jA{b5;F$Th0B_}E0WX3IX(^HoQr|};u{TOq?(bZP= zXU6S;nL`+!g2dL?SBL1SjP6e-X$Zi3le__@0Pw zNBl8h*u@>D7gM14q7p~{@X0gs7H5rRG#L7r)M>a zEg#(Q@|K)9oLmebk}=Qwp{D*tv`RN`qc-%Ka5-WUivX3WqU|Q*1|n0uuY=DyA}Iy( z+plu*5-G|1JQ*P&Zn18yaxhDWDKfnhesEamTv1MH=Cv2MSihZ4C+Udb z#{>Vnqo-&h@I53{=Nyv1JUZUQCEH^7jV5Z)p`~g84M}4&Q2GPb1i&9@$W#p@^|WsK!m`Oo68+0YF0bfkz9!6-cR zqOIjJq~+G@9P!R(o%RRDJ2rte7y9V`4Ydu3O#?+M&s<5!mX-}PI>Uys-&v+FPB8FK z`8sBcCye(fkDcSzTXfh2pppuWe(8Porg5YR|HSDot@aG?z+A(8UFz_zAyHTEBpnP= z)@3yw4&2^yRWdT<=V*mVyFFXfT!tB-eYrS6Uw-DQav%7a22Df-VWQ{D`^pWPS)Rz{ z6)vluhT;j9eSfY8zSd9JDQ*1d8fm7Bz9?=OMeD;OaiiwDJNN}8_|<=bbV?pXb#+Mu zjn`@oN(m}a=X`0RAP~>6T_(YCT{IcFQF%VyopzqBY^J7kQGQbDbD9-bkH#K^wjZII z)rYV;wHA|83?bHQSU5a-^}P;6X9F1K7gNNexcKdsWM}%FNve{%@O?#GFd^44X)FnAic0pHr9HGLsgj z6y>VwKH7K04_yrMx>n}b)oI+)`U>srhvO0{)}t0pflW+C-?npSetKmSD-0;%z_`vK zOQKjAxhd&ux1G+#)@q=3OfY9;1|L|FL0}KEkeTTH?%lvA!>x2C`kfV1&V26wpnk6) zlLmgZ;d?la-072nJ*u*u#f*~$6M_|Hq8s8r>X6GJp_(mQj29D3k?{1YYv=9*#6?~_ z)eYb~F`i9G1H{e@@CPHdj@}rah-Js9{Val;+-lGrZ22r6m(ZJlB?Os`NguQnKTh~P zLCkV~!UtcTM{o=NmSL&?Ty()fCM@94^HBs4&irY@o9bQ0gz12R|T>9@@ z`|Uxxw3%Z8{F&F&EK}c+0|8|ND3VRGM$wI>QukSJYGg$Pm%TVVUy6c3Sg!XGZR;}%t-WBb4@j|H){(fON&=l!2ZP6*qJLMhLDLF> zG~V_&V-qAyXFR^0wHJI zi+csAZt5)ZwMwSKMiMtyh=s0EMOK3^j}1V#oER>ljj>&Uk1&#&-DBFsAZ$C}#025_ zS6GCeb#!4EiUGzxmKYjS5T?DG<@P>}lWkPFHWc-o!I%cNY%)J%znT1L5q1wois66uF`ZcIy%S6Da@4_F zw3=UI6_GDPlcJ(09Pcg)85LBwIUVa#xP6?Et+-@YmirpurBT>q%vMUga7}0Nre12L z(ea#TNL+JO-<1D;B`-dF7_@#$r8mTB*G%@8d2Lh7BYZ288GJea47h99N@Y+L)W~O% z)2udnjZkqez=)lly;vmjj0>LwSRb#83XXKpFuXdl{J}bf=vZK7{vT2Hht|gg8Yxr| z(D1(v&&1FdiCru?pT!~S#lYS=SLY`#Pi%3?|Edy01;&9T3~Ft8JjmgkI;jM_&!h_& zxL`vtE=dnEAOR|{>sc!BTJoUL%)| zd@^SFi9pG7SE8UKId|5}e2Q95Tu5A)9bxJ|RrzTL$8Vib1@%>Nb%54cnC&bncjQ}}U@syRR2CovIvb-HL6ub&A( zR6k{h&vbt!LlXmOS$rqqAO#dc*jROt0nuX!eBJ4^U z<&;OL3Tf888I0H2OGY=0HqX`*Ikfij5;LgY2zapYW6L5M-wuKl`^kmWqApAxX9JF# z>wz(4Cup=-#MyC(Q3Cc1&>+k`3?r69I4+R5RjIr<*R$ivWCDS4A~;?&cT~b|vmw|K z-D%^^t#V+Zspp6>ytf2)|1?GH$#IMT^BbJ7+2n$Vk@NL+^afKH2A6INUT=@^qjpT- z$fsIQCuCIfV-#%(R^`~fpw6#nybXMtGY7V&wu3poC6>KB$z;g5LP1r^Y6AjtHaLt7 zV*~R_AsfV(&-$f#&WV`B=SmW5KQ`2+S+gjdz}Hc_#`QH6pdoAx@^e3U`QtsD{0kSA zOwN0K|6$$P>!q7xu_2*0Q30eo{j@Kf1;lx#48IC_&Cv=%PO1gK-~) zTPj&0gwc9N3(IiCcLvC6*L8oK__AGCFd)E&j8z3j1)vu19_=-{&Xm=)Nj7Pe!(*A(yY4yA(8Rs%S^~zjK)dg(YpIjIRQD!EP z9kG1zgR~7!oiwR6vEendugl8QOS!;${`J|@Ojrxh83vJ@^SAml+$j zRtY~UUNEp!r}CAQ%_;vxmf_(Yw&S*rqrDhHsehJEdVZy{ubn+=G_{2uQ=`ye^`}Gm z_qE|H;*oMaZuWfX^nK$=c!!8x?Lsc3B=VpNO!ipPXCwAtRRrv;K=ck~vjuybBd5U) zxVR$kl7Sm(yK;HX%IIS(>&~9Lb>3C(W0Wu72Y2G79cfnnp_)AX&ABpp>m6qk%sEC- z7Mqsi5y_SjDZ%SoXxR3t#PgK%WX|X=QllMLFI~b*Q7}?wRW?S!b!YZY-S(i67vYN==JRDj<~+~Uo_H2m;t z&cM-d;2yn&{L!bInijX`GezKo4D;s;t-ZJR$GV-vwA2e}Br#Em=}dECfUtbNYmpl( zxG2oUO+mRh|IkKdPq^pMdP7U{Fuk9Kc0zL7emP;?N%4z1kB~e?%L- zEuI->vu_Jm{nnoKc$NPFg(^c_O`d2F*W6F7$IagqbQL3iFb@9lLw8iGkdxbBeZtn$W!SNm9_6OE z{G2Mar$2z@$O%%S*oJEyI078IgcO3ck!|RC>j6TCs&J;EjN72u!MKE!;i@0EJdNMaf7^(#*?)C=3hr|?4TmTJ9j>Cp^|aoR%L9Kr zu2a$I`l*J%fVV>Qz3 z7UV^ghDQwxV{Fo+oZ`Q<`eKkQOxO^`n3 zR>oX4fRF|ICO*@;LAmY63}`&pF5C-f0NWn)^&RKToz4RV8VUe}&|P9N!^gP?S2J3M1O5_hDb zAo;veF$f4=heMnM^6LOQl@K-V$iD%Rb|EJMJj}(y46_jWq{|E-wW&mta5%qveTZs} zcW1w^0*VaA?-)Kw{ZyOfho)6|r5I$Wg>INV%@=(^CjiBi%0lcMY&7fZ=gaRk8e#f@ zA=+)-J{lj1Jvd=7p$c(q&Li}Apygtp0TOw4kTF`&>C(0U&E7N%r6wkX4d$ubN&1yN zUt=nm*=h3((_=UDeC3$`Ww^Xd_0oFeH34i19%de#1&Oc|Dj+#5FP*PVN4?faZ28~_ z@oXh854&%jWYF^WG-8REn0823xB!SW{a!4Dh&NY0OMXjE3X-Ge2bT)mf%zV-N5>dS zM1~_566>VF20gEnJK)e{p?Es*Rmy=&lk@(FUyD1@{{kxHs*FSPC6-Zu6(~Z={=T#6 zu<7Yh(1ke;!kAWy`5?>yt{GhdFmD-qGsD0oWk!Y@16)HSKTCn4H6+n zQv)lh-8A;q=i;NBQTkybfB>q18|n9}=Em`YTz6F>;VY?e;Uj;V{S=n*JFwW!=yiT* zuJ^a5H=Ao?GbYPWJf8UGZ!Qc~4#Zd4-qee26@ZB-8iB#6^o!8tZL&8z#gY;Y-kczS zi=~ABB^JoJ{gRq&6)77W@uT^P*%9Q!Dh)4!#RRLf=Ta^M*jh!Z2`}t(7MrD$&>pJUI_2VR>zsa zXD2Yf3{cTrlUWPMsW$JK7px0DgZ2v!CFb^@Ps#256FcU+ckv$M^cxu0A=3R)_Q$p> zR=SCCWo6Plr_vfS2HLE$yYP~Bo9CNU#AX^D_{kl>yM8qoHj*FfAk7{;2k?OMk3;_t zYz^pysRHgN(a)^Z?=WJ=nThL?|0OmVCvs~*dFG6k&iHX5>q{_= z399y-gG<{`k2zeP7?A0xbx|~Ada7tytPHcuw_%&YQau)%yH&bWa-WZw!5FSr04z~8 z&C$sUpnOqs0DOC2N{(9`pr*&v*c+(+kx%+DGai`s7vg)`txDEPIj?B6Ps;v%_FXi7jz&0IC>vLYl%xTOh zf;sfeXjPfO8D~g2Uh<`7>lM6c8rJ5D1W2E{wFfCwL^=p{dcW_#D4+A1`kRWn5{3R8kU2vA)UpC1aD8OS$9>HfSm4phaq7viW{e%+(!83gz zmL{H2xpzsLv$;|3*%sjKdVNL}{AX>QQJYLrUI}ri>=nI}NgnJB;VWzRC_atayL?Rd zs->8ZFQ>AoMfo)1@G{vGvXf;LO|yUbnt4ONQs+fmC(j5hx$E;-|UT16q$KB$I{_;1NJcZ{62auq6%Od zdlhgBB}xnzQ{_y)q-wSku>+)m`z{1qV72g8IU0>t;*f5i zk*%YJ++cc@b-eA+Mh2jqNOa^Y%T-OZl^@GqvBuxD(>P*ot%x$B{ibYjaS;SX|#TCfQ`s~QM63HUjYKDZhu=Wu2Io>w<0a&K8)HfF~j83P<%&=6Yds(rZ1Ht4{sz*KML^vnz z%pj5YTIOR#;xT-&@$Vbe^ask^#xx8=(_ushbTlP1;4T2}gj?B}(+u*FVyh+-qi8|d zx^TQ30l9Z=pX6!5ThTa32Hn}-nod(A^_>hm8ZZk#?e6}tZi68=mKSmWaT5Vvz=?88 zdxxVI@%J02d%aMxOihFXQ5TSObx2xMO@rBg`)w{IQ*HLT6%Oxm!eorGImeeqk8S~K z<|hu~T6&0p#7NY=in5|&lrW8)%v6Uk4!_xd!^`<)R-)BRmkKT6m^qzs8UZ%bE9~5s z=0EvpTB#-x_m=xF0Y!(-|JJWmn}(!lEhF9jf0wvJ}-Z%o0TP|-J+3|c{_fnHl-a2j&qC=3RG*<$>Vqq||p9LU3wfTJb z?0s{5xxz+DTky0(h$Oy zR*{7HPNLSL^Gfl~`u0h_*`TYn|L${%x!~UQhRu_plk%os z4fL9mKnuB)S{>DntP$}HT52T(FE+{945kN<9bpnaX}OvJX~H&eUiz_~7AqWemSR&H z9vLlnR5`tRFhC}*D0nKsZCky=Bk(MVK=ro{2T*5q zl$#a{O=Z?=XAf1@Do-c7>Bo_@7Y=}VfvBD6H+rb&$YA6)D)gw8ex;WhZ$Zjyu$tDY z9oGBxr%@bAFiQAy5CBl~877q$aV&i{ujuRf#D@Rcme>&WI^AA51oA!x4cFDVgQO~D zOms70JT>!ICUM4kc8SY3-5ZSdCZO&{=jMGN7JUK$R{6J7fz~m5k53W^2+32; z$hXr-`F&QiIg5chK606$Y7}< z#FN((>9Wz>XEv?5ayq9#n!fp~GNKVjYF!_yOZlZisYn3W(T2uYCM*+o0kgA0k(x(} zwG{RIi@U;0)4On@QBRX8>uZIInFg%JJBtNTo(%PWs>7sVuCD3qT3hypN^}*$ChDi)@Y1}`89P> zpNq%`=q#8r|G&?F2iiRNCRRb~PmH0W+Ft(WN!LxW={Qm`74daq$$Hz;u<<7G6ho;F zRoc^95sG*7?**^FBsnIKPZv|QC4%gh6Ji1}rt+}}eRcV3KkyF#B+tY@P&Zx)dwpeR zY_eUzn%>%n2fH0S);P^^SkiB*q6E6n4u!P^70Z|g@hPdy3B2O9v)3u1#Ss?}CAdFh z0I?A;Q^mY#`IJ&Ok%^sU4ybDk-~e;6URF?lJ#g9w-btCEa_#3ZlTzXry$Kj~Zl43Qx`ASa5y7X+ZbU5$hr6o`Y^@MOd(jK1NbVi?iTeh7rMdSse|u4%YhJJT6J)aPfszi5E?j%} z)U9}z<(Uowh9d9b2XoWK4-j!!{X){w`76c8& zeEX>+Ttmm)0e84nkh@2gE;q;p*zB z1UWL|0IGOVzLx@<{U#JF_qGQoJEgl({)L&yaJ1(x_2z*#kE@g5TcIlaEw$Zg>0}>Y z96XLc+VG-YTtp+A6R?$29ImBRpF|;&URoVdsb9^=Ksci&2la%d+ZXxpX>u0)0eBFM zDS_nYt(~+d!i2DO?eM_zhHEZ;!sy_ZW9dh%;K7oo!>_W5=x}{3FBk`xI6}eDOOQVk zpxsNzun~DfK<3|8l=c?!*_5`{!1UNKu)r=d)yF~NVTkW?(Z=CM&MB^;y&R`-vLA#r2Lp*&RjK#lUpvD;L_~JSQb-c+W9lSFkc1gT` z?IL1mMQJHGZsK(`h<|wOUNZHOB#kbk*vzi#bcO4oF5NK;FNtDjl?h1r!Kc@uoaW1$ z@r=7P*uv;Hob?Q;_H6+AmP&ieGUlIF2)TIi1=(Iwp)Fsc6kWJ>$4FImV28b}@r32N zS7pLKz5#dufWf9PgOV{e*&$(_zd3mI0D8VOi#O)>of6yph8&4IsN((+97%C=jf(DY z$<)w%F}i`oOMLALw}6>(c*oXhJ97M5uHXw|$d5fE#xOdSXGNfpl>(?ks4hPxz(zBfLoRl>Eo7-V8({qs7WYwCG2Sn;)4$`S)CNO$YD8Dh$k1mw4-7L ziQ$${ubtqgei*>vnL}p11M$hw8Np+{Ifairzv&#?kHN@#RXI(wC9m+J8Wd(aRiX+E zfLz;JKD=a`SNwe08@;#KS1R+(ht}Toa_F{7a0CAxOE0u1ip<0PrIas23Vp z$JZfR+Jp04Bz1pJyNhGj>q{%i|?^VSSY} z$5xx^`2=xA`bmx8Oe+wXYc@t|f-L9>B;?R|E)EerYRmONNR{IrNT}}`}IZ?FL%yG(U@T%JYW1s)1u?03sUvuQyHug+_Iq~(oLdIqP`{gIh z(}v}^qHt5;fQ?aZ5@qbbA-5vV?D+?K7#AbP6T=-fR~$iDZuS6j=cjRYN3z0A`0T)4 zsA~ldJOV=MVrJ z^@-&NcpKJw#VY>Z>@!BEt>4(hIe&O?jS8;1h|f}>)TlZJzowKzztg)F(EYh)4@QkH zBo^lu{2F z)vR8nhZYx%Ykm3GykiUe=v7X$Dco0f09Jq7n8TA9X}%NR8#;dmVj!eQJ)Q5G+S+^4Qv-rGG4Aapc zYFC~BBbaS=n}27k6XBs_z7(fD@W0fLIi=@t0FwxKBI+ZsIL*NKKM>0=23Ts8 zq80hWSvvZzYnv5`jJq}%g39p!f7llSR9wN}a_2~P#JTnuz^2c1=}WjCfxC-~$*BZu zCC5B7ol$vt);{afhI|D|j^GJJmzV~iS@j$q+(E)_kSFFr&Qxl8qTw|PZW%l^bRoA$ zsn4_>V!(u29#r;o20w+B){q&kK-8MhwuB&t3d4L{NpN7z?<+0TO;q5N?%eIk(%-dl zq_;{uUl#(gitk@lQW01(o34C>iWfilNn9WwX#3xN*{8j8VDAxnu zEs5mP$&YE3mqd*yvj6>6cZzk(cUOe5c*mCqG;1Q)dP@OLM_Nxi%tQ}86)>#$7@w5V zEbr0e(8g_94z&{yz5*g7s<`t29DO^znFwiwobWPA`0=B~kxwO3Zmp3Ysv0!2$GTj_ zZ+z%3Wmy=Otstdbx0r_CyYX`CyH>FxJg0*EQ0tovFh|*tkl=*rXyM%0L$A*lOm$J= zW-@&Ym!V$54`BZEr%dHIjf5FfpLROD~hHEXAVk@h|412Mf$~tq4fqm5O`_PEs?MN$>Y47isbN(%y)yHUCR3In_cOp6f&#i~J;N<6#Th zvDw>Ym|1{K)K>|qBc|-SB))L64n>?c%2JTjl+Ims@3WW_kMrerjOlz zo*5UZm|^pPP?9#Xy>M&KI(F3F`S0*wBNC!(?rt;SNF-;VY6@&*&Zv)-xoGG4LWP9k z4dd!Cj^5IT0)mXLilIS3P23V zk!gtf{tWtfPJveVrBLm<)WSWBF{Dx5j$@ol_8c!`O$3}kL;~jM(pwV&2f+*{skXJ^ z-$v!lt-VkAn9 z7bYnC{3MP{u8z$brSd{O z7-3CZK~Ha~TpaJ;I#0NYVflkMG7aEg@f;A_XFr*wVeNX5};K5t;kbO^|+$rw^#C{VK{;g{2IZhuXD^`g@1S{5G z%DGiqhdSrUi`6&}`7ttLO3k2<;+-y&*GWaX3=j0<66QPj-P9B+@k=Z^yOl@C-dpEF z_IQ`t5Q{c+C^Q^OSh|E7g$&6bfl!xaZKhPtWrf8Ka%9RS7tLQv5ZWXgm88gQT{tAi z-M)jc-NRe4$&}iFtJYk(G-3^rRZGg>oMo&BKf3&98SY^NAcf zpmoN}UL-i$rinIJ#oYT)#qZboH3-iNBKox^=y;<6(pPd_IRa9@8)+B(Hi;~tO&6=f;-v-mq zLH67C`+v%TToN+S3dPJZ@VpO0U=6I{H7M%L5)%wu|2h0ydSs)5sCERU@dPv(gbJ-# zoes-M*oF^5%`FR-l=dv@0RKM#z#B?W+ErlF%-5H|m(IHXRI1l@>v(y|(^9$8uL zvp?XDWC%V!46PxVELT@p3GBq$zA+iy%8Fpv_qk8Zb8qLv^ly7WW*yjnc2l^*wwzTHu)ONFG=3b`Ey69S@=@DM~ zPbKl6n0e*A zWv7ef_G|QS0qX){^>fx~^+j1{`{(-MiEZ&gFO5Ui6cH9>SWhzJdB3S5wlU%ZJ;GeS zhQ*Y{gdy@dKvcmI@##jnACdtjek|WSjCT) zTn1-ypKio8JxX!lrUPOs+N7Z$qCRgV(apDRzPJJRWn8%zLFuHKEQy+V;~)axyNEY% zeBVH~$aQWyJ2>iz6epIjU-(LeukOXg>}9ot<7`9NKw2hsfICPeq+Q10{mRKXk>rhN z#d@EYgw3VNSBrp`eatbgvGitpExsmV&C{>)1%F==o?(|VmI5$&=IcWViKX@2B4i|CTkTSE7V#G6+r8HpJ~m(PoS#`+<_F2(Kh zS{r^Dgh*xP*~3>SWNaj;fB~N9C(fyR6Be+k$drHhrYN+Xv@-Ew>^*w!?doS$Wh>D1 z#b6P54`vQi@irDkkyo6@kf~s5IC~mJ4qTD;k_tT!4XV^P!Nu%d#my?P*XI5iA^rUx z@a~z|?H;J zMJZa_O)s%toBmjZjZ!1SUSuSUJLYtSpbk!-mb@}A&N8=qehJU6qL=+G8@qd7K3~lc z!PL`0-p#03@ZoM1n71KRIr-Q`^*=9M}s7W&`YFj)0`TxlvVuXEy3*(8hoI=R5rg zu%;1YuOHc%P4%-{#b^EkquYAMIiFdy0D50l8p#h#=~c-CfneJ2GxdZ@U{+8`qwdiZ zOF-R(%U2I)=B|qOLwlS{ONc!(Xz~9cw7NDdrcIpJr+2PE=`wX%9BK&GN1_eg6{)_2 z@K}Ixts=iNg4rO0cSqykP0vJh%M4acu+NBpXk1_HuTpeCucEK7P?|{EZuJAJ>}9Bt znr4(k_#V6U6UqLHja@zp`kUfH!6?lMKuyxssmnhGtRbC*97V_u_}Z4|_ip--ItcH9 zjaIp{g&^6$CvN{DY>cu7+H%A7oPNO0o7VF*>MhNoh>)S^zlu9Fn4il8*eOEJU4$l3 zOs#&(RI0bk{WwMbDz`dPPm|J2^EQEnF|-3N3DMJ+5K%IC6dlF1AC*Pl7lo|i2`%(_ zwW}e-M64I0=|%D(3VaI_SlrZxUM#uvl$ zASL8kCC_kf;RU#e%)eNk-BjMt2d@$ zN7n|;zo9_|pp#qOKBCrviN=$w-zo;_T4nsQUeT(NxwDcN`k+%fo13V|+B*e@>p6bg zI^rkcRq_S@YgEryZ~JLBgpR;YEl%SOQ^gxC&3_rS(d^&)Gx(9eySrieS^wi@=~7SH zoO?d%p~>oh^m2rIpkHfNs2Bu*G(wkM0ZgN-v=8iC;mocDEdt+N zZY=I1f#;AFT9L3_R!BC;gp#OpxI3$orIc~uUKZ@>tmKF*h8ay9DGA6EpM4;}Y|!vh z_^1@+k`<^A@}J4Uv*P5PZsjYk%#sPz#o-xr_}3<2C7uBRo`1;4nzZ<>DLs`1jIw!~ zjPkC)yAH;ons$Vf^&CVBG#5r{Ro-~4)4Cf}i#y!hNflJK<-EjTzX+6b#KTPdh^xu` z{k9H-9|ezABCJBs8eTTC*C(&W+uKSTzo8nSOqj%I_vo@QIH=D^&t%se0`YM2hqpbI zeRAU-Yce|dy(dg4BJ-AL#^0SYEZ)MCSxAk7GRNHkO-? zJx|64wJ+d=SYK75$udKah=Up$r>I-tn#5FRUT)yxaBwX^aufDDzKU^B@__b|@-WGX zTezV_b}=SD%3!`LK6U&h9sGe(x?+IN5?TL}l=c0_HFsC;rY*BbT=3D)g$Dr{z;7|; zd!bCUD5qE5jO-qTT_Ks=yhz{JHYBg>nF+0{IPr?(?27oZ3EbUcWm*2Y_NXE-oV4yq zP9ME^`j8Pr-#zG=q| z157yuhXPG>kfH08)BC}ezUkgBKjhiW>L*n=_?yWYyzumZwy!)z_uG=&XqF$1VGkWu zfe{R#&9v&l7}`E1`eF1jz<_hnk2RMq3(H0Z%_fzebZe zZk3RzOOwy6u-wGO$b|CcceZR}nfRvZ(hZA_wCVpXj|UVGN!}PIdh|EealnU@e&@G z)J1)nCBAlm$MkFf?m)+tCV^%`kLPt{z0-QUn~hFwF0~Z(7kNbKOqo4tuyVZ^up96o zue}b5DM3Jy=y)W+G+R&LvhtYN7e5_W_0rwrvh~}G^OVTJQH;%gsR4H5t$;e2`X?GzPfPY2N|>D%l?-vZJ8t3Y?cObwtvB(sPB6S@k3O6&r%9dWW~@8olG zE69J>Fi1xDXm=vZn05aRDFM*35y)p_pg3ujw(;4Vro__dyyfcstyJ0Q!ef>LA4I~G zb@+lOV-Vk?K0gPHZ8~uU3rv%tsOoFT3HLL;w)~b0=;6eFJUrN)^tBsRbSdX`8NWH|uOqoAqXQE*> zVcN=?_(3K6G;7TRRL8ERlaOgcb97(uf#~N}2tLvckP$M8fF1PCf3$G)@>{ zR*K^|!wskJE{Vq(&l5)%^yvfrLe^pR%7{slA1FnB!Z6hwwOjIGqR>F!G&7dn+A83O z`3}=pL8I|z8!JDevL$gDMz>T>KdG| zlPjbvi*0PP$wfKF--^x9r?_A_gMv;USvf}qcwf#m$Zpcuq6nQ60vHF>FY_g44r22U z{J$!A-d~WG7O7QHAzkgt_;fY0IhB`=N6MJbFV&C6y>smK!4b`RB@W;8j9d~f!zA<4 zzN)KFl>bgOo60B^V6Zk$cb@E3pHQavq&Zrlz7iH9lt&TYVvIl#af*)FxZ#lCGOj^0 zqJbDAarqCb;qp(pD&>+i%~2hf*L?z+o0L>P@J0Pqzc4U{Bl;lrtU@L7~S6u$TQ2;zyh30H9|liwX00n+9k_xVkNheD8)+Xksjd>cs+Ag z%MhU5ozqUV%(uSg^m{^gw^_0SKCmSY@m^<^X~z}e0{!~!QKK@2b=xOFt{e*U;5hoZY!~ufDzY#x)ntR8h3`L>|Wc$IJMVr z!yXq-WZJjJfGp9N1lSNKgG8LpOkMF!wkFP;mpd296ah&Nhd7ogZ+^=(2xTJqzq0TL z+E;+jNo$VbTM7m(V`}ag6l_d_e0OeJ$Y#{|&slke1anG1RpNw)=Izw2$>eEwd#z)n z%g9P1e*wXSDk}Spd&D)v#=cvJ$P`?w9#3 ziayKLY+uJf(Jmi=@1(fv$gx4GDEyyN1apK^z|4DQPgjfz~Jge3bnAq$xrY-2P)dv#_=xA3$CDkK){r26ZUl6)pCW77J z{*I9%8!moES9PmEAhX3=Q(Aa!r zyG-CxrAG-Tk|R2ieuV|<4mFQmhCD-lQ3`$Wt2@R;Z{z4gNqxyh7ng5CCIC7mLCxCr z{FnYv4hWD|F`6ylGr6MeSp3!k1yj`|*Mc$r97q3Hd$D}$vStLflLsi$swn&}2_Ee0 zfWm`sD+OB`82~I#5Z7Y+B0NozX*D#@FSVWf@530gUvBTc@v#g_3Wof@l6l55x%u-R z%cp*fP~oI8(hDbp8pWZM*P(PCk?%4Ukmd!dj;VxnZ-t(1&hlV@i? zv2b?eIth`l1kRmoZ7dP6-QiGx>)jy{4MrC)Br>McY9vkZWXTX45NS6_V_Wq zolfZ%SOwdXlHZgEqntUA16J&Is^mR!DBkpfm3`7Mfajf(%qf1@BrrIWclDqQ zQPwP^0%WM~zK3w>bKRY_>-q=}GgsOnstQVk6w&h#&VTBu z9;`Wk8kZKD(&rxv8nPeZ4{zp9X^j-Z)pY~aE+eD7Z;8FEFh+V!ps=|>eH!yeet*c^ z>0;CkAFVRjUACr*h8c@<>?yuAw1oluDI_Qq9}>P;Q6BL%msZMQ+PmN!wtd7iFRP0y zSgI}3HADSQ(qn)atj{X;LrHpPLcKXcANR!GntK~hI~H(?MY zQev#mG4pbdY2XBI(2tf9VD!cnQCZ-^`95&O53uB5J7c>{h(MSxBJrnIX(xJijyYqF z*;F=|%#c;jkEi#${5!o$IA>RBsrNSi`(n}fuxNNzT22Yh8HAPC@6#G4OONG^6Ay;H zjiT7&{E+-Ou3bwpA(?FUvt=!u%iJBz(_qcbjB3VBG5gCL7yC1wMY312IjPMdqD8)Q zv0p!!&E0Z57$2xjTdZ=9ynkQ5*w@W`FwR(PW4#)S9gp>2XL?^{z{JBc$3j@Bm={)x zy7XuACI&rh>0cE;#V_W#F|j8G>Y25m3#MNY$aUvlQ!6*`j_8R7m_PYbN~)X0n7wxNf7C>mnNG^= zCvT8r6Ps3fVOxHDS>qpJ~DLqbPV z($nau5+_pyn>LTws6o3}n0LGp)#^8E65~0Tfq>DnCWA*-KGejckerz0CehS54@Gq> zP}OJY*iOAGp90w8A5m5zYdf(k()SrKUDp+fpJT>`amj$8@=e|jC1F*~UQvZMBXi2z zHQ5-0q!3n0pCKZ-(9);6fttpuIb!tBn2YNnIaElOl&rh1#_4*3(teq!mqArfU7LlXv+zSuYkP6* ze*9xUR3c4QLyJ6dX8XX8!&(~BVSHw-<9f46nX-9XDOa?{`&IuleEK7oH7=HZBe>Sq zUiPtTVL2UO>_k2qPFg&q_82GLY)lC;^e+a_zLwZfX?2Ay02;TeT1Hkk^Swx$_=KmqX=)Gk{HH8&b~ zi+=&OzWI2txl<7)?J9Gw+c+xydMmnI z)cU{RP5=V9tX6~Nh7o@T3ttHCd=>DNi~RERTxwq_-?fC?l`=&hgmUadfUM}83> z9&_BkhRK*ccn!ckQ0gS(a^RLGnO3suO@j60fjhtKhfjI}i)noKXCG{KqEbRl;k%vc z3TLk>E}t8V4zL8>itS|x1dYrZ}81>wZ28KHroGSiWq6B8Q#2aB7p?j&1UxR;Y zghVIBKAYVLm{}VN{-M(yH>%;rqe=H9kij$ctC#7GWZ>&sV>FQB=BU=4qbcsu*a?{e zJJdwad$rGQ&E*^|6Oz;=nFRQ!LK+AuaOUQ{)BIlDy+6^&SaMkw0iO zqlIVsAr_EQr8WB7@yiT+5?|V%Hh<B1@VsFFss8hrcFeg z*{-z2aMh-ZC`HTteKJRx31oYR(sh6}p0Io|-c_m67O%(r;5;9qq1lIt^|(i?s}vZ+ ztO0%v__HLQ!@JdtPt=J0IR*$xGzKz7fiovJ6|>Fc36Q!a49y&QZND-PSDPpQU zUXQM&wlEq{Nfn3}CbzXG7!vuuPu;qVqq>&6!ogtW6QqhnoLT#A1>K_?5YdGP{R7~a zpd4Gq$h?lNO1Eo8jx|R+-Nq3mvQyKJxfpysPklv-w+yBrr+w5y`lVo@Cf4~#V4I7H zUlQMlp(kMY_uNWtZVb;@!o7})Bl8u>4W9%TXLjmBy*;fkTxOrckdJNgGt2e)Do!HS zJukG9>%n9#f%Pll3NqTpZDC?m9K81$k02k+-v=+99x>yh=3;I=@>H7Lh7#FGDH`?0 zxQa44YYpo*sGa4P*1{{!-)Xaf?@eU||0n<@An6Z0mV@?c1R~NtEb^~>moWvVTt8iY z+HoIn>~5>%pyW8C)zfI}#r#jLvuW&x6Nd*$VZS+Xy!&#tSN9D{uTAlk7c+H zsUDU<6}2!KOhx!Mf8IppkP-aKA}^~>S8L(B{@XJOOp^ z`+5nn;=gAG`YOFpok4rtHm?g-X3J-^^oaMK+=gT4b9BL9jPL16qV?$+@;xLh(*N zmn!rb#bvgb0*09JGMc`aE(4*q%jXix{IU*PetkYps8n_1edjlXn8w-cioS)@v$DsK zA<04dB(j?NJxH09rJMHkb%5#4FR#TXHZOarYVnj`+=Z00XuZqRfcb*Ldx#)hkTNby zV=fe=J_`>!F|CF)v8aB6x1edS;+GA>`}lDo*Xhg3X4g_qn97Z{RJ-8=v)a-OfE>}4 zB4@BD9@JcFfQvLx-QUN!Y<;+4wdP`xA3eHY%gN$WQTAvNqMAwfDabwdw{@J6HbCg> zwwnSgaDF-(8^_x+vy*a6q#h8kK-6>-XBd4sbW^Wuwotu*8%C)vKFcv>CtM~%C2N+B z?c+6ui>7_vm~i+P@}r=wAI?3(C$IJTxCnx?BO9!#F0qc8(VTNN(sT(nl^DQ*6yv}# zhD?qPZLJS(FfGylE1lD2OSnEisKTTk6wRq?2J@h90jsycW8=Kp8~+1H5etH!jh*0U z8uKjiT~Y4=`>kTy3|a77Gf(SZ-b$ey*B`N_1UOh#4MdC$@lAX8$^W)+35-bNZp4iO z$QOA5SgBs(=sYB?v0h+i1U~l^lpZ#8!(D?Mfr8w7_5TTS!K!ovT4^X!t$&TtC5G>8 z?m$S}re^cEfncLBIb!C^EkW4T++!l+IF)*OK#+uF3mSook^p88gxH-DyBvuc=i-S^ zqh|V~LDE~kTQPc$%Vc_aTa-M($pSsx_yMw_~3Nw;W(J5NI z1@@KX9zpH4Kb~7w9)@Rbj(I|k+li`w%w63(fPb~Pj^t(M=>gMIbyi^(eaev@l0p+$ z4I{+J!RwgMkBEW%C7M0VafH~y6OcSk(-{u3I*d{hOA$5OtaR7#V**L}m~$iF*kCfX zU)8GQx0)0fu_D{!7N`nw(mXG`s$83n%L~xRKGzcLjCTy+pA)u70&FrU>R>oxwq8xa zhD+GhDlr2C_vzHNSjftS+5BPKN1eZxg6y>9_QEEdI)#`Eq`nsc zzM!B)e_b`cU6-O-CGg}rW{jN>p;@Gx0|h+FZ(x&LwD2YXGsldb~tAuk9U;M2^YISjlK z2xVJavGd!3jsNVcv&||S%SrD?O|))CTl|SGLjN5mWK4=;XoewTzRAxsdl_WuDG$Ze z%-jWwAqT78Zi#Ash3f2dnXWIwg0tDs=YFkpF9<<`l%kjw#=F(oomf`EED~wDRfyveS8x>tbRW`S~)|&=r;ZZ%z@N75D zcSr4%u#CMN75|Azm-waH!yJ@E*i|cz_vbF7;Ysnf=%v>|CzYf*#2%u)89Eu$NAr|CBWpL7C<>AauTH2Va11VDZ*!pY_4EOPuCf6N>XzP&Cst(NU>k4Aru@7KFx*m|gfp4zW4wtGFZymxX5YKX3i&yd1S~OLvQl<4x>` zsytk2EeNZp5M`y1tySPq{S5*f#n??8>qP&;DZB3UtUy!2?XtixIkX|%$v>!9w&tx%F%$Y_4P9Fnn%mC>5 zvprSV)( zIF8`uv9x}mZqjRH2b=0X@8ccFGc94Ie+zMmkGviPG_98Y9bpz)QKRg&E7G)Fm|`(~ zhiB;rWe#F|fbd1d2R&3=I1gCN2@YyL;L^G`Jk3>CcL*UxFI<>p^2xo5cN3_EO8?o1^N+NT3EskgwTJG5-F*k4Zp z8vM?K$hQ4^3qT_=`uC|EI%~7!qYM{Os*bddgQOT99Hj2$o@wj-*MZzRz?Bb-Cz`-5 zJ@18EU9f9?jrx%e7qOF__K7N(d7s>Vy{h8rC*~`)AJk&xN2yPd#yf)_+N$$?6^d|E zO}2pq@ghvLq|9#{pN$NZhbzUfAwvZ%SG8VlNr#19FrpKPSa=gt5T((PEaW3+-O7n& z&LckVn~q4CPr-$`j^)AJ^s`S7K}=}>NWTLBqbDht-j*w~9*>H8ND-?kNjT-9-2>3w zkL{XqP^!Fe9&}`>2XzJ?%9H^8i4;&vI1>ad< zuw3sL(8-%JkQy!~ywC6?og3X+4QOVGxCzYHc{9%fcx-tY8*AlGMz^UQk_zP%Rht&idP59$XVCpzszA?BBRbLwrCVPp z$x#^pGZDxU+8W^cx^d;5QyDAW=)oaVqpDXqKFpOVKvxI{h+ndP7rZxTY`ok zkj}WDGl=)UncV32oqFocCXyoKWeHCaA;SwZ&ef539ObX&(p6k|{{KAT+8q1YzEDcw zUNBRlwm`4y$P_xkm$XG*g7;M)@u=s~B|dR(EE&q{#+8IfeAAafaS&MUk_g`gSOcDI zOT|<#ij`c4nG3a;aL$R2#qh!t;Ac#{jZnC7xze5JWNnA8Sztf8^+;Aly?aT5wWl>b zB%0VhR$e`*DF)2%X=_bLld#(MBKLMLstW2nTUdN-zRTlcn)a{C;T=QqQyep{_>gfJ z`qU(yFnmB=`u$R9_u&Bq)!FTd^3-LmaH6_=RJC@1~Y*IHSa(^VlBpwI9y9NjfE;XEVFNou;_rfPoDgLje+-4oWQ$_NmpXB}|_wQ&4y3 z{iz8F_pL^0?^rHCl`y2HjillB3;VS@twPp(xW&m0Yhzs;RnfnUq1nxtvoZvV@<*5Q zR~Lx8H3&ZFv~^vaf2F}AgZHj%Zug*oka;cWnUfN`fH(Zf=3nCvP80_rMy%Ga@^=|F z!>wSNKx$&>lh-3pX|M$FK`r@@kZ~mH%cxTOq%DAXhu+x9@rplDT6W^bYzAQitZqR9 zRK6#K!E6n}4|{;WRY{kn?!mMu_B`1aCJ0ro2!w9o3_P}f#g%w8@Mc?v^-rtXKPhT* z$B6aE+3>v-{VpWXjX7ly0&3Y&ec<+Dse256okYOL>y7~{E zG`t}&Af#P44QdBNy%a8+N;gsCnnXiZ-Q67X?N9g~n)C(y!cm888tS>wG6}_p6_?2H zcv3*cg!$KjU4((!s%Wjk#xtH4@>A{!H#sCI-QcU1+|OY%+xGr3oAt)3mk-WytM)6Q zR^}^dK);)@uSyoOe1FQ~Y$!;}Eq!r=S*a@jl^zLwmg?sgKts(n-$AWunl4gbck3Ul znHLW_$g)tTJDpPXiJ-meyX(Ujt?9SZaO*_)wP@*-=JHQf>fBCAHeuA7b|Q~bBR2yC z``sE*sC{Xa!7Sr%Zt{%6AfKdR`lH#bxDfh|VzUv))F{hdj=XCmJ7F9;AIT*PzLU(`!y zJdY5N01sM&L^td0Up=(A5r;-3SZ!8Zrsts^81cR+PY8*bZ{~%Lvz|ABGUgacVT=^8 z{KEt&wk;i~aE1eKeX?Vf{M%@4|4>8;rr2K_Ls91IPFMOAy-I`wI3s3*21)ZLcYZ~0 z;Ycxz_uU$>JCj?|^)Pus=9yWWEO_2Y+dXgIt*&N8Ya$#)*PzV<_{D(&xxZYwI%(_v zhFv~0?}V*s(08!oO;)L<5?(77R+&?%7v@f56b5KX!;@@8(Ag`0madsFcgwV@v&nUjqJ&S44UKqpadBk-`qcJ%~4(~*>wnsd&YZWn+DbefgK21p*E1IB9$vW^T0+}7$Rdp zv6Sb>GjaRG$$ zUQf7vt4}CRQGQ;f4R5@dp}%`I`Q#lN6U#bZ9`n>f=uFt2#l11X^(|KEoQGkX(U3S;=llD!P-4Qplht|$xKjL@j$!)@v8i4=zg^$^`wRk%P^@~tDi?TUa$ zmg0rpWz~$xZ^=Z_1>#?u2f~$B>-vnIbFq6>TJ>SC=k%V0Iycs%;d~FPjd5>FZmC&W z0xoj9okk(*vO&EN=>2b8$cWBHQ+vH*GaDJ@l0O9x8F=Rv6kP@>#fysdshIdT15%B` z$Iof6#)IZ0nsd@INQuQUC(s3UT<=JPw-L6F%xOF*VX=O@I?iJvhS2|m@E4xWw~!J2 zz?caBYZHVON=IdPJ72@a@G9Anyxb*SnOvq4p`bE981gpNWABbOX5lm(Jxv4YOVZ5a zmY}j~Fm!Pt-Ra1HYvX%wDywWK5O14rF|gu@9jvf0#L)^yn0~vfi6#w{`(S3zvJN*B zu?MZQz$cx~m9>peL_isWNxhsyk}hkMhA)?=?nGJZP00%ju&yC1>KWj zG@$p~ugo&BJt3HUl;7)Kq8s*`G8*4Kn9&}0gkxM{t05?E8^IUb11vJw(*xSAX)Yy1 z)$UOp0#E01D;{pt$)YlUJkeHWv38-3N;ZWLBkX^Y2qk^O?D;PSitc>Z!&odpc>2(v z@rfX*rvg~mJRkq&V0;+f0{AtByU3&YBpf-xBgm@{QzOSxkcjBF`9Fm%Q~got>(a;) zLp*q6#NN?0WrZEc+gHj6xywdM3ax?!+Z$tVZ|&tpu9geUt9_(GvfZUPo24j5QpSzm zZ)w#$p&1rmWHXL0o$3`VC?2->>X(YDdEGf#!Z!<2a@Z~2AcFR|IBvFB??nnmrWXY? z<)w_wC-?~X*5K9UCTBvqk5BmA4>oNv(G(e#;y!6PeoJdOrxRhWN9ffC@IN$+U!G_o zH_fvf%2IG*K@Jq?5mH7la*-n(2HL-QSou@+y!3|jr}RjppsFmt*(#ln@d6=>f65k> zMv!JnUAV&CnVN@7X%MM& zxBN{_P**wcqYn~d8`3Stps0cra#vHcQ8*0J4^ojz5I#xX6DzYGP5~N_invDY8=QHB zMZPjC?~2nK-_Dj)0XK21MgD~USyh>Wd|2NrsZ|BvViCsZ-ik_TJO(iTa3gG9L z1FHOoQIOo@WF=8epZZyC2+0)!x+zO}91tX6%|V40lU$m3~FBp(GF(BXvwlUs%WQJVhmivpl`9bVzT|5P$_hCWKNM^4Fz{nmqETVql}xw45d@R2BN4-2@Zd{%tC`ui}bZGKg10&~7b_nT0|l&V`Qb&s~AukMsx|F0WhrY(N} z^}4o!7=>r3(QB>J5_uW(f=YeGdPlC^PF&3gSt)^00W+@jEzBx#Q2=0?Ul>YAx+~#L z-BOLX(K~3D9f5bjtvrY`>ZWFH3KgFL|s#0ic2t{+V{#l zH*T02eA@yF$D6AxaLE60G!$ae%z^KS<_As|eA73>emlzx1I?lVj!X4Q_PkZQXW zsS^O7CO5W|$x+H8f)G#mqr4gf2b#hFDG~IBDKE40+565vz}8qCt1rLl`BD636~}8o#wfpTTW^#WJNXUik@Q1BY*Kf)nvjEe2oIciKIO1 zTq;~iCsHogpj1R6KJKHpHagy6R~H$;CQOIUmXop!6V%g7%Sjz0MMAU*9l0mZ-%;QbJ7LlBGA>fA&FWY}9P8w*>$S}99*Y?Lx;$$Dn>1p5M{RSA0t z=e}C6IJ$DTcmk0V4KfwM>?QpnI%PTUInxZO{-E^%nLXCFJ6eeA8E@pi}E75jlZj4`#XCgl6hN|~aHI|UaJ z%tqN)0&TvbzZpft0n1ilDpAs^gF%9N>F0_?RVDr!j#RneqJC~r5T5Mpf=o&-3{Kwk z`{{R)l#^a`noAPEjlW%J6+wOc4H(KiBU`X#d`SxZokZ~syPdqNNYd_?28#EcNQ(5G z@l+Rzeq^(C?-E(nul9bT0V%(n+)jXf)K6KJ#;Uh^UFY8|P0xyBCL;7)0(T9S#%`Uf zP8h5Iz?S^G&Q)7*t7Rgsu5ApJ=bL%VbVxe@)DO#8+Xqv<#e&h&mv=F!u41S0N@(gK zN&^Z>=BB2wZMH>v!swMF@vx)iV|aGcMCd0k=NAJciY1{t73g2w0%Scv)clE zz+troaP_eU@^Q?Yx<@b#SWX0yu?}wKhZTZPX@1bupcG*v_7m`jXB)AJ&YLST0YQ*B z!-r8OCJ{IjNlPdSOb$A~vr%B&F6R8dUueBt&zQ&Aw-~50$b0Sl`w>YgGe6SvuF2;`9$g z?Y2SQ1T&fW1Ncu`VNWM&hTFCpBO1w6HJe>?_GnDlvUL;;Ae{)O##EE6 z$$f7@n>gkJm`5GVp(T50f{yh7~#POy}J8^6=hgXyIG zbQY%)rCq{kM8Zc20NC`7c#-8A6i2bJc;$}JkH9M6zuue&+4|HLz&T}UXXbXqz?KE?G?z5|8&1}#N9 z==z$D(Q?`?I#Q>NPcSpDSI$nIicYRX0ahQW;2y?`8;MymJlI)H#vNtL)^s`L4eM)T zz7>$0O|4Vwg6;^E?A({hXw6Cr`s>Q2S1cfvcZhaKGXzO|$zItc8-cdQTixN6Qv+tz z9FtVyt$h>Fv__LCM7CPSpjxBvw`)gJE_AUhzKZUS;ERyMd-EkB6C9uY-V^y=9B zp*cj^J734*(|XZ}5>5mY2;GfsA>kYtzrhG0jT9C$tIg+`pZ~?iP@@ zn|=PkeacBzG12mqfn=3ufa;MQd1FHm$}or(u6um0Kw#|EZCI{i<~424I3E-z1o8bg$ zP`Skvn$ri7+**1(gBt0!&>}`X^jQL8lriw=PEUUaTV!M8cBRr*T=tAO>4`WKci` zVPS7;$NZzQ5z0F|w87;pyD2NVT(B!W^<-ugX;1bfQqS^_=zogq#RFO1Fu_4+Zh*8W z8voFxF$OwG3O|Js_Obkhm+1d=@S5HyVMoL&mJcaK%_2yrVTY9RSD^e1aH!ZtbN;&Z z&R3h8yM-RlN>4!*vgtQ~MIEKlbmfzi0mr`O=KV1jIbm|8%X8r=W2lbjiQf-E{fuZd z=yL_dE)cWS<|fU|sEs`ARPWcjTDb~Q)5T{{9;z{fH{(JWkC|qGgv!cwVq|_(no9db zRIiS=OI2@wYo-C1D(FI2HYZ`>x4l%+g&{m+?-Q;;4;3$WE-O^7+1shO?X1hDY2G5fx5 z-LKDbb3JR#iS_m)Z-9u09*^8|=h2ytB}PGpy;H~)`_au=TS1xDoNKxOP5^K*E9fOR zR2UlVDm+?}Nvk81X)AT%T$ezo$kat*_3LxTlJA1$-!5K}bQLAE!58o~sk;|Q19qq( zjifJ+*6DnFO(|dL{ zNps#|938PF!L^*-x-IltVfV&E9b>9R7?Hj+`EC{rGVq69ymwni9-1$Asm=LbvLbI- z=U1ADv{p3c`dKNPR2eG$z>tHB3x66mAus7p{>%j86U( z_X|r{x@9U*Kwx0rAu)IT*hbHnw@S|#Jy5#mga>_;`QQtTn>B;UV8BpJwwM^l?zxhI#zK5&*W8cCm$J7t}=`i%W|BTwMrUM-@(SmTB zc>aaeLwa9$hE(xIv%k%Csh)<)>K6T4}EzAadXWrL?ezj8V>Md1=TivCtj_f@NKjm%(L3D2&BWRgqVru zJ?F1yHEg6+YGfAb`Z!cuch^M;4|Y99vt+FWZ`)=C{)wiYCQ3rQqqN_3 zO!Hgn{!YOauaXl*c77$h9Uv7!F4Et%5` zM1w+1J{9DO`Ku@{WrL9|0A9u&f=T8#Db$-1{Iev*IUt0z%=$G+RNI`_0NGi&(g+AT z9V{|~e`F{Y|rL&wQ!*Np3)G>GdSB&i3>zU3p~ z)@3W~L@_a@+bD;b!Q-zXq`YrEW(Q*#K|*18>`I!=Ep9QEnKyer0Y2(R|arDl8vR>s_wdjK{M79gtEmAajs zYtUo-3(SG$6j^yW%r&CD&LvTGq+WARW$Xq1dLjwLMz`VnY~8!OkG9UjHSfO1lr&fO z+IHP;V{}>Z6LCfj)sp;AhHvB+?6ju&RYcaN`)~u|WAX5g;l7fgL@lf*dW17D=1lnus@~GNQBiO@!Vd7GD6+-%OLv^E~cR&ecXZQ zgDo0W6h+7N3T(e=$nDHEXl@?Tl?&6nnS3A0F&}i4tOfo9{<7#RM0{y+H2QSOis0Of z{J~4Kg4hgmBHG-`iEq?IUToc%eD56>f1~Q6rN$yy%IGGv@a%k<7ZH)8Zk)Us!_-{2 zLA&g(!qzklqY~L(H?Qs-^DSLxDqiF1x*1Ea=Riak&o};!;Jc9q=>Q?48MDd4oJ}RL zyo3W+R*0?kxVqb0#7yI2rQ58DKFe^FB_qQyIzX`BQG~3~r*u4~Q{LdTu$}vC=!{^+ z;ydu%MpTg}hgZ)~^G+exr7mD1hr7$4KK8<3aU)~ewAR!!`h~7tSZ+*}D_GbIv-2Sdq{tjLAC|fz zh^Q>uh2D~Vsy${Jd|O$W-tQ)&6oq+TcoUQ?-RzUn&L*+k1+o;Dp$)q^tuHkAGL+p6 z-N3pkKzC)X-DHI3nLPMqwFzpFRz*;?+|d77+!QPmNY^qjk7UJDK7GVXXCH~1fklIx zBMIqsOauG$ln^Ob7A4RG|GO8)c#3cLH$(iYZ0ASujPN#rihW*l>7lnA$ks~&;Ykj* zEN()?ZT2TBwaB{Sqv!NZ0jVl2Jiq62s8g@}cT15Q6(LA*G@u4b^8rdD2~nF<-xJj# zV@t8cE! zQy*pS0+9paOA{1`(R@3s!)H)8-e?C|6YzAeauh*8-u-UwY5J{+%Q%&wEqXZOp^~ z^TqAqH0?I$`(kgwSwsnN6oYzPHFTqr|{lU{*_OUR3b z8NrM$EA9N#8*da|D+7Qo(#fCik|()&p@huy9`aFKPbDsy`Xu#!3s4 zO7VQpXB2P$L1h4nhpCh3{P>TX!v)N4Wy>p-cm{-Gi$Q2doEsum5zup`eq1fCCPwH^ zvHDL=JySJeEKg~F(Y*KgY;()kA6U_UYwhcdii|?yY>V=^kcG4H`4Lw9AStT-Lf1{j zZ(P^$_10Fh)x)LB0z`nTGT}#6-_i>64i_q1L#(D!rZ&$A-zcrYHZyfA(w(tpJ8 zz)6@e=>)FuWj6H?Y{oR$M?)K0L)VR`jVK@1^_7n$vQ(&-T+gm&Jc-kTdy**yLcwhz zzh#n<4G{hkr^!?Xaw6^p;K5O)rk5#mQZ(tR*GF;TL?;Z!_>v5ON}2b$`%KaJ>}Y5v z9J~KGr42|waT+2Ac;vFfIS4TP=7JogtgE6X0xp-J*p(F7mIIwZDNHbsBCW7oTv0F1-0`7no2s z-dF25g^TmU3Xr$a?)?9as#Ma4eaAXI)z+szwrslp&t|Eej_|S%zB;eMH$D~)Z-Dg+c~f?w&cbxRxZIbCM% zFR>VcJxpuUAuT!FQtcGZsAAU2#;%7)8;=yZ|HWsf9Vy+O7~FB>jsPK3D^km?UZG77 zxD$ae{JKu@S~Lp}A(TS$H8K!|v4Hqu%^yKrR>jLDF=RB6SYl`hJ*_e7GWiHKJ3TY% zY|I=G^&==!DOo<7URsQAY_Fc9r60br6_(2ro79BESKmf*FUc1V?+(@tUdogRPhj&x zxoWoTUf)8mzbTAf>fST<8I!N5%5%E0oXxx`Eu4D^Rx zy=7+cb#|J2V+yAf^1!~4I3)`$B)KCc63X@zKH;=qyg;qV#__~d+@&UIc*F*BF8|Vj zVg$N6#F8v9E2qeR@RpHsR(>%|q0^8k*Q4rgO1@g=->jIdt7qNaY}W3mJ?EPzUH;rR z@_>xjXBNc)IZ>_CAG1!(4!|tHR>d!7L*Z@Ogzhkw&C4(mvu&Pe;XO-zb2?_~RcDxp zF0gHfYRUhkyzafr{FnEcexq~-GT2$D-#HX&rc&#l2(Q(Cf%xPIoc)~ZCoO9r!2*(tt^+7><DEkkwoB#i(c30+_$q$!)R2X}slH1zyWYr<)<|xPSc_R>5%ophus{dS) zv<HE1ecQiKFM{b8c__^&9zgaAYwIm4IFJ%EAS)5ViU?r2!-F#~Bvx~^y{y4A_Pv}4*14lbyC znn*fzqBUNel`9y&5t4&#BQwA0{Kc>xgQi)~1rSHB08A1xZS~Rd@D)ALKGGu)@Y$vJmUtd#kSIQr#l>r}jCZK*^@E07 zxS%hAd9O1m`OxfBB!|iBcv1M)%>sddG;l_gH{6Z)fAd!UXh0blnunJ0qBc;ZfwP@u z*X07F_XO`FHu!{i6=eOa0ttY5$BzDJSVHkc;?fYGev;u#ag+T1m#Pfz+eeGJFG2Co zKP%6iU9FTWYTe}Mo)~K~4`Fjlq3jkN<$b7$ani$EcDp9%qyYkotUb|eq-2K@;`JwL zV57ybRl}~qF!)h%U?ae3FZaRV?1}^Y7T!kmB2Q?;OKxGk@`O8)S)F=W8$AlV^v8rp zeN|8#il?^}qJDse@n{kv;Aoo@1izn9V6?fwidmwE9v^CFOGAd25Y{;ZW~GYfo1P5Y zF*lTUiP^KqiX?P>%TX4+To3+&{j|Qb?bX4}DOt1-a|dH~zk5uXe?>L&E`=Q_VdwQ@ z$THHR{el;H@%~CZORLzusqPSA2i{P%d38O($Yp^{z`vVqdpfUHf_HXH%qASVX%DoV zMVVyy)a~>|`_lhmygiNym;?mkARZx+)KiU6EoRsSI{nx%LRK*Q{=DX~i>+YCQ9vR8 z?f$MZ({494=fC>ac=z7-a;u0CQ%d=>q&mr_;-kqOdITi9!UFgGt*Vik+VpM6Fyh5u zickI#i^@YEaTuoD3evN(2Klws*po5mR;2BVUO+;UKV;>{DV(VDFnD*5=E2y}kT)91 zy5P0XXmNv4aGBz;P+O0k1anDEIFt!Y!l7mqp&GAOS|18QIPsHA#wG${;xIqM-GEw! zIU50F1?F*3toxWPy^HHEY%@Mb_WhA8{zX&aComc)CXl29{RsK*T;cC$Qxa@)|Kp)0 z+hsYL1jz6(rI0r^@fggE0tPGiBEO8SKhk0DFA^%8kEi?|9LQcAq1 zao;WLmNY?uU%BU?|9~>$9|?rdSUub6YkcDIkB%wjiJKu3WVHeaVY<$7-6Krkhrt(E zOnqd6Z3GkUv{X|q;>Eiv7iY=6q^C;}dgC=nfSQ7~7xFx^g**Os>_Dwe_*|wodz$4C z>EEi!H|Pxa74M2m#L4fU0{FaZMNzVk$l3&nko{nGYb3_|OwY%H>8-27D4IabObC zumMLO9&)fxM@DB_=QBg8R$U%GksZ$sR;8WnKd_HYtt5<+AWd(5~b1c z@~|Ed?p;3z9Tp#OsX%ipFdrNt4dR-|>~j>6~ClD20xG8op#(7FiwkX?|ele#)ovsKTv=}wLv zNT))bB&b}gFpHJ0S^$*HRZQe8z<&}&C{$DPcq7%z2>@wT+BrrJ-n8)P&4Ro0>paBK z2<)O}&$}2BNiM%#w2w3C_^qa8QF=gjl*Cb!b|Zm^n_t_iP$ zjy>GNhPG1qC`gW@hIMHce)kS?9z5Qh4!T3!-hUlCFmZkQncxGM(`{e1<2!$O@&u67 zIk+++{VH<5)*_(jcpw!;{bOqbL}#9yY|*xsMA(K|$~f zpnlAfl*dYVXjlplo_=&<;?GnzcW57DKTJ9q#6|*zk+?Z?4XS>^MKT@_3fj00X7Gwh z5-0}UNwge@0#T3)JKoCV_kZd2EFjja5+efylI`@vLzGXy9ufsS%k`tSSL>D;3}?(j zRhAvw4|VyRhu(6Zr~7M22%~0f2At~yGuq0yyI_W zYSY0j{ZwRF{QHc>P69F;USN+qG2ei03sTRJmgiNJ8vgi zO{bJ0c8&Inb%ms9`vNztN4PE-h_eXd@BYHig#@ZZ4&@IyV=B0p!Pa~bq&T3enwfe6 z@+?h>A;sx`?Ms-TQkj&Xf0!(96~`!-11>!;HZI!qZ4n6N`s{`}fkpe5B(OZ2A{>1N z#gM@!q-KvD)LS0m63V&lmbY_+!bqiM^qxJUjd~01{$MgnudDCOHJm^7o2T7aFr{zkQp;1)Nt!-mk)Ul1UHE4229De7jufp`CizmEDo#3(}N1! z#<00z;O%gF@aHU&*gMaSqF~*;1pCS)Qv&)aa3`(KMFnj_E}_@KYOdHrUmKlY!uW#zg(`+*3k7!kFfA?>DWV9dB?tQ@Xsj&~R znh;H$sU;Y?RAS}&Ig%kOS2-I-KoWV$?~Hz zCBdc0f%DREPFWNw<1_v>HSt|29(Rvau4N*GF8WR8S(5hLX0sKD6*=UcAYV>Ua#b6e zt^p9pFo>G;{AfwK=GQP+`;$=lW%<4c;B8vLmn+8g8K3Fbf7vAXqKm?&j>r%#;t42? z7{hefIbHarKzYbD&*j9l>eb~#bnH^0%#3Dnm=EdA-|m4KN7@>Zt@ zxL$w*%2=c)*01XWG7!cF6Qj#$-)VDS#SSwY9I!oGMzFp9;cf0Cp$}f3>HD=bFReJ{ zkTlMb>I-c~`U$0uo)3qNgr4}`JO%KoAnP_I>?M`Rl2XR%1~e z7o`PGjNBkmU^bqKAR*&1Pj9ddB3avL6Fv#kAgKtBxx)~Cvk4!UB0SFbWl6&?OX@d>&tFXC(ykGwdu`ORM`VOZ50QK%?N utFj-j2sJx1ufXGm^fe{SKjzjiKjN>|2H$7Ty9!e5D8#ab`i&5eoA_ct95@I7 literal 0 HcmV?d00001 diff --git a/MikroMaster/20260504/20260504200001-Config.rsc b/MikroMaster/20260504/20260504200001-Config.rsc new file mode 100644 index 0000000..0c0bd5f --- /dev/null +++ b/MikroMaster/20260504/20260504200001-Config.rsc @@ -0,0 +1,4064 @@ +# 2026-05-04 20:00:03 by RouterOS 7.22.1 +# software id = A8L5-07YF +# +# model = RB952Ui-5ac2nD +# serial number = D3D50CEDCD38 +/caps-man configuration +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-2ghz ssid=vados +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-5ghz-ac ssid=vados5g +add channel.band=5ghz-a/n .control-channel-width=20mhz .extension-channel=XX \ + country=belarus datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes name=cfg-5ghz-an ssid=vados5g +/interface ethernet +set [ find default-name=ether1 ] comment="WAN - Unet" mac-address=\ + 48:8F:5A:8E:1A:C2 name="ether1 - Unet" +set [ find default-name=ether3 ] comment=LEN +set [ find default-name=ether4 ] comment=NUC +set [ find default-name=ether5 ] poe-out=off +/interface l2tp-server +add comment=Server disabled=yes name=l2tp-in1 user=vados +/interface l2tp-client +add comment="Starless 2 MikroSPb" connect-to=176.53.203.171 name=l2tp-EoIP \ + user=vados +add allow=mschap2 allow-fast-path=yes comment=Starless connect-to=\ + vpn.starless.ru max-mru=1280 name=l2tp-vpn use-ipsec=yes use-peer-dns=yes \ + user=vados +/interface wireguard +add listen-port=13231 mtu=1280 name=WG +/disk +add slot=tmpfs tmpfs-max-size=22369621 type=tmpfs +/interface list +add name=WAN +add name=LAN +/interface lte apn +set [ find default=yes ] ip-type=ipv4 use-network-apn=no +/interface wifi channel +add band=5ghz-ax disabled=no frequency=5180,5200,5220,5240 name=5G-AX +add band=5ghz-ac disabled=no frequency=5180,5200,5220,5240 name=5G-AC +add band=2ghz-n disabled=no frequency=2422,2442,2462 name=2G-N +add band=2ghz-ax disabled=no frequency=2422,2442,2462 name=2G-AX +add band=2ghz-g disabled=no frequency=2422,2442,2462 name=2G-G +add band=5ghz-n disabled=no frequency=5180,5200,5220,5240 name=5G-AN +/interface wifi security +add authentication-types=wpa2-psk,wpa3-psk disabled=no group-encryption=ccmp \ + group-key-update=1h management-protection=allowed name=sec2g +add authentication-types=wpa3-psk disable-pmkid=yes disabled=no \ + group-encryption=ccmp group-key-update=5m management-encryption=cmac \ + management-protection=required name=sec5G +/interface wifi configuration +add channel=5G-AX disabled=no mode=ap name=5G-AX security=sec5G security.ft=\ + yes .ft-over-ds=yes ssid=vados +add channel=5G-AN disabled=no mode=ap name=5G-AN security=sec5G ssid=vados +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroTik +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=HP1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +add name=VADOS-LEN options=HostName +add name=VADOS-NUC options=HostName +add name=MikroNUC options=HostName +add name=master options=HostName +add name=MikroYellow options=HostName +add name="=\"Client ID\"" options=HostName +/ip dns forwarders +add dns-servers=1.1.1.1,1.0.0.1 name=blsp.at verify-doh-cert=no +add comment=Kra dns-servers=1.0.0.1,1.1.1.1 name=slon2.to verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=slon3.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=slon3.cc verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2web.at verify-doh-cert=no +add dns-servers=1.1.1.1,1.0.0.1 name=bs2best.at verify-doh-cert=no +add dns-servers=1.0.0.1,1.1.1.1 name=psrms.is verify-doh-cert=no +/ip ipsec proposal +set [ find default=yes ] disabled=yes +/ip pool +add name=dhcp ranges=10.30.30.83-10.30.30.254 +/ip smb users +set [ find default=yes ] disabled=yes +add disabled=yes name=vados +/ppp profile +set *FFFFFFFE use-upnp=no +/routing bgp template +set default disabled=no output.network=bgp-networks +/routing table +add disabled=no fib name=To-VPN +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/system script +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + /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#:local Script AM-setup\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n\ + \n#\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\ + \n#\ + \n#root.mnuc.backuper\ + \n\ + \n#/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@1\ + 0.30.30.81.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.81.pub\";\ + \n#:local Script AM-GlobalConfig;\ + \n#/system/script/add name=\$Script owner=\$Script source=([ /tool/fetch c\ + heck-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \".r\ + sc\") output=user as-value ]->\"data\");\ + \n#/usb1/mikro_bak_rsa.pub\ + \n#:local FetchFile AM-DOHCert.rsc\ + \n\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/tmp/\";\ + \n:global MkDir;\ + \n\ + \n:local FetchFile Binary.backup\ + \n:local localDir \"\";\ + \n\ + \n#\$MkDir \$localDir;\ + \n\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \$FetchFile) dst-path=(\ + \$localDir . \$FetchFile);" +add comment="Example add WU servers to AddrList" dont-require-permissions=no \ + name=WU-add-to-list owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_Script to add target web sites DNS IP addresses into address list\r\ + \n# Tested with Mikrotik 6.4x\r\ + \n# Syed Jahanzaib / aacable@hotmail.com\r\ + \n# List name\r\ + \n:local LISTNAME \"windowsupdateslist\"\r\ + \n# Web site names which will be added in address list\r\ + \n:local TARGET1 \"update.microsoft.com\"\r\ + \n:local TARGET2 \"download.windowsupdate.com\"\r\ + \n:local TARGET3 \"download.microsoft.com\"\r\ + \n:local TARGET4 \"windowsupdate.com\"\r\ + \n:local TARGET5 \"ntservicepack.microsoft.com\"\r\ + \n:local TARGET6 \"wustat.windows.com\"\r\ + \n:local TARGET7 \"stats.microsoft.com\"\r\ + \n:local TARGET8 \"mp.microsoft.com\"\r\ + \n:local TARGET9 \"ws.microsoft.com\"\r\ + \n:local TARGET10 \"sls.update.microsoft.com.akadns.net\"\r\ + \n:local TARGET11 \"vortex.data.microsoft.com\"\r\ + \n:local TARGET12 \"vortex-win.data.microsoft.com\"\r\ + \n:local TARGET13 \"fe2.update.microsoft.com.akadns.net\"\r\ + \n:local TARGET14 \"statsfe2.update.microsoft.com.akadns.net\"\r\ + \n \r\ + \n# 1st time runner, check if address list is not created previously and a\ + dd entries in it for 1st time usage\r\ + \n:if ( [/ip firewall address-list find where list=\$LISTNAME] = \"\") do=\ + {\r\ + \n:log warning \"No address list for \$TARGET1 found ! creating and adding\ + \_resolved entry for 1st time usage ... zaib\"\r\ + \n \r\ + \n:local FirstAddr [resolve \$TARGET1];\r\ + \n\r\ + \n/ip firewall address-list add address=\$FirstAddr list=\$LISTNAME commen\ + t=\$TARGET1;\r\ + \n} else={\r\ + \n:log warning \"Previous List for \$LISTNAME found ! moving forward and c\ + hecking if DNS entries can be added in it ...\"\r\ + \n}\r\ + \n \r\ + \n# Check DNS entries and collect matching names\r\ + \n:foreach i in=[/ip dns cache find name~\"(\$TARGET1|\$TARGET2|\$TARGET3|\ + \$TARGET4|\$TARGET5|\$TARGET6|\$TARGET7|\$TARGET8|\$TARGET9|\$TARGET10|\$T\ + ARGET11|\$TARGET12|\$TARGET13|\$TARGET14)\" && \$type ~ \"^(A|CNAME)\\\$\"\ + \_] do={\r\ + \n \r\ + \n# Get IP Address from the names and hold it in temporary buffer\r\ + \n:local Buffer [/ip dns cache get \$i data];\r\ + \ndelay delay-time=10ms\r\ + \n \r\ + \n# Check if entry is already not exists, then OK, otherwise ignore duplic\ + ation\r\ + \n:if ( [/ip firewall address-list find where address=\$Buffer] = \"\") do\ + ={\r\ + \n \r\ + \n# Fetch DNS names for the entries\r\ + \n:local sitednsname [/ip dns cache get \$i name] ;\r\ + \n \r\ + \n# Print name in LOG window\r\ + \n:log info (\"added entry: \$sitednsname \$Buffer\");\r\ + \n \r\ + \n# Add IP addresses and there names to the address list\r\ + \n/ip firewall address-list add address=\$Buffer list=\$LISTNAME comment=\ + \$sitednsname;\r\ + \n}\r\ + \n}" +add comment="Add Hosts DNS names to NoWG addres list" \ + dont-require-permissions=no name=Add2vdsina owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_Script to add target web sites DNS IP addresses into address list\r\ + \n# Tested with Mikrotik 6.4x\r\ + \n# \r\ + \n# List name\r\ + \n:local LISTNAME \"NoWG\"\r\ + \n#\r\ + \n# Web site names which will be added in address list\r\ + \n:local TARGET1 \"comp-lenta.ru\"\r\ + \n:local TARGET2 \"ok.ru\"\r\ + \n:local TARGET3 \"vk.com\"\r\ + \n#:local TARGET4 \"smtp.mail.me.com\"\r\ + \n#:local TARGET4 \"windowsupdate.com\"\r\ + \n#:local TARGET5 \"ntservicepack.microsoft.com\"\r\ + \n#:local TARGET6 \"wustat.windows.com\"\r\ + \n#:local TARGET7 \"stats.microsoft.com\"\r\ + \n#:local TARGET8 \"mp.microsoft.com\"\r\ + \n#:local TARGET9 \"ws.microsoft.com\"\r\ + \n#:local TARGET10 \"sls.update.microsoft.com.akadns.net\"\r\ + \n#:local TARGET11 \"vortex.data.microsoft.com\"\r\ + \n#:local TARGET12 \"vortex-win.data.microsoft.com\"\r\ + \n#:local TARGET13 \"fe2.update.microsoft.com.akadns.net\"\r\ + \n#:local TARGET14 \"statsfe2.update.microsoft.com.akadns.net\"\r\ + \n \r\ + \n# 1st time runner, check if address list is not created previously and a\ + dd entries in it for 1st time usage\r\ + \n:if ( [/ip firewall address-list find where list=\$LISTNAME] = \"\") do=\ + {\r\ + \n:log warning \"No address list for \$TARGET1 found ! creating and adding\ + \_resolved entry for 1st time usage ... zaib\"\r\ + \n\r\ + \n:local FirstAddr [resolve \$TARGET1];\r\ + \n\r\ + \n/ip firewall address-list add address=\$FirstAddr list=\$LISTNAME commen\ + t=\$TARGET1;\r\ + \n\r\ + \n} else={\r\ + \n:log warning \"Previous List for \$LISTNAME found ! moving forward and c\ + hecking if DNS entries can be added in it ...\"\r\ + \n}\r\ + \n\r\ + \n# Check DNS entries and collect matching names\r\ + \n:foreach i in=[/ip dns cache find name~\"(\$TARGET1|\$TARGET2|\$TARGET3|\ + \$TARGET4)\" && \$type ~ \"^(A|CNAME)\\\$\" ] do={\r\ + \n\r\ + \n:log info (\"start entry: \$c \$sitednsname \$Buffer\");\r\ + \n\r\ + \n# Get IP Address from the names and hold it in temporary buffer\r\ + \n:local Buffer [/ip dns cache get \$i data];\r\ + \ndelay delay-time=10ms\r\ + \n:log info (\"1: \$Buffer\"); \r\ + \n\r\ + \n# Check if entry is already not exists, then OK, otherwise ignore duplic\ + ation\r\ + \n:if ( [/ip firewall address-list find where address=\$Buffer] = \"\") do\ + ={\r\ + \n\r\ + \n:log info (\"2: \$Buffer\"); \r\ + \n \r\ + \n# Fetch DNS names for the entries\r\ + \n:local sitednsname [/ip dns cache get \$i name] ;\r\ + \n \r\ + \n# Print name in LOG window\r\ + \n:log info (\"added entry: \$i \$sitednsname \$Buffer\");\r\ + \n \r\ + \n# Add IP addresses and there names to the address list\r\ + \n/ip firewall address-list add address=\$Buffer list=\$LISTNAME comment=\ + \$sitednsname;\r\ + \n}\r\ + \n}" +add comment="Flush DNS Cache" dont-require-permissions=no name=\ + DNS_Flush_Cache owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\ + "/ip dns cache flush" +add comment="Certificates CloudFlare, Quad9 " dont-require-permissions=no \ + name=Update-Certificates owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \_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\r\ + \n:global GlobalScriptsUrl;\r\ + \n#google\r\ + \n:local CertName \"DigiCert-Global-Root-CA.pem\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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=(\$GlobalScriptsUrl . \"certs/Master/\" . \$C\ + ertName);\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#/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=script1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + tool/netwatch/add comment=\"doh-fallback, doh-url=https://security.cloudfl\ + are-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Clou\ + dFlare-doh IPv4 1\" host=1.1.1.1;\r\ + \n/tool/netwatch/add comment=\"doh, doh-url=https://security.cloudflare-dn\ + s.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=CloudFlare\ + -doh IPv4 2\" host=1.0.0.1;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.google/dns-query, doh-cert=DigiCert Global Root G2, notify, name=Goog\ + le-doh IPv4 1\" host=8.8.8.8;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.google/dns-query, doh-cert=DigiCert Global Root G2, notify, name=Goog\ + le-doh IPv4 2\" host=8.8.4.4;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.quad9.net/dns-query, doh-cert=DigiCert Global Root G3, notify, name=C\ + uad9-doh IPv4 1\" host=9.9.9.9;\r\ + \n/tool/netwatch/add comment=\"doh-fallback, dns-fallback, doh-url=https:/\ + /dns.quad9.net/dns-query, doh-cert=DigiCert Global Root G3, notify, name=C\ + uad9-doh IPv4 2\" host=149.112.112.112;\r\ + \n\r\ + \n/tool/netwatch/add comment=\"dns, notify, name=ns1.unet.ws\" host=91.192\ + .189.2;" +add dont-require-permissions=no name=script2 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n\r\ + \n:global InspectVar;\r\ + \n#:global RouterBoard;\r\ + \n#:do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on-erro\ + r={}\r\ + \n#:global Resources;\r\ + \n#:do {:set Resources [[ :parse \"/system/resource/get\" ]]} on-error={}\ + \r\ + \n\r\ + \n#:global Updates;\r\ + \n#:do {:set Updates [[ :parse \"/system/package/update/get\" ]]} on-error\ + ={}\r\ + \n\r\ + \n#:global PkgUpdStatus \"undefined\";\r\ + \n#:local Update [/system/package/update/get];\r\ + \n#:retry command={:set PkgUpdStatus (\$Update->\"status\")} delay=200ms m\ + ax=5 on-error={};\r\ + \n\r\ + \n#:log warning [\$InspectVar \$RouterBoard];\r\ + \n#:put [\$InspectVar \$RouterBoard];\r\ + \n\r\ + \n#:retry command={/system/package/update check-for-updates without-paging\ + \_as-value} delay=300ms max=5 on-error={};\r\ + \n\r\ + \n#:global arrDeviceInfo ({});\r\ + \n#:local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};});\ + \r\ + \n#:set (\$arrDeviceInfo->\"RouterBoard\") [[ :parse \"/system/routerboard\ + /get\" ]];\r\ + \n#:retry command={:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system\ + /package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"Error\ + \")};\r\ + \n# [:toarray {\"section\"={\"key\"=\"\"; \"value\"=\"\";} }];\r\ + \n# [:toarray \"\"];\r\ + \n:local arrDeviceInfo ({});\r\ + \n\r\ + \n:set (\$arrDeviceInfo->\"devUpdates\") {\"channel\"; \"stable\";};\r\ + \n#:do {:set (arrDeviceInfo->\"Updates\") [[ :parse \"/system/package/upda\ + te/get\" ]]} on-error={:log error (\$error)}\r\ + \n\$InspectVar \$arrDeviceInfo;\r\ + \n" +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 SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global RunOnce;\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 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 :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 } else={\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 (\$GlobalScriptsUrl . \"certs/ipall/\" . \$CertFileN\ + ame) dst-path=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :delay 1s;\r\ + \n };\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 :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 \"\";\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 {\r\ + \n \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass {\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/589/c05c3863\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 19:45:02 04.05.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 GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\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 WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\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 /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 :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\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# read parts of a large file\r\ + \n# Description of parameters:\r\ + \n# \$1 - script name for logging and user agent\r\ + \n# \$2 - url to fetch from\r\ + \n# \$3 - check-certificate value for /tool/fetch (true/false)\r\ + \n# \$4 - mode value for /tool/fetch (optional, e.g. \"keep-broken\", \"ht\ + tps-only\", \"http-only\"\r\ + \n# \"no-redirects\", \"background\", \"background-and-keep-broken\",\ + \_\"background-and-https-only\",\r\ + \n# \"background-and-http-only\", \"background-and-no-redirects\", \"\ + background-and-keep-broken-and-https-only\", \"background-and-keep-broken-\ + and-http-only\",\r\ + \n# \"background-and-keep-broken-and-no-redirects\")\r\ + \n# \$5 - fetch method for /tool/fetch (optional, e.g. \"get\", \"head\", \ + \"post\", \"put\", \"patch\", \"delete\")\r\ + \n#:set FetchLargeFiles do={\r\ + \n# :local RunName [:tostr \$1];\r\ + \n# :local fetchUrl [:tostr \$2];\r\ + \n# :local fetchFile [:tostr \$3];\r\ + \n# :local CheckCert [:tostr \$4];\r\ + \n# :local fetchMode [:tostr \$5];\r\ + \n# :local fetchMethod [:tostr \$6];\r\ + \n# :local tmpName;\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-\ + without-crl\" ];\r\ + \n#\r\ + \n# :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\r\ + \n# :local DirName (\"tmpfs/\" . \$tmpName);\r\ + \n# :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n# :log error (\$RunName . \" Failed creating directory: \" . \$DirNam\ + e . \"!\");\r\ + \n# :return false;\r\ + \n# }\r\ + \n#\r\ + \n# :local FileName (\$DirName . \"/\" . [ \$CleanName \$fetchFile ] . \"\ + -\" . [ \$GetRandom20CharAlNum 5 ]);\r\ + \n# :local Url (\$fetchUrl . \$fetchFile);\r\ + \n# :onerror Err {\r\ + \n# /tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName\ + \_\\\r\ + \n# http-header-field=({ [ \$FetchUserAgentStr \$RunName ] }) as-valu\ + e;\r\ + \n# } do={\r\ + \n# :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n# \$RmFile \$FileName;\r\ + \n# }\r\ + \n# :log error (\$RunName . \" 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# :log error (\$RunName . \" 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=3\ + 2768 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## \$RmFile \$FileName;\r\ + \n# \$RmDir \$DirName;\r\ + \n# :return \$Return;\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={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\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 dont-require-permissions=no name=AM-FwAddrLists owner=AM-FwAddrLists \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="#!rsc by Vados\ + \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" +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BC auto-mac=no mlag-peer-port="ether1 - Unet" \ + name=Bridge-LAN port-cost-mode=short +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +# managed by CAPsMAN +# channel: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5260/20-Ceee/ac/DP(18dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/caps-man manager +set enabled=yes +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=gn master-configuration=\ + cfg-2ghz name-format=prefix-identity name-prefix=2ghz +add action=create-dynamic-enabled hw-supported-modes=ac master-configuration=\ + cfg-5ghz-ac name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled hw-supported-modes=an master-configuration=\ + cfg-5ghz-an name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,dns,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN disabled=yes interface="ether1 - Unet" +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 firewall connection tracking +set udp-timeout=10s +/ip neighbor discovery-settings +set discover-interface-list=LAN +/ip settings +set max-neighbor-entries=8192 secure-redirects=no +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no max-neighbor-entries=8192 +/interface detect-internet +set detect-interface-list=WAN internet-interface-list=WAN lan-interface-list=\ + LAN wan-interface-list=WAN +/interface l2tp-server server +set authentication=mschap2 use-ipsec=yes +/interface list member +add interface="ether1 - Unet" list=WAN +add interface=Bridge-LAN list=LAN +/interface ovpn-server server +add auth=sha1,md5 mac-address=FE:82:A5:78:8E:84 name=ovpn-server1 +/interface wifi configuration +add channel=2G-AX datapath=xs-DataPath disabled=no mode=ap name=2G-AX \ + security=sec2g security.ft=yes .ft-over-ds=yes ssid=vados +add channel=2G-N datapath=xs-DataPath disabled=no mode=ap name=2G-N security=\ + sec2g security.ft=yes .ft-over-ds=yes ssid=vados +add channel=5G-AC datapath=xs-DataPath disabled=no mode=ap name=5G-AC \ + security=sec5G security.authentication-types="" .ft=yes .ft-over-ds=yes \ + ssid=vados +add channel=2G-G datapath=xs-DataPath disabled=no mode=ap name=2G-G security=\ + sec2g security.authentication-types="" .ft=yes .ft-over-ds=yes ssid=vados +/interface wifi datapath +add bridge=Bridge-LAN disabled=no interface-list=all name=xs-DataPath +/interface wireguard peers +add allowed-address=10.8.0.2/32,0.0.0.0/0 client-allowed-address=0.0.0.0/0 \ + endpoint-address=89.110.101.17 endpoint-port=29185 interface=WG name=\ + MikroVados persistent-keepalive=10s public-key=\ + "64Y25EUZQQt8EIeAJYD8qWt+te8qvGEepnswdBgmzlY=" +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.81/24 interface=Bridge-LAN network=10.30.30.0 +add address=10.8.0.2/24 interface=WG network=10.8.0.0 +/ip dhcp-client +add add-default-route=special-classless default-route-distance=2 \ + default-route-tables=main interface="ether1 - Unet" name=client1 \ + use-peer-dns=no +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set interface=Bridge-LAN lease-time=10m \ + name=masterDHCP server-address=10.30.30.81 +/ip dhcp-server config +set accounting=no +/ip dhcp-server lease +add address=10.30.30.101 client-id=1:48:8f:5a:8e:ee:a8 mac-address=\ + 48:8F:5A:8E:EE:A8 server=masterDHCP +add address=10.30.30.107 client-id=1:f0:de:f1:91:d:1e mac-address=\ + F0:DE:F1:91:0D:1E server=masterDHCP +add address=10.30.30.83 client-id=1:0:80:77:ec:43:86 mac-address=\ + 00:80:77:EC:43:86 server=masterDHCP +add address=10.30.30.70 dhcp-option=domain-search-list,HostName \ + dhcp-option-set=HP1505n mac-address=00:1E:0B:1A:88:8D server=masterDHCP +add address=10.30.30.50 client-id=1:4:7c:16:36:f5:37 mac-address=\ + 04:7C:16:36:F5:37 server=masterDHCP +add address=10.30.30.71 client-id=1:10:2d:41:2c:20:c2 mac-address=\ + 10:2D:41:2C:20:C2 server=masterDHCP +add address=10.30.30.61 client-id=1:10:8:c1:81:59:5f mac-address=\ + 10:08:C1:81:59:5F server=masterDHCP +add address=10.30.30.72 client-id=1:10:38:1f:d2:5f:13 mac-address=\ + 10:38:1F:D2:5F:13 server=masterDHCP +add address=10.30.30.99 client-id=1:10:b1:df:e9:d0:d5 mac-address=\ + 10:B1:DF:E9:D0:D5 server=masterDHCP +add address=10.30.30.111 client-id=1:fe:2:52:be:3f:16 mac-address=\ + FE:02:52:BE:3F:16 server=masterDHCP +add address=10.30.30.92 client-id=1:d4:6d:6d:fd:e5:49 mac-address=\ + D4:6D:6D:FD:E5:49 server=masterDHCP +add address=10.30.30.93 client-id=1:7e:8b:1e:cb:b8:cb mac-address=\ + CC:42:10:12:46:94 server=masterDHCP +add address=10.30.30.94 client-id=1:50:cc:f8:85:96:a mac-address=\ + 50:CC:F8:85:96:0A server=masterDHCP +add address=10.30.30.82 client-id=1:e4:18:6b:58:34:ab mac-address=\ + E4:18:6B:58:34:AB server=masterDHCP +add address=10.30.30.75 client-id=1:0:27:15:41:97:a9 mac-address=\ + 00:27:15:41:97:A9 server=masterDHCP +add address=10.30.30.77 dhcp-option=HostName dhcp-option-set=StartLife1 \ + mac-address=C4:82:E1:03:49:10 server=masterDHCP +add address=10.30.30.73 client-id=1:10:38:1f:82:81:f2 mac-address=\ + 10:38:1F:82:81:F2 server=masterDHCP +add address=10.30.30.95 client-id=1:88:ae:dd:60:39:54 dhcp-option=HostName \ + dhcp-option-set=VADOS-NUC mac-address=88:AE:DD:60:39:54 server=masterDHCP +add address=10.30.30.98 client-id=1:c8:5b:76:d8:cc:bf dhcp-option=HostName \ + dhcp-option-set=VADOS-LEN mac-address=C8:5B:76:D8:CC:BF server=masterDHCP +add address=10.30.30.96 client-id=iPhone mac-address=4A:91:ED:0E:1F:39 \ + server=masterDHCP +add address=10.30.30.74 client-id=MiTV dhcp-option=HostName dhcp-option-set=\ + MiTV mac-address=20:72:A9:D3:34:36 server=masterDHCP +add address=10.30.30.30 dhcp-option=HostName dhcp-option-set=miller \ + mac-address=F0:75:5D:1E:5F:71 server=masterDHCP +add address=10.30.30.100 client-id=iVados dhcp-option=HostName \ + dhcp-option-set="=\"Client ID\"" mac-address=DE:4D:72:F3:1A:9F server=\ + masterDHCP +/ip dhcp-server network +add address=10.30.30.0/24 caps-manager=10.30.30.10 dhcp-option=\ + domain-search-list dhcp-option-set=domain-search-set dns-server=\ + 10.30.30.81 domain=WORKGROUP gateway=10.30.30.81 netmask=24 ntp-server=\ + 10.30.30.81,10.30.30.10 wins-server=10.30.30.95,10.30.30.98 +/ip dns +set allow-remote-requests=yes cache-max-ttl=1d doh-max-concurrent-queries=100 \ + doh-max-server-connections=20 servers=8.8.8.8,8.8.4.4 verify-doh-cert=yes +/ip dns static +add address=10.30.30.33 name=ros.vados.ru type=A +add address=10.30.30.95 name=vados-nuc type=A +add address=10.30.30.33 name=amster-nuc type=A +add address=10.30.30.33 comment=AMSTER name=amster.vados.ru type=A +add address=10.30.30.33 name=amster type=A +add address=10.30.30.33 name=amster-reg type=A +add address=10.30.30.33 name=mng.vados.ru type=A +add address=10.30.30.33 name=mgr.vados.ru type=A +add address=10.30.30.33 name=prt.vados.ru type=A +add address=10.30.30.33 name=reg.vados.ru type=A +add address=10.30.30.33 match-subdomain=yes name=mikrots.vados.ru type=A +add address=10.30.30.33 name=oxidized.vados.ru type=A +add address=8.8.4.4 comment="Google-dns IPv4 2" name=dns.google type=A +add address=8.8.8.8 comment="Google-dns IPv4 1" name=dns.google type=A +add address=10.30.30.30 comment=MILLER name=miller.vados.ru type=A +add address=10.30.30.30 name=MILLER-LEN type=A +add address=10.30.30.30 name=miller type=A +add address=1.0.0.1 comment="CloudFlare-doh IPv4 2" name=\ + security.cloudflare-dns.com type=A +add address=1.1.1.1 comment="CloudFlare-doh IPv4 1" name=\ + security.cloudflare-dns.com type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=149.112.112.112 comment="Cuad9-dns IPv4 2" name=dns.quad9.net \ + type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +add address=10.30.30.81 comment=LocalNet name=MikroVados type=A +add address=10.30.30.10 name=MikroNUC type=A +add address=10.30.30.86 name=MikroYellow type=A +add address=10.30.30.85 name=MikroMic type=A +add address=10.30.30.95 name=VADOS-NUC type=A +add address=10.30.30.98 name=VADOS-LEN type=A +add address=10.30.30.20 name=garage type=A +add address=9.9.9.9 comment="Cuad9-dns IPv4 1" disabled=yes name=\ + dns.quad9.net type=A +add address=91.192.189.2 comment=Unet-DNS disabled=yes name=ns1.unet.ws type=\ + A +/ip firewall address-list +add address=91.215.120.206 list=TRUSTED +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=10.30.30.100-255 list=KIDS +add address=8.8.4.0/24 list=YouTube +add address=8.8.8.0/24 list=YouTube +add address=8.34.208.0/20 list=YouTube +add address=8.35.192.0/20 list=YouTube +add address=23.236.48.0/20 list=YouTube +add address=23.251.128.0/19 list=YouTube +add address=34.0.0.0/15 list=YouTube +add address=34.2.0.0/16 list=YouTube +add address=34.3.0.0/23 list=YouTube +add address=34.3.3.0/24 list=YouTube +add address=34.3.4.0/24 list=YouTube +add address=34.3.8.0/21 list=YouTube +add address=34.3.16.0/20 list=YouTube +add address=34.3.32.0/19 list=YouTube +add address=34.3.64.0/18 list=YouTube +add address=34.4.0.0/14 list=YouTube +add address=34.8.0.0/13 list=YouTube +add address=34.16.0.0/12 list=YouTube +add address=34.32.0.0/11 list=YouTube +add address=34.64.0.0/10 list=YouTube +add address=34.128.0.0/10 list=YouTube +add address=35.184.0.0/13 list=YouTube +add address=35.192.0.0/14 list=YouTube +add address=35.196.0.0/15 list=YouTube +add address=35.198.0.0/16 list=YouTube +add address=35.199.0.0/17 list=YouTube +add address=35.199.128.0/18 list=YouTube +add address=35.200.0.0/13 list=YouTube +add address=35.208.0.0/12 list=YouTube +add address=35.224.0.0/12 list=YouTube +add address=35.240.0.0/13 list=YouTube +add address=57.140.192.0/18 list=YouTube +add address=64.15.112.0/20 list=YouTube +add address=64.233.160.0/19 list=YouTube +add address=66.22.228.0/23 list=YouTube +add address=66.102.0.0/20 list=YouTube +add address=66.249.64.0/19 list=YouTube +add address=70.32.128.0/19 list=YouTube +add address=72.14.192.0/18 list=YouTube +add address=74.125.0.0/16 list=YouTube +add address=104.154.0.0/15 list=YouTube +add address=104.196.0.0/14 list=YouTube +add address=104.237.160.0/19 list=YouTube +add address=107.167.160.0/19 list=YouTube +add address=107.178.192.0/18 list=YouTube +add address=108.59.80.0/20 list=YouTube +add address=108.170.192.0/18 list=YouTube +add address=108.177.0.0/17 list=YouTube +add address=130.211.0.0/16 list=YouTube +add address=136.22.160.0/20 list=YouTube +add address=136.22.176.0/21 list=YouTube +add address=136.22.184.0/23 list=YouTube +add address=136.22.186.0/24 list=YouTube +add address=142.250.0.0/15 list=YouTube +add address=146.148.0.0/17 list=YouTube +add address=152.65.208.0/22 list=YouTube +add address=152.65.214.0/23 list=YouTube +add address=152.65.218.0/23 list=YouTube +add address=152.65.222.0/23 list=YouTube +add address=152.65.224.0/19 list=YouTube +add address=162.120.128.0/17 list=YouTube +add address=162.216.148.0/22 list=YouTube +add address=162.222.176.0/21 list=YouTube +add address=172.110.32.0/21 list=YouTube +add address=172.217.0.0/16 list=YouTube +add address=172.253.0.0/16 list=YouTube +add address=173.194.0.0/16 list=YouTube +add address=173.255.112.0/20 list=YouTube +add address=192.158.28.0/22 list=YouTube +add address=192.178.0.0/15 list=YouTube +add address=193.186.4.0/24 list=YouTube +add address=199.36.154.0/23 list=YouTube +add address=199.36.156.0/24 list=YouTube +add address=199.192.112.0/22 list=YouTube +add address=199.223.232.0/21 list=YouTube +add address=207.223.160.0/20 list=YouTube +add address=208.65.152.0/22 list=YouTube +add address=208.68.108.0/22 list=YouTube +add address=208.81.188.0/22 list=YouTube +add address=208.117.224.0/19 list=YouTube +add address=209.85.128.0/17 list=YouTube +add address=216.58.192.0/19 list=YouTube +add address=216.73.80.0/20 list=YouTube +add address=216.239.32.0/19 list=YouTube +add address=2ip.ru list=Test +add address=157.240.247.174 list=Instagram +add address=46.53.178.107 list=Instagram +add address=179.60.195.174 list=Instagram +add address=157.240.205.174 list=Instagram +add address=31.13.24.0/21 list=Instagram +add address=31.13.64.0/18 list=Instagram +add address=45.64.40.0/22 list=Instagram +add address=66.220.144.0/20 list=Instagram +add address=69.63.176.0/20 list=Instagram +add address=69.171.224.0/19 list=Instagram +add address=74.119.76.0/22 list=Instagram +add address=103.4.96.0/22 list=Instagram +add address=129.134.0.0/16 list=Instagram +add address=157.240.0.0/16 list=Instagram +add address=173.252.64.0/18 list=Instagram +add address=179.60.192.0/22 list=Instagram +add address=185.60.216.0/22 list=Instagram +add address=204.15.20.0/22 list=Instagram +add address=157.240.200.63 list=Instagram +add address=185.60.219.63 list=Instagram +add address=129.134.31.12 list=Instagram +add address=66.81.203.132 list=Instagram +add address=185.89.218.12 list=Instagram +add address=31.13.66.63 list=Instagram +add address=84.15.65.162 list=Instagram +add address=68.66.224.28 list=Instagram +add address=157.240.253.63 list=Instagram +add address=83.174.11.224 list=Instagram +add address=157.240.9.52 list=Instagram +add address=157.240.252.174 list=Instagram +add address=157.240.195.63 list=Instagram +add address=31.13.71.52 list=Instagram +add address=57.144.110.192 list=Instagram +add address=157.240.252.17 list=Instagram +add address=84.15.66.97 list=Instagram +add address=217.168.6.33 list=Instagram +add address=31.13.83.52 list=Instagram +add address=157.240.241.63 list=Instagram +add address=129.134.30.12 list=Instagram +add address=185.89.219.12 list=Instagram +add address=157.240.252.10 list=Instagram +add address=157.240.201.63 list=Instagram +add address=66.81.203.197 list=Instagram +add address=179.60.195.52 list=Instagram +add address=66.81.203.7 list=Instagram +add address=216.40.34.41 list=Instagram +add address=157.240.202.63 list=Instagram +add address=157.240.229.63 list=Instagram +add address=157.240.252.63 list=Instagram +add address=31.13.72.53 list=Instagram +add address=124.108.16.224 list=Instagram +add address=157.240.205.63 list=Instagram +add address=92.46.37.96 list=Instagram +add address=157.240.247.63 list=Instagram +add address=157.240.234.63 list=Instagram +add address=157.240.235.63 list=Instagram +add address=87.245.208.97 list=Instagram +add address=216.58.192.0/19 list=Instagram +add address=209.85.128.0/17 list=Instagram +add address=198.105.240.0/20 list=Instagram +add address=173.194.0.0/16 list=Instagram +add address=172.217.0.0/16 list=Instagram +add address=142.250.0.0/15 list=Instagram +add address=108.177.0.0/17 list=Instagram +add address=87.245.197.140 list=Instagram +add address=74.125.0.0/16 list=Instagram +add address=64.233.160.0/19 list=Instagram +add address=157.240.0.1 list=Instagram +add address=157.240.238.63 list=Instagram +add address=157.240.238.174 list=Instagram +add address=157.240.0.63 list=Instagram +add address=157.240.224.63 list=Instagram +add address=157.240.224.174 list=Instagram +add address=157.240.251.36 list=Instagram +add address=157.240.253.12 list=Instagram +add address=157.240.253.35 list=Instagram +add address=157.240.238.13 list=Instagram +add address=157.240.238.56 list=Instagram +add address=157.240.238.175 list=Instagram +add address=57.144.112.141 list=Instagram +add address=157.240.251.60 list=Instagram +add address=157.240.251.128 list=Instagram +add address=157.240.238.5 list=Instagram +add address=157.240.253.13 list=Instagram +add address=157.240.253.5 list=Instagram +add address=157.240.238.2 list=Instagram +add address=157.240.238.37 list=Instagram +add address=157.240.251.5 list=Instagram +add address=157.240.251.34 list=Instagram +add address=57.144.112.1 list=Instagram +add address=157.240.238.54 list=Instagram +add address=129.134.26.123 list=Instagram +add address=157.240.252.3 list=Instagram +add address=31.13.84.4 list=Instagram +add address=157.240.224.12 list=Instagram +add address=157.240.238.4 list=Instagram +add address=157.240.0.13 list=Instagram +add address=3.33.139.32 list=Instagram +add address=157.240.0.35 list=Instagram +add address=157.240.238.14 list=Instagram +add address=157.240.238.60 list=Instagram +add address=57.144.112.145 list=Instagram +add address=157.240.251.35 list=Instagram +add address=151.101.84.159 list=Twitter +add address=pbs.twimg.com list=Twitter +add address=89.110.101.17 comment=VDSIna list=TRUSTED +add address=10.8.0.0/24 comment="WG VDSIna" list=TRUSTED +add address=ikus.pesc.ru comment=ikus.pesc.ru list=NoVdsina +add address=love.ru comment=love.ru list=NoVdsina +add address=gosuslugi.ru comment=gosuslugi.ru list=NoVdsina +add address=pochta.ru comment=pochta.ru list=NoVdsina +add address=vdsina.com list=NoVdsina +add address=vdsina.ru list=NoVdsina +add address=youla.ru list=NoVdsina +add address=kupiprodai.ru list=NoVdsina +add address=myip.ru list=Test +add address=geoip.co list=NoVdsina +add address=x.com list=Twitter +add address=facebook.com list=facebook +add address=fbcd.net list=facebook +add address=comp-lenta.ru list=NoVdsina +add address=128.85.102.70 comment=update.microsoft.com list=\ + windowsupdateslist +add address=wu-b-net.trafficmanager.net. comment=\ + ctldl.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=ctldl.windowsupdate.com.delivery.microsoft.com. comment=\ + ctldl.windowsupdate.com list=windowsupdateslist +add address=redir.update.msft.com.trafficmanager.net. comment=\ + update.microsoft.com list=windowsupdateslist +add address=geo.prod.do.dsp.trafficmanager.net. comment=\ + geo.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=13.74.139.29 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12437.d.akamaiedge.net. comment=\ + kv801.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=displaycatalog-rp.md.mp.microsoft.com.akadns.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=rp-consumer-prod-displaycatalog-geomap.trafficmanager.net. \ + comment=displaycatalog-rp.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=sls.update.microsoft.com. comment=slscr.update.microsoft.com \ + list=windowsupdateslist +add address=glb.sls.prod.dcat.dsp.trafficmanager.net. comment=\ + sls.update.microsoft.com list=windowsupdateslist +add address=fe3.delivery.mp.microsoft.com. comment=\ + fe3cr.delivery.mp.microsoft.com list=windowsupdateslist +add address=glb.cws.prod.dcat.dsp.trafficmanager.net. comment=\ + fe3.delivery.mp.microsoft.com list=windowsupdateslist +add address=fe2cr.update.msft.com.trafficmanager.net. comment=\ + fe2cr.update.microsoft.com list=windowsupdateslist +add address=download.windowsupdate.com.delivery.microsoft.com. comment=\ + download.windowsupdate.com list=windowsupdateslist +add address=wu-f-net.trafficmanager.net. comment=\ + download.windowsupdate.com.delivery.microsoft.com list=windowsupdateslist +add address=tsfe.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=edge.ds-c7110-microsoft.global.dns.qwilted-cds.cqloud.com. \ + comment=9.au.download.windowsupdate.com list=windowsupdateslist +add address=52.158.227.125 comment=array812.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dspw65.akamai.net. comment=\ + download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.151.58.88 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net. \ + comment=licensing.mp.microsoft.com list=windowsupdateslist +add address=licensing-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-licensing-aks2aks.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-nlu-net.trafficmanager.net. comment=\ + star.f.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.b.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-tlu-net.trafficmanager.net. comment=\ + star.b.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=storeedgefd.xbetservices.akadns.net. comment=\ + storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net. \ + comment=storeedgefd.dsx.mp.microsoft.com.edgekey.net list=\ + windowsupdateslist +add address=e16646.dscg.akamaiedge.net. comment=\ + storeedgefd.dsx.mp.microsoft.com.edgekey.net.globalredir.akadns.net list=\ + windowsupdateslist +add address=40.69.76.189 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=bg.microsoft.map.fastly.net. comment=\ + 3.au.download.windowsupdate.com list=windowsupdateslist +add list=windowsupdateslist +add address=40.69.75.33 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=cdp-f-ssl-tlu-net.trafficmanager.net. comment=\ + star.sf.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a2033.dscd.akamai.net. comment=\ + star.sb.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.138.242 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-nlu-net.trafficmanager.net. comment=\ + dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=1D.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-b-tlu-net.trafficmanager.net. comment=\ + 1d.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a122.dscg3.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=windowsupdateslist +add address=geover.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e10370.d.akamaiedge.net. comment=\ + geover.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=52.232.182.21 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.95 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=a1683.dscd.akamai.net. comment=\ + dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net. \ + comment=collections.mp.microsoft.com list=windowsupdateslist +add address=a1847.dscd.akamai.net. comment=\ + wildcard.f.tlu.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=13.74.142.6 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=au.download.windowsupdate.com.edgesuite.net. comment=\ + 2.au.download.windowsupdate.com list=windowsupdateslist +add address=a767.dscg3.akamai.net. comment=\ + au.download.windowsupdate.com.edgesuite.net list=windowsupdateslist +add address=52.156.123.84 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.78.254 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=4.au.download.windowsupdate.com.delivery.microsoft.com. comment=\ + 4.au.download.windowsupdate.com list=windowsupdateslist +add address=cl-glcb907925.gcdn.co. comment=\ + 4.au.download.windowsupdate.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.111 comment=array510.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.69.70.43 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com. \ + comment=tsfe.trafficshaping.dsp.mp.microsoft.com list=windowsupdateslist +add address=ts-frontend.trafficmanager.net. comment=\ + tsfe.trafficshaping.dsp.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=40.69.75.248 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.74.84 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=sds.trafficmanager.net. comment=software-download.microsoft.com \ + list=windowsupdateslist +add address=40.69.74.80 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.175.242.182 comment=array804.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=dlc-shim.trafficmanager.net. comment=download.microsoft.com list=\ + windowsupdateslist +add address=e12671.dscd.akamaiedge.net. comment=\ + download.microsoft.com.edgekey.net list=windowsupdateslist +add address=20.187.55.34 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.231 comment=array513.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.222.13 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=e12358.d.akamaiedge.net. comment=\ + kv601.prod.do.dsp.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. comment=\ + tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=dcat-f-tlu-net.trafficmanager.net. comment=\ + tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=a1856.dspw65.akamai.net. comment=\ + tlu.dl.delivery.mp.microsoft.com-c.edgesuite.net list=windowsupdateslist +add address=52.167.164.252 comment=array506.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=13.74.137.54 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=kv501.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + kv501.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=collections-prod-frontdoor-geomap.trafficmanager.net. comment=\ + consumer-collections-aks2eap.md.mp.microsoft.com.akadns.net list=\ + windowsupdateslist +add address=52.167.160.173 comment=array509.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.77.148 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.200.126 comment=array507.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=52.167.167.59 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.172 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=82.202.162.184 comment=comp-lenta.ru list=NoWG +add address=smtp.mail.me.com.akadns.net. comment=smtp.mail.me.com list=NoWG +add address=17.57.155.37 comment=smtp.mail.me.com.akadns.net list=NoWG +add address=smtp.mail.me.com comment=smtp.mail.me.com list=NoVdsina +add address=40.70.76.5 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.186.119 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.177.176.186 comment=array520.prod.do.dsp.mp.microsoft.com \ + list=windowsupdateslist +add address=40.70.76.27 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.160.43 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.110 comment=array817.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.142.8 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.138.254 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.167.96 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.69.76.215 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.143.200 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.111 comment=array818.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.112 comment=array819.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=13.74.137.53 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.98 comment=array805.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.96 comment=array803.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.104 comment=array811.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.101 comment=array808.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.99 comment=array806.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.17 comment=array802.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.97 comment=array804.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.103 comment=array810.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.16 comment=array801.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=40.70.77.177 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.164.84 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.105 comment=array812.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.107 comment=array814.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.232.161.82 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.108 comment=array815.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=52.167.161.91 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.102 comment=array809.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.109 comment=array816.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.106 comment=array813.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.117 comment=array622.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.107 comment=array612.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.108 comment=array613.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.105 comment=array610.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.113 comment=array618.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.116 comment=array621.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.98 comment=array603.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.114 comment=array619.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.111 comment=array616.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.97 comment=array602.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.106 comment=array611.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.110 comment=array615.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.119 comment=array624.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.135 comment=array514.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.97 comment=array503.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.99 comment=array604.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.61 comment=array504.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.131 comment=array510.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.132 comment=array511.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.96 comment=array601.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.104 comment=array609.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.138 comment=array517.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.60 comment=array501.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.139 comment=array518.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.118 comment=array623.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.113 comment=array820.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.103 comment=array608.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.154.7.100 comment=array807.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.129 comment=array508.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.134 comment=array513.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.62 comment=array505.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.137 comment=array516.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.101 comment=array606.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.96 comment=array502.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.130 comment=array509.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.112 comment=array617.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.100 comment=array605.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.115 comment=array620.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.136 comment=array515.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=purchase.md.mp.microsoft.com.akadns.net. comment=\ + purchase.mp.microsoft.com list=windowsupdateslist +add address=e110219.a.akamaiedge.net. comment=\ + purchase.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=72.153.5.140 comment=array519.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.141 list=windowsupdateslist +add address=72.153.5.63 comment=array506.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.128 comment=array507.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.102 comment=array607.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=storesdk.xbetservices.akadns.net. comment=\ + storesdk.dsx.mp.microsoft.com list=windowsupdateslist +add address=e16646.g.akamaiedge.net. comment=\ + storesdk.dsx.mp.microsoft.com.edgekey.net list=windowsupdateslist +add address=software-download.microsoft.com.delivery.microsoft.com. comment=\ + software-download.microsoft.com list=windowsupdateslist +add address=download.prss.microsoft.com.akamaized.net. comment=\ + software-download.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=72.145.35.109 comment=array614.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=72.153.5.133 comment=array512.prod.do.dsp.mp.microsoft.com list=\ + windowsupdateslist +add address=213.180.192.0/19 comment=YandexDisk list=NoVdsina +add address=87.250.250.50 comment=YandexDisk list=NoVdsina +add address=consumer-prod-bcfd-v7-afd.trafficmanager.net. comment=\ + displaycatalog.mp.microsoft.com list=windowsupdateslist +add address=purchase-europeeap.md.mp.microsoft.com.akadns.net. comment=\ + purchase.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=ne-az-conspurchase-mp.trafficmanager.net. comment=\ + purchase-europeeap.md.mp.microsoft.com.akadns.net list=windowsupdateslist +add address=storeedgefd.dsx.mp.microsoft.com.edgekey.net. comment=\ + cdn.storeedgefd.dsx.mp.microsoft.com list=windowsupdateslist +add address=star.f.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.f.tlu.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=a1996.dscd.akamai.net. comment=\ + wildcard.f.dl.delivery.mp.microsoft.com.edgesuite.net list=\ + windowsupdateslist +add address=cp801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=glb.tas02.sls-prod.dcat.dsp.mp.microsoft.com. comment=\ + tas02.sls.update.microsoft.com list=windowsupdateslist +add address=cp601.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + cp601.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=star.sb.tlu.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedgeextensions.sb.tlu.dl.delivery.mp.microsoft.com list=\ + windowsupdateslist +add address=star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com. \ + comment=msedge.sf.dl.delivery.mp.microsoft.com list=windowsupdateslist +add address=cdp-f-ssl-nlu-net.trafficmanager.net. comment=\ + star.sf.dl.delivery.mp.microsoft.com.delivery.microsoft.com list=\ + windowsupdateslist +add address=tm-pifd-prod-gbl-weight.trafficmanager.net. comment=\ + paymentinstruments.mp.microsoft.com list=windowsupdateslist +add address=10.30.30.33 comment=NUC disabled=yes list=NoWG +add address=10.30.30.10 comment=MikroNUC list=NoWG +add address=89.110.101.17 comment=!!!VDSINA!!!! list=NoWG +add address=89.110.101.17 list=VPN-Server +add address=80.85.244.9 list=TRUSTED +add address=8.8.8.8 list=TRUSTED +add address=8.8.4.4 list=TRUSTED +add address=disc801.prod.do.dsp.mp.microsoft.com.edgekey.net. comment=\ + disc801.prod.do.dsp.mp.microsoft.com list=windowsupdateslist +add address=185.71.70.78 disabled=yes list=TRUSTED +add address=176.53.203.171 disabled=yes list=TRUSTED +add address=176.53.203.170 disabled=yes list=TRUSTED +add address=176.53.202.194 disabled=yes list=TRUSTED +add address=89.110.101.17 comment="!!!VDSina Server!!!" disabled=yes list=\ + NoVdsina +/ip firewall filter +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=12h chain=input comment="block honeypot DNS" \ + connection-state=new dst-port=53 in-interface="ether1 - Unet" protocol=\ + udp +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input connection-state=new dst-port=53 \ + in-interface="ether1 - Unet" protocol=tcp +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment=\ + "block honeypot ssh rdp winbox" connection-state=new dst-port=\ + 22,8291,2222 in-interface="ether1 - Unet" protocol=tcp src-address-list=\ + !TRUSTED +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=4w2d chain=input comment="block honeypot asterisk" \ + connection-state=new dst-port=5060 in-interface="ether1 - Unet" protocol=\ + udp +add action=add-src-to-address-list address-list="Honeypot Hacker" \ + address-list-timeout=5d chain=input comment="block honeypot NTP" \ + connection-state=new dst-port=123 in-interface="ether1 - Unet" protocol=\ + udp src-address=!10.30.30.0/24 +add action=accept chain=input comment=\ + "accept NTP clients on local area network" dst-port=123 in-interface=\ + Bridge-LAN in-interface-list=LAN protocol=udp +add action=accept chain=input comment="accept WireGuard" dst-port=13231 \ + in-interface="ether1 - Unet" protocol=udp src-address-list=VPN-Server +add action=accept chain=input disabled=yes dst-port=443 in-interface=\ + "ether1 - Unet" protocol=tcp +add action=accept chain=output disabled=yes protocol=tcp src-port=443 +add action=fasttrack-connection chain=forward comment=\ + "FastTrack for non-VPN connections" connection-mark=!VPN_No_FastTrack \ + connection-state=established,related,new disabled=yes +add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \ + connection-state=established,related,new disabled=yes routing-mark=\ + !To-VPN +add action=accept chain=input comment=\ + "defconf: accept established,related,untracked" connection-state=\ + established,related,untracked +add action=drop chain=input comment="defconf: drop invalid" connection-state=\ + invalid +add action=accept chain=input comment="defconf: accept ICMP" disabled=yes \ + protocol=icmp +add action=accept chain=input comment=\ + "defconf: accept to local loopback (for CAPsMAN)" disabled=yes \ + dst-address=127.0.0.1 +add action=accept chain=output disabled=yes src-address=127.0.0.1 +add action=accept chain=forward comment="defconf: accept in ipsec policy" \ + ipsec-policy=in,ipsec +add action=accept chain=forward comment="defconf: accept out ipsec policy" \ + ipsec-policy=out,ipsec +add action=accept chain=forward comment=\ + "defconf: accept established,related, untracked" connection-state=\ + established,related,untracked +add action=drop chain=forward comment="defconf: drop invalid" \ + connection-state=invalid +add action=drop chain=forward comment=\ + "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \ + connection-state=new in-interface="ether1 - Unet" +add action=accept chain=input connection-state=established disabled=yes +add action=accept chain=input connection-state=related disabled=yes +add action=drop chain=input disabled=yes in-interface-list=!LAN +add action=drop chain=forward comment=\ + "Filter Rule to block FB address LIST : )" disabled=yes dst-address-list=\ + facebook +add action=drop chain=forward comment=\ + "Filter Rule to block YOUTUBE address LIST : )" disabled=yes \ + dst-address-list=YouTube +/ip firewall mangle +add action=mark-connection chain=prerouting comment=\ + "Mark VPN connections to exclude from FastTrack" in-interface=WG \ + log-prefix=Mark-VPN-FT new-connection-mark=VPN_No_FastTrack +add action=mark-routing chain=prerouting comment="Test sites" disabled=yes \ + dst-address=!10.30.30.0/24 dst-address-list=Test new-routing-mark=To-VPN \ + passthrough=no src-address=10.30.30.0/24 +add action=mark-routing chain=prerouting comment=Instagram dst-address=\ + !10.30.30.0/24 dst-address-list=Instagram new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=Twitter dst-address=\ + !10.30.30.0/24 dst-address-list=Twitter new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=YouTube dst-address=\ + !10.30.30.0/24 dst-address-list=YouTube new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment=facebook dst-address=\ + !10.30.30.0/24 dst-address-list=facebook new-routing-mark=To-VPN \ + src-address=10.30.30.0/24 src-address-list=!NoWG +add action=mark-routing chain=prerouting comment="VDSIna for All sites" \ + dst-address=!10.30.30.0/24 dst-address-list=!NoVdsina log-prefix=VPN-all \ + new-routing-mark=To-VPN src-address=10.30.30.0/24 src-address-list=!NoWG +add action=change-mss chain=forward comment="MSS on WG" new-mss=1380 \ + out-interface=WG protocol=tcp tcp-flags=syn tcp-mss=1381-65535 +add action=mark-routing chain=prerouting comment="VPN Network" dst-address=\ + 10.8.0.0/24 dst-address-list=!NoVdsina log=yes log-prefix=VPN-Net \ + new-routing-mark=To-VPN src-address=10.30.30.0/24 src-address-list=!NoWG +/ip firewall nat +add action=redirect chain=dstnat comment=\ + "FORCE DNS TO LOCAL MIKROTIK DNS SERVER" dst-port=53 protocol=tcp \ + src-address=10.30.30.0/24 to-ports=53 +add action=redirect chain=dstnat dst-port=53 protocol=udp src-address=\ + 10.30.30.0/24 to-ports=53 +add action=masquerade chain=srcnat comment=WG dst-address-list=!NoVdsina \ + in-interface=Bridge-LAN log-prefix=WG-nat out-interface=WG routing-mark=\ + To-VPN +add action=masquerade chain=srcnat comment="masquerade Default" ipsec-policy=\ + out,none out-interface="ether1 - Unet" routing-mark=!To-VPN +add action=dst-nat chain=dstnat comment=npm dst-port=81 in-interface=\ + "ether1 - Unet" protocol=tcp to-addresses=10.30.30.33 to-ports=81 +add action=dst-nat chain=dstnat comment=amster.vados.ruhttps disabled=yes \ + dst-port=443 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=443 +add action=dst-nat chain=dstnat comment="amster.vados.ru For Certbot HTTP" \ + dst-port=80 in-interface="ether1 - Unet" protocol=tcp to-addresses=\ + 10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat dst-port=80 in-interface="ether1 - Unet" \ + protocol=tcp to-addresses=10.30.30.33 to-ports=80 +add action=dst-nat chain=dstnat comment="Yandex.DNS Family" disabled=yes \ + dst-port=53 in-interface=Bridge-LAN protocol=udp src-address-list=KIDS \ + time=6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +add action=dst-nat chain=dstnat disabled=yes dst-port=53 in-interface=\ + Bridge-LAN protocol=tcp src-address-list=KIDS time=\ + 6h-15m,sun,mon,tue,wed,thu,fri,sat to-addresses=77.88.8.3 +/ip firewall raw +add action=drop chain=prerouting comment="Drop Honeypot Hackers" \ + in-interface="ether1 - Unet" src-address-list="Honeypot Hacker" +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + extras.getpagespeed.com content=extras.getpagespeed.com disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=linux.duke.edu \ + content=linux.duke.edu disabled=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=vk.com \ + content=vk.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=ok.ru content=\ + ok.ru +add action=add-dst-to-address-list address-list=Instagram \ + address-list-timeout=none-dynamic chain=prerouting comment=Instagram \ + content=instagram.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting comment=Twitter content=twimg.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting content=x.com +add action=add-dst-to-address-list address-list=Twitter address-list-timeout=\ + none-dynamic chain=prerouting content=twitter.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting comment=YouTube content=youtube.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googleapis.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=ggpht.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=youtu.be +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=ytimg.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googlevideo.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=gstatic.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=googleusercontent.com +add action=add-dst-to-address-list address-list=YouTube address-list-timeout=\ + none-dynamic chain=prerouting content=nhacmp3youtube.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=rutube.ru \ + content=rutube.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=me.com \ + content=me.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=icloud.com \ + content=icloud.com +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting comment=facebook \ + content=fbcd.net +add action=add-dst-to-address-list address-list=facebook \ + address-list-timeout=none-dynamic chain=prerouting content=facebook.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=comp-lenta.ru \ + content=comp-lenta.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + smtp.mail.me.com content=smtp.mail.me.com log=yes +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=gov.ru \ + content=gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + r78.fssp.gov.ru content=r78.fssp.gov.ru +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=api.db-ip.com \ + content=api.db-ip.com +add action=add-dst-to-address-list address-list=NoVdsina \ + address-list-timeout=none-dynamic chain=prerouting comment=\ + api.telegram.org content=api.telegram.org +/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 user profile +set [ find default=yes ] address-pool=dhcp +/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 disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=3 dst-address=192.168.0.0/24 gateway=l2tp-vpn +add disabled=no distance=4 dst-address=192.168.5.0/24 gateway=l2tp-vpn +add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=WG routing-table=\ + To-VPN scope=30 target-scope=10 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set reverse-proxy 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 interface="ether1 - Unet" type=external +/snmp community +set [ find default=yes ] addresses=10.30.30.0/24 read-access=no security=\ + private +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system clock manual +set time-zone=+03:00 +/system identity +set name=MikroMaster +/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=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="Scheduler for Update Certificates CloudFlare Quad9" disabled=yes \ + interval=1w name="Update Certificates CloudFlare Quad9" on-event=\ + "/system/script { run Update-Certificates; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2025-11-28 start-time=05:45:40 +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 +/system watchdog +set watchdog-timer=no +/tool e-mail +set certificate-verification=no from=MikroVados port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool mac-server +set allowed-interface-list=LAN +/tool mac-server mac-winbox +set allowed-interface-list=LAN +/tool netwatch +add comment="doh, doh-url=https://security.cloudflare-dns.com/dns-query, notif\ + y, name=CloudFlare-doh IPv4 1" disabled=yes down-script="" host=1.1.1.1 \ + http-codes="" test-script="" type=simple up-script="" +add check-certificate=no comment="doh-fallback, doh-url=https://security.cloud\ + flare-dns.com/dns-query, doh-cert=DigiCert Global Root CA, notify, name=Cl\ + oudFlare-doh IPv4" disabled=yes down-script="" host=1.0.0.1 http-codes="" \ + port=443 test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=Google-DNS IPv4" disabled=yes \ + down-script="" host=8.8.8.8 http-codes="" test-script="" type=simple \ + up-script="" +add comment="doh-fallback, doh-url=https://dns.google/dns-query, doh-cert=GTS \ + Root R1, notify, name=Google-DOH IPv4" disabled=yes down-script="" host=\ + 8.8.4.4 http-codes="" test-script="" type=simple up-script="" +add comment="dns, notify, name=Cuad9-DOH IPv4" disabled=yes down-script="" \ + host=9.9.9.9 http-codes="" test-script="" type=simple up-script="" +add comment="doh-fallback, doh-url=https://dns.quad9.net/dns-query, name=Cuad9\ + -DOH IPv4" disabled=yes down-script="" host=149.112.112.112 http-codes="" \ + test-script="" type=simple up-script="" +add comment="dns-fallback, notify, name=ns1.unet.ws" disabled=yes \ + down-script="" host=91.192.189.2 http-codes="" test-script="" type=simple \ + up-script="" +/tool sniffer +set filter-interface=Bridge-LAN filter-src-ip-address=10.30.30.50/32 +/user aaa +set accounting=no diff --git a/MikroMaster/history/20260504/20260504200001-Diff-Config.rsc b/MikroMaster/history/20260504/20260504200001-Diff-Config.rsc new file mode 100644 index 0000000..08518cd --- /dev/null +++ b/MikroMaster/history/20260504/20260504200001-Diff-Config.rsc @@ -0,0 +1,4390 @@ +512,513c512 +< add comment="Script for setup routeros script system" \ +< dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +--- +> add dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ +725,755c724,753 +< 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 \"\";\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\ +--- +> add 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\ +> \n# RouterOS script: AM-GlobalConfig\ +> \n# Script comment: Global Config Script\ +> \n# Copyright (c) 2007-2026 Vados \ +> \n#\ +> \n#\ +> \n# Warning: Dont touch this line!\ +> \n:global Identity [ /system identity get name ];\ +> \n:global GlobalConfReady false;\ +> \n#\ +> \n#\ +> \n# Global Url For Amster scripts to fetch\ +> \n# most be defined in AM-Init-Script or AM-setup scripts\ +> \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\ +> \n:global ScriptsUrlSuffix \"\";\ +> \n:global CheckSumsVerify true;\ +> \n\ +> \n:global ScriptUpdatesCRLF true;\ +> \n:global CommentsInScripts true;\ +> \n\ +> \n# Debug output:\ +> \n:global PrintDebug true; #false;\ +> \n\ +> \n# Debug output for specific script:\ +> \n#:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\ +> \n\ +> \n# Debug logs\ +> \n# Other actions (disk, email, remote or support) can be used as well.\ +757,766c755,764 +< 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\ +--- +> eworm.de/main/DEBUG.html#debug-output).\ +> \n#/system/logging/add topics=script,debug action=memory;\ +> \n\ +> \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\ +> \n:global Domain \"WORKGROUP\";\ +> \n\ +> \n:global EmailGeneralTo \"vados@vados.ru\";\ +> \n#:global EmailGeneralCc \"\";\ +> \n\ +> \n# \$ScriptInstallUpdate mod/notification-telegram\ +768,771c766,769 +< \";\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:global TelegramChatId \"-1003631309063\"; #\"454403445\";\ +> \n# Use this to send notifications to a specific topic in group.\ +> \n#:global TelegramThreadId \"30\";\ +773,796c771,794 +< !)\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# or user names. Groups allow to chat with devices simultaneously.\ +> \n:global TelegramChatIdsTrusted {\ +> \n \"454403445\"\ +> \n \"-1003631309063\"\ +> \n \"-5124482807\"\ +> \n \"1087968824\";\ +> \n};\ +> \n# \"-5294757340\";\ +> \n\ +> \n:global TelegramChatGroups \"(all)\";\ +> \n#:global TelegramChatGroups \"(all|home|office)\";\ +> \n\ +> \n:global NotificationFunctions {\ +> \n \"email\"\ +> \n \"telegram\";\ +> \n};\ +> \n# Toggle this to disable symbols in notifications.\ +> \n:global NotificationsWithSymbols true;\ +> \n:global TerminalColorOutput true;\ +> \n\ +> \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\ +> \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\ +> \n\ +798,800c796,798 +< ent\r\ +< \n:global updateChannel \"stable\";\r\ +< \n\r\ +--- +> ent\ +> \n:global updateChannel \"stable\";\ +> \n\ +802,816c800,814 +< \");\r\ +< \n:global CertRenewTime 2w;\r\ +< \n:global CertRenewPass {\r\ +< \n \"\";\r\ +< \n# \"v3ry-s3cr3t\";\r\ +< \n# \"4n0th3r-s3cr3t\";\r\ +< \n};\r\ +< \n:global CertWarnTime 1w;\r\ +< \n:global CertIssuedExportPass {\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:global CertRenewTime 2w;\ +> \n:global CertRenewPass {\ +> \n \"\";\ +> \n# \"v3ry-s3cr3t\";\ +> \n# \"4n0th3r-s3cr3t\";\ +> \n};\ +> \n:global CertWarnTime 1w;\ +> \n:global CertIssuedExportPass {\ +> \n \"\";\ +> \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\ +> \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\ +> \n};\ +> \n\ +> \n# Script BackupAndUpdate mode, possible values: backup,\ +818c816 +< n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ +--- +> n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \ +820c818 +< \_(ignores `forceBackup`)\r\ +--- +> \_(ignores `forceBackup`)\ +822,880c820,878 +< \_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\ +--- +> \_without updates\ +> \n# osnotify - Set `forceBackup` to always create backups on every run\ +> \n:global DevInfoIncludeIP true;\ +> \n:global BackupAndUpdateMode \"osnotify\"\ +> \n\ +> \n:global forceBackup true;\ +> \n:global BackupPassword \"Peskar55\";\ +> \n\ +> \n# SFTP Backup Variables\ +> \n:global BackupRandomDelay 0;\ +> \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\ +> \n:global BackupUploadUser \$Identity;\ +> \n:global BackupUploadPass \"root.mnuc.backuper\";\ +> \n\ +> \n:global BackupSendBinary true;\ +> \n:global BackupSendExport true;\ +> \n:global BackupSendGlobalConfig true;\ +> \n:global BackupSendScripts true;\ +> \n\ +> \n# Remove local file after uploading if no errors\ +> \n:global BackupRmLocal true;\ +> \n\ +> \n# Local Backups Root Directory \ +> \n:global BackupLocalRoot \"tmpfs\";\ +> \n\ +> \n# Encrypt Backup\ +> \n:global BackupEncrypt true;\ +> \n\ +> \n# Sensitive information in Backups\ +> \n:global BackupSens true;\ +> \n\ +> \n# User Export\ +> \n:global BackupUser true;\ +> \n\ +> \n# License Export (not for CHR, will silently skip)\ +> \n:global BackupLicense false;\ +> \n\ +> \n# SSH Keys\ +> \n:global BackupSshKeys true;\ +> \n\ +> \n# Certificate Export\ +> \n:global BackupCerts true;\ +> \n\ +> \n# Certificate Password\ +> \n:global BackupCertsPasswd \"\";\ +> \n\ +> \n# User-Manager Export\ +> \n:global BackupUserMan false;\ +> \n\ +> \n# The Dude Export\ +> \n:global BackupDude false;\ +> \n\ +> \n# User Files to export, comma-separated string or array of strings\ +> \n# User Files are not removed on backup\ +> \n# Any directory paths will be removed (/ -> _) on remote file\ +> \n# Nonpresent files are silently skipped\ +> \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\ +> \n\ +> \n# load functions and any custom scripts\ +882c880 +< erlay\" ], \\\r\ +--- +> erlay\" ], \\\ +884,885c882,883 +< verlay\\\\.d/.\" ]\r\ +< \n#\r\ +--- +> verlay\\\\.d/.\" ]\ +> \n#\ +888,891c886,888 +< \r\ +< \n# :onerror Err {\r\ +< \n# /system/script/run \$Script;\r\ +< \n# } do={\r\ +--- +> \n# :onerror Err {\ +> \n# /system/script/run \$Script;\ +> \n# } do={\ +893,897c890,894 +< \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ +< \n# }\r\ +< \n#}\r\ +< \n#:log info \"\\ndevMode = \$devMode\";\r\ +< \n#:log info \"\\ndevRunning = \$devRunning\";\r\ +--- +> \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\ +> \n# }\ +> \n#}\ +> \n#:log info \"\\ndevMode = \$devMode\";\ +> \n#:log info \"\\ndevRunning = \$devRunning\";\ +899,902c896,899 +< GlobalRUN\\r\?\\n\" ] do={\r\ +< \n :onerror Err {\r\ +< \n /system/script/run \$Script;\r\ +< \n } do={\r\ +--- +> GlobalRUN\\r\?\\n\" ] do={\ +> \n :onerror Err {\ +> \n /system/script/run \$Script;\ +> \n } do={\ +904,910c901,907 +< ] . \" 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\ +--- +> ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\ +> \n }\ +> \n}\ +> \n\ +> \n# signal we are ready\ +> \n:set GlobalConfReady true;\ +> \n:while (\$GlobalConfReady != true) do={:delay 500ms};\ +912,927c909,923 +< 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\ +--- +> add 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\ +> \n# RouterOS script: AM-GglobalFunc\ +> \n# Script comment: Global functions\ +> \n# Copyright (c) 2005-2026 Vados \ +> \n#\ +> \n#\ +> \n# requires RouterOS, version=7.19\ +> \n# requires device-mode, fetch, scheduler\ +> \n\ +> \n:local ScriptName [ :jobname ];\ +> \n#:global checkRunJob \$SriptName;\ +> \n#:global fixCRLF;\ +> \n#:if (\$fixCRLF != false) do={\ +930c926 +< }\r\ +--- +> }\ +932,938c928,934 +< 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/589/c05c3863\";\r\ +< \n:global CommitTAG \"unknown\";\r\ +--- +> et \$fixScript source ] ] \$fixScript};};\ +> \n#}\ +> \n:global GlobalFuncReady false;\ +> \n\ +> \n# Git commit id & info, expected configuration version\ +> \n:global CommitId \"main/588/3cafe107\";\ +> \n:global CommitTAG \"unknown\";\ +940,1076c936,1072 +< r: root, in 19:45:02 04.05.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 GlobalEnvRemove;\r\ +< \n:global MiniDateTimeStamp;\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 WaitDNSResolving;\r\ +< \n:global WaitFullyConnected;\r\ +< \n:global WaitTimeSync;\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\ +--- +> r: root, in 19:35:03 04.05.2026.\";\ +> \n\ +> \n# The variables are received right here.\ +> \n:global GlobalConfVersion 140;\ +> \n\ +> \n:global SumsDirAndFileName \"tmp/checksums.json\";\ +> \n\ +> \n:global Identity [/system/identity/get name];\ +> \n:global IdentityShort [:pick \$Identity 0 18];\ +> \n\ +> \n:global devBoardName [/system/resource/get board-name];\ +> \n:global devMode [/system/device-mode/get mode];\ +> \n:global devCurArch [/system/resource/get architecture-name];\ +> \n:global devCurVersion [/system/resource/get version];\ +> \n\ +> \n# Variables defined in AM-GlobalConfig.rsc\ +> \n:global TerminalColorOutput;\ +> \n:global CommentsInScripts;\ +> \n:global DetectIpAddrDefault;\ +> \n:global DetectIpAddrFallback;\ +> \n:global updateChannel;\ +> \n:global Domain;\ +> \n:global EmailGeneralTo;\ +> \n:global BackupAndUpdateMode;\ +> \n\ +> \n# Single functions, without nested functions.\ +> \n:global GlobalEnvRemove;\ +> \n:global MiniDateTimeStamp;\ +> \n\ +> \n# Include globals \$PrintDebug and \$PrintDebugOverride\ +> \n:global LogPrint;\ +> \n\ +> \n# DeviceInfo and Updates\ +> \n:global IsCheckUpdates;\ +> \n:global WaitCheckUpdates;\ +> \n:global GetPubIp;\ +> \n\ +> \n:global GetArrDeviceInfo;\ +> \n:global WaitArrDeviceInfo;\ +> \n\ +> \n:global devModel;\ +> \n:global devRunningMode;\ +> \n\ +> \n:global devRbRevision;\ +> \n:global devRbSerialNumber;\ +> \n:global devRbVerAvail;\ +> \n\ +> \n:global runningChannelVersion;\ +> \n:global runningChannel;\ +> \n:global runningVersion;\ +> \n\ +> \n:global devBuildTime;\ +> \n:global ROsVerAvail;\ +> \n:global PkgUpdStatus;\ +> \n:global currentUpdateChannel;\ +> \n\ +> \n:global ScriptInstallUpdate;\ +> \n\ +> \n:global DeviceInfo;\ +> \n\ +> \n:global OldMode;\ +> \n\ +> \n:global ParseKeyValueStore;\ +> \n:global RandomDelay;\ +> \n:global GetRandomNumber;\ +> \n:global EscapeForRegEx;\ +> \n:global CharacterMultiply;\ +> \n:global CharacterReplace;\ +> \n:global CleanFilePath;\ +> \n:global CleanName;\ +> \n\ +> \n:global CommitBrief;\ +> \n\ +> \n:global EitherOr;\ +> \n:global FormatLine;\ +> \n:global GetRandom20CharAlNum;\ +> \n:global GetRandom20CharHex;\ +> \n:global GetRandomNumber;\ +> \n:global Grep;\ +> \n:global IfThenElse;\ +> \n:global MAX;\ +> \n:global MIN;\ +> \n:global HumanReadableNum;\ +> \n\ +> \n:global IsFullyConnected;\ +> \n:global IsDNSResolving;\ +> \n:global IsTimeSync;\ +> \n:global IsTimeSyncCached;\ +> \n:global IsTimeSyncResetNtp;\ +> \n\ +> \n:global WaitDNSResolving;\ +> \n:global WaitFullyConnected;\ +> \n:global WaitTimeSync;\ +> \n:global MkDir;\ +> \n:global RmDir;\ +> \n:global RmFile;\ +> \n:global FileGet;\ +> \n:global Unix2Dos;\ +> \n:global UrlEncode;\ +> \n:global WaitForFile;\ +> \n:global ScriptLock;\ +> \n:global SendTelegram;\ +> \n:global NotificationFunctions;\ +> \n:global SendNotification;\ +> \n:global SendNotification2;\ +> \n:global SymbolForNotification;\ +> \n:global SymbolByUnicodeName;\ +> \n:global ValidateSyntax;\ +> \n:global CheckSumsVerify;\ +> \n:global GlobalConfChanges;\ +> \n:global GlobalConfMigration;\ +> \n:global VersionToNum;\ +> \n:global RequiredRouterOS;\ +> \n:global ExitError;\ +> \n:global ExitOnError;\ +> \n\ +> \n:global FetchHugeFiles;\ +> \n:global FetchUserAgentStr;\ +> \n:global FileExists;\ +> \n:global CertificateAvailable;\ +> \n:global CertificateDownload;\ +> \n:global CertificateNameByCN;\ +> \n:global CharacterMultiply;\ +> \n\ +> \n:global InspectVar;\ +> \n:global InspectVarRet;\ +> \n:global ParseCustom;\ +> \n\ +> \n:set IsCheckUpdates do={\ +> \n :local isInfo [:tobool \$1];\ +> \n :global updateChannel;\ +> \n :global PkgUpdStatus;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n :global arrDeviceInfo;\ +> \n :log info (\$0 . \" \\\$isInfo = \" . \$isInfo); \ +> \n :local CurrentChannel [ /system/package/update/get channel ];\ +1078c1074 +< el) do={\r\ +--- +> el) do={\ +1080,1088c1076,1084 +< \_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\ +--- +> \_delay=300ms max=5 on-error={};\ +> \n :log info (\$0 . \" Set updates channel to: \$updateChannel\");\ +> \n }\ +> \n :local Update [ /system/package/update/get ];\ +> \n :local Channel [ :tostr (\$Update->\"channel\") ];\ +> \n :set currentUpdateChannel \$Channel;\ +> \n :log info (\$0 . \" Update Channel: \" . \$Channel . \".\");\ +> \n :local StatusPkg \"undefined\";\ +> \n :log info (\$0 . \" Checking for updates...\");\ +1090,1092c1086,1088 +< dates without-paging as-value]->\"status\")} \\\r\ +< \n delay=300ms max=5 on-error={};\r\ +< \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\r\ +--- +> dates without-paging as-value]->\"status\")} \\\ +> \n delay=300ms max=5 on-error={};\ +> \n :log info (\$0 . \" \\\$StatusPkg = \" . \$StatusPkg);\ +1094c1090 +< s true; } else={ :set PkgUpdStatus false; }\r\ +--- +> s true; } else={ :set PkgUpdStatus false; }\ +1096,1102c1092,1098 +< ] ];\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 :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +> \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\ +> \n :log info (\$0 . \" \\\$PkgUpdStatus = \" . \$PkgUpdStatus);\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +> \n }\ +1104,1123c1100,1119 +< 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\ +--- +> kage/update/get ]} delay=500ms max=5 on-error={:log error (\"Error\")};\ +> \n :return true;\ +> \n } else={\ +> \n :return \$PkgUpdStatus;\ +> \n }\ +> \n}\ +> \n\ +> \n:set WaitCheckUpdates do={\ +> \n :global IsCheckUpdates;\ +> \n :global PkgUpdStatus;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n :global arrDeviceInfo;\ +> \n :local Status \"\";\ +> \n :local Update;\ +> \n :local WaitCount 0;\ +> \n :if ([ \$IsCheckUpdates true ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +1125,1141c1121,1137 +< \") && \$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\ +--- +> \") && \$WaitCount < 60) do={\ +> \n :delay 1s;\ +> \n :set WaitCount (\$WaitCount + 1);\ +> \n :set Status [ :tostr [ /system/package/update/get status ] ];\ +> \n }\ +> \n :set Update [ /system/package/update/get ];\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +> \n :if ((\$Update->\"status\") = \"New version is available\") do={\ +> \n :set PkgUpdStatus true;\ +> \n } else={\ +> \n :set PkgUpdStatus false;\ +> \n }\ +> \n :if ([ :typeof \$arrDeviceInfo ] != \"array\") do={\ +> \n :set arrDeviceInfo [:toarray \$arrDeviceInfo];\ +> \n }\ +> \n :set (\$arrDeviceInfo->\"devUpdates\") \$Update;\ +1143,1186c1139,1182 +< 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\ +--- +> do={\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set WaitArrDeviceInfo do={\ +> \n :global GetArrDeviceInfo;\ +> \n :while ([ \$GetArrDeviceInfo ] = false) do={\ +> \n :delay 1s;\ +> \n }\ +> \n}\ +> \n\ +> \n:set GetArrDeviceInfo do={\ +> \n :global LogPrint;\ +> \n :global arrDeviceInfo;\ +> \n :global devBoardName;\ +> \n :global devModel;\ +> \n :global devRunning;\ +> \n :global devCurArch;\ +> \n :global devRbRevision;\ +> \n :global devRbSerialNumber;\ +> \n :global devBuildTime;\ +> \n :global runningChannelVersion;\ +> \n :global runningChannel;\ +> \n :global runningVersion;\ +> \n :global currentUpdateChannel;\ +> \n :global ROsVerAvail;\ +> \n\ +> \n :local DeviceInfo;\ +> \n :local Resource [/system/resource/get];\ +> \n :local Update [ /system/package/update/get ];\ +> \n :local VersionString [ :tostr (\$Resource->\"version\") ];\ +> \n :local ChannelStart [ :find \$VersionString \" (\" ];\ +> \n :local RouterBoard;\ +> \n :local IsRouterBoard false;\ +> \n :local RunningMode \"\";\ +> \n\ +> \n :set devCurArch [ :tostr (\$Resource->\"architecture-name\") ];\ +> \n :set devBuildTime [ :tostr (\$Resource->\"build-time\") ];\ +> \n :set runningChannelVersion \$VersionString;\ +> \n :set runningVersion \$VersionString;\ +> \n :set runningChannel \"\";\ +> \n\ +1188,1189c1184,1185 +< {\r\ +< \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\r\ +--- +> {\ +> \n :set runningVersion [ :pick \$VersionString 0 \$ChannelStart ];\ +1191,1192c1187,1188 +< len \$VersionString ] ];\r\ +< \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\r\ +--- +> len \$VersionString ] ];\ +> \n :local ChannelEnd [ :find \$ChannelRest \")\" ];\ +1194,1198c1190,1193 +< \r\ +< \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\r\ +< \n }\r\ +< \n }\r\ +< \n\r\ +--- +> \n :set runningChannel [ :pick \$ChannelRest 0 \$ChannelEnd ];\ +> \n }\ +> \n }\ +> \n\ +1200,1223c1195,1218 +< \_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\ +--- +> \_3] != \"x86\") do={\ +> \n :do {\ +> \n :set RouterBoard [[ :parse \"/system/routerboard/get\" ]];\ +> \n# :set RouterBoard [ /system/routerboard/get ];\ +> \n :if ((\$RouterBoard->\"routerboard\") = true) do={\ +> \n :set IsRouterBoard true;\ +> \n }\ +> \n } on-error={}\ +> \n }\ +> \n\ +> \n :do {\ +> \n :set RunningMode [ /system/device-mode/get mode ];\ +> \n } on-error={\ +> \n :do {\ +> \n :set RunningMode [ /system/device-mode/get running ];\ +> \n } on-error={\ +> \n :set RunningMode \"\";\ +> \n }\ +> \n }\ +> \n :set devRunning \$RunningMode;\ +> \n\ +> \n :if (\$IsRouterBoard = true) do={\ +> \n :set devModel [ :tostr (\$RouterBoard->\"model\") ];\ +> \n :set devRbRevision [ :tostr (\$RouterBoard->\"revision\") ];\ +1225,1241c1220,1236 +< ];\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 } else={\ +> \n :set devModel \$devBoardName;\ +> \n :set devRbRevision \"\";\ +> \n :set devRbSerialNumber \"\";\ +> \n }\ +> \n\ +> \n :set currentUpdateChannel [ :tostr (\$Update->\"channel\") ];\ +> \n :set ROsVerAvail [ :tostr (\$Update->\"latest-version\") ];\ +> \n\ +> \n :set (\$DeviceInfo->\"board-name\") \$devBoardName;\ +> \n :set (\$DeviceInfo->\"architecture-name\") \$devCurArch;\ +> \n :set (\$DeviceInfo->\"model\") \$devModel;\ +> \n :set (\$DeviceInfo->\"revision\") \$devRbRevision;\ +> \n :set (\$DeviceInfo->\"serial-number\") \$devRbSerialNumber;\ +> \n :set (\$DeviceInfo->\"running-mode\") \$devRunning;\ +> \n :set (\$DeviceInfo->\"build-time\") \$devBuildTime;\ +1243,1246c1238,1241 +< ion;\r\ +< \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\r\ +< \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\r\ +< \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\r\ +--- +> ion;\ +> \n :set (\$DeviceInfo->\"running-version\") \$runningVersion;\ +> \n :set (\$DeviceInfo->\"running-channel\") \$runningChannel;\ +> \n :set (\$DeviceInfo->\"routerboard\") \$IsRouterBoard;\ +1248c1243 +< current-firmware\") ];\r\ +--- +> current-firmware\") ];\ +1250,1251c1245,1246 +< upgrade-firmware\") ];\r\ +< \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\r\ +--- +> upgrade-firmware\") ];\ +> \n :set (\$DeviceInfo->\"package-channel\") \$currentUpdateChannel;\ +1253,1254c1248,1249 +< alled-version\") ];\r\ +< \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\r\ +--- +> alled-version\") ];\ +> \n :set (\$DeviceInfo->\"latest-version\") \$ROsVerAvail;\ +1256,1280c1251,1275 +< ) ];\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\ +> \n :set arrDeviceInfo \$DeviceInfo;\ +> \n :return \$DeviceInfo;\ +> \n}\ +> \n\ +> \n:set DeviceInfo do={\ +> \n :global GetArrDeviceInfo;\ +> \n :global GlobalConfVersion;\ +> \n :global Identity;\ +> \n :global IfThenElse;\ +> \n :global FormatLine;\ +> \n :global CommitBrief;\ +> \n\ +> \n :local License [/system/license/get];\ +> \n :local Snmp [ /snmp/get ];\ +> \n :local Info [ \$GetArrDeviceInfo ];\ +> \n\ +> \n :if ([ :typeof \$Info ] != \"array\") do={\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :return ( \\\ +> \n [ \$FormatLine \"Hostname\" \$Identity ] . \"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\ +1282,1283c1277,1278 +< \_. \\\r\ +< \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ +--- +> \_. \\\ +> \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\ +1285,1286c1280,1281 +< \_\\\r\ +< \n \"Hardware:\\n\" . \\\r\ +--- +> \_\\\ +> \n \"Hardware:\\n\" . \\\ +1288c1283 +< \\\r\ +--- +> \\\ +1290,1294c1285,1289 +< 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\" . \\\ +> \n [ \$FormatLine \" Model\" (\$Info->\"model\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"revision\") ] > 0) \\\ +> \n (\" \" . (\$Info->\"revision\")) ] . \"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"serial-number\") ] > 0) \\\ +1296,1297c1291,1292 +< \\n\") ] . \\\r\ +< \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ +--- +> \\n\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\ +1299,1301c1294,1296 +< \")) ] . \"\\n\") ] . \\\r\ +< \n \"RouterOS:\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ +--- +> \")) ] . \"\\n\") ] . \\\ +> \n \"RouterOS:\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\ +1303c1298 +< \")) ] . \"\\n\") ] . \\\r\ +--- +> \")) ] . \"\\n\") ] . \\\ +1305c1300 +< \\n\" . \\\r\ +--- +> \\n\" . \\\ +1307,1308c1302,1303 +< \_\"\\n\" . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\r\ +--- +> \_\"\\n\" . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"running-channel\") ] > 0) \\\ +1310c1305 +< \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\r\ +--- +> \" (\" . (\$Info->\"running-channel\") . \")\") ] . \"\\n\") \\\ +1312,1313c1307,1308 +< \"\\n\") ] . \\\r\ +< \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\r\ +--- +> \"\\n\") ] . \\\ +> \n [ \$IfThenElse ([ :len (\$Info->\"latest-version\") ] > 0 && \\\ +1315c1310 +< \_\\\r\ +--- +> \_\\\ +1317,1318c1312,1313 +< \_\"\\n\") ] . \\\r\ +< \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\r\ +--- +> \_\"\\n\") ] . \\\ +> \n [ \$IfThenElse ((\$Info->\"routerboard\") = true && \\\ +1320c1315 +< ) \\\r\ +--- +> ) \\\ +1322,1327c1317,1322 +< \_\" -> \" . (\$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\ +--- +> \_\" -> \" . (\$Info->\"upgrade-firmware\")) ] . \"\\n\") ] . \\\ +> \n \"RouterOS-Scripts:\\n\" . \\\ +> \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\ +> \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\ +> \n}\ +> \n\ +1329,1332c1324,1327 +< tionFunctions ({})}\r\ +< \n\r\ +< \n:set GetRandom20CharAlNum do={\r\ +< \n :global EitherOr;\r\ +--- +> tionFunctions ({})}\ +> \n\ +> \n:set GetRandom20CharAlNum do={\ +> \n :global EitherOr;\ +1334,1336c1329,1331 +< FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ +< \n}\r\ +< \n\r\ +--- +> FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\ +> \n}\ +> \n\ +1338c1333 +< \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\r\ +--- +> \_\$EitherOr [ :tonum \$1 ] 20 ] from=\"0123456789abcdef\" ]; }\ +1340,1346c1335,1341 +< \_\$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\ +--- +> \_\$EitherOr [ :tonum \$1 ] 4294967295 ] ]; }\ +> \n\ +> \n:global checkRunJob;\ +> \n:set checkRunJob do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLock; \ +> \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\ +1348c1343 +< :set Job [ /system/script/job/get \$Job ];\r\ +--- +> :set Job [ /system/script/job/get \$Job ];\ +1350c1345 +< stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ +--- +> stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\ +1352,1379c1347,1374 +< 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\ +--- +> lse; \ +> \n}\ +> \n\ +> \n:set InspectVar do={\ +> \n :global InspectVarRet;\ +> \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\ +> \n}\ +> \n\ +> \n:set CommitBrief do={\ +> \n :global CommitId;\ +> \n :global CommitInfo;\ +> \n :if (\$CommitId = \"unknown\") do={\ +> \n :return \"unknown\";\ +> \n }\ +> \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\ +> \n}\ +> \n\ +> \n:set InspectVarRet do={\ +> \n :local Input \$1;\ +> \n :local Level (0 + [ :tonum \$2 ]);\ +> \n :global CharacterReplace;\ +> \n :global IfThenElse;\ +> \n :global InspectVarRet;\ +> \n :local IndentReturn do={\ +> \n :local Prefix [ :tostr \$1 ];\ +> \n :local Value [ :tostr \$2 ];\ +> \n :local Level [ :tonum \$3 ];\ +> \n :global CharacterMultiply;\ +1381,1404c1376,1399 +< 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\ +--- +> fix . \"-> \" . \$Value);\ +> \n }\ +> \n :local TypeOf [ :typeof \$Input ];\ +> \n :local Len [ :len \$Input ];\ +> \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\ +> \n :if (\$TypeOf = \"array\") do={\ +> \n :foreach Key,Value in=\$Input do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +> \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\ +> \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\ +> \n }\ +> \n } else={\ +> \n :if (\$TypeOf = \"str\") do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +> \n [ \$IndentReturn \"len\" \$Len \$Level ]);\ +> \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\ +> \n }\ +> \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\ +> \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\ +> \n }\ +> \n }\ +> \n :if (\$TypeOf != \"nothing\") do={\ +> \n :set \$Return (\$Return . \"\\n\" . \\\ +1406,1421c1401,1416 +< \_\\\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 ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\ +> \n }\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set GetPubIp do={\ +> \n :global DetectIpAddrDefault;\ +> \n :global DetectIpAddrFallback;\ +> \n\ +> \n :local PubIpAddr false;\ +> \n :local Url \$DetectIpAddrDefault;\ +> \n :local JobName [ :jobname ];\ +> \n\ +> \n :do {\ +1423c1418 +< ice: \" . \$Url . \"...\");\r\ +--- +> ice: \" . \$Url . \"...\");\ +1426c1421 +< )} \\\r\ +--- +> )} \\\ +1428,1429c1423,1424 +< detect public IP using default service: \" . \$Url . \".\")}\r\ +< \n } on-error={\r\ +--- +> detect public IP using default service: \" . \$Url . \".\")}\ +> \n } on-error={\ +1431,1432c1426,1427 +< ice: \" . \$Url . \".\");\r\ +< \n :set Url \$DetectIpAddrFallBack;\r\ +--- +> ice: \" . \$Url . \".\");\ +> \n :set Url \$DetectIpAddrFallBack;\ +1434c1429 +< vice: \" . \$Url . \"...\");\r\ +--- +> vice: \" . \$Url . \"...\");\ +1437c1432 +< )} \\\r\ +--- +> )} \\\ +1439,1441c1434,1436 +< \_detect public IP using fallback service: \" . \$Url . \".\")}\r\ +< \n };\r\ +< \n :local IpLen ([ :len \$PubIpAddr ] -1);\r\ +--- +> \_detect public IP using fallback service: \" . \$Url . \".\")}\ +> \n };\ +> \n :local IpLen ([ :len \$PubIpAddr ] -1);\ +1443,1457c1438,1452 +< {: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\ +--- +> {:set PubIpAddr [:pick \$PubIpAddr 0 \$IpLen]}\ +> \n :return \$PubIpAddr;\ +> \n}\ +> \n\ +> \n:set FormatLine do={\ +> \n :local Key [ :tostr \$1 ];\ +> \n :local Value [ :tostr \$2 ];\ +> \n :local Indent [ :tonum \$3 ];\ +> \n :local Spaces;\ +> \n :local Return \"\";\ +> \n :global CharacterMultiply;\ +> \n :global EitherOr;\ +> \n :set Indent [ \$EitherOr \$Indent 16 ];\ +> \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\ +> \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\ +1459c1454 +< n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ +--- +> n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\ +1461,1472c1456,1467 +< \$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\ +--- +> \$Return ]) ] . \$Value)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ParseCustom do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Start [:find [ \$Str ] [:tostr \$2]];\ +> \n :local End [ :tostr \$3 ];\ +> \n :local Num [ :tonum \$4 ];\ +> \n :local Return;\ +> \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\ +> \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \ +1474,1487c1469,1482 +< 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\ +--- +> lse={\ +> \n :set End [:find \$rest \$End];\ +> \n :set Return [:pick \$rest 0 \$End];\ +> \n }\ +> \n:return \$Return;\ +> \n}\ +> \n\ +> \n:set LogPrint do={\ +> \n :local Severity [ :tostr \$1 ];\ +> \n :local Name [ :tostr \$2 ];\ +> \n :local Message [ :tostr \$3 ];\ +> \n :global PrintDebug;\ +> \n :global PrintDebugOverride;\ +> \n :global EitherOr;\ +1489,1495c1484,1490 +< ];\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 PrintSeverity do={\ +> \n :global TerminalColorOutput;\ +> \n :if (\$TerminalColorOutput != true) do={:return \$1}\ +> \n :local Color { debug=96; info=97; warning=93; error=91 };\ +> \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\ +> \n}\ +1497,1502c1492,1496 +< \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 ~ (\"^(custom|debug|error|info)\\\$\")) do={\ +> \n :if (\$Severity = \"debug\") do={:log debug \$Log}\ +> \n :if (\$Severity = \"error\") do={:log error \$Log}\ +> \n :if (\$Severity = \"info\" ) do={:log info \$Log}\ +> \n } else={:log warning \$Log; :set Severity \"warning\"}\ +1504,1520c1498,1514 +< 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\ +--- +> erity \$Severity ] . \": \" . \$Message)}\ +> \n}\ +> \n\ +> \n:set CertificateAvailable do={\ +> \n :local CommonName [ :tostr \$1 ];\ +> \n :local UseFor [ :tostr \$2 ];\ +> \n\ +> \n :global CertificateDownload;\ +> \n :global ParseKeyValueStore;\ +> \n\ +> \n :if ([ :len \$UseFor ] = 0) do={\ +> \n :log warning (\$0 . \"The intended use is undefined!\");\ +> \n :set UseFor \"undefined\";\ +> \n }\ +> \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\ +> \n [ /certificate/settings/get crl-download ] = true && \\\ +> \n [ /certificate/settings/get crl-store ] = \"system\") do={\ +1522,1529c1516,1523 +< \\\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 \"is configured to download certificate CRLs to system!\");\ +> \n }\ +> \n :if ([ :len \$CommonName ] = 0) do={\ +> \n :log warning (\$0 . \"No CommonName given!\");\ +> \n :return false;\ +> \n }\ +> \n :local CertSettings [ /certificate/settings/get ];\ +1531,1533c1525,1526 +< \r\ +< \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ +< \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ +--- +> \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\ +> \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\ +1535,1537c1528,1530 +< \_] ] > 0) do={\r\ +< \n :return true;\r\ +< \n }\r\ +--- +> \_] ] > 0) do={\ +> \n :return true;\ +> \n }\ +1539c1532 +< ) do={\r\ +--- +> ) do={\ +1541,1545c1534,1538 +< \"' not available.\");\r\ +< \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +--- +> \"' not available.\");\ +> \n :if ([ \$CertificateDownload \$CommonName ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +1547c1540 +< ) do={\r\ +--- +> ) do={\ +1549,1551c1542,1544 +< \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ +< \n :return true;\r\ +< \n }\r\ +--- +> \_CommonName '\" . \$CommonName . \"'. Should be ok.\");\ +> \n :return true;\ +> \n }\ +1553c1546 +< e ] ];\r\ +--- +> e ] ];\ +1555c1548 +< ertVal->\"skid\")) do={\r\ +--- +> ertVal->\"skid\")) do={\ +1557c1550 +< \_= 0) do={\r\ +--- +> \_= 0) do={\ +1559c1552 +< >\"CN\");\r\ +--- +> >\"CN\");\ +1561,1565c1554,1558 +< is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ +< \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\r\ +< \n :return false;\r\ +< \n }\r\ +< \n }\r\ +--- +> is incomplete, missing '\" . \$IssuerCN . \"'.\");\ +> \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +1567,1581c1560,1574 +< \") ] ];\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 }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CertificateDownload do={\ +> \n :local CommonName [ :tostr \$1 ];\ +> \n :global ScriptUpdatesBaseUrl;\ +> \n :global ScriptUpdatesUrlSuffix;\ +> \n :global CertificateNameByCN;\ +> \n :global CleanName;\ +> \n :global FetchUserAgentStr;\ +> \n :global RmFile;\ +> \n :global WaitForFile;\ +> \n\ +1583,1586c1576,1578 +< \r\ +< \n \"CommonName '\" . \$CommonName . \"'.\");\r\ +< \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ +< \n :do {\r\ +--- +> \n \"CommonName '\" . \$CommonName . \"'.\");\ +> \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\ +> \n :do {\ +1588c1580 +< -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +--- +> -field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +1590,1593c1582,1585 +< sUrlSuffix) \\\r\ +< \n dst-path=\$FileName as-value;\r\ +< \n \$WaitForFile \$FileName;\r\ +< \n } on-error={\r\ +--- +> sUrlSuffix) \\\ +> \n dst-path=\$FileName as-value;\ +> \n \$WaitForFile \$FileName;\ +> \n } on-error={\ +1595,1598c1587,1590 +< e '\" . \$CommonName . \\\r\ +< \n \"' from repository! Trying fallback to mkcert.org...\");\r\ +< \n :do {\r\ +< \n :local CertSettings [ /certificate/settings/get ];\r\ +--- +> e '\" . \$CommonName . \\\ +> \n \"' from repository! Trying fallback to mkcert.org...\");\ +> \n :do {\ +> \n :local CertSettings [ /certificate/settings/get ];\ +1600c1592 +< \_] ] = 0 && \\\r\ +--- +> \_] ] = 0 && \\\ +1602c1594 +< || \\\r\ +--- +> || \\\ +1604c1596 +< \\\r\ +--- +> \\\ +1606d1597 +< \r\ +1608c1599 +< \_Root X1\" ] ] > 0)) do={\r\ +--- +> \_Root X1\" ] ] > 0)) do={\ +1610,1612c1601,1602 +< \r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \n :return false;\ +> \n }\ +1614c1604 +< er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\r\ +--- +> er-field=({ [ \$FetchUserAgentStr \$0 ] }) \\\ +1616,1623c1606,1613 +< 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 ({ \$CommonName }) ] \\\ +> \n dst-path=\$FileName as-value;\ +> \n \$WaitForFile \$FileName;\ +> \n :if ([ /file/get \$FileName size ] = 0) do={\ +> \n \$RmFile \$FileName;\ +> \n :error false;\ +> \n }\ +> \n } on-error={\ +1625,1631c1615,1621 +< 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\ +--- +> e '\" . \$CommonName . \"'!\");\ +> \n :return false;\ +> \n }\ +> \n }\ +> \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\ +> \n :delay 1s;\ +> \n \$RmFile \$FileName;\ +1633c1623 +< ) do={\r\ +--- +> ) do={\ +1635c1625 +< +\\\$\") ];\r\ +--- +> +\\\$\") ];\ +1637,1639c1627,1629 +< e . \"' still unavailable!\");\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> e . \"' still unavailable!\");\ +> \n :return false;\ +> \n }\ +1641,1649c1631,1639 +< \"_[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\ +--- +> \"_[0-9]+\\\$\") ] do={\ +> \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CertificateNameByCN do={\ +> \n :local Match [ :tostr \$1 ];\ +> \n :global CleanName;\ +1651,1676c1641,1666 +< 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\ +--- +> rint=\$Match or name=\$Match) ]->0);\ +> \n :if ([ :len \$Cert ] = 0) do={\ +> \n :log warning (\$0 .\" No matching certificate found.\");\ +> \n :return false;\ +> \n }\ +> \n :local CommonName [ /certificate/get \$Cert common-name ];\ +> \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set CharacterMultiply do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Num [ :tonum \$2 ];\ +> \n :if (\$Num = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set FileExists do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :local Type [ :tostr \$2 ];\ +> \n :global FileGet;\ +> \n :local FileVal [ \$FileGet \$FileName ];\ +> \n :if (\$FileVal = false) do={ :return false; }\ +> \n :if ([ :len (\$FileVal->\"size\") ] = 0) do={ :return false; }\ +1678,1684c1668,1674 +< \_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\ +--- +> \_true; }\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set Grep do={\ +> \n :local Input ([ :tostr \$1 ] . \"\\n\");\ +> \n :local Pattern [ :tostr \$2 ];\ +1686,1688c1676,1678 +< }\r\ +< \n :do {\r\ +< \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ +--- +> }\ +> \n :do {\ +> \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\ +1690c1680 +< \$Line}\r\ +--- +> \$Line}\ +1692,1714c1682,1704 +< 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\ +--- +> Input ] ];\ +> \n } while=([ :len \$Input ] > 0);\ +> \n :return [];\ +> \n}\ +> \n\ +> \n:set HumanReadableNum do={\ +> \n :local Input [ :tonum \$1 ];\ +> \n :local Base [ :tonum \$2 ];\ +> \n :global EitherOr;\ +> \n :global IfThenElse;\ +> \n :local Prefix \"kMGTPE\";\ +> \n :local Pow 1;\ +> \n :set Base [ \$EitherOr \$Base 1024 ];\ +> \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\ +> \n :if (\$Input < \$Base) do={:return \$Input}\ +> \n :for I from=0 to=[ :len \$Prefix ] do={\ +> \n :set Pow (\$Pow * \$Base);\ +> \n :if (\$Input / \$Base < \$Pow) do={\ +> \n :set Prefix [ :pick \$Prefix \$I ];\ +> \n :local Tmp1 (\$Input * 100 / \$Pow);\ +> \n :local Tmp2 (\$Tmp1 / 100);\ +> \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\ +> \n :return (\$Tmp2 . \".\" . \\\ +1716,1738c1706,1731 +< 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\ +--- +> 2 ] + 1) ] . \\\ +> \n \$Prefix . \$Bin);\ +> \n }\ +> \n }\ +> \n}\ +> \n\ +> \n:set CleanFilePath do={\ +> \n :local Path [ :tostr \$1 ];\ +> \n :global CharacterReplace;\ +> \n :while (\$Path ~ \"//\") do={\ +> \n :set \$Path [ \$CharacterReplace \$Path \"//\" \"/\" ];\ +> \n }\ +> \n :if ([ :pick \$Path 0 ] = \"/\") do={\ +> \n :set Path [ :pick \$Path 1 [ :len \$Path ] ];\ +> \n }\ +> \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={\ +> \n :set Path [ :pick \$Path 0 ([ :len \$Path ] - 1) ];\ +> \n }\ +> \n :return \$Path;\ +> \n}\ +> \n\ +> \n:set CleanName do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :local Return \"\";\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +1740,1755c1733,1753 +< 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\ +--- +> stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ +> \n :do { :if ([ :len \$Return ] = 0) do={ :error true; } }\ +> \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={ :e\ +> rror true; }\ +> \n :set Char \"-\";\ +> \n } on-error={\ +> \n :set Char \"\";\ +> \n }\ +> \n }\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set RandomDelay do={\ +> \n :local Time [ :tonum \$1 ];\ +> \n :local Unit [ :tostr \$2 ];\ +> \n :global EitherOr;\ +> \n :global GetRandomNumber;\ +> \n :global MAX;\ +> \n :if (\$Time = 0) do={:return false}\ +1757,1778c1755,1776 +< [ \$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\ +--- +> [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\ +> \n}\ +> \n\ +> \n:set EscapeForRegEx do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +> \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ExitError do={\ +> \n :local ExitOK [ :tostr \$1 ];\ +> \n :local Name [ :tostr \$2 ];\ +> \n :local Error [ :tostr \$3 ];\ +> \n :global IfThenElse;\ +> \n :if (\$ExitOK = \"false\") do={\ +1780c1778 +< \\\r\ +--- +> \\\ +1782c1780 +< ror\" . \\\r\ +--- +> ror\" . \\\ +1784,1791c1782,1789 +< \$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\ +--- +> \$Error) \".\" ]);\ +> \n }\ +> \n}\ +> \n\ +> \n:set ExitOnError do={\ +> \n :local Name [ :tostr \$1 ];\ +> \n :local Error [ :tostr \$2 ];\ +> \n :global IfThenElse;\ +1793c1791 +< \\\$\") \\\r\ +--- +> \\\$\") \\\ +1795c1793 +< r\" . \\\r\ +--- +> r\" . \\\ +1797,1808c1795,1806 +< rror) \".\" ]);\r\ +< \n}\r\ +< \n\r\ +< \n:set MiniDateTimeStamp do={\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\ +--- +> rror) \".\" ]);\ +> \n}\ +> \n\ +> \n:set MiniDateTimeStamp do={\ +> \n /system/clock;\ +> \n :local vdate [get date];\ +> \n :local vtime [get time];\ +> \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\ +> \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\ +> \n :local M [:tonum \$MM];\ +> \n :if (\$vdate ~ \".../../....\") do={\ +> \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\ +1810,1869c1808,1867 +< 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 :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\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\ +--- +> PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\ +> \n :if (\$M>12) do={:set M (\$M - 12)}\ +> \n :set MM [:pick (100 + \$M) 1 3];\ +> \n }\ +> \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\ +> \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\ +> \n :local HH [:pick \$vtime 0 2];\ +> \n :local mm [:pick \$vtime 3 5];\ +> \n :local ss [:pick \$vtime 6 8];\ +> \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\ +> \n}\ +> \n\ +> \n:set WaitForFile do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :local WaitTime [ :totime \$2 ];\ +> \n :global CleanFilePath;\ +> \n :global EitherOr;\ +> \n :global MAX;\ +> \n :set FileName [ \$CleanFilePath \$FileName ];\ +> \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\ +> \n :do {\ +> \n :retry {\ +> \n /file/get \$FileName;\ +> \n :return true;\ +> \n } delay=\$Delay max=10;\ +> \n } on-error={ }\ +> \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\ +> \n :do {\ +> \n /file/get \$FileName;\ +> \n :return true;\ +> \n } on-error={ }\ +> \n :delay \$Delay;\ +> \n :set Delay (\$Delay * 3 / 2);\ +> \n }\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set FileGet do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :global WaitForFile;\ +> \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n :local FileVal false;\ +> \n :do {\ +> \n :set FileVal [ /file/get \$FileName ];\ +> \n } on-error={ }\ +> \n :return \$FileVal;\ +> \n}\ +> \n\ +> \n:set RmDir do={\ +> \n :local DirName [ :tostr \$1 ];\ +> \n :global FileGet;\ +> \n :log debug (\$0 . \" Removing directory: \". \$DirName);\ +> \n :local DirVal [ \$FileGet \$DirName ];\ +> \n :if (\$DirVal = false) do={\ +> \n :log debug (\$0 . \" ... which does not exist.\");\ +> \n :return true;\ +> \n };\ +> \n :if (\$DirVal->\"type\" != \"directory\") do={\ +1871,1876c1869,1874 +< ory.\");\r\ +< \n :return false;\r\ +< \n };\r\ +< \n :onerror Err {\r\ +< \n /file/remove \$DirName;\r\ +< \n } do={\r\ +--- +> ory.\");\ +> \n :return false;\ +> \n };\ +> \n :onerror Err {\ +> \n /file/remove \$DirName;\ +> \n } do={\ +1878,1892c1876,1890 +< : \" . \$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\ +--- +> : \" . \$Err);\ +> \n :return false;\ +> \n };\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set RmFile do={\ +> \n :local FileName [ :tostr \$1 ];\ +> \n :global FileGet;\ +> \n :log debug (\$0 . \" Removing file: \". \$FileName);\ +> \n :local FileVal [ \$FileGet \$FileName ];\ +> \n :if (\$FileVal = false) do={\ +> \n :log debug (\$0 . \" ... which does not exist.\");\ +> \n :return true;\ +> \n }\ +1894c1892 +< sk\") do={\r\ +--- +> sk\") do={\ +1896,1901c1894,1898 +< \r\ +< \n :return false;\r\ +< \n }\r\ +< \n :onerror Err {\r\ +< \n /file/remove \$FileName;\r\ +< \n } do={\r\ +--- +> \n :return false;\ +> \n }\ +> \n :onerror Err {\ +> \n /file/remove \$FileName;\ +> \n } do={\ +1903,1927c1900,1924 +< \_. \$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\ +--- +> \_. \$Err); :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set MkDir do={\ +> \n :local Path [ :tostr \$1 ];\ +> \n :global CleanFilePath;\ +> \n :global FileGet;\ +> \n :global RmDir;\ +> \n :global WaitForFile;\ +> \n\ +> \n :local MkTmpfs do={\ +> \n :global WaitForFile;\ +> \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\ +> \n :if ([ :len \$TmpFs ] = 1) do={\ +> \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\ +> \n :log info (\$0 . \" The tmpfs is disabled, enabling.\");\ +> \n /disk/enable \$TmpFs;\ +> \n }\ +> \n :return true;\ +> \n }\ +> \n :log info (\$0 . \" Creating disk of type tmpfs.\");\ +> \n \$RmDir \"tmpfs\";\ +> \n :onerror Err {\ +1929,1931c1926,1928 +< /get total-memory ] / 3);\r\ +< \n \$WaitForFile \"tmpfs\";\r\ +< \n } do={\r\ +--- +> /get total-memory ] / 3);\ +> \n \$WaitForFile \"tmpfs\";\ +> \n } do={\ +1933,1956c1930,1953 +< 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\ +--- +> Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n }\ +> \n :set Path [ \$CleanFilePath \$Path ];\ +> \n :if (\$Path = \"\") do={\ +> \n :return true;\ +> \n }\ +> \n :log debug (\$0 . \" Making directory: \" . \$Path);\ +> \n :local PathVal [ \$FileGet \$Path ];\ +> \n :if (\$PathVal->\"type\" = \"directory\") do={\ +> \n :log debug (\$0 . \" ... which already exists.\");\ +> \n :return true;\ +> \n }\ +> \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\ +> \n :if ([ \$MkTmpfs ] = false) do={\ +> \n :return false;\ +> \n }\ +> \n }\ +> \n :onerror Err {\ +> \n /file/add type=\"directory\" name=\$Path;\ +> \n \$WaitForFile \$Path;\ +> \n } do={\ +1958,1985c1955,1982 +< \" . \$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\ +--- +> \" . \$Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\ +> \n :return \$2;\ +> \n}\ +> \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\ +> \n :return \$2;\ +> \n}\ +> \n\ +> \n:set CharacterMultiply do={\ +> \n :local Str [ :tostr \$1 ];\ +> \n :local Num [ :tonum \$2 ];\ +> \n :if (\$Num = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set CharacterReplace do={\ +> \n :local String [ :tostr \$1 ];\ +> \n :local ReplaceFrom [ :tostr \$2 ];\ +> \n :local ReplaceWith [ :tostr \$3 ];\ +> \n :local Return \"\";\ +> \n :if (\$ReplaceFrom = \"\") do={:return \$String}\ +1987,1988c1984 +< \r\ +< \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ +--- +> \n :local Pos [ :find \$String \$ReplaceFrom ];\ +1990d1985 +< \r\ +1992,1997c1987,2024 +< \_\$String ] ];\r\ +< \n }\r\ +< \n :return (\$Return . \$String);\r\ +< \n}\r\ +< \n\r\ +< \n:set IfThenElse do={\r\ +--- +> \_\$String ] ];\ +> \n }\ +> \n :return (\$Return . \$String);\ +> \n}\ +> \n\ +> \n:set CleanFilePath do={\ +> \n :local Path [ :tostr \$1 ];\ +> \n :global CharacterReplace;\ +> \n :while (\$Path ~ \"//\") do={ :set \$Path [ \$CharacterReplace \$Path \ +> \"//\" \"/\" ]; }\ +> \n :if ([ :pick \$Path 0 ] = \"/\") do={ :set Path [ :pick \$Path 1 [ :le\ +> n \$Path ] ]; }\ +> \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={ :set Path [ \ +> :pick \$Path 0 ([ :len \$Path ] - 1) ]; }\ +> \n :return \$Path;\ +> \n}\ +> \n\ +> \n:set CleanName do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :local Return \"\";\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +> \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ +> stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\ +> \n :do { :if ([ :len \$Return ] = 0) do={ :error true; } }\ +> \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={ :e\ +> rror true; }\ +> \n :set Char \"-\";\ +> \n } on-error={\ +> \n :set Char \"\";\ +> \n }\ +> \n }\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set IfThenElse do={\ +1999,2004c2026,2031 +< \$2};\r\ +< \n :return \$3;\r\ +< \n}\r\ +< \n\r\ +< \n:set EitherOr do={\r\ +< \n :global IfThenElse;\r\ +--- +> \$2};\ +> \n :return \$3;\ +> \n}\ +> \n\ +> \n:set EitherOr do={\ +> \n :global IfThenElse;\ +2006c2033 +< \$1 \$2 ]}\r\ +--- +> \$1 \$2 ]}\ +2008,2019c2035,2046 +< \_\$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\ +--- +> \_\$1 \$2 ]}\ +> \n# this works for boolean values, literal ones with parentheses\ +> \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\ +> \n}\ +> \n\ +> \n:set ParseKeyValueStore do={\ +> \n :local Source \$1;\ +> \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\ +> \n :do {\ +> \n :return [ :deserialize from=json \$Source ];\ +> \n } on-error={ }\ +> \n } \ +2021,2025c2048,2052 +< }\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 Result ({});\ +> \n :foreach KeyValue in=[ :toarray \$Source ] do={\ +> \n :if ([ :find \$KeyValue \"=\" ]) do={\ +> \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\ +2027,2040c2054,2067 +< \_: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\ +--- +> \_:len \$KeyValue ] ];\ +> \n :if (\$Value=\"true\") do={:set Value true}\ +> \n :if (\$Value=\"false\") do={:set Value false}\ +> \n :set (\$Result->\$Key) \$Value;\ +> \n } else={:set (\$Result->\$KeyValue) true}\ +> \n }\ +> \n :return \$Result;\ +> \n}\ +> \n:set RequiredRouterOS do={\ +> \n :local Caller [ :tostr \$1 ];\ +> \n :local Required [ :tostr \$2 ];\ +> \n :local Warn [ :tostr \$3 ];\ +> \n :global IfThenElse;\ +> \n :global VersionToNum;\ +2042,2045c2069,2072 +< \\\$\")) do={\r\ +< \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\r\ +< \n :return false;\r\ +< \n }\r\ +--- +> \\\$\")) do={\ +> \n :log error (\$0 . \" No valid RouterOS version: \" . \$Required);\ +> \n :return false;\ +> \n }\ +2047,2048c2074,2075 +< e/update/get installed-version ] ]) do={\r\ +< \n :if (\$Warn = \"true\") do={\r\ +--- +> e/update/get installed-version ] ]) do={\ +> \n :if (\$Warn = \"true\") do={\ +2050c2077 +< 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ +--- +> 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\ +2052,2077c2079,2104 +< 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\ +--- +> es RouterOS \" . \$Required . \". Please update!\");\ +> \n }\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set ValidateSyntax do={\ +> \n :local Code [ :tostr \$1 ];\ +> \n :global LogPrint;\ +> \n :onerror Err {\ +> \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\ +> \n } do={\ +> \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\ +> \n :return false;\ +> \n }\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set VersionToNum do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :local Multi 0x1000000;\ +> \n :local Return 0;\ +> \n :global CharacterReplace;\ +> \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\ +> \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\ +2079,2088c2106,2114 +< \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 }\ +> \n :foreach Value in=([ :toarray \$Input ], 0) do={\ +> \n :local Num [ :tonum \$Value ];\ +> \n :if (\$Multi = 0x100) do={\ +> \n :if ([ :typeof \$Num ] = \"num\") do={\ +> \n :set Return (\$Return + 0xff00);\ +> \n :set Multi (\$Multi / 0x100);\ +> \n } else={\ +> \n :if (\$Value = \"zero\") do={ }\ +2090c2116 +< }\r\ +--- +> }\ +2092,2095c2118,2120 +< \r\ +< \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ +< \n }\r\ +< \n }\r\ +--- +> \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\ +> \n }\ +> \n }\ +2097,2116c2122,2141 +< 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\ +--- +> lue * \$Multi)); }\ +> \n :set Multi (\$Multi / 0x100);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set ScriptLock do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local WaitMax [ :totime \$2 ];\ +> \n :global GetRandom20CharAlNum;\ +> \n :global IfThenElse;\ +> \n :global ScriptLockOrder;\ +> \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\ +> \n :set ScriptLockOrder ({});\ +> \n }\ +> \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n }\ +> \n :local JobCount do={\ +> \n :local Script [ :tostr \$1 ];\ +2118,2124c2143,2148 +< \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 }\ +> \n :local TicketCount do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLockOrder;\ +> \n :local Count 0;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +2126,2135c2150,2159 +< + 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\ +--- +> + 1)}\ +> \n }\ +> \n :return \$Count;\ +> \n }\ +> \n :local IsFirstTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Check [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :if (\$Ticket = \$Check) do={:return true}\ +2137,2148c2161,2172 +< 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\ +--- +> o={:return false}\ +> \n }\ +> \n :return false;\ +> \n }\ +> \n :local AddTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Add [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :while (true) do={\ +> \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\ +> \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\ +> \n :delay 10ms;\ +2150,2173c2174,2197 +< 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\ +--- +> e}\ +> \n }\ +> \n }\ +> \n :local RemoveTicket do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :local Remove [ :tostr \$2 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\ +> \n :set (\$ScriptLockOrder->\$Script->\$Id);\ +> \n :delay 10ms;\ +> \n }\ +> \n }\ +> \n }\ +> \n :local CleanupTickets do={\ +> \n :local Script [ :tostr \$1 ];\ +> \n :global ScriptLockOrder;\ +> \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\ +> \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\ +> \n }\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n }\ +> \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\ +> \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ +2175,2178c2199,2202 +< ist!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$JobCount \$Script ] = 0) do={\r\ +--- +> ist!\");\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$JobCount \$Script ] = 0) do={\ +2180,2183c2204,2207 +< );\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ +--- +> );\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\ +2185,2205c2209,2229 +< 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\ +--- +> t . \"', resetting!\");\ +> \n :set (\$ScriptLockOrder->\$Script) ({});\ +> \n /system/script/job/remove [ find where script=\$Script ];\ +> \n }\ +> \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\ +> \n \$AddTicket \$Script \$MyTicket;\ +> \n :local WaitInterval (\$WaitMax / 20);\ +> \n :local WaitTime \$WaitMax;\ +> \n :while (\$WaitTime > 0 && \\\ +> \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\ +> \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\ +> \n :set WaitTime (\$WaitTime - \$WaitInterval);\ +> \n :delay \$WaitInterval;\ +> \n }\ +> \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\ +> \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\ +> \n \$RemoveTicket \$Script \$MyTicket;\ +> \n \$CleanupTickets \$Script;\ +> \n :return true;\ +> \n }\ +> \n \$RemoveTicket \$Script \$MyTicket;\ +2207c2231 +< once\" . \\\r\ +--- +> once\" . \\\ +2209,2214c2233,2238 +< \_lock\" \"\" ] . \"...\");\r\ +< \n :return false;\r\ +< \n}\r\ +< \n\r\ +< \n:set SendNotification do={ :onerror Err {\r\ +< \n :global SendNotification2;\r\ +--- +> \_lock\" \"\" ] . \"...\");\ +> \n :return false;\ +> \n}\ +> \n\ +> \n:set SendNotification do={ :onerror Err {\ +> \n :global SendNotification2;\ +2216,2223c2240,2247 +< \_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\ +--- +> \_silent=\$4 });\ +> \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\ +> \n}\ +> \n\ +> \n:set SendNotification2 do={\ +> \n :local Notification \$1;\ +> \n :global NotificationFunctions;\ +> \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\ +2225,2276c2249,2300 +< 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\ +--- +> ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\ +> \n }\ +> \n}\ +> \n\ +> \n:set SymbolByUnicodeName do={\ +> \n :local Name [ :tostr \$1 ];\ +> \n :global EitherOr;\ +> \n :global SymbolsExtra;\ +> \n :local Symbols ({\ +> \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\ +> \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\ +> \n \"arrow-down\"=\"\\E2\\AC\\87\";\ +> \n \"arrow-up\"=\"\\E2\\AC\\86\";\ +> \n \"calendar\"=\"\\F0\\9F\\93\\85\";\ +> \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\ +> \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\ +> \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\ +> \n \"cloud\"=\"\\E2\\98\\81\";\ +> \n \"cross-mark\"=\"\\E2\\9D\\8C\";\ +> \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\ +> \n \"fire\"=\"\\F0\\9F\\94\\A5\";\ +> \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\ +> \n \"gear\"=\"\\E2\\9A\\99\";\ +> \n \"heart\"=\"\\E2\\99\\A5\";\ +> \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\ +> \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\ +> \n \"information\"=\"\\E2\\84\\B9\";\ +> \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\ +> \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\ +> \n \"link\"=\"\\F0\\9F\\94\\97\";\ +> \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\ +> \n \"memo\"=\"\\F0\\9F\\93\\9D\";\ +> \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\ +> \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\ +> \n \"scissors\"=\"\\E2\\9C\\82\";\ +> \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\ +> \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\ +> \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\ +> \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\ +> \n \"sparkles\"=\"\\E2\\9C\\A8\";\ +> \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\ +> \n \"star\"=\"\\E2\\AD\\90\";\ +> \n \"warning-sign\"=\"\\E2\\9A\\A0\";\ +> \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\ +> \n }, \$SymbolsExtra);\ +> \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\ +> \n :local Special {\ +> \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\ +> \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\ +> \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\ +> \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\ +> \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\ +2278,2280c2302,2304 +< '!\");\r\ +< \n :return \"\";\r\ +< \n }\r\ +--- +> '!\");\ +> \n :return \"\";\ +> \n }\ +2282,2288c2306,2312 +< 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\ +--- +> me) ] . \"\\EF\\B8\\8F\");\ +> \n}\ +> \n\ +> \n:set SymbolForNotification do={\ +> \n :global NotificationsWithSymbols;\ +> \n :global SymbolByUnicodeName;\ +> \n :global IfThenElse;\ +2290,2291c2314,2315 +< \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ +< \n :local Return \"\";\r\ +--- +> \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\ +> \n :local Return \"\";\ +2293,2302c2317,2326 +< 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\ +--- +> mbolByUnicodeName \$Symbol ])}\ +> \n :return (\$Return . \" \");\ +> \n}\ +> \n\ +> \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\ +> \n:set UrlEncode do={\ +> \n :local Input [ :tostr \$1 ];\ +> \n :if ([ :len \$Input ] = 0) do={:return \"\"}\ +> \n :local Return \"\";\ +> \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\ +2304c2328 +< %24\"; \"%25\"; \"%26\"; \"%27\";\r\ +--- +> %24\"; \"%25\"; \"%26\"; \"%27\";\ +2306c2330 +< \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ +--- +> \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\ +2308,2311c2332,2335 +< \"%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\ +--- +> \"%7C\"; \"%7D\"; \"%7E\" };\ +> \n :for I from=0 to=([ :len \$Input ] - 1) do={\ +> \n :local Char [ :pick \$Input \$I ];\ +> \n :local Replace [ :find \$Chars \$Char ];\ +2313,2345c2337,2369 +< 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\ +--- +> ce)}\ +> \n :set Return (\$Return . \$Char);\ +> \n }\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set IsDNSResolving do={\ +> \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set IsFullyConnected do={\ +> \n :global IsDNSResolving;\ +> \n :global IsTimeSync;\ +> \n :if ([ \$IsDNSResolving ] = false) do={:return false};\ +> \n :if ([ \$IsTimeSync ] = false) do={:return false};\ +> \n :return true;\ +> \n}\ +> \n\ +> \n:set IsTimeSync do={\ +> \n :global IsTimeSyncCached;\ +> \n :global IsTimeSyncResetNtp;\ +> \n :if (\$IsTimeSyncCached = true) do={:return true}\ +> \n :if ([ /system/ntp/client/get enabled ] = true) do={\ +> \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\ +> \n :set IsTimeSyncCached true;\ +> \n :return true;\ +> \n }\ +> \n :local Uptime [ /system/resource/get uptime ];\ +> \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\ +> \n :set IsTimeSyncResetNtp \$Uptime;\ +> \n }\ +> \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\ +2347,2355c2371,2379 +< ;\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 :set IsTimeSyncResetNtp \$Uptime;\ +> \n /system/ntp/client/set enabled=no;\ +> \n :delay 20ms;\ +> \n /system/ntp/client/set enabled=yes;\ +> \n :return false;\ +> \n }\ +> \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\ +> \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\ +2357,2366c2381,2390 +< 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\ +--- +> ee license and x86.\";\ +> \n :return true;\ +> \n }\ +> \n :if ([ /ip/cloud/get update-time ] = true) do={\ +> \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\ +> \n :set IsTimeSyncCached true;\ +> \n :return true;\ +> \n }\ +> \n :return false;\ +> \n }\ +2368,2376c2392,2399 +< \r\ +< \n :return true;\r\ +< \n}\r\ +< \n\r\ +< \n# read parts of a large file\r\ +< \n# Description of parameters:\r\ +< \n# \$1 - script name for logging and user agent\r\ +< \n# \$2 - url to fetch from\r\ +< \n# \$3 - check-certificate value for /tool/fetch (true/false)\r\ +--- +> \n :return true;\ +> \n}\ +> \n\ +> \n# read parts of a large file\ +> \n# Description of parameters:\ +> \n# \$1 - script name for logging and user agent\ +> \n# \$2 - url to fetch from\ +> \n# \$3 - check-certificate value for /tool/fetch (true/false)\ +2378c2401 +< tps-only\", \"http-only\"\r\ +--- +> tps-only\", \"http-only\"\ +2380c2403 +< \_\"background-and-https-only\",\r\ +--- +> \_\"background-and-https-only\",\ +2383,2384c2406,2407 +< and-http-only\",\r\ +< \n# \"background-and-keep-broken-and-no-redirects\")\r\ +--- +> and-http-only\",\ +> \n# \"background-and-keep-broken-and-no-redirects\")\ +2386,2404c2409,2427 +< \"post\", \"put\", \"patch\", \"delete\")\r\ +< \n#:set FetchLargeFiles do={\r\ +< \n# :local RunName [:tostr \$1];\r\ +< \n# :local fetchUrl [:tostr \$2];\r\ +< \n# :local fetchFile [:tostr \$3];\r\ +< \n# :local CheckCert [:tostr \$4];\r\ +< \n# :local fetchMode [:tostr \$5];\r\ +< \n# :local fetchMethod [:tostr \$6];\r\ +< \n# :local tmpName;\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\ +--- +> \"post\", \"put\", \"patch\", \"delete\")\ +> \n#:set FetchLargeFiles do={\ +> \n# :local RunName [:tostr \$1];\ +> \n# :local fetchUrl [:tostr \$2];\ +> \n# :local fetchFile [:tostr \$3];\ +> \n# :local CheckCert [:tostr \$4];\ +> \n# :local fetchMode [:tostr \$5];\ +> \n# :local fetchMethod [:tostr \$6];\ +> \n# :local tmpName;\ +> \n# :global CleanName;\ +> \n# :global FetchUserAgentStr;\ +> \n# :global GetRandom20CharAlNum;\ +> \n# :global IfThenElse;\ +> \n# :global LogPrint;\ +> \n# :global MkDir;\ +> \n# :global RmDir;\ +> \n# :global RmFile;\ +> \n# :global WaitForFile;\ +> \n#\ +2406,2410c2429,2433 +< without-crl\" ];\r\ +< \n#\r\ +< \n# :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\r\ +< \n# :local DirName (\"tmpfs/\" . \$tmpName);\r\ +< \n# :if ([ \$MkDir \$DirName ] = false) do={\r\ +--- +> without-crl\" ];\ +> \n#\ +> \n# :set tmpName (\$CleanName \"tmp-\" . [ \$GetRandom20CharAlNum 6 ]);\ +> \n# :local DirName (\"tmpfs/\" . \$tmpName);\ +> \n# :if ([ \$MkDir \$DirName ] = false) do={\ +2412,2415c2435,2438 +< e . \"!\");\r\ +< \n# :return false;\r\ +< \n# }\r\ +< \n#\r\ +--- +> e . \"!\");\ +> \n# :return false;\ +> \n# }\ +> \n#\ +2417,2419c2440,2442 +< -\" . [ \$GetRandom20CharAlNum 5 ]);\r\ +< \n# :local Url (\$fetchUrl . \$fetchFile);\r\ +< \n# :onerror Err {\r\ +--- +> -\" . [ \$GetRandom20CharAlNum 5 ]);\ +> \n# :local Url (\$fetchUrl . \$fetchFile);\ +> \n# :onerror Err {\ +2421c2444 +< \_\\\r\ +--- +> \_\\\ +2423,2427c2446,2450 +< e;\r\ +< \n# } do={\r\ +< \n# :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ +< \n# \$RmFile \$FileName;\r\ +< \n# }\r\ +--- +> e;\ +> \n# } do={\ +> \n# :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +> \n# \$RmFile \$FileName;\ +> \n# }\ +2429,2434c2452,2457 +< ' - \" . \$Err);\r\ +< \n# \$RmDir \$DirName;\r\ +< \n# :return false;\r\ +< \n# }\r\ +< \n#\r\ +< \n# :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ +--- +> ' - \" . \$Err);\ +> \n# \$RmDir \$DirName;\ +> \n# :return false;\ +> \n# }\ +> \n#\ +> \n# :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +2436,2443c2459,2466 +< \"' 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\ +--- +> \"' did not show up.\");\ +> \n# :return false;\ +> \n# }\ +> \n# \ +> \n# :local FileSize [ /file/get \$FileName size ];\ +> \n# :local Return \"\";\ +> \n# :local VarSize 0;\ +> \n# :while (\$VarSize != \$FileSize) do={\ +2445,2471c2468,2494 +< 2768 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## \$RmFile \$FileName;\r\ +< \n# \$RmDir \$DirName;\r\ +< \n# :return \$Return;\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\ +--- +> 2768 file=\$FileName as-value ]->\"data\"));\ +> \n# :set FileSize [ /file/get \$FileName size ];\ +> \n# :set VarSize [ :len \$Return ];\ +> \n# :if (\$VarSize > \$FileSize) do={\ +> \n# :delay 100ms;\ +> \n# }\ +> \n# }\ +> \n## \$RmFile \$FileName;\ +> \n# \$RmDir \$DirName;\ +> \n# :return \$Return;\ +> \n#}\ +> \n\ +> \n:set FetchHugeFiles do={\ +> \n :local ScriptName [ :tostr \$1 ];\ +> \n :local Url [ :tostr \$2 ];\ +> \n :local CheckCert [ :tostr \$3 ];\ +> \n\ +> \n :global CleanName;\ +> \n :global FetchUserAgentStr;\ +> \n :global GetRandom20CharAlNum;\ +> \n :global IfThenElse;\ +> \n :global LogPrint;\ +> \n :global MkDir;\ +> \n :global RmDir;\ +> \n :global RmFile;\ +> \n :global WaitForFile;\ +> \n\ +2473,2480c2496,2503 +< 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\ +--- +> ithout-crl\" ];\ +> \n\ +> \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\ +> \n :if ([ \$MkDir \$DirName ] = false) do={\ +> \n \$LogPrint error \$0 (\"Failed creating directory!\");\ +> \n :return false;\ +> \n }\ +> \n\ +2482,2483c2505,2506 +< \$GetRandom20CharAlNum ]);\r\ +< \n :onerror Err {\r\ +--- +> \$GetRandom20CharAlNum ]);\ +> \n :onerror Err {\ +2485c2508 +< \\\r\ +--- +> \\\ +2487,2491c2510,2514 +< lue;\r\ +< \n } do={\r\ +< \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ +< \n \$RmFile \$FileName;\r\ +< \n }\r\ +--- +> lue;\ +> \n } do={\ +> \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\ +> \n \$RmFile \$FileName;\ +> \n }\ +2493,2498c2516,2521 +< \_. \$Err);\r\ +< \n \$RmDir \$DirName;\r\ +< \n :return false;\r\ +< \n }\r\ +< \n\r\ +< \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ +--- +> \_. \$Err);\ +> \n \$RmDir \$DirName;\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\ +2500,2507c2523,2530 +< \_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\ +--- +> \_not show up.\");\ +> \n :return false;\ +> \n }\ +> \n\ +> \n :local FileSize [ /file/get \$FileName size ];\ +> \n :local Return \"\";\ +> \n :local VarSize 0;\ +> \n :while (\$VarSize != \$FileSize) do={\ +2509,2525c2532,2548 +< 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\ +--- +> 768 file=\$FileName as-value ]->\"data\"));\ +> \n :set FileSize [ /file/get \$FileName size ];\ +> \n :set VarSize [ :len \$Return ];\ +> \n :if (\$VarSize > \$FileSize) do={\ +> \n :delay 100ms;\ +> \n }\ +> \n }\ +> \n \$RmDir \$DirName;\ +> \n :return \$Return;\ +> \n}\ +> \n\ +> \n:set FetchUserAgentStr do={\ +> \n :local Caller [ :tostr \$1 ];\ +> \n :global GlobalScriptsUrl;\ +> \n :global CommitBrief;\ +> \n :global IfThenElse;\ +> \n :local Resource [ /system/resource/get ];\ +2527c2550 +< \_\$Resource->\"architecture-name\" . \\\r\ +--- +> \_\$Resource->\"architecture-name\" . \\\ +2529,2558c2552,2581 +< 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\ +--- +> CommitBrief ] . \")\");\ +> \n}\ +> \n\ +> \n:set ScriptInstallUpdate do={ :onerror Err {\ +> \n :local Scripts [ :toarray \$1 ];\ +> \n :local NewComment [ :tostr \$2 ];\ +> \n :global InitSetup;\ +> \n\ +> \n :global CommitId;\ +> \n :global ScriptUpdatesCRLF;\ +> \n :global GlobalConfVersion;\ +> \n :global Identity;\ +> \n :global CertificateAvailable;\ +> \n :global CheckSumsVerify;\ +> \n :global GlobalScriptsUrl;\ +> \n :global SumsDirAndFileName;\ +> \n :global GlobalScriptsUrlSuffix;\ +> \n :global EitherOr;\ +> \n :global FetchUserAgentStr;\ +> \n :global Grep;\ +> \n :global IfThenElse;\ +> \n :global LogPrint;\ +> \n :global ParseKeyValueStore;\ +> \n :global RequiredRouterOS;\ +> \n :global SendNotification2;\ +> \n :global SymbolForNotification;\ +> \n :global ValidateSyntax;\ +> \n :global CommentsInScripts;\ +> \n\ +> \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\ +2560,2563c2583,2586 +< hout.\");\r\ +< \n }\r\ +< \n\r\ +< \n :foreach Script in=\$Scripts do={\r\ +--- +> hout.\");\ +> \n }\ +> \n\ +> \n :foreach Script in=\$Scripts do={\ +2565,2566c2588 +< \r\ +< \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ +--- +> \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\ +2568,2579c2590,2601 +< 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\ +--- +> Vados\\n\" comment=\$NewComment;\ +> \n }\ +> \n }\ +> \n\ +> \n :local CommitIdBefore \$CommitId;\ +> \n :local GlobalConfVersionBefore \$GlobalConfVersion;\ +> \n :local ReloadGlobal false;\ +> \n :local DeviceMode [ /system/device-mode/get ];\ +> \n\ +> \n :if (\$CheckSumsVerify = true) do={\ +> \n :local CheckSums ({});\ +> \n :do {\ +2581c2603 +< iptsUrlSuffix);\r\ +--- +> iptsUrlSuffix);\ +2583d2604 +< \r\ +2585c2606 +< ficate=yes-without-crl \\\r\ +--- +> ficate=yes-without-crl \\\ +2587,2590c2608,2611 +< =user as-value ]->\"data\") ];\r\ +< \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ +< \n }\r\ +< \n\r\ +--- +> =user as-value ]->\"data\") ];\ +> \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\ +> \n }\ +> \n\ +2592,2593c2613,2614 +< s\" ] do={\r\ +< \n :local ScriptVal [ /system/script/get \$Script ];\r\ +--- +> s\" ] do={\ +> \n :local ScriptVal [ /system/script/get \$Script ];\ +2595,2597c2616,2618 +< ];\r\ +< \n :local SourceNew;\r\ +< \n\r\ +--- +> ];\ +> \n :local SourceNew;\ +> \n\ +2599,2601c2620,2622 +< \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ +< \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ +< \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ +--- +> \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\ +> \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\ +> \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\ +2604,2608c2625,2629 +< \"'!\");\r\ +< \n }\r\ +< \n }\r\ +< \n :do {\r\ +< \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ +--- +> \"'!\");\ +> \n }\ +> \n }\ +> \n :do {\ +> \n :if (\$ScriptInfo->\"ignore\" = true) do={\ +2610,2614c2631,2635 +< e\" . \"', as requested.\");\r\ +< \n :error true;\r\ +< \n }\r\ +< \n :if (\$CheckSumsVerify = true) do={\r\ +< \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ +--- +> e\" . \"', as requested.\");\ +> \n :error true;\ +> \n }\ +> \n :if (\$CheckSumsVerify = true) do={\ +> \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\ +2616c2637 +< ptInfo->\"url-suffix\") ] = 0 && \\\r\ +--- +> ptInfo->\"url-suffix\") ] = 0 && \\\ +2618c2639 +< rce\") ] ] = \$CheckSum) do={\r\ +--- +> rce\") ] ] = \$CheckSum) do={\ +2620,2624c2641,2645 +< >\"name\" . \"' matches, ignoring.\");\r\ +< \n :error true;\r\ +< \n }\r\ +< \n }\r\ +< \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ +--- +> >\"name\" . \"' matches, ignoring.\");\ +> \n :error true;\ +> \n }\ +> \n }\ +> \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\ +2626c2647 +< fetch\" ] = false) do={\r\ +--- +> fetch\" ] = false) do={\ +2628,2631c2649,2652 +< ng without.\");\r\ +< \n }\r\ +< \n }\r\ +< \n :onerror Err {\r\ +--- +> ng without.\");\ +> \n }\ +> \n }\ +> \n :onerror Err {\ +2633c2654 +< lScriptsUrl ];\r\ +--- +> lScriptsUrl ];\ +2635c2656 +< lobalScriptsUrlSuffix ];\r\ +--- +> lobalScriptsUrlSuffix ];\ +2637c2658 +< Suffix);\r\ +--- +> Suffix);\ +2639c2660 +< name\") . \"' from url: \" . \$Url);\r\ +--- +> name\") . \"' from url: \" . \$Url);\ +2641d2661 +< \r\ +2643,2647c2663,2667 +< ut=user as-value ];\r\ +< \n :if (\$Result->\"status\" = \"finished\") do={\r\ +< \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ +< \n } \r\ +< \n } do={\r\ +--- +> ut=user as-value ];\ +> \n :if (\$Result->\"status\" = \"finished\") do={\ +> \n :set SourceNew [ :tolf (\$Result->\"data\") ];\ +> \n } \ +> \n } do={\ +2649,2653c2669,2673 +< 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\ +--- +> al->\"name\" . \"': \" . \$Err);\ +> \n :if (\$Err != \"Fetch failed with status 404\") do={\ +> \n :error false;\ +> \n }\ +> \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\ +2655,2659c2675,2679 +< \?\");\r\ +< \n /system/script/remove \$Script;\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if (\$CheckSumsVerify = true) do={\r\ +--- +> \?\");\ +> \n /system/script/remove \$Script;\ +> \n :error false;\ +> \n }\ +> \n :if (\$CheckSumsVerify = true) do={\ +2661,2662c2681,2682 +< riptInfo->\"url-suffix\") ] = 0 && \\\r\ +< \n [ :len \$CheckSum ] = 0) do={\r\ +--- +> riptInfo->\"url-suffix\") ] = 0 && \\\ +> \n [ :len \$CheckSum ] = 0) do={\ +2664,2670c2684,2690 +< 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\ +--- +> pdates with 'ignore=true' in comment.\");\ +> \n }\ +> \n }\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if ([ :len \$SourceNew ] = 0) do={\ +2672,2676c2692,2696 +< >\"name\") . \"'.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ +--- +> >\"name\") . \"'.\");\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :local SourceCRLF [ :tocrlf \$SourceNew ];\ +2678c2698 +< lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ +--- +> lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\ +2680c2700 +< \$ScriptVal->\"source\")) do={\r\ +--- +> \$ScriptVal->\"source\")) do={\ +2682,2684c2702,2704 +< . \"' source did not change. End of lines set to CRLF.\");\r\ +< \n if (\$ScriptUpdatesCRLF = false) do={\r\ +< \n :put [ :tolf \$SourceNew ];\r\ +--- +> . \"' source did not change. End of lines set to CRLF.\");\ +> \n if (\$ScriptUpdatesCRLF = false) do={\ +> \n :put [ :tolf \$SourceNew ];\ +2686,2692c2706,2712 +< ) . \"' 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\ +--- +> ) . \"' source update end of lines to LF.\");\ +> \n }\ +> \n :error false;\ +> \n }\ +> \n }\ +> \n\ +> \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\ +2695,2699c2715,2719 +< );\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :if (\$CommentsInScripts = true) do={\r\ +--- +> );\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if (\$CommentsInScripts = true) do={\ +2701,2702c2721,2722 +< \_\") ];\r\ +< \n :if ([ :len \$CommentLine ] = 0) do={\r\ +--- +> \_\") ];\ +> \n :if ([ :len \$CommentLine ] = 0) do={\ +2705,2707c2725,2727 +< noring!\");\r\ +< \n :error false;\r\ +< \n } else={\r\ +--- +> noring!\");\ +> \n :error false;\ +> \n } else={\ +2710c2730 +< ] + 2) [ :len \$CommentLine] ]) do={\r\ +--- +> ] + 2) [ :len \$CommentLine] ]) do={\ +2713c2733 +< ;\r\ +--- +> ;\ +2715c2735 +< ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ +--- +> ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\ +2718,2719c2738,2739 +< ded!\");\r\ +< \n } else={\r\ +--- +> ded!\");\ +> \n } else={\ +2721,2726c2741,2746 +< al->\"name\") . \"' did not change.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n } \r\ +< \n }\r\ +< \n\r\ +--- +> al->\"name\") . \"' did not change.\");\ +> \n :error false;\ +> \n }\ +> \n } \ +> \n }\ +> \n\ +2728c2748 +< \"\\23 requires RouterOS, \") ] ]->version);\r\ +--- +> \"\\23 requires RouterOS, \") ] ]->version);\ +2730c2750 +< \_false ] = false) do={\r\ +--- +> \_false ] = false) do={\ +2732c2752 +< \") . \"' requires RouterOS \" . \\\r\ +--- +> \") . \"' requires RouterOS \" . \\\ +2734,2736c2754,2756 +< gnoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +--- +> gnoring!\");\ +> \n :error false;\ +> \n }\ +2738,2740c2758,2760 +< \\23 requires device-mode, \") ] ];\r\ +< \n :local MissingDM ({});\r\ +< \n :foreach Feature,Value in=\$RequiredDM do={\r\ +--- +> \\23 requires device-mode, \") ] ];\ +> \n :local MissingDM ({});\ +> \n :foreach Feature,Value in=\$RequiredDM do={\ +2742,2746c2762,2766 +< ceMode->\$Feature) = false) do={\r\ +< \n :set MissingDM (\$MissingDM, \$Feature);\r\ +< \n }\r\ +< \n }\r\ +< \n :if ([ :len \$MissingDM ] > 0) do={\r\ +--- +> ceMode->\$Feature) = false) do={\ +> \n :set MissingDM (\$MissingDM, \$Feature);\ +> \n }\ +> \n }\ +> \n :if ([ :len \$MissingDM ] > 0) do={\ +2748c2768 +< \") . \"' requires disabled \" . \\\r\ +--- +> \") . \"' requires disabled \" . \\\ +2750,2754c2770,2774 +< gnoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n\r\ +< \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ +--- +> gnoring!\");\ +> \n :error false;\ +> \n }\ +> \n\ +> \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\ +2756,2759c2776,2779 +< ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n \r\ +--- +> ScriptVal->\"name\") . \"' failed! Ignoring!\");\ +> \n :error false;\ +> \n }\ +> \n \ +2761,2762c2781,2782 +< ript comment: \" . (\$ScriptVal->\"comment\"));\r\ +< \n\r\ +--- +> ript comment: \" . (\$ScriptVal->\"comment\"));\ +> \n\ +2764c2784 +< Val->\"comment\") \\\r\ +--- +> Val->\"comment\") \\\ +2766,2768c2786,2788 +< F \$SourceNew ] \$Script;\r\ +< \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ +< \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ +--- +> F \$SourceNew ] \$Script;\ +> \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\ +> \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\ +2770,2775c2790,2795 +< o={\r\ +< \n :set ReloadGlobal true;\r\ +< \n }\r\ +< \n } on-error={ }\r\ +< \n }\r\ +< \n :if (\$ReloadGlobal = true) do={\r\ +--- +> o={\ +> \n :set ReloadGlobal true;\ +> \n }\ +> \n } on-error={ }\ +> \n }\ +> \n :if (\$ReloadGlobal = true) do={\ +2777,2780c2797,2800 +< \");\r\ +< \n :onerror Err {\r\ +< \n :global InitSetup (a);\r\ +< \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ +--- +> \");\ +> \n :onerror Err {\ +> \n :global InitSetup (a);\ +> \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\ +2782,2784c2802,2804 +< ctions failed! \" . \$Err)}\r\ +< \n }\r\ +< \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ +--- +> ctions failed! \" . \$Err)}\ +> \n }\ +> \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\ +2786,2797c2806,2817 +< \" . \\\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 \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\ +> \n \". Installed an older version\?\");\ +> \n }\ +> \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\ +> \n :global GlobalConfChanges;\ +> \n :global GlobalConfMigration;\ +> \n :local ChangeLogCode;\ +> \n :if ([ :len \$ChangeLogCode ] > 0) do={\ +> \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\ +> \n :onerror Err {\ +> \n [ :parse \$ChangeLogCode ];\ +2799c2819 +< . \$Err)}\r\ +--- +> . \$Err)}\ +2801,2803c2821,2823 +< dation!\")}\r\ +< \n }\r\ +< \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ +--- +> dation!\")}\ +> \n }\ +> \n :if ([ :len \$GlobalConfMigration ] > 0) do={\ +2805,2808c2825,2828 +< \_do={\r\ +< \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ +< \n :do {\r\ +< \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ +--- +> \_do={\ +> \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\ +> \n :do {\ +> \n :if ([ :typeof \$Migration ] != \"str\") do={\ +2810,2813c2830,2833 +< \_\" is not available.\");\r\ +< \n :error false;\r\ +< \n }\r\ +< \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ +--- +> \_\" is not available.\");\ +> \n :error false;\ +> \n }\ +> \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\ +2815,2816c2835,2836 +< \_. \" failed syntax validation!\");\r\ +< \n :error false}\r\ +--- +> \_. \" failed syntax validation!\");\ +> \n :error false}\ +2818,2820c2838,2840 +< . \": \" . \$Migration);\r\ +< \n :onerror Err {\r\ +< \n [ :parse \$Migration ];\r\ +--- +> . \": \" . \$Migration);\ +> \n :onerror Err {\ +> \n [ :parse \$Migration ];\ +2822,2825c2842,2845 +< \_\$I . \" failed to run: \" . \$Err)}\r\ +< \n } on-error={ }\r\ +< \n }\r\ +< \n }\r\ +--- +> \_\$I . \" failed to run: \" . \$Err)}\ +> \n } on-error={ }\ +> \n }\ +> \n }\ +2827c2847 +< entity . \" increased \" . \\\r\ +--- +> entity . \" increased \" . \\\ +2829c2849 +< d modification. \" . \\\r\ +--- +> d modification. \" . \\\ +2831,2833c2851,2853 +< bal-config.\");\r\ +< \n \$LogPrint info \$0 (\$NotificationMessage);\r\ +< \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ +--- +> bal-config.\");\ +> \n \$LogPrint info \$0 (\$NotificationMessage);\ +> \n :if ([ :len \$GlobalConfChanges ] > 0) do={\ +2835c2855 +< \");\r\ +--- +> \");\ +2837,2838c2857,2858 +< \_do={\r\ +< \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ +--- +> \_do={\ +> \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\ +2840,2843c2860,2862 +< \r\ +< \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ +< \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ +< \n }\r\ +--- +> \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\ +> \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\ +> \n }\ +2845,2854c2864,2873 +< ws and changes are not available.\")}\r\ +< \n\r\ +< \n :set GlobalConfChanges;\r\ +< \n :set GlobalConfMigration;\r\ +< \n }\r\ +< \n} do={\r\ +< \n :global ExitOnError; \$ExitOnError \$0 \$Err;\r\ +< \n} }\r\ +< \n\r\ +< \n# load modules\r\ +--- +> ws and changes are not available.\")}\ +> \n\ +> \n :set GlobalConfChanges;\ +> \n :set GlobalConfMigration;\ +> \n }\ +> \n} do={\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +> \n} }\ +> \n\ +> \n# load modules\ +2856,2861c2875,2880 +< 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\ +--- +> ns\\\\.d|mod)/.\" ] do={\ +> \n :local ScriptVal [ /system/script/get \$Script ];\ +> \n :if ([ \$ValidateSyntax (\$ScriptVal->\"source\") ] = true) do={\ +> \n :onerror Err {\ +> \n /system/script/run \$Script;\ +> \n } do={\ +2863,2865c2882,2884 +< ailed to run: \" . \$Err);\r\ +< \n }\r\ +< \n } else={\r\ +--- +> ailed to run: \" . \$Err);\ +> \n }\ +> \n } else={\ +2867,2872c2886,2891 +< 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\ +--- +> led syntax validation, skipping.\");\ +> \n }\ +> \n}\ +> \n\ +> \n# Add and fix global scheduler\ +> \n:put \"Add or/and fix Global scheduler...\";\ +2874,2875c2893,2894 +< ; }\";\r\ +< \n:local Comment \"Every Day Set Global Environment Variables\";\r\ +--- +> ; }\";\ +> \n:local Comment \"Every Day Set Global Environment Variables\";\ +2877c2896 +< = 0) do={\r\ +--- +> = 0) do={\ +2879,2880c2898,2899 +< ent=\$OnEvent start-time=startup;\r\ +< \n}\r\ +--- +> ent=\$OnEvent start-time=startup;\ +> \n}\ +2882,2884c2901,2903 +< \_do={\r\ +< \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ +< \n}\r\ +--- +> \_do={\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\ +> \n}\ +2886,2890c2905,2909 +< ) 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\ +--- +> ) do={\ +> \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\ +> \n}\ +> \n# Add Update Script scheduler\ +> \n:put \"Add or/and fix Update Script scheduler\";\ +2892,2893c2911 +< \r\ +< \n:set Comment \"Every Day Check For Update Scripts\";\r\ +--- +> \n:set Comment \"Every Day Check For Update Scripts\";\ +2895c2913 +< \" ] ] = 0) do={\r\ +--- +> \" ] ] = 0) do={\ +2897,2901c2915,2919 +< start-time=startup interval=1d on-event=\$OnEvent;\r\ +< \n}\r\ +< \n\r\ +< \n:onerror Err {\r\ +< \n :global GlobalConfReady;\r\ +--- +> start-time=startup interval=1d on-event=\$OnEvent;\ +> \n}\ +> \n\ +> \n:onerror Err {\ +> \n :global GlobalConfReady;\ +2903,2905c2921,2923 +< \_not ready.\"); }; } delay=100ms max=5;\r\ +< \n\r\ +< \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ +--- +> \_not ready.\"); }; } delay=100ms max=5;\ +> \n\ +> \n:log warning (\"This script \$ScriptName Loaded \" . \\\ +2907c2925 +< \") ] . \\\r\ +--- +> \") ] . \\\ +2909,2921c2927,2935 +< \\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 dont-require-permissions=no name=AM-FwAddrLists owner=AM-FwAddrLists \ +< policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ +< source="#!rsc by Vados\ +--- +> \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\ +> \n # signal we are ready\ +> \n:set GlobalFuncReady true;\ +> \n:set ExitOK true;\ +> \n\ +> \n:log info (\$0 . \"Global configs ready!\");\ +> \n} do={\ +> \n :global ExitOnError; \$ExitOnError \$0 \$Err;\ +> \n}\ -- 2.52.0