Randomize fileserver port
This commit is contained in:
parent
270922b460
commit
852aaae52e
3 changed files with 48 additions and 10 deletions
|
@ -212,7 +212,8 @@ class Config(object):
|
||||||
self.parser.add_argument('--workers', help='Download workers per site', default=5, type=int, metavar='workers')
|
self.parser.add_argument('--workers', help='Download workers per site', default=5, type=int, metavar='workers')
|
||||||
|
|
||||||
self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')
|
self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')
|
||||||
self.parser.add_argument('--fileserver_port', help='FileServer bind port', default=15441, type=int, metavar='port')
|
self.parser.add_argument('--fileserver_port', help='FileServer bind port (0: randomize)', default=0, type=int, metavar='port')
|
||||||
|
self.parser.add_argument('--fileserver_port_range', help='FileServer randomization range', default="10000-40000", metavar='port')
|
||||||
self.parser.add_argument('--ip_local', help='My local ips', default=ip_local, type=int, metavar='ip', nargs='*')
|
self.parser.add_argument('--ip_local', help='My local ips', default=ip_local, type=int, metavar='ip', nargs='*')
|
||||||
|
|
||||||
self.parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true')
|
self.parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true')
|
||||||
|
|
|
@ -61,22 +61,25 @@ class ConnectionServer(object):
|
||||||
)
|
)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
if port: # Listen server on a port
|
if request_handler:
|
||||||
self.pool = Pool(500) # do not accept more than 500 connections
|
self.handleRequest = request_handler
|
||||||
self.stream_server = StreamServer(
|
|
||||||
(ip.replace("*", "0.0.0.0"), port), self.handleIncomingConnection, spawn=self.pool, backlog=100
|
|
||||||
)
|
|
||||||
if request_handler:
|
|
||||||
self.handleRequest = request_handler
|
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.running = True
|
self.running = True
|
||||||
CryptConnection.manager.loadCerts()
|
CryptConnection.manager.loadCerts()
|
||||||
|
if not self.port:
|
||||||
|
self.log.info("No port found, not binding")
|
||||||
|
return False
|
||||||
|
|
||||||
self.log.debug("Binding to: %s:%s, (msgpack: %s), supported crypt: %s" % (
|
self.log.debug("Binding to: %s:%s, (msgpack: %s), supported crypt: %s" % (
|
||||||
self.ip, self.port,
|
self.ip, self.port,
|
||||||
".".join(map(str, msgpack.version)), CryptConnection.manager.crypt_supported)
|
".".join(map(str, msgpack.version)), CryptConnection.manager.crypt_supported)
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
self.pool = Pool(500) # do not accept more than 500 connections
|
||||||
|
self.stream_server = StreamServer(
|
||||||
|
(self.ip, self.port), self.handleIncomingConnection, spawn=self.pool, backlog=100
|
||||||
|
)
|
||||||
self.stream_server.serve_forever() # Start normal connection server
|
self.stream_server.serve_forever() # Start normal connection server
|
||||||
except Exception, err:
|
except Exception, err:
|
||||||
self.log.info("StreamServer bind error, must be running already: %s" % err)
|
self.log.info("StreamServer bind error, must be running already: %s" % err)
|
||||||
|
|
|
@ -3,6 +3,7 @@ import urllib2
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
|
import socket
|
||||||
|
|
||||||
import gevent
|
import gevent
|
||||||
|
|
||||||
|
@ -20,10 +21,21 @@ from Plugin import PluginManager
|
||||||
class FileServer(ConnectionServer):
|
class FileServer(ConnectionServer):
|
||||||
|
|
||||||
def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port):
|
def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port):
|
||||||
ConnectionServer.__init__(self, ip, port, self.handleRequest)
|
|
||||||
|
|
||||||
self.site_manager = SiteManager.site_manager
|
self.site_manager = SiteManager.site_manager
|
||||||
self.log = logging.getLogger("FileServer")
|
self.log = logging.getLogger("FileServer")
|
||||||
|
ip = ip.replace("*", "0.0.0.0")
|
||||||
|
|
||||||
|
should_use_random_port = port == 0 or config.tor == "always"
|
||||||
|
if should_use_random_port:
|
||||||
|
port_range_from, port_range_to = map(int, config.fileserver_port_range.split("-"))
|
||||||
|
port = self.getRandomPort(ip, port_range_from, port_range_to)
|
||||||
|
config.fileserver_port = port
|
||||||
|
if not port:
|
||||||
|
raise Exception("Can't find bindable port")
|
||||||
|
if not config.tor == "always":
|
||||||
|
config.saveValue("fileserver_port", port) # Save random port value for next restart
|
||||||
|
|
||||||
|
ConnectionServer.__init__(self, ip, port, self.handleRequest)
|
||||||
|
|
||||||
if config.ip_external: # Ip external defined in arguments
|
if config.ip_external: # Ip external defined in arguments
|
||||||
self.port_opened = True
|
self.port_opened = True
|
||||||
|
@ -36,6 +48,28 @@ class FileServer(ConnectionServer):
|
||||||
self.files_parsing = {}
|
self.files_parsing = {}
|
||||||
self.ui_server = None
|
self.ui_server = None
|
||||||
|
|
||||||
|
def getRandomPort(self, ip, port_range_from, port_range_to):
|
||||||
|
self.log.info("Getting random port in range %s-%s..." % (port_range_from, port_range_to))
|
||||||
|
tried = []
|
||||||
|
for bind_retry in range(100):
|
||||||
|
port = random.randint(port_range_from, port_range_to)
|
||||||
|
if port in tried:
|
||||||
|
continue
|
||||||
|
tried.append(port)
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
try:
|
||||||
|
sock.bind((ip, port))
|
||||||
|
success = True
|
||||||
|
except Exception as err:
|
||||||
|
self.log.warning("Error binding to port %s: %s" % (port, err))
|
||||||
|
success = False
|
||||||
|
sock.close()
|
||||||
|
if success:
|
||||||
|
return port
|
||||||
|
else:
|
||||||
|
time.sleep(0.1)
|
||||||
|
return False
|
||||||
|
|
||||||
# Handle request to fileserver
|
# Handle request to fileserver
|
||||||
def handleRequest(self, connection, message):
|
def handleRequest(self, connection, message):
|
||||||
if config.verbose:
|
if config.verbose:
|
||||||
|
|
Loading…
Reference in a new issue