summaryrefslogtreecommitdiffstats
path: root/BitTorrent/defaultargs.py
diff options
context:
space:
mode:
Diffstat (limited to 'BitTorrent/defaultargs.py')
-rw-r--r--BitTorrent/defaultargs.py306
1 files changed, 306 insertions, 0 deletions
diff --git a/BitTorrent/defaultargs.py b/BitTorrent/defaultargs.py
new file mode 100644
index 0000000..2c7af5c
--- /dev/null
+++ b/BitTorrent/defaultargs.py
@@ -0,0 +1,306 @@
+# 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)
+
+import os
+### add your favorite here
+BAD_LIBC_WORKAROUND_DEFAULT = MYFALSE
+if os.name == 'posix':
+ if os.uname()[0] in ['Darwin']:
+ BAD_LIBC_WORKAROUND_DEFAULT = MYTRUE
+
+MIN_INCOMPLETE = 100
+if os.name == 'nt':
+ from BitTorrent.platform import win_version_num
+ # starting in XP SP2 the incomplete outgoing connection limit was set to 10
+ if win_version_num >= (2, 5, 1, 2, 0):
+ MIN_INCOMPLETE = 10
+
+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', 60,
+ _("number of peers at which to stop initiating new connections")),
+ ('max_incomplete', MIN_INCOMPLETE,
+ _("max number of outgoing incomplete 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.")),
+ ('upnp', MYTRUE,
+ _("Enable automatic port mapping")+' (UPnP)'),
+ ]
+
+
+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', BAD_LIBC_WORKAROUND_DEFAULT,
+ _("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'),
+ ('start_minimized', MYFALSE,
+ _("Start BitTorrent minimized")),
+ ('new_version', '',
+ _("override the version provided by the http version check "
+ "and enable version check debugging mode")),
+ ('current_version', '',
+ _("override the current version used in the version check "
+ "and enable version check debugging mode")),
+ ('geometry', '',
+ _("specify window size and position, in the format: "
+ "WIDTHxHEIGHT+XOFFSET+YOFFSET")),
+ ])
+
+ if os.name == 'nt':
+ r.extend([
+ ('launch_on_startup', MYTRUE,
+ _("Launch BitTorrent when Windows starts")),
+ ('minimize_to_tray', MYTRUE,
+ _("Minimize to system tray")),
+ ])
+
+ 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") ),
+ ('launch_delay', 0,
+ _("wait this many seconds after noticing a torrent before starting it, to avoid race with tracker")),
+ ('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