268 lines
12 KiB
Python
Executable File
268 lines
12 KiB
Python
Executable File
# The contents of this file are subject to the BitTorrent Open Source License
|
|
# Version 1.1 (the License). You may not copy or use this file, in either
|
|
# source code or executable form, except in compliance with the License. You
|
|
# may obtain a copy of the License at http://www.bittorrent.com/license/.
|
|
#
|
|
# Software distributed under the License is distributed on an AS IS basis,
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
# for the specific language governing rights and limitations under the
|
|
# License.
|
|
|
|
|
|
# False and True are not distinct from 0 and 1 under Python 2.2,
|
|
# and we want to handle boolean options differently.
|
|
class MyBool(object):
|
|
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
def __repr__(self):
|
|
if self.value:
|
|
return 'True'
|
|
return 'False'
|
|
|
|
def __nonzero__(self):
|
|
return self.value
|
|
|
|
MYTRUE = MyBool(True)
|
|
MYFALSE = MyBool(False)
|
|
|
|
from BitTorrent import languages
|
|
|
|
basic_options = [
|
|
('data_dir', '',
|
|
_("directory under which variable data such as fastresume information "
|
|
"and GUI state is saved. Defaults to subdirectory 'data' of the "
|
|
"bittorrent config directory.")),
|
|
('filesystem_encoding', '',
|
|
_("character encoding used on the local filesystem. "
|
|
"If left empty, autodetected. "
|
|
"Autodetection doesn't work under python versions older than 2.3")),
|
|
('language', '',
|
|
_("ISO Language code to use") + ': ' + ', '.join(languages)),
|
|
]
|
|
|
|
common_options = [
|
|
('ip', '',
|
|
_("ip to report to the tracker (has no effect unless you are on the same "
|
|
"local network as the tracker)")),
|
|
('forwarded_port', 0,
|
|
_("world-visible port number if it's different from the one the client "
|
|
"listens on locally")),
|
|
('minport', 6881,
|
|
_("minimum port to listen on, counts up if unavailable")),
|
|
('maxport', 6999,
|
|
_("maximum port to listen on")),
|
|
('bind', '',
|
|
_("ip to bind to locally")),
|
|
('display_interval', .5,
|
|
_("seconds between updates of displayed information")),
|
|
('rerequest_interval', 5 * 60,
|
|
_("minutes to wait between requesting more peers")),
|
|
('min_peers', 20,
|
|
_("minimum number of peers to not do rerequesting")),
|
|
('max_initiate', 40,
|
|
_("number of peers at which to stop initiating new connections")),
|
|
('max_allow_in', 80,
|
|
_("maximum number of connections to allow, after this new incoming "
|
|
"connections will be immediately closed")),
|
|
('check_hashes', MYTRUE,
|
|
_("whether to check hashes on disk")),
|
|
('max_upload_rate', 20,
|
|
_("maximum kB/s to upload at, 0 means no limit")),
|
|
('min_uploads', 2,
|
|
_("the number of uploads to fill out to with extra optimistic unchokes")),
|
|
('max_files_open', 50,
|
|
_("the maximum number of files in a multifile torrent to keep open at a "
|
|
"time, 0 means no limit. Used to avoid running out of file descriptors.")),
|
|
('start_trackerless_client', MYTRUE,
|
|
_("Initialize a trackerless client. This must be enabled in order to download trackerless torrents."))
|
|
]
|
|
|
|
|
|
rare_options = [
|
|
('keepalive_interval', 120.0,
|
|
_("number of seconds to pause between sending keepalives")),
|
|
('download_slice_size', 2 ** 14,
|
|
_("how many bytes to query for per request.")),
|
|
('max_message_length', 2 ** 23,
|
|
_("maximum length prefix encoding you'll accept over the wire - larger "
|
|
"values get the connection dropped.")),
|
|
('socket_timeout', 300.0,
|
|
_("seconds to wait between closing sockets which nothing has been "
|
|
"received on")),
|
|
('timeout_check_interval', 60.0,
|
|
_("seconds to wait between checking if any connections have timed out")),
|
|
('max_slice_length', 16384,
|
|
_("maximum length slice to send to peers, close connection if a larger "
|
|
"request is received")),
|
|
('max_rate_period', 20.0,
|
|
_("maximum time interval over which to estimate the current upload and download rates")),
|
|
('max_rate_period_seedtime', 100.0,
|
|
_("maximum time interval over which to estimate the current seed rate")),
|
|
('max_announce_retry_interval', 1800,
|
|
_("maximum time to wait between retrying announces if they keep failing")),
|
|
('snub_time', 30.0,
|
|
_("seconds to wait for data to come in over a connection before assuming "
|
|
"it's semi-permanently choked")),
|
|
('rarest_first_cutoff', 4,
|
|
_("number of downloads at which to switch from random to rarest first")),
|
|
('upload_unit_size', 1380,
|
|
_("how many bytes to write into network buffers at once.")),
|
|
('retaliate_to_garbled_data', MYTRUE,
|
|
_("refuse further connections from addresses with broken or intentionally "
|
|
"hostile peers that send incorrect data")),
|
|
('one_connection_per_ip', MYTRUE,
|
|
_("do not connect to several peers that have the same IP address")),
|
|
('peer_socket_tos', 8,
|
|
_("if nonzero, set the TOS option for peer connections to this value")),
|
|
('bad_libc_workaround', MYFALSE,
|
|
_("enable workaround for a bug in BSD libc that makes file reads very slow.")),
|
|
('tracker_proxy', '',
|
|
_("address of HTTP proxy to use for tracker connections")),
|
|
('close_with_rst', 0,
|
|
_("close connections with RST and avoid the TCP TIME_WAIT state")),
|
|
('twisted', -1,
|
|
_("Use Twisted network libraries for network connections. 1 means use twisted, 0 means do not use twisted, -1 means autodetect, and prefer twisted")),
|
|
]
|
|
|
|
|
|
def get_defaults(ui):
|
|
assert ui in ("bittorrent" , "bittorrent-curses", "bittorrent-console" ,
|
|
"maketorrent", "maketorrent-console",
|
|
"launchmany-curses", "launchmany-console" ,
|
|
)
|
|
r = []
|
|
|
|
if ui.startswith('bittorrent') or ui.startswith('launchmany'):
|
|
r.extend(common_options)
|
|
|
|
if ui == 'bittorrent':
|
|
r.extend([
|
|
('save_as', '',
|
|
_("file name (for single-file torrents) or directory name (for "
|
|
"batch torrents) to save the torrent as, overriding the default "
|
|
"name in the torrent. See also --save_in, if neither is "
|
|
"specified the user will be asked for save location")),
|
|
('advanced', MYFALSE,
|
|
_("display advanced user interface")),
|
|
('next_torrent_time', 300,
|
|
_("the maximum number of minutes to seed a completed torrent "
|
|
"before stopping seeding")),
|
|
('next_torrent_ratio', 80,
|
|
_("the minimum upload/download ratio, in percent, to achieve "
|
|
"before stopping seeding. 0 means no limit.")),
|
|
('last_torrent_ratio', 0,
|
|
_("the minimum upload/download ratio, in percent, to achieve "
|
|
"before stopping seeding the last torrent. 0 means no limit.")),
|
|
('seed_forever', MYFALSE,
|
|
_("Seed each completed torrent indefinitely "
|
|
"(until the user cancels it)")),
|
|
('seed_last_forever', MYTRUE,
|
|
_("Seed the last torrent indefinitely "
|
|
"(until the user cancels it)")),
|
|
('pause', MYFALSE,
|
|
_("start downloader in paused state")),
|
|
('start_torrent_behavior', 'replace',
|
|
_('specifies how the app should behave when the user manually '
|
|
'tries to start another torrent: "replace" means always replace '
|
|
'the running torrent with the new one, "add" means always add '
|
|
'the running torrent in parallel, and "ask" means ask the user '
|
|
'each time.')),
|
|
('open_from', '',
|
|
'local directory to look in for .torrent files to open'),
|
|
('ask_for_save', MYFALSE,
|
|
'whether or not to ask for a location to save downloaded files in'),
|
|
])
|
|
|
|
if ui in ('bittorrent-console', 'bittorrent-curses'):
|
|
r.append(
|
|
('save_as', '',
|
|
_("file name (for single-file torrents) or directory name (for "
|
|
"batch torrents) to save the torrent as, overriding the "
|
|
"default name in the torrent. See also --save_in")))
|
|
|
|
if ui.startswith('bittorrent'):
|
|
r.extend([
|
|
('max_uploads', -1,
|
|
_("the maximum number of uploads to allow at once. -1 means a "
|
|
"(hopefully) reasonable number based on --max_upload_rate. "
|
|
"The automatic values are only sensible when running one "
|
|
"torrent at a time.")),
|
|
('save_in', '',
|
|
_("local directory where the torrent contents will be saved. The "
|
|
"file (single-file torrents) or directory (batch torrents) will "
|
|
"be created under this directory using the default name "
|
|
"specified in the .torrent file. See also --save_as.")),
|
|
('responsefile', '',
|
|
_("deprecated, do not use")),
|
|
('url', '',
|
|
_("deprecated, do not use")),
|
|
('ask_for_save', 0,
|
|
_("whether or not to ask for a location to save downloaded files in")),
|
|
])
|
|
|
|
if ui.startswith('launchmany'):
|
|
r.extend([
|
|
('max_uploads', 6,
|
|
_("the maximum number of uploads to allow at once. -1 means a "
|
|
"(hopefully) reasonable number based on --max_upload_rate. The "
|
|
"automatic values are only sensible when running one torrent at "
|
|
"a time.")),
|
|
('save_in', '',
|
|
_("local directory where the torrents will be saved, using a "
|
|
"name determined by --saveas_style. If this is left empty "
|
|
"each torrent will be saved under the directory of the "
|
|
"corresponding .torrent file")),
|
|
('parse_dir_interval', 60,
|
|
_("how often to rescan the torrent directory, in seconds") ),
|
|
('saveas_style', 4,
|
|
_("How to name torrent downloads: "
|
|
"1: use name OF torrent file (minus .torrent); "
|
|
"2: use name encoded IN torrent file; "
|
|
"3: create a directory with name OF torrent file "
|
|
"(minus .torrent) and save in that directory using name "
|
|
"encoded IN torrent file; "
|
|
"4: if name OF torrent file (minus .torrent) and name "
|
|
"encoded IN torrent file are identical, use that "
|
|
"name (style 1/2), otherwise create an intermediate "
|
|
"directory as in style 3; "
|
|
"CAUTION: options 1 and 2 have the ability to "
|
|
"overwrite files without warning and may present "
|
|
"security issues."
|
|
) ),
|
|
('display_path', ui == 'launchmany-console' and MYTRUE or MYFALSE,
|
|
_("whether to display the full path or the torrent contents for "
|
|
"each torrent") ),
|
|
])
|
|
|
|
if ui.startswith('launchmany') or ui == 'maketorrent':
|
|
r.append(
|
|
('torrent_dir', '',
|
|
_("directory to look for .torrent files (semi-recursive)")),)
|
|
|
|
if ui in ('bittorrent-curses', 'bittorrent-console'):
|
|
r.append(
|
|
('spew', MYFALSE,
|
|
_("whether to display diagnostic info to stdout")))
|
|
|
|
if ui.startswith('maketorrent'):
|
|
r.extend([
|
|
('piece_size_pow2', 18,
|
|
_("which power of two to set the piece size to")),
|
|
('tracker_name', 'http://my.tracker:6969/announce',
|
|
_("default tracker name")),
|
|
('tracker_list', '', ''),
|
|
('use_tracker', MYTRUE,
|
|
_("if false then make a trackerless torrent, instead of "
|
|
"announce URL, use reliable node in form of <ip>:<port> or an "
|
|
"empty string to pull some nodes from your routing table")),
|
|
])
|
|
|
|
r.extend(basic_options)
|
|
|
|
if ui.startswith('bittorrent') or ui.startswith('launchmany'):
|
|
r.extend(rare_options)
|
|
|
|
return r
|