| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- # -*- coding: UTF-8 -*-
- # 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.
- version = '5.2.0'
- URL = 'http://www.bittorrent.com/'
- DONATE_URL = URL + 'donate.html?client=%(client)s'
- FAQ_URL = URL + 'FAQ.html?client=%(client)s'
- SEARCH_URL = 'http://www.bittorrent.com/search_result.html?client=%(client)s&search=%(search)s'
- #LOCALE_URL = URL + 'translations/'
- # Moved to BTL. Needed for get_language <- BTL.write_language_file
- #LOCALE_URL = 'http://translations.bittorrent.com/'
- NAG_FREQUENCY = 3
- PORT_RANGE = 5
- import sys
- assert sys.version_info >= (2, 3, 0), "Python %s or newer required" % '2.3.0'
- import os
- import logging
- import logging.handlers
- from StringIO import StringIO
- from BTL import BTFailure, InfoHashType
- from BTL import atexit_threads
- # failure due to user error. Should output differently (e.g., not outputting
- # a backtrace).
- class UserFailure(BTFailure):
- pass
- branch = None
- p = os.path.realpath(os.path.split(sys.argv[0])[0])
- if (os.path.exists(os.path.join(p, '.cdv')) or
- os.path.exists(os.path.join(p, '.svn'))):
- branch = os.path.split(p)[1]
- del p
- from BitTorrent.platform import get_temp_subdir, get_dot_dir, is_frozen_exe
- if os.name == 'posix':
- if os.uname()[0] == "Darwin":
- from BTL.translation import _
- if "-u" in sys.argv or "--use_factory_defaults" in sys.argv:
- logroot = get_temp_subdir()
- else:
- #logroot = get_home_dir()
- logroot = get_dot_dir()
- if is_frozen_exe:
- if logroot is None:
- logroot = os.path.splitdrive(sys.executable)[0]
- if logroot[-1] != os.sep:
- logroot += os.sep
- logname = os.path.split(sys.executable)[1]
- else:
- logname = os.path.split(os.path.abspath(sys.argv[0]))[1]
- logname = os.path.splitext(logname)[0] + '.log'
- if logroot != '' and not os.path.exists(logroot):
- os.makedirs(logroot)
- logpath = os.path.join(logroot, logname)
- # becuase I'm generous.
- STDERR = logging.CRITICAL + 10
- logging.addLevelName(STDERR, 'STDERR')
- # define a Handler which writes INFO messages or higher to the sys.stderr
- console = logging.StreamHandler()
- console.setLevel(logging.DEBUG)
- # set a format which is simpler for console use
- #formatter = logging.Formatter(u'%(name)-12s: %(levelname)-8s %(message)s')
- formatter = logging.Formatter(u'%(message)s')
- # tell the handler to use this format
- console.setFormatter(formatter)
- # add the handler to the root logger
- logging.getLogger('').addHandler(console)
- bt_log_fmt = logging.Formatter(u'[' + unicode(version) + u' %(asctime)s] %(levelname)-8s: %(message)s',
- datefmt=u'%Y-%m-%d %H:%M:%S')
- stderr_console = None
- old_stderr = sys.stderr
- def inject_main_logfile():
- # the main log file. log every kind of message, format properly,
- # rotate the log. someday - SocketHandler
- mainlog = logging.handlers.RotatingFileHandler(filename=logpath,
- mode='a', maxBytes=2**20, backupCount=1)
- mainlog.setFormatter(bt_log_fmt)
- mainlog.setLevel(logging.DEBUG)
- logger = logging.getLogger('')
- logging.getLogger('').addHandler(mainlog)
- logging.getLogger('').removeHandler(console)
- atexit_threads.register(lambda : logging.getLogger('').removeHandler(mainlog))
- global stderr_console
- if not is_frozen_exe:
- # write all stderr messages to stderr (unformatted)
- # as well as the main log (formatted)
- stderr_console = logging.StreamHandler(old_stderr)
- stderr_console.setLevel(STDERR)
- stderr_console.setFormatter(logging.Formatter(u'%(message)s'))
- logging.getLogger('').addHandler(stderr_console)
- root_logger = logging.getLogger('')
- class StderrProxy(StringIO):
- # whew. ugly. is there a simpler way to write this?
- # the goal is to stop every '\n' and flush to the log
- # otherwise keep buffering.
- def write(self, text, *args):
- lines = text.split('\n')
- for t in lines[:-1]:
- if len(t) > 0:
- StringIO.write(self, t)
- try:
- # the docs don't say it, but logging.log is new in 2.4
- #logging.log(STDERR, self.getvalue())
- root_logger.log(STDERR, self.getvalue())
- except:
- # logging failed. throwing a traceback would recurse
- pass
- self.truncate(0)
- if len(lines[-1]) > 0:
- StringIO.write(self, lines[-1])
- sys.stderr = StderrProxy()
- def reset_stderr():
- sys.stderr = old_stderr
- atexit_threads.register(reset_stderr)
|