From 5320e96f75b5c77d5e8195a94e107d96a971ba7c Mon Sep 17 00:00:00 2001 From: packocrayons Date: Thu, 22 Mar 2018 10:37:41 -0400 Subject: [PATCH 1/6] Ta.py handles interrupts gracefully, SIGKILL (2, ^C) will kill the program and close any open sockets. SIGQUIT (3, ^\\) will break the current iteration of the loop, this is useful for when SYNACKs are lost in the mesh and the receive socket livelocks (this appears to be a TCP 'bug' of sorts). Of course, any data currently in the socket will be lost. Additionally, the TA.py README was updated TA.py supports verbosity mode --- mesh-comms/ta.py | 43 +++++++++++++++++++++++++++++++++++++++--- mesh-comms/tcpcomms.py | 4 ++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/mesh-comms/ta.py b/mesh-comms/ta.py index 427d7b3..ee08566 100644 --- a/mesh-comms/ta.py +++ b/mesh-comms/ta.py @@ -4,9 +4,11 @@ # import external libraries +import signal import xml.etree.ElementTree as et import sqlite3 import sys +# import exception # import local py import tcpcomms @@ -19,11 +21,32 @@ VALID_PACKET = 16 DEFAULT_DB_PATH = 'dat/power-usages.db' +############################################################################### +# GRACEFUL SIGNAL HANDLING +############################################################################### +class Killer: + die = False + def __init__(self): + signal.signal(signal.SIGINT, self.terminate) + signal.signal(signal.SIGTERM, self.terminate) + signal.signal(signal.SIGQUIT, self.quit) + + def terminate(self, signum, frame): + printv("Terminate caught " + str(signum)) + self.die = True; + raise InterruptedError + + def quit(self, signum, frame): + printv("Quit caught " + str(signum)) + raise InterruptedError ############################################################################### # DECLARING FUNCTIONS ############################################################################### +def printv(string): + if verbose: + print(string) # save xml data to database def write(xml, curser, connection): @@ -67,6 +90,8 @@ def write(xml, curser, connection): # initialize parameters to default dbPath = DEFAULT_DB_PATH encryptOn = False +verbose = False +killer = Killer() # check for flags flags = sys.argv @@ -78,6 +103,8 @@ def write(xml, curser, connection): dbPath = str(flags.pop(0)) elif (flag == '-e'): encryptOn = True + elif (flag == '-v'): + verbose = True # setup server object server = tcpcomms.Server() @@ -91,9 +118,14 @@ def write(xml, curser, connection): tool = encryptiontool.SecurityTool() # receive-unpack-write loop -while(True): +while(killer.die != True): # receive and unpack data - packet = server.receive() + try: + packet = server.receive() + except InterruptedError: + print("Interrupted socket receive, continuing") # This is an error and as such is printed regardless of verbosity + continue + #if the packet is an RSA encrypted AES key if(len(packet[0]) == RSA_PACKET and encryptOn): tool.addAesKey(packet) @@ -106,8 +138,13 @@ def write(xml, curser, connection): try: data = packer.unpack(data) except Exception as err: - print('IMF unpack error: ', err) + print('IMF unpack error: ', err) # This is an error and as such is printed regardless of verbosity continue #save to SQLite3 server write(data, curser, connection) + + +# Cleanup - any future cleanup can go here. +del(server) # This doesn't necessarily have to be done, but it doesn't hurt. +print("Exiting") \ No newline at end of file diff --git a/mesh-comms/tcpcomms.py b/mesh-comms/tcpcomms.py index 54d5be7..6af4bb5 100644 --- a/mesh-comms/tcpcomms.py +++ b/mesh-comms/tcpcomms.py @@ -65,7 +65,7 @@ def setup(self): # socket setup print('Binding Socket on port', PORT, '...') scope_id = socket.if_nametoindex('lowpan0') - #scope_id = socket.AF_INET + # scope_id = socket.AF_INET self.serverSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) self.serverSocket.bind((HOST, PORT, 0, scope_id)) #self.serverSocket.bind((HOST, PORT)) @@ -77,7 +77,7 @@ def setup(self): def teardown(self): if (self.serverSocket != None): print('Closing socket...') - self.serverSocket.close + self.serverSocket.shutdown(socket.SHUT_RDWR) # Shutdown reads and writes # recieve data over multiple transactions From 9b80d09a08fe8679bd9017ebf17b3d9c6142f857 Mon Sep 17 00:00:00 2001 From: packocrayons Date: Thu, 22 Mar 2018 10:40:45 -0400 Subject: [PATCH 2/6] Committing the README updates in a separate commit --- README.md | 15 +++++++++++++-- mesh-comms/.gitignore | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 mesh-comms/.gitignore diff --git a/README.md b/README.md index 7e2344a..b7630da 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,22 @@ Provides a runnable **CA stub** that generates a pseudorandom _currentload_ and | `-a [ta_ip]` | Defines target TA IPv6 address | | `-h [j]` | Specifies the spoofed _Home ID_ | -General Usage: +#### General Usage `sudo python3 ca.py -v -c -h 1 -r 5 -t 10 -a dead:beef::1` ### ta.py -TODO + +This is the script that should be running on the TA to receive information and put it in the database + +| CLI parameters | Description | +| --- | --- | +| `-v`| Enable verbose mode | +| `-e`| Enable encryption mode | + +#### General Usage +`sudo python3 ta.py -v [-e] -d database.db` + +Ta.py handles interrupts gracefully, SIGKILL (2, ^C) will kill the program and close any open sockets. SIGQUIT (3, ^\\) will break the current iteration of the loop, this is useful for when SYNACKs are lost in the mesh and the receive socket livelocks (this appears to be a TCP 'bug' of sorts). Of course, any data currently in the socket will be lost. ### udpping.py TODO diff --git a/mesh-comms/.gitignore b/mesh-comms/.gitignore new file mode 100644 index 0000000..822f7f3 --- /dev/null +++ b/mesh-comms/.gitignore @@ -0,0 +1,3 @@ +**/__pycache__ #ignore any python leftovers +*.db #ignore any databases from testing +*.bin #ignore keys \ No newline at end of file From 85a65068285f01566651b314dbd01a873e16d3ec Mon Sep 17 00:00:00 2001 From: packocrayons Date: Thu, 22 Mar 2018 10:44:28 -0400 Subject: [PATCH 3/6] Forgot about a CLI parameter in README --- README.md | 5 ++++- mesh-comms/.gitignore | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 mesh-comms/.gitignore diff --git a/README.md b/README.md index b7630da..6ef5162 100644 --- a/README.md +++ b/README.md @@ -93,9 +93,12 @@ This is the script that should be running on the TA to receive information and p | --- | --- | | `-v`| Enable verbose mode | | `-e`| Enable encryption mode | +| `-d [DB]`| Use database `DB` | #### General Usage -`sudo python3 ta.py -v [-e] -d database.db` +`sudo python3 ta.py -v [-e] [-d database.db]` + +Database defaults to `dat/power-usages.db` Ta.py handles interrupts gracefully, SIGKILL (2, ^C) will kill the program and close any open sockets. SIGQUIT (3, ^\\) will break the current iteration of the loop, this is useful for when SYNACKs are lost in the mesh and the receive socket livelocks (this appears to be a TCP 'bug' of sorts). Of course, any data currently in the socket will be lost. diff --git a/mesh-comms/.gitignore b/mesh-comms/.gitignore deleted file mode 100644 index 822f7f3..0000000 --- a/mesh-comms/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -**/__pycache__ #ignore any python leftovers -*.db #ignore any databases from testing -*.bin #ignore keys \ No newline at end of file From 8ab0a1c81fea4f33098504f82c412055d0c88cba Mon Sep 17 00:00:00 2001 From: packocrayons Date: Thu, 29 Mar 2018 15:24:56 -0400 Subject: [PATCH 4/6] Fixes #29 by also setting a timer that can interrupt the socket - configurable deadlock timeout currently set to 30 seconds --- mesh-comms/__pycache__/aestools.cpython-35.pyc | Bin 0 -> 1150 bytes .../__pycache__/encryptiontool.cpython-35.pyc | Bin 0 -> 1375 bytes mesh-comms/__pycache__/packer.cpython-35.pyc | Bin 0 -> 4226 bytes mesh-comms/__pycache__/rsatools.cpython-35.pyc | Bin 0 -> 1589 bytes mesh-comms/__pycache__/tcpcomms.cpython-35.pyc | Bin 0 -> 2812 bytes mesh-comms/ta.py | 13 +++++++++++++ 6 files changed, 13 insertions(+) create mode 100644 mesh-comms/__pycache__/aestools.cpython-35.pyc create mode 100644 mesh-comms/__pycache__/encryptiontool.cpython-35.pyc create mode 100644 mesh-comms/__pycache__/packer.cpython-35.pyc create mode 100644 mesh-comms/__pycache__/rsatools.cpython-35.pyc create mode 100644 mesh-comms/__pycache__/tcpcomms.cpython-35.pyc diff --git a/mesh-comms/__pycache__/aestools.cpython-35.pyc b/mesh-comms/__pycache__/aestools.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..814bfd6db0d659253f09a9819b2ce0bc09fbf573 GIT binary patch literal 1150 zcmZ`(O>Yx15FPJV(#@s~5-o5+NQgrYbSuuNB2A(q6@t|E!d}8QHci{?Zsc`^A~mPN zkKxLlKeAU&{R^CU?#IrN4xM; z;X(iX@J)ZPfBc#cxlpsOr0ekfJdDRhrs5MllSLl)RC!^FY1}O?b*YAf0!PP3S*p#x zK9h0D=oIMrsK~N1&Qv*G!c>)}C?@6hbXGM^Rjzbu)Pb6XoSlb(L?kp@BTkwduX1*l zzzYBnI2Uv!EO6-Bp}E6MaQ6?GlSAh&+e{I_1x062@^(8rZBH|(++2OC>Tlom`on&A zud1nhq-Rsp_9{=NCe<|#3PxwsvC>s@=~c4FKE9B}u*Om0(hEtpV3+JBXH$e?L+E?J zD<(dS6_Z^U|7K$IH{O!MiUq34`1Hl0M|1eRg>ZqTqZ`;vM;NM_RF+BQ+k&VXz0Psx zR#RVdeOPjOgQJ_v=moPRy3D7kl>gzmj0Mlf`0a}4rf3Px%tz?9{h?SNOW=7;TyKzQ z4&AJJtdNz?Kt0Ha2V)?Ym69DUvBR|vaJM3I`X5nrMydRXB?v*eTI@wv{#2jk#wLSx z)-dr|&dy@mTTI=*6|A9r4QM^X4@$m85^ExWd{)ATum|n1YIeCoitVl~3VZL#?b@Mz zgZ2^W`-s>0pP=7~*^D%AbmwSWMz(_LFS9~kPSh^H)si{3M9U4Fz>T7)9@TyUwQ%D% literal 0 HcmV?d00001 diff --git a/mesh-comms/__pycache__/encryptiontool.cpython-35.pyc b/mesh-comms/__pycache__/encryptiontool.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd794aa5dd12ce19139e33d1051c7aa826919299 GIT binary patch literal 1375 zcmZ9LPjAyO6u_U8H0!!<{M!a)Ad0vUX{-|G39ag22T+kHVyF@dS?qRc)1P7!h%a1+BTWCJm(7cK{F&dZx$*C*cAzZ-WYjqqYqRpaznfE zbByi)F93Iqj>-z~qS0O8t9U{wE4M^Al93*NOw%}I=#(1$>7)jBwT_|-Fa_{U=q-;m zJ(g|8k<#xwjWkiCfspmCNVLLvM~S%e6C~1rf1hio=|I#@6G4iL}u$bA#bfB;0c(<(9d_AnXgB*?lq2SY&FD3zwEx1J3J0 zy%pnII8+-bz`AEYVLR+TD_RfPWP1tVwfPc3Dy$)RhRXR@f{6Gua>ShR0?%;0A({)g zaDb@hxGI2r5$=qAzSS5|B`ky5MsO84)_8Gka+`y4a!|5}r%xU=>eWsV#e!FLS{=&t zTf{}R{<>8~0-h^NXe8H27+l3bsAZ~XniYmJO7x7Or0Xt;Pv-DI2R9jR%*ufq4{`Z1 z8mcl1u%1{u)>BqwB{tbv!nnL6qzY4`|Mergg98Lf9FX5USA1xeyo*aFe25%$dsO^r0g;`J?V*1n}r1z#-q8O#r-^xS42k9g(heJ E0S)aPI{*Lx literal 0 HcmV?d00001 diff --git a/mesh-comms/__pycache__/packer.cpython-35.pyc b/mesh-comms/__pycache__/packer.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..413d3ae8de1afa5ba0d58f09987fd1ebf03ba0c3 GIT binary patch literal 4226 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 Bd}sgw literal 0 HcmV?d00001 diff --git a/mesh-comms/__pycache__/rsatools.cpython-35.pyc b/mesh-comms/__pycache__/rsatools.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..247811b694b7c4e4ad481e1bd013f60dcd225b0b GIT binary patch literal 1589 zcmbVMO>f&q5S`_RM9E^Lw6R+RMPZ<-DD_ulMQ7`8w9dg%{|I|ihaZ$#SKakG%1DCq+f~RfKuEo>$fOv zQ@UY&I2}qu>u*qchelENFMO3EVcet99{$?HgTZKb{NvvK5K-?~>aj}lw8+MjrIyvj z{r*Xj$$mNOkFrGRr)rk=&*XAvGRrTvZ&@qPC-d2~&Y1GI_;Twpz<;%X(L|?$OTQBI z2BAaR<;t%ddLwM;twV<{9Xj>t5|1?K3Kpfi{2*>|Db{QMo((ux@Utrq(2gSSa7F=< zaTb%<9q#`SwG{Ia2gfp(D$&w-MJaO=9PIx*9`3#P-gJjAzkU8}FutDf7iy+u+`6tb zZpqhWq4a@V8h<)3DjB)P1q4RCioI9J`;AnHul#+q0&Jp|X_5Dz$m&cNWq(kdt4fX! z3*dbN<%;n>2Hp>*MV3|lOjakgtExm7#k|@nm!`YkIrzj5s&^RT9t?@D{e2*|L>oWV z#oScz3N9amS+R_K2M3Jk6(c|lM35!IrBjc9G1CN&e5L@9a_G_}R-4QVhe-1Puybe} zHHiY%z&jP7CgUlYq!wn=nq@Uoia&1LTrT3K%%^Hu>c}^4nrPDkbR(^1`LWvIq{ehs zo=9cFI!~rg5}jB?SLP09wd+;D@FC)=4MWam4T5?f(e1@Q$IAaMUI%skZ$Y3Ke@M$> zfc__SmkldTF+a9=^)9@)nMzx{@om3FzPiT=n{2pxwZ&Q8^ZdVyuit{=KSusr#cv9A zA9GU-dol1l1{l>#7<3`GAg!51|JfE?(T>6ddh=QXpc?`>b4We4g0W%{dD{lIE%^}R zPO~c9{p8cnKL6s&M~@$_yo=zO-d+^ythxw)lG}-r+i8IlCXGDHk?~6~uZ=sGx!pH< z$%85q^&YkwhjpR1Yapzkuep37D-9%exj@ziiH7Ki9!5umj$(NnMxD4fVAT~nLwjVQ zcUDJ1SWgeE>MT|9dhW;`jmpCtl;xELZX3&P-fq~w|Asob^Ocoo@Ksi%=X3crH=#wR Rhh6nH8lvHLI-Pc>^$*CnP%;1j literal 0 HcmV?d00001 diff --git a/mesh-comms/__pycache__/tcpcomms.cpython-35.pyc b/mesh-comms/__pycache__/tcpcomms.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ba8f0ddfe62352a9e847c1e6d40eb166c378288 GIT binary patch literal 2812 zcmbtW&2HO95S}F|>c^CSk|vFlw6)PogratV0zCvpn#8e_pokJ!N}Uod2$@{Rv?Wqm zuI*T`FLnA7eS@BRD0=FtPf+y2Ytchqp{IVcq~ssuR!JNTXJ>c6o&9D;SDVeoKY#q< z|LGC^O=mtf^t*Vn4n%~Xpgxg5(FOT}B8z;BBAa}hB8Pm3q6+yHid>4S^alPeJ&bA; z)%gYT1QV*fR;Sf?i-oBje{z{9r^(zS>ejxfb5%gjsA~S88mk_*50ptbj zomRCyy1ts}-ey0}w&UdGLYO9r40W6)OG`_BwVxggd&y@?a0F&LGKttJ>ggVaM~w$i z7BZRW#nE&p4R@tp2>WR!qs7)tUKy%5(Yc$M0e?E)3XNHLw`8u!NTMHhySG!;2 zQ=O+PUk9D;`s%$Wej}4w#{-$}>3pjD_{r+i=iQ*Qx{_B*Xu0$3>3TPB#95pGc@oOp z&a}#1nS^O1a|d{$ydsrKRbDZ0T8{5TGSj)k$n#njrb8LTk?%0JpGkoQ^zZueb~=#D zo9Zx1ljR38+tulCc_rObnGD*gmf3P=&{O)MilgO>wU^L74b#COTOP=4yHs^JG`6MT zp_<0ROrz{W2okQ<5Hr>d(G>F)Xu^XwZOvL9?8Y}_xABL$co$DLgplAfI1dTdf&bt< z=xk^P-n@Yw%s1p`-J}4x&pIeyr>J3ckZy`1&*(5VDVjEVgQ6LVW{nO9PLa9X?MSsR zReLSu>*o(6;>TnKAL%q7KxrfZa|{?kRme`uYLDiMMHX;XO79Ipo0g>Ahjg z;v4I4iCfO>d8|JeZrzaTA@TA6^izctiF*GY8m&+tKVH9md zsg7fArdg~HP54S6NH2{vdwCIyYm#sOD~7_+CQ%ooW(lMidpC|I=~j4qd(o*h4TOBJ}82?tP$5P*OP0T)*rHOrzM6jGR= zpwdD*MuP38#xhpd%yhZ9qO$U26jw1WuDmM7!1$uXmb(i>-#@d{7M*d?LSE);Gm$RaF*D8sFiGx%230 zr|Y{YyIM|2b%~wMlS*BM?IE5FJrc=x*{X{V#Z7BgjJ(sp?hPjqWsH*)O0;W} zS~jnUPSHY&F%Bx)QV|*x4bIyY6mpIRmq@8O7b*qo`J8?&E0d%+Y`yacWqSR=#yYrS z66C@$u47UcPnj1pD14LL9p~2M3>-futzpIQP|7o$f;P<;#pXMUiGluGdO!hbERY7w zKpnE_^ieO?)~R$Ypd(I-IocP=xgvXQnLs;?wfBiZ=5cUPOC!24b86(dx!nB7hT|MUd5s^ z-k0CQDZ2?lR#RLNvvytB=y)#vn#_widtS_P`5u?Xa#G9VO3(iif*@}M!61$H`mB3F z@M^EuFGdO)^4e;i#SIoF`#xfgGe$Ar)GZdLL^K+=6Lke*2~Wlu=UFZqvsd*ho`Y}G xtDEsw%}^UhKFo@=UgW7Cv#7D)-fleKwMAb0vH*XF$(*sTCp;TF@weiA@E_z`MGXJ| literal 0 HcmV?d00001 diff --git a/mesh-comms/ta.py b/mesh-comms/ta.py index ee08566..f11c5b1 100644 --- a/mesh-comms/ta.py +++ b/mesh-comms/ta.py @@ -20,6 +20,7 @@ RSA_PACKET = 256 VALID_PACKET = 16 DEFAULT_DB_PATH = 'dat/power-usages.db' +DEADLOCK_TIMEOUT = 30 # 30 seconds of deadlock is generally locked enoug hthat there's no recovering ############################################################################### # GRACEFUL SIGNAL HANDLING @@ -44,6 +45,11 @@ def quit(self, signum, frame): ############################################################################### # DECLARING FUNCTIONS ############################################################################### +def timeoutSocket(): + printv("Socket deadlock detected - breaking lock") + raise InterruptedError + + def printv(string): if verbose: print(string) @@ -117,8 +123,13 @@ def write(xml, curser, connection): if(encryptOn): tool = encryptiontool.SecurityTool() + # receive-unpack-write loop while(killer.die != True): + + socketDeadlockDetector = Timer(DEADLOCK_TIMEOUT, timeoutSocket) # We have to recreate this every time, we can't restart the same timer even though it's dead. + socketDeadlockDetector.start() # Start the timer now - if DEADLOCK_TIMEOUT is hit, the server.receive function is locked and it will be interrupted + # receive and unpack data try: packet = server.receive() @@ -126,6 +137,8 @@ def write(xml, curser, connection): print("Interrupted socket receive, continuing") # This is an error and as such is printed regardless of verbosity continue + socketDeadlockDetector.cancel() # We've hit the end, cancel the timer regardless of how we got here, it will be restarted next time around + #if the packet is an RSA encrypted AES key if(len(packet[0]) == RSA_PACKET and encryptOn): tool.addAesKey(packet) From 163f335c28e11a8637db687204635a816914cf17 Mon Sep 17 00:00:00 2001 From: packocrayons Date: Thu, 29 Mar 2018 15:25:30 -0400 Subject: [PATCH 5/6] removing pycache because gitignore hates me --- mesh-comms/__pycache__/aestools.cpython-35.pyc | Bin 1150 -> 0 bytes .../__pycache__/encryptiontool.cpython-35.pyc | Bin 1375 -> 0 bytes mesh-comms/__pycache__/packer.cpython-35.pyc | Bin 4226 -> 0 bytes mesh-comms/__pycache__/rsatools.cpython-35.pyc | Bin 1589 -> 0 bytes mesh-comms/__pycache__/tcpcomms.cpython-35.pyc | Bin 2812 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mesh-comms/__pycache__/aestools.cpython-35.pyc delete mode 100644 mesh-comms/__pycache__/encryptiontool.cpython-35.pyc delete mode 100644 mesh-comms/__pycache__/packer.cpython-35.pyc delete mode 100644 mesh-comms/__pycache__/rsatools.cpython-35.pyc delete mode 100644 mesh-comms/__pycache__/tcpcomms.cpython-35.pyc diff --git a/mesh-comms/__pycache__/aestools.cpython-35.pyc b/mesh-comms/__pycache__/aestools.cpython-35.pyc deleted file mode 100644 index 814bfd6db0d659253f09a9819b2ce0bc09fbf573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZ`(O>Yx15FPJV(#@s~5-o5+NQgrYbSuuNB2A(q6@t|E!d}8QHci{?Zsc`^A~mPN zkKxLlKeAU&{R^CU?#IrN4xM; z;X(iX@J)ZPfBc#cxlpsOr0ekfJdDRhrs5MllSLl)RC!^FY1}O?b*YAf0!PP3S*p#x zK9h0D=oIMrsK~N1&Qv*G!c>)}C?@6hbXGM^Rjzbu)Pb6XoSlb(L?kp@BTkwduX1*l zzzYBnI2Uv!EO6-Bp}E6MaQ6?GlSAh&+e{I_1x062@^(8rZBH|(++2OC>Tlom`on&A zud1nhq-Rsp_9{=NCe<|#3PxwsvC>s@=~c4FKE9B}u*Om0(hEtpV3+JBXH$e?L+E?J zD<(dS6_Z^U|7K$IH{O!MiUq34`1Hl0M|1eRg>ZqTqZ`;vM;NM_RF+BQ+k&VXz0Psx zR#RVdeOPjOgQJ_v=moPRy3D7kl>gzmj0Mlf`0a}4rf3Px%tz?9{h?SNOW=7;TyKzQ z4&AJJtdNz?Kt0Ha2V)?Ym69DUvBR|vaJM3I`X5nrMydRXB?v*eTI@wv{#2jk#wLSx z)-dr|&dy@mTTI=*6|A9r4QM^X4@$m85^ExWd{)ATum|n1YIeCoitVl~3VZL#?b@Mz zgZ2^W`-s>0pP=7~*^D%AbmwSWMz(_LFS9~kPSh^H)si{3M9U4Fz>T7)9@TyUwQ%D% diff --git a/mesh-comms/__pycache__/encryptiontool.cpython-35.pyc b/mesh-comms/__pycache__/encryptiontool.cpython-35.pyc deleted file mode 100644 index fd794aa5dd12ce19139e33d1051c7aa826919299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1375 zcmZ9LPjAyO6u_U8H0!!<{M!a)Ad0vUX{-|G39ag22T+kHVyF@dS?qRc)1P7!h%a1+BTWCJm(7cK{F&dZx$*C*cAzZ-WYjqqYqRpaznfE zbByi)F93Iqj>-z~qS0O8t9U{wE4M^Al93*NOw%}I=#(1$>7)jBwT_|-Fa_{U=q-;m zJ(g|8k<#xwjWkiCfspmCNVLLvM~S%e6C~1rf1hio=|I#@6G4iL}u$bA#bfB;0c(<(9d_AnXgB*?lq2SY&FD3zwEx1J3J0 zy%pnII8+-bz`AEYVLR+TD_RfPWP1tVwfPc3Dy$)RhRXR@f{6Gua>ShR0?%;0A({)g zaDb@hxGI2r5$=qAzSS5|B`ky5MsO84)_8Gka+`y4a!|5}r%xU=>eWsV#e!FLS{=&t zTf{}R{<>8~0-h^NXe8H27+l3bsAZ~XniYmJO7x7Or0Xt;Pv-DI2R9jR%*ufq4{`Z1 z8mcl1u%1{u)>BqwB{tbv!nnL6qzY4`|Mergg98Lf9FX5USA1xeyo*aFe25%$dsO^r0g;`J?V*1n}r1z#-q8O#r-^xS42k9g(heJ E0S)aPI{*Lx diff --git a/mesh-comms/__pycache__/packer.cpython-35.pyc b/mesh-comms/__pycache__/packer.cpython-35.pyc deleted file mode 100644 index 413d3ae8de1afa5ba0d58f09987fd1ebf03ba0c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4226 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 Bd}sgw diff --git a/mesh-comms/__pycache__/rsatools.cpython-35.pyc b/mesh-comms/__pycache__/rsatools.cpython-35.pyc deleted file mode 100644 index 247811b694b7c4e4ad481e1bd013f60dcd225b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmbVMO>f&q5S`_RM9E^Lw6R+RMPZ<-DD_ulMQ7`8w9dg%{|I|ihaZ$#SKakG%1DCq+f~RfKuEo>$fOv zQ@UY&I2}qu>u*qchelENFMO3EVcet99{$?HgTZKb{NvvK5K-?~>aj}lw8+MjrIyvj z{r*Xj$$mNOkFrGRr)rk=&*XAvGRrTvZ&@qPC-d2~&Y1GI_;Twpz<;%X(L|?$OTQBI z2BAaR<;t%ddLwM;twV<{9Xj>t5|1?K3Kpfi{2*>|Db{QMo((ux@Utrq(2gSSa7F=< zaTb%<9q#`SwG{Ia2gfp(D$&w-MJaO=9PIx*9`3#P-gJjAzkU8}FutDf7iy+u+`6tb zZpqhWq4a@V8h<)3DjB)P1q4RCioI9J`;AnHul#+q0&Jp|X_5Dz$m&cNWq(kdt4fX! z3*dbN<%;n>2Hp>*MV3|lOjakgtExm7#k|@nm!`YkIrzj5s&^RT9t?@D{e2*|L>oWV z#oScz3N9amS+R_K2M3Jk6(c|lM35!IrBjc9G1CN&e5L@9a_G_}R-4QVhe-1Puybe} zHHiY%z&jP7CgUlYq!wn=nq@Uoia&1LTrT3K%%^Hu>c}^4nrPDkbR(^1`LWvIq{ehs zo=9cFI!~rg5}jB?SLP09wd+;D@FC)=4MWam4T5?f(e1@Q$IAaMUI%skZ$Y3Ke@M$> zfc__SmkldTF+a9=^)9@)nMzx{@om3FzPiT=n{2pxwZ&Q8^ZdVyuit{=KSusr#cv9A zA9GU-dol1l1{l>#7<3`GAg!51|JfE?(T>6ddh=QXpc?`>b4We4g0W%{dD{lIE%^}R zPO~c9{p8cnKL6s&M~@$_yo=zO-d+^ythxw)lG}-r+i8IlCXGDHk?~6~uZ=sGx!pH< z$%85q^&YkwhjpR1Yapzkuep37D-9%exj@ziiH7Ki9!5umj$(NnMxD4fVAT~nLwjVQ zcUDJ1SWgeE>MT|9dhW;`jmpCtl;xELZX3&P-fq~w|Asob^Ocoo@Ksi%=X3crH=#wR Rhh6nH8lvHLI-Pc>^$*CnP%;1j diff --git a/mesh-comms/__pycache__/tcpcomms.cpython-35.pyc b/mesh-comms/__pycache__/tcpcomms.cpython-35.pyc deleted file mode 100644 index 3ba8f0ddfe62352a9e847c1e6d40eb166c378288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2812 zcmbtW&2HO95S}F|>c^CSk|vFlw6)PogratV0zCvpn#8e_pokJ!N}Uod2$@{Rv?Wqm zuI*T`FLnA7eS@BRD0=FtPf+y2Ytchqp{IVcq~ssuR!JNTXJ>c6o&9D;SDVeoKY#q< z|LGC^O=mtf^t*Vn4n%~Xpgxg5(FOT}B8z;BBAa}hB8Pm3q6+yHid>4S^alPeJ&bA; z)%gYT1QV*fR;Sf?i-oBje{z{9r^(zS>ejxfb5%gjsA~S88mk_*50ptbj zomRCyy1ts}-ey0}w&UdGLYO9r40W6)OG`_BwVxggd&y@?a0F&LGKttJ>ggVaM~w$i z7BZRW#nE&p4R@tp2>WR!qs7)tUKy%5(Yc$M0e?E)3XNHLw`8u!NTMHhySG!;2 zQ=O+PUk9D;`s%$Wej}4w#{-$}>3pjD_{r+i=iQ*Qx{_B*Xu0$3>3TPB#95pGc@oOp z&a}#1nS^O1a|d{$ydsrKRbDZ0T8{5TGSj)k$n#njrb8LTk?%0JpGkoQ^zZueb~=#D zo9Zx1ljR38+tulCc_rObnGD*gmf3P=&{O)MilgO>wU^L74b#COTOP=4yHs^JG`6MT zp_<0ROrz{W2okQ<5Hr>d(G>F)Xu^XwZOvL9?8Y}_xABL$co$DLgplAfI1dTdf&bt< z=xk^P-n@Yw%s1p`-J}4x&pIeyr>J3ckZy`1&*(5VDVjEVgQ6LVW{nO9PLa9X?MSsR zReLSu>*o(6;>TnKAL%q7KxrfZa|{?kRme`uYLDiMMHX;XO79Ipo0g>Ahjg z;v4I4iCfO>d8|JeZrzaTA@TA6^izctiF*GY8m&+tKVH9md zsg7fArdg~HP54S6NH2{vdwCIyYm#sOD~7_+CQ%ooW(lMidpC|I=~j4qd(o*h4TOBJ}82?tP$5P*OP0T)*rHOrzM6jGR= zpwdD*MuP38#xhpd%yhZ9qO$U26jw1WuDmM7!1$uXmb(i>-#@d{7M*d?LSE);Gm$RaF*D8sFiGx%230 zr|Y{YyIM|2b%~wMlS*BM?IE5FJrc=x*{X{V#Z7BgjJ(sp?hPjqWsH*)O0;W} zS~jnUPSHY&F%Bx)QV|*x4bIyY6mpIRmq@8O7b*qo`J8?&E0d%+Y`yacWqSR=#yYrS z66C@$u47UcPnj1pD14LL9p~2M3>-futzpIQP|7o$f;P<;#pXMUiGluGdO!hbERY7w zKpnE_^ieO?)~R$Ypd(I-IocP=xgvXQnLs;?wfBiZ=5cUPOC!24b86(dx!nB7hT|MUd5s^ z-k0CQDZ2?lR#RLNvvytB=y)#vn#_widtS_P`5u?Xa#G9VO3(iif*@}M!61$H`mB3F z@M^EuFGdO)^4e;i#SIoF`#xfgGe$Ar)GZdLL^K+=6Lke*2~Wlu=UFZqvsd*ho`Y}G xtDEsw%}^UhKFo@=UgW7Cv#7D)-fleKwMAb0vH*XF$(*sTCp;TF@weiA@E_z`MGXJ| From 442ba25c207229c0dcce682ca96034e5f3d870fd Mon Sep 17 00:00:00 2001 From: packocrayons Date: Fri, 30 Mar 2018 11:23:21 -0400 Subject: [PATCH 6/6] Revert "Fixes #29 by also setting a timer that can interrupt the socket - configurable deadlock timeout currently set to 30 seconds" This reverts commit 8ab0a1c81fea4f33098504f82c412055d0c88cba. Undoing the timer stuff --- mesh-comms/ta.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/mesh-comms/ta.py b/mesh-comms/ta.py index f11c5b1..ee08566 100644 --- a/mesh-comms/ta.py +++ b/mesh-comms/ta.py @@ -20,7 +20,6 @@ RSA_PACKET = 256 VALID_PACKET = 16 DEFAULT_DB_PATH = 'dat/power-usages.db' -DEADLOCK_TIMEOUT = 30 # 30 seconds of deadlock is generally locked enoug hthat there's no recovering ############################################################################### # GRACEFUL SIGNAL HANDLING @@ -45,11 +44,6 @@ def quit(self, signum, frame): ############################################################################### # DECLARING FUNCTIONS ############################################################################### -def timeoutSocket(): - printv("Socket deadlock detected - breaking lock") - raise InterruptedError - - def printv(string): if verbose: print(string) @@ -123,13 +117,8 @@ def write(xml, curser, connection): if(encryptOn): tool = encryptiontool.SecurityTool() - # receive-unpack-write loop while(killer.die != True): - - socketDeadlockDetector = Timer(DEADLOCK_TIMEOUT, timeoutSocket) # We have to recreate this every time, we can't restart the same timer even though it's dead. - socketDeadlockDetector.start() # Start the timer now - if DEADLOCK_TIMEOUT is hit, the server.receive function is locked and it will be interrupted - # receive and unpack data try: packet = server.receive() @@ -137,8 +126,6 @@ def write(xml, curser, connection): print("Interrupted socket receive, continuing") # This is an error and as such is printed regardless of verbosity continue - socketDeadlockDetector.cancel() # We've hit the end, cancel the timer regardless of how we got here, it will be restarted next time around - #if the packet is an RSA encrypted AES key if(len(packet[0]) == RSA_PACKET and encryptOn): tool.addAesKey(packet)