From 0873e341c884d7290c50c790568342e848c11b0f Mon Sep 17 00:00:00 2001 From: naman108 Date: Thu, 23 Apr 2020 18:38:14 -0300 Subject: [PATCH] updated variable logging and rotating logs --- TAKfreeServerv0.6.zip => FreeTAKServerV0.6 | Bin 68386 -> 68844 bytes TAKfreeServer.zip | Bin 58296 -> 0 bytes TAKfreeServer/constants.py | 8 ++- TAKfreeServer/server.py | 62 +++++++++++++-------- 4 files changed, 47 insertions(+), 23 deletions(-) rename TAKfreeServerv0.6.zip => FreeTAKServerV0.6 (84%) delete mode 100644 TAKfreeServer.zip diff --git a/TAKfreeServerv0.6.zip b/FreeTAKServerV0.6 similarity index 84% rename from TAKfreeServerv0.6.zip rename to FreeTAKServerV0.6 index 6bce27f2f0732abdf3f18b316dfdcfcf1a528ff5..6dc2c4d1d8ad7923902c0a5a2573b6e41280d298 100644 GIT binary patch delta 5906 zcmZ8lcRbbm|93vdvG+PM3t1U;R75y7Io7esNU~){;)IaM#RtbMj=g0SiL%O0Rx%ID zUfC-@j{Cj8`~9AOUeEP@eIDoYexLJrKVH~GqUB^FDjiKiB65PW&*uot8!BRe>a^;J zPHA0PJ=MxVE`S&9)XYu$c@la^-N4w7(W`j*tckUzA0-}XyThYxa|W8ty5xEaROEIvt+{`nV#?3I^gqdI_KUdo>dZ{aXm!Si+f6nP!;%>4lhwY` zgN33efwqap0ev+_sHOGP3T01N#Bd? zMLp2fz$PTkDZjSuyVybP&&AiAhT-jDP?_5FXus+Kmc2;wMz>!Cth~53;3?Tr#TCz( zl)7Lr3yYYn3{^eO%3@o{i)4y7B8O`evNAG6BFKIEDL)B+Ood5&!@W)~wqrVxInC^s z6p0TNl#qeZFFbm#{lO*O*$lpejZ?RHO8)1tq0uK&EYXigtyXkpm%ZUGm3AO3kTcY% zd8rR00i$IjLRXE~N!8wNWDC!m8z$)Jw1P$W#jFESEi#+t znyfBfc8A?>FSHG13DbX7A-;tx8y6Z*xo8@k%pfe(8QGe~&k zMHCnYjDvq%DYybdnL>B1sA)vJ`(28UGAE&NGVk6UJ@E;YsAG#pug1lX zS9)2!L!wpX0*=R8^DUHYA0of%q48>*>-({LU3Ae(-233|V{k zFXLdP&3Z%rW2{1 zk+cg=%ed|NrEYuQ$K+C8-)SXqF~P3}KWG+r1S_j4m^9J>#%k}P(C#s7wT|vQ=KHc{-a-{ztORb=i zp%+I+sO-IP@drJG z&6ByKF7sgH2Ia-{mGvtqzfr!8LIIS(;257tOw9A`xL9)*)^G&LZa{o#64hg;N4LF) zxC!-*RT}TUL{p#-Tx7nP-39LYqM%Amniqcac5;3EjhMf>I-Or*f9;oB(TA~dJ+%>k zm9;y;sGXl9@ZGOI+M8v*h_$1DI`4(x2(&@$f=fD8ubAyo7BOqeJvepw&B9~<1VP4K zjocFFGFt0b=IYjL?Jqbk?1~9fcv$PvFFf-7eXLSWD3Vs(%=h+{+hm|AZU`4ePW-LdMl$N{cwMA!%*a>d8r$RD;Z}Ds?S8`UEnLm>j%H%tkm|pF~l*cbm85n9= z?}xz(v)@Ud{5FX!%t3`3e7VBWdMBov0HkOlnlYfmofPGUT zyY#E*+XoxjqpqiNze;Z z6dS$v7eoHhWKFH{l?FFSuj@gb8WK<8Td9uA@TisJFyPuDS?ULAR_U*48U~1|Y+_IT zf)~X?f#ea#q4R%G!Q3J;oM|?YdY@`4clRnHac8l_dEj1&jEWa?@O`XrXuY^Qz z%;2{7^2#1O$Z}ecmSnf5h9XWt!J-Q&4pjmRt-{BWT0dM@?E6-QZjDx!hz+h&jV4kT zn-wDYHmFqY(Ils5a6H}jdO0zZEUoECBO^6CHLF#GwH`!b2?Zi@7H0rrVd@nwQi~UB>XZO00W|Hx|HfxSh=Z?+MRr`H&jvt~k zJAFv68uOK0g~rmtY1HOQ7RlmEC5KN~+n2l6#Fw@rI#zlNNk~lJHJxy2l||+LP;-l> zt6B6KUzu5EPdIpjqAy)UbBtfENTW4nx@{tPxJ`d4#Ot-Ag}n90&V>P~+v<~Yo>47r zh0!s2+%=kPb87vZj-M;W!!^c-bZABu)?0qNjVJn`?qRZjWDrYfcJfyjY5Tl#j*phT zkKNsvMWl4ocgQ{1bxz8yzU?sQQ%yMVbpq|&6V5HDk@mTue%5FH7Ft!6>p*pls=@Q9 zVOZ{uS20)WTd2UpO4T4z2hY5=;-A%S?I*VT14YuYf?}!jp9r#-xwuBX(~gt(TWd09 zO;l?rf+hA6;vBO|zBNvZqnK>PGg0GmZh9-zLw&|PaP#+dfgu(CB5^E~L~^}d2GFjO zDMFG2)nB=FzAZOsf1nlC(`U5AD9agCzL{IV zheu42J}%Cw#l*r|gC9A$bD>-XjhU<(#Z2^S@0C$y6b`S%=+GN4^A@POsyD`X-)N|_ zxSHKl#ZY1|7P}J%4~NT4-FLMeZfDduQKbnB-6OwNH`QW8!d%W{S^k8t zC-Yuh(57qaW;)tPY}ik<-bKv$sRqURN1NoNIp5OU&5#jD_=#r{9j|%!5ZtC8El+n_ z+Nuwi7s8eGmnu|ut$Eh!$I^$Bt(owN+4-B0#P|o3hH*2JVMB+W*BQ$xC;1;UsgL)U zap$BMMl;{kpYn^6XMQrkgZuJ0Jt{v+Y8Zh^l)@I?DcVLS#otezsiu zn}(ZozSZnD@~rmKS5uol-TKTRlNg~ z9=Do?izUy=`D>xB^tq1wu@F|gwc1U6I{nJFwX^^L||BIZ}o8(CaVxt2%XmQM4YWDOvGn zRiM;zOD-kJ`%(>^L1Kt)txnnXg6+nlg&rbzSH(e+SDj($%POsQj!T=#(c>l7hu`fh z7LCnq9QvTss_d~!uAJTMS_2BB6^+IwNkh#0vYv($v1MM34M)EW&3EhVmsWck?_D&t zG2L$%eOpt5j$f;Lu97oAfHPNcqnmVfKdOfQvEikZFqjC-guCrAW5jC((CjG6uHI+C z))Hno8gwb|*rsp_fjOHB+sX%71?{R(sR^pn)9bSeA=jh7Rp9pxedFj8bV*4|-tf%^gpd;9cy~8e^7O zW?3NIltK#o1Nr+Y-AQqiz$Zbnk+AFEW_bxEtsq4r@jX=%E20jrch*0V zX%>`xiBCqcMi){6yg>&MaCb_Q*T_wV0l&9!dXNnn!;NMx7g(mqIk zcWvw-u)=-y-xEjgUOD=NzM+DxwRIkc16=*hAEWO8$O*g5NLU4keLp-$QHncv~JV2Wx&*f32F!h$NLe zf~Ug`YS0O0iCbJ!_oRyB80pVOsK)8#=Wu09G7!h*t-(%US#S3meaT8FW-`|*jSIMZ zpx4OITmdbsSQTtPn$@b|>2uAfuqYDt+&M?T?LVI_Ma$52b*9~uAAVvAqxy8=&hVcB zs@?G_Ys747cSGHqW}|Oq176uaaysSSIn$Y)#IX^43;7a>4(cG6$D^Lcq(3loQH)Wi zpt({FTrv~&MrSeQLEbY{qV-ueOQ9{gHT^{OOP4=if>`Kuqrcqg)42JUr^5~1Ltn44 zyq3tDp^p^Nn$vUIXp1=3F?smRg-5yNkDIDdiq*V=PE}()qpU>DtQ0-)H-=k5CbYDu zNG+P2bxDQ8qlGm%9gmfhVj7*tuH=u2q5j=MVqrwLGu{1HB&>7F+!x-Ik?4;{SFRcE znVsY(Ana=hdf6W#BH$9d?n7Jd$RyFP{DiXs8(-v8jtI{tEf`S%!dkhNMJh#jI%WY+ z#-yl=7}J`HU_+2Lo3je4j0gVD1g3BN7WGxaRD9^Xf@~9TK$H-S6=VmUCy;>MIs86h z0*DadRqaU&Km>}1v}7dU*U9_90O{Y91AI7z1op`Orlg<@IXxITO$h=x1RzTBkL-wh z07OyZ=^E}n@Qwx#w`gFeVI(j}i>JHO_K-`U)l3NB$^cr=aDv4Q6d?615`Z$D`kdgC zSt9^>1_i+5Q#B3`FDP#qkRt$g(H%dxW1Iyu<9fdn)(@y=6CQc&VI5+Vvd z{p|;IBJm>KrZLd10|x1_fJC|sV8SL6u+}@JTp-aF5?Ig&KW(vq+$a*zeG3U01wU@N z09TFhE0woVK;t=lvuy$#7~@rO6Dm+_2MOev;_0|41(r$6WO3hMuX17(=A+W|uY_37a(_=5zN{>5P@_W`No|MxRaOaQ)=|8N!V zvzx}>&%hVyN6u?PF$4|~Nx(ruf#?i;2onZ@+`#wy z@0-iNzk+t=dGz!i!}LE5F`NJd4q$W610Ddx0?5rjBmO{I0Y-rc!i{kygct!hJP|rO zCzxYG2m-iVc;==7Ri$TD2ox`2J=ySh40W;%xeA??0W{VsmKvFkx_HzFZ1jV-$ delta 5496 zcmZXYbyQSe)c2W7cPI=fC0$C2bc~?n(BV+h-Jt?HfP^&61x8X@8Udw5xu5&k1@p4n}$hFmR@knqkuMpFeDsp^)eAgja zTl=V0X&2*t09gPIq*ezjRnM&EDMgcjk6>(v<2sG?L}*+nLifl0H$-qm`nw^Onqk5E zW9)*@c$^LcjHqWvX)rI8#O2HE4ZoaDUJ z(@$`!=@J=fXS`?OAA@&Yl-Z#);N~q|k{?CB?2*vG)>q9mQOGBzQ6&_Aj?J<(B`Zn# zC8&+vUbe{k70353n$06Bo+P1uM*q=C5qukh4A-WsTdCi1XD+nmg4J|gQ-j7oi~4Fy zP}z+t<9J^(uva%o;|%Yn`1g3(?XLR!$@nu)dHNNfmA%qwN&eK+n>RwBI7rCDaS&`1}lMi-l@P5m?uwT!AoSL|44ideUE~?GA z;c4ArD0f}%Wp+_=XXt$OVt*}Szh!o?Syk3$rP(||X>4#~W24Ew`0(h=@$MwvMQp^I zAyPGW#~p=eRtxrx5|w3Dx&jWw4nF@sj_4E}zp(&8Isp`_(?yLq(0oaZz0Sp;^F2~M zg&HR>f=4w^RjrRN{cFfJK4;##x)fl zq9_TrlQ|h)r0Oxt!_VO30tH&nk~EDtZ=VWfaPpFOP@Fp69r%#@%1e81>|MWc)zqSE z*BYv1F(g%vJ-S85t$7!pNJ_K1Ay}zPhLBSaSLH|GADV3&$3(3Gv24auZu$bGkE*C# zxIIm>jhMKY@PHb#ZPS#EB>w~|qdEpEpy{YXaBn}J_V)4Ww+UDz;sbeIn6hd#hZ-oq z*=~X>Oe0{#tF;@_^Mn883cv@;=XARj8Cg-aOk~vW9;0W7r8k$`c%^uhlz5?&patNBWzGXn$eM zlC>Y_%`97PhCcM@=e7Lj;S;4qYUpL7Owix@+wR7z>VT|=Hm^X5*nSjF_P3;X>tDD& zd^>XKfd#@_`zD{elZI62Vf8yg`|4>!jW%s%ej(B8cNA}ptqwm}=@3LOAlFONtBhwH zdZKyK_1IkWcVQDvUlicMR-r5eTpFTO0_0@F*72P3fd{Tnnau;4V?W*q2=M*K+r%^* z6W-#>N7l+K@uGUF?9-=4vc%?UnI?wk4NT<2L#*L(P6AxSq1o;>TQuxmJ-Tv1Z!{IB zvVt|(nVBGqf0}`Imw5x$9Hbaey=n3dpH~Sj=i&*`HPsK=t7E$7NN;solP7agC0lCp z;Ae7G*_wHad7Ot-dZ89yuYAJw-o}l0VC*k_*R=gX&h)tgoM%}qdfeWRf63TU*DEd3 z;H!yDF%>a%)htSNY=_1}1V}|`@DP>gLRIY)ND8`tJ$5ZTlvq3Phan4l@H_b#p!|G( zF56bOS#Efh-ia(61==ZPhdd(ZUxzICa1^Mf29q(eBtgCu8ui}p+0YlkV-(q=MRqY) zUx?+Zr;ux>z*(=C+@rb}<(>j#IteovMU!ZL8m|fSiTvG{MO=SPB~sM7{l;*P@0yg} z_ndaV&3pl)>#Ft%cYYw*m*qJ0#Ur6&=i%`DT&64-L!B8-WfZJYx69Oun1-f#h}V*@ zP2zfc152)ta_s2MPu!yRlp-UMw)>L@e~-4&vpwv-i;UY-M@jcJz_0Z(eG}{sS>DOr zW*KkA5J$(-0VyZal(55K|05}dvKOFBci`Cc`9Z18+Vm5OrgEeSG^sL5gK0hRsVDC# z%UuN>raaG}KAo)Dx{`!aBQ_W1XZVzRUGPl9n&n0ua_)7H{t?1o>e|bWz*z8jF^$qv zuA1j>Uq<`&mQaMr=bT1qnZ~-pkIjEibv#SxXRJ8A)MrMY!_COW!pL)m{vGCLA`iy6 z;sj!54;WSD;wq4EBvTyiw7BE-Ft(>*O02rYc~!x;T$ZMC>9=~XJu3~7nu(Q4ETS~G zSp8@@%Cj_L?)>((rRpx3?xRsp@-eupE0w22?;?d%q(EUY_tCruftFy1egf+A{&Pau z3_s1$X)IGdYr(hlT!UY8y#myNB2&ob?sYi72+1r^dv-e zJA$R5c;}#tq4C3p^j_&IxWl(U6-Gs_0sq$VNP6pB`I6IF=!uyGJ6!Q^Djd@K>BVGb zIU|TPAtgUo#wz2!i;vZ#UNI9Ah&vcXe*PvBp~jKIo7-6=t487e|XZ5}; z2`G4Q-6xmqG97mrWtwiUXegQb@Pa_yZ_+OOk#3TVfMIG}upe1gZ?Uj88~uZ>G#ReI z9BEQQvX3zFKBX_Wqa4hl!pSKGc2gY?dGBpPcks!Wken8u?cB5;S{4Q63??#ny$k=U z)6Nk8Rr?O#{dLvhY~Mu%gu!%eesF`#i*4J(7A8vf?v_AFd6sFS(LUz;!eZaz`=-^iFwR~I;5tF0kL+9i`Azc;e$c0bewD`~)%SIMV7TSY^!kvCkHt6p1^nsP zE~bp4!Ch6Vp{ZTc+wa?c(mYxjcWhu<^M2+a9siMgls?VJ)^SbDVLVwAPCF^bn=Pf1 zG(Q;Zn?RTJG(e=zME5RPzDMfCY`XcXW^$i`7CVw_-Di4X!IUxCX^>BqZ7=hQf|As& zEX_bR=fhIo2NJ8nZ*3sKkobE%&7xt%lk%dmR+h=&Z-#f9sGkxg1NUtkCuP%1s>8ir zlZ3n+ZZUZDGcneTCO`q#tCmjL$tcrh>vmF{oO1TdyaZfb!IXsaYyT7?91+DJ6O+s? z9$zGKcGa!!I}7mEVJ$E-@}pNo^Yg&d3gl@`cb(RYKL=WJ8AX)`>O?m6kMe@TMjAlt z@AHTC8t3^g%adyPqXS(2LO6E_xw-9FRstK5!nQ@Xc6G~fH`Q6_W;TsiJn0IctMR&^Lw+(wEpIZaZ`6q&4%hXl8TY@{v;UZKr+)pjZ z$Tvb!Nqy;r+oe{qpT9OOnZ6i#^j@u@LA&IMvv07I^L}1do3KO1;r%@P-q1ybmzIof zn{Ft9ABn7bIgV{TfN3!~!4t39l7mE^_|GKepFZ9E`bUkfTy0YPkvC$kEckBFFvV;@ zCX&1@!J0EsVd8e4ler4R0QJso)lrk*&I@4_Rt%^+Q%T*mY79#L#-)!K-t8Rfy!r9S zh7B<>r7FcY&6E2xximMuq^W2xe_M{&U$II=@>e45>^lzU9#NwJUGT2$T@L~U8lA4p zbOj;FN(%So6!mgkr<(EBhSjenBju!i0(M9{_qj=m+Igt9a9`^)<%K61_ayGccp@hQ zSh97=0!NIyp=2vg?w%6z8gnc!nH5`Y-8Yqe4k=aIdm_Z7{(1b>+duy+wDu{TamfGE z8~M}yihGiBsqHASzUK1IsBs=d=CGu;f@mP`stKy3z(R427x4x0SSxssKA7ierD;3z z*MStX4g+_j6KyKBo>g#g zcq`|Jyt7f~b4p?`v9J-PJ;ALu3X6M-EW($UfvWiz=ZRk*dmS*axT)P>{hs};*b?bV z@KDY70CU-1N3_@A1L+XGle=67zQH1qM^9^MPg_NWv)7_BUDx}yolr%GMlNO}w6CaO z=EEu(CSLP;%jO7!{;zq{;(joSSX_kF5$Mi<7#qo?L=(NfsVc<$D-i(KQo zCI}x)J)%63?Qf7vlJsPEHvCh>l$I7@&`YNI*vZ+}N9*h}5q9`(jc;WI zryixGa^FY_89miCt~u2|Z}*E3Ju^7!RHFE7cN`rSHssvLTvW3cH?c=iGU?9TrAZ+u z)flk5_1n!WrV!p!u4ppQ@x+WTPa9dy;9=!WdSWQr#u79auhLGHx1dQ+auDwBLCW-E z{s`8kaN)&6Pq#;VPWKzpdKOne+?sEhKXRVlajI$5B+krH!rOfk8JtVYqGHBJS2kx^ zi-7I33sHRv-0b1c8vka)biijW;CH9PiGOTMdkn_de(%MA75y3X>U>c10sRmU_u8}M znu~MmD%t6%^V`a4VVhFoutrExaYxou~gL zz{%3-+JcYN#r{EuTi@+!@65k0_0|=MZMqUvMG2Yoj+?x?%d2>6MBx|YsB_ys?op&O z;-Fp6)G}dOc7Zx$*lzR(b%xI7Z9E!Z9%G^GnJPQQTd_DdJ)1mw%M~Ym?1VmfUuyU>vuA;GE=nG>oO$%lb?&7-F2jDxk%@Z@l*Pcuc4>Echim9ihk8O<+}g;t9KhQi1414 zNfTx~#jnXN;E=?{97w^w8A%G`?0iHG{ddUBQ2{1`RI@MspCf$wtTaVAQ{nL;^gHA# zf{U|afCw(QL&XS+&%ptwE188$3YKF~2oIZK_+GO!+l)La;pxk{_9!2n-gY)g404VZaO z4NhPzYrg+1C_0D`LI&Ee!yr0f$+|N@BmlAsK*2j3aELVce8V1a7XWka(}AZOa3JSO z4hs;1j+=0RRuG#R-ZTbwg|L!UmcgRQ)mXE_O>Kox*^q7Z?<} zYGyct0bfI~mB=$Ipd{=+NeP-BQ-hr6Fd+UF*1Fm-dJu1L=lm656a~6Rv4Ck8LahJm zFA+Bm4itw2`*RHkhZPf(qQSCgh8rYUz`=pw(Brr$y}>@cS239hA_kPBLB%xIWN!!@ zSj9?^`!zKA9|rHGUS`lv5Xd8dJq@FI(SINiq05gD`W67W32djM6Y(L;Xj1?}Mj@ih zI8TUqF(hVPMzkM*8JjQTs-Pc$*g;~@!nhDa*8lIz^}p^}Gv}&f2?C*|ShLdQ&87Yh zxr*rDxR@a)@~#SG@E~TuR3R3?xgtuif0hhAh6lk+>Dx<_6)k}eF#@1Pm+%xY!$v;P zwS)t^yl7hjOzB$LWtI;dS|LJbkwO^JN0;t##g$83b@Q?o4qVh+8I-kxSIu{cFl8!j zSFUjfwu}tjf9YycB0=9LmUC0PVi!y@$zMZ79qj-WmjC$ef?_S z>Pz!=54PyPnNEfV diff --git a/TAKfreeServer.zip b/TAKfreeServer.zip deleted file mode 100644 index d2b621eebb11030dbe94dc88738b1e944cf69b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58296 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 KG=K;S>i+?pUdRpr diff --git a/TAKfreeServer/constants.py b/TAKfreeServer/constants.py index 9b1c71b2..d9014edf 100644 --- a/TAKfreeServer/constants.py +++ b/TAKfreeServer/constants.py @@ -11,4 +11,10 @@ def __init__(self): self.DELAY = 5 self.IP = 'your ip' self.LOGTIMEFORMAT = '%(levelname)s:%(asctime)s:%(message)s' - self.DELIMITER = ' ? ' \ No newline at end of file + self.LOGNAME = 'FTS' + self.WARNINGLOG = 'FTS_warning.log' + self.DEBUGLOG = 'FTS_debug.log' + self.INFOLOG = 'FTS_info.log' + self.DELIMITER = ' ? ' + self.MAXFILESIZE = 2000000 + self.BACKUPCOUNT = 5 \ No newline at end of file diff --git a/TAKfreeServer/server.py b/TAKfreeServer/server.py index c1934aba..44008e8a 100644 --- a/TAKfreeServer/server.py +++ b/TAKfreeServer/server.py @@ -15,7 +15,6 @@ import socket import threading import argparse -import logging import time import xml.etree.ElementTree as ET import constants @@ -24,8 +23,27 @@ from Controllers.serializer import Serializer import multiprocessing as multi const = constants.vars() -logging.basicConfig(filename=const.LOGFILEPATH, level=logging.DEBUG, format='%(levelname)s:%(asctime)s:%(message)s') -logging.debug('called or imported') +from logging.handlers import RotatingFileHandler +''' +configure logging +''' +format = logging.Formatter(const.LOGTIMEFORMAT) +logger = logging.getLogger(const.LOGNAME) +logger.setLevel(logging.DEBUG) +debug = RotatingFileHandler(const.DEBUGLOG, maxBytes=const.MAXFILESIZE,backupCount=const.BACKUPCOUNT) +debug.setLevel(logging.DEBUG) +warning = RotatingFileHandler(const.WARNINGLOG, maxBytes=const.MAXFILESIZE,backupCount=const.BACKUPCOUNT) +warning.setLevel(logging.WARNING) +info = RotatingFileHandler(const.INFOLOG, maxBytes=const.MAXFILESIZE,backupCount=const.BACKUPCOUNT) +info.setLevel(logging.INFO) +debug.setFormatter(format) +warning.setFormatter(format) +info.setFormatter(format) +logger.addHandler(warning) +logger.addHandler(debug) +logger.addHandler(info) + +logger.debug('called or imported') hostname = socket.gethostname() ''' Server class ''' class ThreadedServer(object): @@ -45,7 +63,7 @@ def __init__(self, host = const.IP, port=const.DEFAULTPORT): self.connected_xml = [] self.client_id = 0 self.client_dict = {} - logging.debug('startup ip is '+self.host+' startup port is '+str(self.port)) + logger.info('startup ip is '+self.host+' startup port is '+str(self.port)) self.emergencyDict = {} def listen(self): @@ -59,7 +77,7 @@ def listen(self): threading.Thread(target = self.listenToClient,args = (client,address), daemon=True).start() except Exception as e: - logging.warning('error in main listen function '+str(e)) + logger.warning('error in main listen function '+str(e)) #issue in following func def check_xml(self, xml_string, current_id): ''' @@ -70,18 +88,18 @@ def check_xml(self, xml_string, current_id): if xml_string == const.EMPTY_BYTE: print('client disconnected now setting as disconnected') self.client_dict[current_id]['alive'] = 0 - logging.info(str(self.client_dict[current_id]['uid'])+' disconnected') + logger.info(str(self.client_dict[current_id]['uid'])+' disconnected') return const.FAIL tree = ET.fromstring(xml_string) uid = tree.get('uid') - logging.debug('parsing data uid is ' +str(uid)) + logger.debug('parsing data uid is ' +str(uid)) try: uid_by_dot = uid.split('.') uid_by_dash = uid.split('-') except: uid_by_dash = uid.split('-') - logging.debug(uid_by_dash) + logger.debug(uid_by_dash) if str(uid_by_dash[-1]) == '1' and str(uid_by_dash[-2]) == '1' and str(uid_by_dash[-3] == '9'): for x in tree.iter('emergency'): if x.get('cancel') != 'true': @@ -124,7 +142,7 @@ def check_xml(self, xml_string, current_id): return data_value except Exception as e: - logging.warning('error in message parsing '+str(e)) + logger.warning('error in message parsing '+str(e)) def connectionSetup(self, client, address): # try: @@ -166,11 +184,11 @@ def connectionSetup(self, client, address): self.client_dict[current_id] = {'id_data': '', 'main_data': [], 'alive': 1, 'uid': '', 'client':client} self.client_dict[current_id]['id_data'] = id_data self.client_dict[current_id]['uid'] = uid - logging.info('client connected, information is as follows initial'+ '\n'+ 'connection data:'+str(id_data)+'\n'+'current id:'+ str(current_id)) + logger.info('client connected, information is as follows initial'+ '\n'+ 'connection data:'+str(id_data)+'\n'+'current id:'+ str(current_id)) threading.Thread(target = self.sendClientData, args = (client, address, current_id), daemon=True).start() return str(first_run)+' ? '+str(total_clients_connected)+' ? '+str(id_data)+' ? '+str(current_id) # except Exception as e: -# logging.warning('error in connection setup: ' + str(e)) +# logger.warning('error in connection setup: ' + str(e)) def recieveAll(self, client): total_data = [] @@ -215,22 +233,22 @@ def listenToClient(self, client, address): try: if first_run == 0: data = self.recieveAll(client) - logging.debug('recieved '+str(data)+' from '+str(self.client_dict[current_id]['uid'])) + logger.debug('recieved '+str(data)+' from '+str(self.client_dict[current_id]['uid'])) working = self.check_xml(data, current_id) #checking if check_xml detected client disconnect if working == const.FAIL: print('here') timeoutInfo = Serializer().serializerRoot(RequestCOTController().timeout(eventhow = 'h-g-i-g-o', eventuid = 'aef53602-ea19-4a82-a07b-f0069470b23d', linkuid = self.client_dict[current_id]['uid'])) print(timeoutInfo.encode()) - logging.debug(timeoutInfo.encode()) - logging.debug('timeout info is with utf8 '+str(timeoutInfo)) - logging.debug('timeout info is with ascii '+str(bytes(timeoutInfo, 'utf-8'))) + logger.debug(timeoutInfo.encode()) + logger.debug('timeout info is with utf8 '+str(timeoutInfo)) + logger.debug('timeout info is with ascii '+str(bytes(timeoutInfo, 'utf-8'))) if len(self.client_dict)>0: for x in self.client_dict: if x != current_id: - logging.debug('sending timeout to '+str(self.client_dict[x]['client'])) + logger.debug('sending timeout to '+str(self.client_dict[x]['client'])) self.client_dict[x]['client'].send(timeoutInfo.encode()) else: @@ -255,14 +273,14 @@ def listenToClient(self, client, address): pass for x in self.client_dict: data = self.client_dict[x]['id_data'] - logging.debug('sending conn data abc'+str(self.client_dict[x]['id_data'])+'to '+str(client)+'\n') + logger.debug('sending conn data abc'+str(self.client_dict[x]['id_data'])+'to '+str(client)+'\n') client.send(data) #just some debug stuff first_run = 0 except Exception as e: - logging.warning('error in main loop') - logging.warning(str(e)) + logger.warning('error in main loop') + logger.warning(str(e)) killSwitch =1 def sendClientData(self, client, address, current_id): killSwitch = 0 @@ -275,7 +293,7 @@ def sendClientData(self, client, address, current_id): for x in self.emergencyDict: client.send(self.emergencyDict[x]) else: - logging.debug('emergency not found') + logger.debug('emergency not found') if len(self.client_dict[current_id]['main_data'])>0: @@ -284,13 +302,13 @@ def sendClientData(self, client, address, current_id): client.send(x) print('\n'+'sent '+ str(x)+' to '+ str(address) + '\n') self.client_dict[current_id]['main_data'].remove(x) - logging.debug('sending '+str(x)+' to '+str(client)) + logger.debug('sending '+str(x)+' to '+str(client)) else: print('sending' + str(client)) client.send(Serializer().serializerRoot(RequestCOTController().ping()).encode()) client.close() except Exception as e: - logging.warning('error in send info '+str(e)) + logger.warning('error in send info '+str(e)) client.close() if __name__ == "__main__":