Added P2P portcheck
This commit is contained in:
parent
1db2327b3d
commit
5c5e4b914c
2 changed files with 59 additions and 3 deletions
|
@ -3,6 +3,7 @@ import os
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
import itertools
|
import itertools
|
||||||
|
import socket
|
||||||
|
|
||||||
# Third party modules
|
# Third party modules
|
||||||
import gevent
|
import gevent
|
||||||
|
@ -13,6 +14,7 @@ from util import RateLimit
|
||||||
from util import StreamingMsgpack
|
from util import StreamingMsgpack
|
||||||
from util import helper
|
from util import helper
|
||||||
from Plugin import PluginManager
|
from Plugin import PluginManager
|
||||||
|
from contextlib import closing
|
||||||
|
|
||||||
FILE_BUFF = 1024 * 512
|
FILE_BUFF = 1024 * 512
|
||||||
|
|
||||||
|
@ -456,6 +458,15 @@ class FileRequest(object):
|
||||||
def actionPing(self, params):
|
def actionPing(self, params):
|
||||||
self.response("Pong!")
|
self.response("Pong!")
|
||||||
|
|
||||||
|
# Check requested port of the other peer
|
||||||
|
def actionCheckport(self, params):
|
||||||
|
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
|
||||||
|
sock.settimeout(5)
|
||||||
|
if sock.connect_ex((self.connection.ip, params["port"])) == 0:
|
||||||
|
self.response("open %s" % self.connection.ip)
|
||||||
|
else:
|
||||||
|
self.response("closed %s" % self.connection.ip)
|
||||||
|
|
||||||
# Unknown command
|
# Unknown command
|
||||||
def actionUnknown(self, cmd, params):
|
def actionUnknown(self, cmd, params):
|
||||||
self.response({"error": "Unknown command: %s" % cmd})
|
self.response({"error": "Unknown command: %s" % cmd})
|
||||||
|
|
|
@ -2,13 +2,12 @@ import logging
|
||||||
import urllib2
|
import urllib2
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import socket
|
import random
|
||||||
|
|
||||||
import gevent
|
import gevent
|
||||||
|
|
||||||
import util
|
import util
|
||||||
from Config import config
|
from Config import config
|
||||||
from FileRequest import FileRequest
|
|
||||||
from Site import SiteManager
|
from Site import SiteManager
|
||||||
from Debug import Debug
|
from Debug import Debug
|
||||||
from Connection import ConnectionServer
|
from Connection import ConnectionServer
|
||||||
|
@ -87,11 +86,57 @@ class FileServer(ConnectionServer):
|
||||||
def testOpenport(self, port=None, use_alternative=True):
|
def testOpenport(self, port=None, use_alternative=True):
|
||||||
if not port:
|
if not port:
|
||||||
port = self.port
|
port = self.port
|
||||||
back = self.testOpenportPortchecker(port)
|
back = self.testOpenportP2P(port)
|
||||||
if back["result"] is not True and use_alternative: # If no success try alternative checker
|
if back["result"] is not True and use_alternative: # If no success try alternative checker
|
||||||
return self.testOpenportCanyouseeme(port)
|
return self.testOpenportCanyouseeme(port)
|
||||||
else:
|
else:
|
||||||
return back
|
return back
|
||||||
|
return back
|
||||||
|
|
||||||
|
def testOpenportP2P(self, port=None):
|
||||||
|
self.log.info("Checking port %s using P2P..." % port)
|
||||||
|
site = SiteManager.site_manager.get("1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D")
|
||||||
|
peers = []
|
||||||
|
res = None
|
||||||
|
if not site: # First run, has no any peers
|
||||||
|
return self.testOpenportPortchecker(port) # Fallback to centralized service
|
||||||
|
for peer in site.peers.values(): # Get all non-onion peers
|
||||||
|
if peer.ip.endswith(".onion"):
|
||||||
|
peers.append(peer)
|
||||||
|
if len(peers) < 3: # Not enough peers
|
||||||
|
return self.testOpenportPortchecker(port) # Fallback to centralized service
|
||||||
|
for retry in range(1, 3): # Try 3 peers
|
||||||
|
random_peer = random.choice(peers)
|
||||||
|
with gevent.Timeout(10.0, False): # 10 sec timeout, don't raise exception
|
||||||
|
random_peer.connect()
|
||||||
|
res = random_peer.request("checkport", {"port": port})
|
||||||
|
break # All fine, exit from for loop
|
||||||
|
if res is None: # Nobody answered
|
||||||
|
return self.testOpenportPortchecker(port) # Fallback to centralized service
|
||||||
|
message = res["body"]
|
||||||
|
if "open" not in message:
|
||||||
|
if config.tor != "always":
|
||||||
|
self.log.info("[BAD :(] Port closed %s" % message)
|
||||||
|
if port == self.port:
|
||||||
|
self.port_opened = False # Self port, update port_opened status
|
||||||
|
match = message.split(" ", 1)[1] # Try find my external ip in message
|
||||||
|
if match: # Found my ip in message
|
||||||
|
config.ip_external = match
|
||||||
|
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||||
|
else:
|
||||||
|
config.ip_external = False
|
||||||
|
return {"result": False, "message": message}
|
||||||
|
else:
|
||||||
|
self.log.info("[OK :)] Port open: %s" % message)
|
||||||
|
if port == self.port: # Self port, update port_opened status
|
||||||
|
self.port_opened = True
|
||||||
|
match = message.split(" ", 1)[1] # Try find my external ip in message
|
||||||
|
if match: # Found my ip in message
|
||||||
|
config.ip_external = match
|
||||||
|
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||||
|
else:
|
||||||
|
config.ip_external = False
|
||||||
|
return {"result": True, "message": message}
|
||||||
|
|
||||||
def testOpenportPortchecker(self, port=None):
|
def testOpenportPortchecker(self, port=None):
|
||||||
self.log.info("Checking port %s using portchecker.co..." % port)
|
self.log.info("Checking port %s using portchecker.co..." % port)
|
||||||
|
|
Loading…
Reference in a new issue