BitTorrent Tracker

    2008-02-07 23:01 | Автор: Oleg | Filed under: Oleg

    Сегодня проводил подготовку к запуску на нашем серваке Битторрент трекер. За базу взял стандартный bittorrent, написанный на python.Все отлично заработало из коробки. Но когда я включил опцию --allowed_dir в логах увидел ошибку:

    Traceback (most recent call last):
    File "/usr/lib/python2.5/site-packages/BitTorrent/RawServer.py", line 467, in _make_wrapped_call
    function(*args)
    File "/usr/lib/python2.5/site-packages/BitTorrent/track.py", line 796, in save_dfile
    h.write(bencode(self.state))
    File "/usr/lib/python2.5/site-packages/BitTorrent/bencode.py", line 135, in bencode
    encode_func[type(x)](x, r)
    File "/usr/lib/python2.5/site-packages/BitTorrent/bencode.py", line 115, in encode_dict
    encode_func[type(v)](v, r)
    File "/usr/lib/python2.5/site-packages/BitTorrent/bencode.py", line 115, in encode_dict
    encode_func[type(v)](v, r)
    File "/usr/lib/python2.5/site-packages/BitTorrent/bencode.py", line 106, in encode_list
    encode_func[type(i)](i, r)
    File "/usr/lib/python2.5/site-packages/BitTorrent/bencode.py", line 106, in encode_list
    encode_func[type(i)](i, r)
    KeyError: <type 'float'>

    Замечено было, что данная ошибка появлялась каждый раз, когда производилась запись в файл состояния. И соответственно при перезагрузке сервера битторрента ничего не сохранялось.

    Погугля пол дня, я нарвался на одну статью, где рассказано, как включить поддержку float в bencode.py. На основании статьи соорудил следующий патч, который решает все проблемы:

    --- bencode.py.org      2008-02-07 22:00:01.000000000 +0200
    +++ bencode.py  2008-02-07 22:02:15.000000000 +0200
    @@ -14,6 +14,8 @@
    
    from BitTorrent import BTFailure
    
    +import string
    +
    def decode_int(x, f):
    f += 1
    newf = x.index('e', f)
    @@ -25,6 +27,23 @@
    raise ValueError
    return (n, newf+1)
    
    +def assert_finite(n):
    +  """Raises ValueError if n is NaN or infinite."""
    +
    +  valid_chars = '0123456789.-+eE'
    +  if repr(n).translate(string.maketrans('',''), valid_chars) != '':
    +    raise ValueError('encountered NaN or infinite')
    +
    +def decode_float(x, f):
    +    f += 1
    +    newf = x.index('e', f)
    +    try:
    +        n = float(x[f:newf].replace('E', 'e'))
    +        assert_finite(n)
    +    except (OverflowError, ValueError):
    +        raise ValueError('encountered NaN or infinite')
    +    return (n, newf+1)
    +
    def decode_string(x, f):
    colon = x.index(':', f)
    n = int(x[f:colon])
    @@ -55,6 +74,7 @@
    decode_func['l'] = decode_list
    decode_func['d'] = decode_dict
    decode_func['i'] = decode_int
    +decode_func['f'] = decode_float
    decode_func['0'] = decode_string
    decode_func['1'] = decode_string
    decode_func['2'] = decode_string
    @@ -75,7 +95,7 @@
    raise BTFailure, _("invalid bencoded value (data after valid prefix)")
    return r
    
    -from types import StringType, IntType, LongType, DictType, ListType, TupleType
    +from types import StringType, IntType, LongType, DictType, ListType, TupleType, FloatType
    
    class Bencached(object):
    @@ -91,6 +111,10 @@
    def encode_int(x, r):
    r.extend(('i', str(x), 'e'))
    
    +def encode_float(x, r):
    +    assert_finite(x)
    +    r.extend(('f', repr(x).replace('e', 'E'), 'e'))
    +
    def encode_bool(x, r):
    if x:
    encode_int(1, r)
    @@ -119,6 +143,7 @@
    encode_func[Bencached] = encode_bencached
    encode_func[IntType] = encode_int
    encode_func[LongType] = encode_int
    +encode_func[FloatType] = encode_float
    encode_func[StringType] = encode_string
    encode_func[ListType] = encode_list
    encode_func[TupleType] = encode_list
    

    Данный патч касается версии bittorrent 4.4.0-5, которая не менялась со времён Fedora 7.

    1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
    Loading...

    Метки: ,

    4 комментария »


    комментария 4

    1. blondi:

      Вас ведь и блондинки могут тоже читать((( у нас может блокировка мозга от такого произойти! Будьте гумманы, ведь красота спасет мир!

    2. Oleg:

      Блондинки попадаются тоже умные 😛

    3. Большой лис:

      патч бесполезен, так как сбились отступы (тэг pre нормальная штука;))

    4. Oleg:

      Исправил на тэг «pre».

    Leave a comment

    *