mirror of
https://github.com/ChronosX88/medved.git
synced 2024-11-22 22:52:19 +00:00
51 lines
1.2 KiB
Python
51 lines
1.2 KiB
Python
import socket
|
|
|
|
from Config import cnf
|
|
|
|
from lib.exeq import Task
|
|
|
|
class GopherFindTask(Task):
|
|
def __init__(self, id, root):
|
|
super().__init__(id, root)
|
|
|
|
def _run(self, items):
|
|
for item in items:
|
|
self._process(item)
|
|
return items
|
|
|
|
def _recv(self, sck):
|
|
total_data = []
|
|
while True:
|
|
data = sck.recv(2048)
|
|
if not data:
|
|
break
|
|
total_data.append(data.decode('utf-8'))
|
|
return ''.join(total_data)
|
|
|
|
def _process(self, item):
|
|
sock = socket.socket()
|
|
sock.settimeout(self.lcnf.get('timeout', 20))
|
|
sock.connect((item['data']['ip'], int(70)))
|
|
sock.sendall(b'\n\n')
|
|
|
|
response = self._recv(sock)
|
|
sock.close()
|
|
|
|
self._logger.debug("Parsing result")
|
|
item['data']['files'] = []
|
|
item['data']['filter'] = False
|
|
for s in [s for s in response.split("\r\n") if s]:
|
|
node = {}
|
|
fields = s.split("\t")
|
|
self._logger.debug(fields)
|
|
node['type'] = fields[0][0]
|
|
if len(fields) == 4:
|
|
node['name'] = fields[0][1:]
|
|
node['path'] = fields[1]
|
|
node['serv'] = f"{fields[2]}:{fields[3]}"
|
|
item['data']['files'].append(node)
|
|
|
|
if not item['data']['files']:
|
|
item['steps'][self._id] = False
|
|
raise Exception("Empty server (not Gopher?)")
|