summaryrefslogtreecommitdiffstats
path: root/BitTorrent/defaultargs.py
blob: 2c7af5cfd1850ca8aac1b0ed085087435d3d2248 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
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