"""
This file is part of the UFONet project, https://ufonet.03c8.net
Copyright (c) 2013/2020 | psy <[email protected]>
You should have received a copy of the GNU General Public License along
with UFONet; if not, write to the Free Software Foundation, Inc., 51
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
"""
import socket, re, time, string, sys, os, traceback
from threading import *
class Paster(Thread):
def __init__(self, parent):
Thread.__init__(self)
self.parent = parent
self.active = False
self.sock = None
self.clean = False
def run( self ):
conn = None
addr = None
self.sock = self.parent.try_bind(9992)
if self.sock is not None:
self.sock.listen(1)
print('[Info] [AI] Clean on port 9992')
self.clean = True
else:
print('[Error] [AI] No paste on port 9992')
while self.clean:
try:
conn,addr = self.sock.accept()
print('[Info] [AI] Got copy from', addr)
try:
data = conn.recv(4096).decode("utf-8")
except:
data = None
pass
print ("[Info] [AI] Stream received:", repr(data))
except socket.timeout:
print("[Info] [AI] Socket listening...")
pass
except socket.error as e:
if self.clean == False:
print("[Error] [AI] Socket Error /return : "+str(e))
return
else:
print("[Error] [AI] Socket Error /break : "+str(e))
break
else:
if data:
l=len(data)
print("[Info] [AI] Received data...\n")
if data.find('\n')==-1 and data.find('\r')==-1:
if data.find("#?#")!=-1:
print("[Info] [AI] Adding to grid")
fc=open(self.parent.target_dir+"grid.txt","a")
fc.write(data+"\n")
fc.close()
elif data.find("#!#")!=-1:
print("[Info] [AI] Adding to board")
fc=open(self.parent.target_dir+"board.txt","a")
fc.write(data+"\n")
fc.close()
elif data.find("#-#")!=-1:
print("[Info] [AI] Adding to wargames")
fc=open(self.parent.target_dir+"wargames.txt","a")
fc.write(data+"\n")
fc.close()
elif data.find("#L#")!=-1:
print("[Info] [AI] Adding to links")
fc=open(self.parent.target_dir+"links.txt","a")
fc.write(data+"\n")
fc.close()
elif data.find("#S#")!=-1:
print("[Info] [AI] Adding to streams")
fc=open(self.parent.target_dir+"streams.txt","a")
fc.write(data+"\n")
fc.close()
elif data.find("#$#")!=-1:
print("[Info] [AI] Adding to globalnet")
fc=open(self.parent.target_dir+"globalnet.txt","a")
fc.write(data+"\n")
fc.close()
else:
print("[Error] [AI] Unknown data...")
conn.close()
print('[Info] [AI] Done!!!')
self.sock.close()
class Grider ( Thread ):
def __init__(self):
Thread.__init__( self )
self.daemon = True
self.awake = True
self.tmp_dir = "/tmp/"
self.target_dir = '/var/www/ufonet/'
self.blackray = None
self.absorber = None
self.computer = None
def dream(self):
if not os.path.exists(self.target_dir+"grid.txt"):
grid_fail = 0
try:
fc = open(self.target_dir+'grid.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'grid.txt' file in "+self.target_dir)
grid_fail = grid_fail + 1
else:
grid_fail = 0
if not os.path.exists(self.target_dir+"board.txt"):
board_fail = 0
try:
fc = open(self.target_dir+'board.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'board.txt' file in "+self.target_dir)
board_fail = board_fail + 1
else:
board_fail = 0
if not os.path.exists(self.target_dir+"wargames.txt"):
wargames_fail = 0
try:
fc = open(self.target_dir+'wargames.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'wargames.txt' file in "+self.target_dir)
wargames_fail = wargames_fail + 1
else:
wargames_fail = 0
if not os.path.exists(self.target_dir+"links.txt"):
links_fail = 0
try:
fc = open(self.target_dir+'links.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'links.txt' file in "+self.target_dir)
links_fail = links_fail + 1
else:
links_fail = 0
if not os.path.exists(self.target_dir+"streams.txt"):
streams_fail = 0
try:
fc = open(self.target_dir+'streams.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'streams.txt' file in "+self.target_dir)
streams_fail = streams_fail + 1
else:
streams_fail = 0
if not os.path.exists(self.target_dir+"globalnet.txt"):
globalnet_fail = 0
try:
fc = open(self.target_dir+'globalnet.txt', 'wb')
fc.close()
except:
print("[Error] [AI] No 'globalnet.txt' file in "+self.target_dir)
globalnet_fail = globalnet_fail + 1
else:
globalnet_fail = 0
if not os.access(self.target_dir+"grid.txt",os.W_OK):
print("[Error] [AI] Write access denied for grid file in "+self.target_dir)
grid_fail = grid_fail + 1
if not os.access(self.target_dir+"board.txt",os.W_OK):
print("[Error] [AI] Write access denied for board file in "+self.target_dir)
board_fail = board_fail + 1
if not os.access(self.target_dir+"wargames.txt",os.W_OK):
print("[Error] [AI] Write access denied for wargames file in "+self.target_dir)
wargames_fail = wargames_fail + 1
if not os.access(self.target_dir+"links.txt",os.W_OK):
print("[Error] [AI] Write access denied for links file in "+self.target_dir)
links_fail = links_fail + 1
if not os.access(self.target_dir+"streams.txt",os.W_OK):
print("[Error] [AI] Write access denied for streams file in "+self.target_dir)
streams_fail = streams_fail + 1
if not os.access(self.target_dir+"globalnet.txt",os.W_OK):
print("[Error] [AI] Write access denied for globalnet file in "+self.target_dir)
globalnet_fail = globalnet_fail + 1
if grid_fail > 0 and board_fail > 0 and wargames_fail > 0 and links_fail > 0 and streams_fail > 0 and globalnet_fail > 0:
print("\n[Error] [AI] 'Grid', 'board', 'wargames', 'links', 'streams' and 'globalnet' are unuseable... -> [Aborting!]")
print("\n[Info] [AI] Suspend [Grider] with: Ctrl+z")
sys.exit(2)
self.paster = Paster(self)
self.awake = False
print("[Info] [AI] [Grider] Having sweet dreams...")
def try_bind(self, port):
s=None
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(30)
s.bind(('', port))
except socket.error as e:
if e.errno == 98:
time.sleep(3)
return self.try_bind(port)
print("[Error] [AI] [Grider] Socket busy, connection failed on port " + str(port))
return s
def run(self):
self.dream()
try:
self.paster.start()
if self.paster.clean:
print("[Info] [AI] [Grider] Advancing time in another space (waiting for server)"+os.linesep)
time.sleep(1)
while self.paster.clean:
print("[Info] [AI] [Grider] Advancing time in another space (waiting for server)"+os.linesep)
time.sleep(1)
print("\n[Info] [AI] [Grider] Sheets are all up and ready...")
while self.paster.clean:
time.sleep(1)
except:
traceback.print_exc()
self.cut()
print("[Info] [AI] [Grider] Finished!!!")
def cut(self):
self.paster.clean=False
self.paster.join()
if __name__ == "__main__":
try:
print("\n[Info] [AI] Initiating copy/paste functions ...\n")
print('='*22 + '\n')
app = Grider()
app.start()
while True: time.sleep(1)
except KeyboardInterrupt:
print("\n[Info] [AI] Terminating copy/paste functions...\n")
app.cut()
except Exception as e:
traceback.print_exc()
print ("\n[Error] [AI] Something wrong trying to copy/paste to the 'grid'... -> [Passing!]\n")