|
@@ -12,8 +12,6 @@ from threading import Thread
|
|
|
from collections import defaultdict
|
|
from collections import defaultdict
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
-log = logging.getLogger(__name__)
|
|
|
|
|
-log.setLevel(logging.DEBUG)
|
|
|
|
|
|
|
|
|
|
MODE_SEARCH = 'search'
|
|
MODE_SEARCH = 'search'
|
|
|
MODE_BOOK = 'book'
|
|
MODE_BOOK = 'book'
|
|
@@ -81,6 +79,7 @@ class IRCClient(Thread):
|
|
|
time_joined = None
|
|
time_joined = None
|
|
|
jobs = defaultdict(dict)
|
|
jobs = defaultdict(dict)
|
|
|
busy = False
|
|
busy = False
|
|
|
|
|
+ running = True
|
|
|
|
|
|
|
|
def __init__(self, command_queue, results_queue):
|
|
def __init__(self, command_queue, results_queue):
|
|
|
super(IRCClient, self).__init__(daemon=True)
|
|
super(IRCClient, self).__init__(daemon=True)
|
|
@@ -89,15 +88,20 @@ class IRCClient(Thread):
|
|
|
self.results_queue = results_queue
|
|
self.results_queue = results_queue
|
|
|
self.send_queue = queue.Queue()
|
|
self.send_queue = queue.Queue()
|
|
|
|
|
|
|
|
|
|
+ self.log = logging.getLogger(self.getName())
|
|
|
|
|
+ self.log.setLevel(logging.DEBUG)
|
|
|
|
|
+
|
|
|
nickstr = "NICK %s" % self.name
|
|
nickstr = "NICK %s" % self.name
|
|
|
userstr = "USER %s %s bla :%s" % (self.name, self.HOST, self.name)
|
|
userstr = "USER %s %s bla :%s" % (self.name, self.HOST, self.name)
|
|
|
|
|
|
|
|
self.send_queue.put(nickstr)
|
|
self.send_queue.put(nickstr)
|
|
|
self.send_queue.put(userstr)
|
|
self.send_queue.put(userstr)
|
|
|
|
|
|
|
|
|
|
+ def stop(self):
|
|
|
|
|
+ self.running = False
|
|
|
def run(self):
|
|
def run(self):
|
|
|
self.handle_connect()
|
|
self.handle_connect()
|
|
|
- while True:
|
|
|
|
|
|
|
+ while self.running:
|
|
|
if self.connected and self.joined_channel:
|
|
if self.connected and self.joined_channel:
|
|
|
self.handle_commands()
|
|
self.handle_commands()
|
|
|
self.process_send_queue()
|
|
self.process_send_queue()
|
|
@@ -106,14 +110,14 @@ class IRCClient(Thread):
|
|
|
except socket.timeout:
|
|
except socket.timeout:
|
|
|
continue
|
|
continue
|
|
|
except socket.error as e:
|
|
except socket.error as e:
|
|
|
- log.error('socket error')
|
|
|
|
|
- log.exception(e)
|
|
|
|
|
|
|
+ self.log.error('socket error')
|
|
|
|
|
+ self.log.exception(e)
|
|
|
self.handle_connect()
|
|
self.handle_connect()
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
- log.exception(e)
|
|
|
|
|
|
|
+ self.log.exception(e)
|
|
|
break
|
|
break
|
|
|
self.handle_close()
|
|
self.handle_close()
|
|
|
- log.info('Exiting RUN')
|
|
|
|
|
|
|
+ self.log.info('Exiting RUN')
|
|
|
|
|
|
|
|
def handle_commands(self):
|
|
def handle_commands(self):
|
|
|
if self.command_queue.empty():
|
|
if self.command_queue.empty():
|
|
@@ -122,21 +126,24 @@ class IRCClient(Thread):
|
|
|
|
|
|
|
|
elapsed = time.time() - self.time_joined
|
|
elapsed = time.time() - self.time_joined
|
|
|
if elapsed < self.TIME_TO_FIRST_COMMAND:
|
|
if elapsed < self.TIME_TO_FIRST_COMMAND:
|
|
|
- log.info("commands to process, but we have to wait %d", self.TIME_TO_FIRST_COMMAND - elapsed)
|
|
|
|
|
|
|
+ self.log.info("commands to process, but we have to wait %d seconds", self.TIME_TO_FIRST_COMMAND - elapsed)
|
|
|
time.sleep(1)
|
|
time.sleep(1)
|
|
|
return
|
|
return
|
|
|
command = self.command_queue.get()
|
|
command = self.command_queue.get()
|
|
|
- log.info("command %s", command)
|
|
|
|
|
|
|
+ self.log.info("command %s", command)
|
|
|
job = query_to_job_key(command['query'])
|
|
job = query_to_job_key(command['query'])
|
|
|
self.set_job_state(job, 'pending')
|
|
self.set_job_state(job, 'pending')
|
|
|
|
|
|
|
|
if command['mode'] == MODE_SEARCH:
|
|
if command['mode'] == MODE_SEARCH:
|
|
|
self.send_queue.put("PRIVMSG %s :@%s %s " % (self.CHANNEL, self.SEARCH_BOT, command['query']))
|
|
self.send_queue.put("PRIVMSG %s :@%s %s " % (self.CHANNEL, self.SEARCH_BOT, command['query']))
|
|
|
return
|
|
return
|
|
|
- self.send_queue.put("PRIVMSG %s :%s " % (self.CHANNEL, command['query']))
|
|
|
|
|
|
|
+ elif command['mode'] == MODE_BOOK:
|
|
|
|
|
+ self.send_queue.put("PRIVMSG %s :%s " % (self.CHANNEL, command['query']))
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.log.error('Invalid command')
|
|
|
|
|
|
|
|
def set_job_state(self, job, state):
|
|
def set_job_state(self, job, state):
|
|
|
- log.info("Setting job [%s] to %s", job, state)
|
|
|
|
|
|
|
+ self.log.info("Setting job [%s] to %s", job, state)
|
|
|
self.jobs[job].update({'state': state})
|
|
self.jobs[job].update({'state': state})
|
|
|
self.results_queue.put({'type': 'status', 'status': state, 'key': job})
|
|
self.results_queue.put({'type': 'status', 'status': state, 'key': job})
|
|
|
if state == 'done':
|
|
if state == 'done':
|
|
@@ -146,11 +153,11 @@ class IRCClient(Thread):
|
|
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
self.socket.connect((self.HOST, self.PORT))
|
|
self.socket.connect((self.HOST, self.PORT))
|
|
|
self.socket.settimeout(2)
|
|
self.socket.settimeout(2)
|
|
|
- log.info("connected")
|
|
|
|
|
|
|
+ self.log.info("connected")
|
|
|
self.connected = True
|
|
self.connected = True
|
|
|
|
|
|
|
|
def handle_close(self):
|
|
def handle_close(self):
|
|
|
- log.info("closed")
|
|
|
|
|
|
|
+ self.log.info("closed")
|
|
|
self.connected = False
|
|
self.connected = False
|
|
|
self.socket.close()
|
|
self.socket.close()
|
|
|
|
|
|
|
@@ -181,7 +188,7 @@ class IRCClient(Thread):
|
|
|
comm = words[1]
|
|
comm = words[1]
|
|
|
|
|
|
|
|
if self.joined_channel:
|
|
if self.joined_channel:
|
|
|
- # log.debug(line)
|
|
|
|
|
|
|
+ # self.log.debug(line)
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
if comm in self.IGNORE:
|
|
if comm in self.IGNORE:
|
|
@@ -190,7 +197,7 @@ class IRCClient(Thread):
|
|
|
if comm == "JOIN":
|
|
if comm == "JOIN":
|
|
|
if self.name not in msg_from: # msg "NICK joined the channel" not about me
|
|
if self.name not in msg_from: # msg "NICK joined the channel" not about me
|
|
|
continue
|
|
continue
|
|
|
- log.info("Joined channel %s", self.CHANNEL)
|
|
|
|
|
|
|
+ self.log.info("Joined channel %s", self.CHANNEL)
|
|
|
self.time_joined = time.time()
|
|
self.time_joined = time.time()
|
|
|
self.joined_channel = True
|
|
self.joined_channel = True
|
|
|
continue
|
|
continue
|
|
@@ -199,7 +206,7 @@ class IRCClient(Thread):
|
|
|
# private message not addressed to me
|
|
# private message not addressed to me
|
|
|
if words[2] != self.name:
|
|
if words[2] != self.name:
|
|
|
continue
|
|
continue
|
|
|
- log.info("privmsg: %s", line)
|
|
|
|
|
|
|
+ self.log.info("privmsg: %s", line)
|
|
|
dcc_args = get_dcc_args(line)
|
|
dcc_args = get_dcc_args(line)
|
|
|
if dcc_args is None:
|
|
if dcc_args is None:
|
|
|
continue
|
|
continue
|
|
@@ -226,9 +233,9 @@ class IRCClient(Thread):
|
|
|
|
|
|
|
|
def netcat(self, ip, port, size, filename, job_key):
|
|
def netcat(self, ip, port, size, filename, job_key):
|
|
|
filename = os.path.basename(filename).replace(" ", "_")
|
|
filename = os.path.basename(filename).replace(" ", "_")
|
|
|
- log.info('netcat: %s %d %d %s', ip, port, size, filename)
|
|
|
|
|
|
|
+ self.log.info('netcat: %s %d %d %s', ip, port, size, filename)
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
- log.info("Receiving file")
|
|
|
|
|
|
|
+ self.log.info("Receiving file")
|
|
|
s.connect((ip, port))
|
|
s.connect((ip, port))
|
|
|
|
|
|
|
|
fname = os.path.join(self.PATH, filename)
|
|
fname = os.path.join(self.PATH, filename)
|
|
@@ -238,13 +245,13 @@ class IRCClient(Thread):
|
|
|
while True:
|
|
while True:
|
|
|
data = s.recv(16384)
|
|
data = s.recv(16384)
|
|
|
if len(data) == 0:
|
|
if len(data) == 0:
|
|
|
- log.info("No data received - finished")
|
|
|
|
|
|
|
+ self.log.info("No data received - finished")
|
|
|
break
|
|
break
|
|
|
count += len(data)
|
|
count += len(data)
|
|
|
f.write(data)
|
|
f.write(data)
|
|
|
perc = int(100 * count / size)
|
|
perc = int(100 * count / size)
|
|
|
if perc % 10 == 0 and perc != last_perc:
|
|
if perc % 10 == 0 and perc != last_perc:
|
|
|
- log.info("Download percentage: %d", perc)
|
|
|
|
|
|
|
+ self.log.info("Download percentage: %d", perc)
|
|
|
self.set_job_state(job_key, "%d%%" % perc)
|
|
self.set_job_state(job_key, "%d%%" % perc)
|
|
|
last_perc = perc
|
|
last_perc = perc
|
|
|
if count >= size:
|
|
if count >= size:
|
|
@@ -265,6 +272,6 @@ class IRCClient(Thread):
|
|
|
return
|
|
return
|
|
|
data = self.send_queue.get()
|
|
data = self.send_queue.get()
|
|
|
if not data.startswith("PONG"):
|
|
if not data.startswith("PONG"):
|
|
|
- log.info("Sending %s", data)
|
|
|
|
|
|
|
+ self.log.info("Sending %s", data)
|
|
|
add = bytes(str(data), "utf-8") + bytes([13, 10])
|
|
add = bytes(str(data), "utf-8") + bytes([13, 10])
|
|
|
self.socket.send(add)
|
|
self.socket.send(add)
|