grider.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-"
  3. """
  4. This file is part of the UFONet project, https://ufonet.03c8.net
  5. Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
  6. You should have received a copy of the GNU General Public License along
  7. with UFONet; if not, write to the Free Software Foundation, Inc., 51
  8. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  9. """
  10. import socket, re, time, string, sys, os, traceback
  11. from threading import *
  12. class Paster(Thread):
  13. def __init__(self, parent):
  14. Thread.__init__(self)
  15. self.parent = parent
  16. self.active = False
  17. self.sock = None
  18. self.clean = False
  19. def run( self ):
  20. conn = None
  21. addr = None
  22. self.sock = self.parent.try_bind(9992)
  23. if self.sock is not None:
  24. self.sock.listen(1)
  25. print('[Info] [AI] Clean on port 9992')
  26. self.clean = True
  27. else:
  28. print('[Error] [AI] No paste on port 9992')
  29. while self.clean:
  30. try:
  31. conn,addr = self.sock.accept()
  32. print('[Info] [AI] Got copy from', addr)
  33. data = conn.recv(4096).decode()
  34. print ("[Info] [AI] Stream received:", repr(data))
  35. except socket.timeout:
  36. print("[Info] [AI] Socket listening...")
  37. pass
  38. except socket.error as e:
  39. if self.clean == False:
  40. print("[Error] [AI] Socket Error /return : "+str(e))
  41. return
  42. else:
  43. print("[Error] [AI] Socket Error /break : "+str(e))
  44. break
  45. else:
  46. if data:
  47. l=len(data)
  48. print("[Info] [AI] Received data...\n")
  49. if data.find('\n')==-1 and data.find('\r')==-1:
  50. if data.find("#?#")!=-1:
  51. print("[Info] [AI] Adding to grid")
  52. fc=open(self.parent.target_dir+"grid.txt","a")
  53. fc.write(data+"\n")
  54. fc.close()
  55. elif data.find("#!#")!=-1:
  56. print("[Info] [AI] Adding to board")
  57. fc=open(self.parent.target_dir+"board.txt","a")
  58. fc.write(data+"\n")
  59. fc.close()
  60. elif data.find("#-#")!=-1:
  61. print("[Info] [AI] Adding to wargames")
  62. fc=open(self.parent.target_dir+"wargames.txt","a")
  63. fc.write(data+"\n")
  64. fc.close()
  65. elif data.find("#L#")!=-1:
  66. print("[Info] [AI] Adding to links")
  67. fc=open(self.parent.target_dir+"links.txt","a")
  68. fc.write(data+"\n")
  69. fc.close()
  70. elif data.find("#S#")!=-1:
  71. print("[Info] [AI] Adding to streams")
  72. fc=open(self.parent.target_dir+"streams.txt","a")
  73. fc.write(data+"\n")
  74. fc.close()
  75. elif data.find("#$#")!=-1:
  76. print("[Info] [AI] Adding to globalnet")
  77. fc=open(self.parent.target_dir+"globalnet.txt","a")
  78. fc.write(data+"\n")
  79. fc.close()
  80. else:
  81. print("[Error] [AI] Unknown data...")
  82. conn.close()
  83. print('[Info] [AI] Done!!!')
  84. self.sock.close()
  85. class Grider ( Thread ):
  86. def __init__(self):
  87. Thread.__init__( self )
  88. self.daemon = True
  89. self.awake = True
  90. self.tmp_dir = "/tmp/"
  91. self.target_dir = '/var/www/ufonet/'
  92. self.blackray = None
  93. self.absorber = None
  94. self.computer = None
  95. def dream(self):
  96. if not os.path.exists(self.target_dir+"grid.txt"):
  97. grid_fail = 0
  98. try:
  99. fc = open(self.target_dir+'grid.txt', 'wb')
  100. fc.close()
  101. except:
  102. print("[Error] [AI] No 'grid.txt' file in "+self.target_dir)
  103. grid_fail = grid_fail + 1
  104. else:
  105. grid_fail = 0
  106. if not os.path.exists(self.target_dir+"board.txt"):
  107. board_fail = 0
  108. try:
  109. fc = open(self.target_dir+'board.txt', 'wb')
  110. fc.close()
  111. except:
  112. print("[Error] [AI] No 'board.txt' file in "+self.target_dir)
  113. board_fail = board_fail + 1
  114. else:
  115. board_fail = 0
  116. if not os.path.exists(self.target_dir+"wargames.txt"):
  117. wargames_fail = 0
  118. try:
  119. fc = open(self.target_dir+'wargames.txt', 'wb')
  120. fc.close()
  121. except:
  122. print("[Error] [AI] No 'wargames.txt' file in "+self.target_dir)
  123. wargames_fail = wargames_fail + 1
  124. else:
  125. wargames_fail = 0
  126. if not os.path.exists(self.target_dir+"links.txt"):
  127. links_fail = 0
  128. try:
  129. fc = open(self.target_dir+'links.txt', 'wb')
  130. fc.close()
  131. except:
  132. print("[Error] [AI] No 'links.txt' file in "+self.target_dir)
  133. links_fail = links_fail + 1
  134. else:
  135. links_fail = 0
  136. if not os.path.exists(self.target_dir+"streams.txt"):
  137. streams_fail = 0
  138. try:
  139. fc = open(self.target_dir+'streams.txt', 'wb')
  140. fc.close()
  141. except:
  142. print("[Error] [AI] No 'streams.txt' file in "+self.target_dir)
  143. streams_fail = streams_fail + 1
  144. else:
  145. streams_fail = 0
  146. if not os.path.exists(self.target_dir+"globalnet.txt"):
  147. globalnet_fail = 0
  148. try:
  149. fc = open(self.target_dir+'globalnet.txt', 'wb')
  150. fc.close()
  151. except:
  152. print("[Error] [AI] No 'globalnet.txt' file in "+self.target_dir)
  153. globalnet_fail = globalnet_fail + 1
  154. else:
  155. globalnet_fail = 0
  156. if not os.access(self.target_dir+"grid.txt",os.W_OK):
  157. print("[Error] [AI] Write access denied for grid file in "+self.target_dir)
  158. grid_fail = grid_fail + 1
  159. if not os.access(self.target_dir+"board.txt",os.W_OK):
  160. print("[Error] [AI] Write access denied for board file in "+self.target_dir)
  161. board_fail = board_fail + 1
  162. if not os.access(self.target_dir+"wargames.txt",os.W_OK):
  163. print("[Error] [AI] Write access denied for wargames file in "+self.target_dir)
  164. wargames_fail = wargames_fail + 1
  165. if not os.access(self.target_dir+"links.txt",os.W_OK):
  166. print("[Error] [AI] Write access denied for links file in "+self.target_dir)
  167. links_fail = links_fail + 1
  168. if not os.access(self.target_dir+"streams.txt",os.W_OK):
  169. print("[Error] [AI] Write access denied for streams file in "+self.target_dir)
  170. streams_fail = streams_fail + 1
  171. if not os.access(self.target_dir+"globalnet.txt",os.W_OK):
  172. print("[Error] [AI] Write access denied for globalnet file in "+self.target_dir)
  173. globalnet_fail = globalnet_fail + 1
  174. if grid_fail > 0 and board_fail > 0 and wargames_fail > 0 and links_fail > 0 and streams_fail > 0 and globalnet_fail > 0:
  175. print("\n[Error] [AI] 'Grid', 'board', 'wargames', 'links', 'streams' and 'globalnet' are unuseable... -> [Aborting!]")
  176. print("\n[Info] [AI] Suspend [Grider] with: Ctrl+z")
  177. sys.exit(2)
  178. self.paster = Paster(self)
  179. self.awake = False
  180. print("[Info] [AI] [Grider] Having sweet dreams...")
  181. def try_bind(self, port):
  182. s=None
  183. try:
  184. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  185. s.settimeout(30)
  186. s.bind(('', port))
  187. except socket.error as e:
  188. if e.errno == 98: # if is in use wait a bit and retry
  189. time.sleep(3)
  190. return self.try_bind(port)
  191. print("[Error] [AI] [Grider] Socket busy, connection failed on port " + str(port))
  192. return s
  193. def run(self):
  194. self.dream()
  195. try:
  196. self.paster.start()
  197. if self.paster.clean:
  198. print("[Info] [AI] [Grider] Advancing time in another space (waiting for server)"+os.linesep)
  199. time.sleep(1)
  200. while self.paster.clean:
  201. print("[Info] [AI] [Grider] Advancing time in another space (waiting for server)"+os.linesep)
  202. time.sleep(1)
  203. print("\n[Info] [AI] [Grider] Sheets are all up and ready...")
  204. while self.paster.clean:
  205. time.sleep(1)
  206. except:
  207. traceback.print_exc()
  208. self.cut()
  209. print("[Info] [AI] [Grider] Finished!!!")
  210. def cut(self):
  211. self.paster.clean=False
  212. self.paster.join()
  213. if __name__ == "__main__":
  214. try:
  215. print("\n[Info] [AI] Initiating copy/paste functions ...\n")
  216. print('='*22 + '\n')
  217. app = Grider()
  218. app.start()
  219. while True: time.sleep(1)
  220. except KeyboardInterrupt:
  221. print("\n[Info] [AI] Terminating copy/paste functions...\n")
  222. app.cut()
  223. except Exception as e:
  224. traceback.print_exc()
  225. print ("\n[Error] [AI] Something wrong trying to copy/paste to the 'grid'... -> [Passing!]\n")