Метки
amd bittorrent bug centos debian enlightenment fedora fedora 8 fedora 9 fedora 10 fedora 11 fedora 12 fedora 13 fedora 15 fedora 16 FedoraMD fglrx firefox flash player gnome google intel interview java kde kernel linux livecd migrate moldova nvidia openoffice OpenStreetMap opera Orange ovirt radeon red hat rpmfusion Sandel skype video virtualisation vmware wine
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.
Метки: bittorrent, python
24, 2008 16:21
Вас ведь и блондинки могут тоже читать((( у нас может блокировка мозга от такого произойти! Будьте гумманы, ведь красота спасет мир!
25, 2008 9:18
Блондинки попадаются тоже умные 😛
26, 2008 11:21
патч бесполезен, так как сбились отступы (тэг pre нормальная штука;))
26, 2008 11:38
Исправил на тэг «pre».