--- Begin Message ---
Package: bittornado
Version: 0.3.18-8dfd~002
Severity: minor
Tags: patch
BitTornado connects to peers using any outgoing port and not using an existing
connection which means many connections get blocked when using a restrictive
firewall (many syslog messages). The attached patches are the patch to add to
the quilt series that adds the functionality and the man page patch to document
the new parameters.
The new patch allows you to specify range of ports which BitTornado will use to
make outgoing connections. This allows one to specify the port range to bt and
the firewall so that there aren't blocked connection for traffic we want.
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing'), (500, 'stable')
Architecture: i386 (i686)
Kernel: Linux 2.6.26-1-686 (SMP w/1 CPU core)
Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages bittornado depends on:
ii python 2.5.2-2 An interactive high-level object-o
ii python-support 0.8.4 automated rebuilding support for P
Versions of packages bittornado recommends:
ii mime-support 3.44-1 MIME files 'mime.types' & 'mailcap
ii python-crypto 2.0.1+dfsg1-2.3 cryptographic algorithms and proto
Versions of packages bittornado suggests:
pn bittornado-gui <none> (no description available)
pn python-psyco <none> (no description available)
-- no debconf information
Index: bittornado-0.3.18/BitTornado/RawServer.py
===================================================================
--- bittornado-0.3.18.orig/BitTornado/RawServer.py 2008-09-20 20:45:29.000000000 -0400
+++ bittornado-0.3.18/BitTornado/RawServer.py 2008-09-20 20:45:30.000000000 -0400
@@ -43,11 +43,13 @@
READSIZE = 32768
class RawServer:
- def __init__(self, doneflag, timeout_check_interval, timeout, noisy = True,
+ def __init__(self, doneflag, timeout_check_interval, timeout, config,
+ noisy = True,
ipv6_enable = True, failfunc = lambda x: None, errorfunc = None,
sockethandler = None, excflag = Event()):
self.timeout_check_interval = timeout_check_interval
self.timeout = timeout
+ self.config = config
self.servers = {}
self.single_sockets = {}
self.dead_from_write = []
@@ -63,7 +65,8 @@
self.excflag = excflag
if sockethandler is None:
- sockethandler = SocketHandler(timeout, ipv6_enable, READSIZE)
+ sockethandler = SocketHandler(timeout, ipv6_enable, config,
+ READSIZE)
self.sockethandler = sockethandler
self.add_task(self.scan_for_timeouts, timeout_check_interval)
Index: bittornado-0.3.18/BitTornado/SocketHandler.py
===================================================================
--- bittornado-0.3.18.orig/BitTornado/SocketHandler.py 2008-09-20 20:45:30.000000000 -0400
+++ bittornado-0.3.18/BitTornado/SocketHandler.py 2008-09-20 20:49:18.000000000 -0400
@@ -121,8 +121,9 @@
self.handler = handler
class SocketHandler:
- def __init__(self, timeout, ipv6_enable, readsize = 100000):
+ def __init__(self, timeout, ipv6_enable, config, readsize = 100000):
self.timeout = timeout
+ self.config = config
self.ipv6_enable = ipv6_enable
self.readsize = readsize
self.poll = poll()
@@ -231,11 +232,69 @@
def set_handler(self, handler):
self.handler = handler
+ def bind_send(self, port, bind = '', reuse = False, ipv6_socket_style = 1, upnp = 0):
+ port = int(port)
+ addrinfos = []
+ interfaces = []
+ # if bind != "" thread it as a comma seperated list and bind to all
+ # addresses (can be ips or hostnames) else bind to default ipv6 and
+ # ipv4 address
+ if bind:
+ if self.ipv6_enable:
+ socktype = socket.AF_UNSPEC
+ else:
+ socktype = socket.AF_INET
+
+ if sys.version_info < (2,2):
+ addrinfo = (socket.AF_INET, None, None, None, (addr, port))
+ else:
+ addrinfo = (socket.getaddrinfo(addr, port,
+ socktype, socket.SOCK_STREAM))
+ else:
+ if self.ipv6_enable:
+ addrinfo = ([socket.AF_INET6, None, None, None, ('', port)])
+ if not addrinfo or ipv6_socket_style != 0:
+ addrinfo = ([socket.AF_INET, None, None, None, ('', port)])
+ try:
+ socket = socket.socket(addrinfo[0], socket.SOCK_STREAM)
+ if reuse:
+ server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ socket.setblocking(0)
+ socket.bind(addrinfo[4])
+ except socket.error, e:
+ socket.close()
+ if self.ipv6_enable and ipv6_socket_style == 0 and servers:
+ raise socket.error('blocked port (may require ipv6_binds_v4 to be set)')
+ raise socket.error(str(e))
+ if not socket:
+ raise socket.error('unable to open send port')
+ return socket
+
+ def find_and_bind_send(self, minport, maxport, bind = '', reuse = False,
+ ipv6_socket_style = 1, randomizer = False):
+ send_port = -1
+ e = 'maxport less than minport - no ports to check'
+ portrange = range(minport, maxport+1)
+ if randomizer:
+ shuffle(portrange)
+
+ for send_port in portrange:
+ try:
+ send_socket = self.bind_send(send_port, bind,
+ ipv6_socket_style = ipv6_socket_style)
+ return send_socket
+ except socket.error, e:
+ pass
+ raise socket.error(str(e))
def start_connection_raw(self, dns, socktype = socket.AF_INET, handler = None):
+ minsrcport = self.config['minsrcport']
+ maxsrcport = self.config['maxsrcport']
+
if handler is None:
handler = self.handler
- sock = socket.socket(socktype, socket.SOCK_STREAM)
+
+ sock = self.find_and_bind_send(minsrcport, maxsrcport, ipv6_socket_style = config['ipv6_binds_v4'], randomizer = config['random_port'])
sock.setblocking(0)
try:
sock.connect_ex(dns)
@@ -248,7 +307,6 @@
self.single_sockets[sock.fileno()] = s
return s
-
def start_connection(self, dns, handler = None, randomize = False):
if handler is None:
handler = self.handler
Index: bittornado-0.3.18/BitTornado/download_bt1.py
===================================================================
--- bittornado-0.3.18.orig/BitTornado/download_bt1.py 2008-09-20 20:45:30.000000000 -0400
+++ bittornado-0.3.18/BitTornado/download_bt1.py 2008-09-20 20:45:30.000000000 -0400
@@ -57,6 +57,8 @@
"ip to report you have to the tracker."),
('minport', 10000, 'minimum port to listen on, counts up if unavailable'),
('maxport', 60000, 'maximum port to listen on'),
+ ('minsrcport', 10000, 'minimum port to send on, counts up if unavailable'),
+ ('maxsrcport', 60000, 'maximum port to send on'),
('random_port', 1, 'whether to choose randomly inside the port range ' +
'instead of counting up linearly'),
('responsefile', '',
@@ -188,7 +190,7 @@
seed(myid)
rawserver = RawServer(doneflag, config['timeout_check_interval'],
- config['timeout'], ipv6_enable = config['ipv6_enabled'],
+ config['timeout'], config, ipv6_enable = config['ipv6_enabled'],
failfunc = failed, errorfunc = exchandler)
upnp_type = 0
Index: bittornado-0.3.18/BitTornado/launchmanycore.py
===================================================================
--- bittornado-0.3.18.orig/BitTornado/launchmanycore.py 2008-09-20 20:45:30.000000000 -0400
+++ bittornado-0.3.18/BitTornado/launchmanycore.py 2008-09-20 20:45:30.000000000 -0400
@@ -167,7 +167,7 @@
self.hashcheck_current = None
self.rawserver = RawServer(self.doneflag, config['timeout_check_interval'],
- config['timeout'], ipv6_enable = config['ipv6_enabled'],
+ config['timeout'], config, ipv6_enable = config['ipv6_enabled'],
failfunc = self.failed, errorfunc = self.exchandler)
upnp_type = 0
while True:
Index: bittornado-0.3.18/BitTornado/BT1/track.py
===================================================================
--- bittornado-0.3.18.orig/BitTornado/BT1/track.py 2008-09-20 20:45:30.000000000 -0400
+++ bittornado-0.3.18/BitTornado/BT1/track.py 2008-09-20 20:45:30.000000000 -0400
@@ -1120,7 +1120,8 @@
print 'run with no arguments for parameter explanations'
return
r = RawServer(Event(), config['timeout_check_interval'],
- config['socket_timeout'], ipv6_enable = config['ipv6_enabled'])
+ config['socket_timeout'], config,
+ ipv6_enable = config['ipv6_enabled'])
t = Tracker(config, r)
r.bind(config['port'], config['bind'],
reuse = True, ipv6_socket_style = config['ipv6_binds_v4'])
--- ../bittornado_0.3.18-7/debian/bittorrent-downloader.bittornado.sgml
2008-09-20 07:35:03.000000000 -0400
+++ ../bittornado-0.3.18/debian/bittorrent-downloader.bittornado.sgml
2008-09-20 21:03:36.000000000 -0400
@@ -154,6 +154,18 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><option>--minsrcport
<replaceable>port</replaceable></option></term>
+ <listitem>
+ <para>the minimum <replaceable>port</replaceable> to send on
(defaults to 10000)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--maxsrcport
<replaceable>port</replaceable></option></term>
+ <listitem>
+ <para>the maximum <replaceable>port</replaceable> to send on
(defaults to 60000)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><option>--responsefile
<replaceable>file</replaceable></option></term>
<listitem>
<para>the <replaceable>file</replaceable> the server response was
stored in, as an alternative to --url. If this option is used,
--- End Message ---