예제 #1
0
 def enableTracker(self):
     if self.tracker is None and self.listen_port:
         presets = {'port': self.listen_port,
                    'allowed_dir': os.path.join(utility.configdir.dir_root, 'tracker'),
                    'dfile': os.path.join(utility.getDatabaseDir(), 'tracker.db'),
                   }
         trackconfig, args = parseargs('', defaults, presets = presets)
         self.tracker = Tracker(trackconfig, self.rawserver)
         self.handler.http = HTTPHandler(self.tracker.get, trackconfig['min_time_between_log_flushes'])
예제 #2
0
class LaunchMany(Thread):
    def __init__(self):
        Thread.__init__(self, name = "LaunchMany")
        
        try:            
            self.Output = Output()
            
            btconfig = utility.getBTParams()
            if not _natpmp_supported:
                btconfig["natpmp"] = 0
            self.stats_period = btconfig['display_interval']

            self.counter = 0
            self.doneflag = Event()

            self.hashcheck_queue = []
            self.hashcheck_current = None

            # BT RawServer
            self.rawserver = RawServer(self.doneflag, btconfig['timeout_check_interval'], 
                              btconfig['timeout'], ipv6_enable = btconfig['ipv6_enabled'], 
                              failfunc = self.failed, errorfunc = self.exchandler)                   

            self.upnp_type = 0
            
            
            self.listen_port = self.getPort(btconfig)

            if self.listen_port and utility.config.Write('useport', self.listen_port, "int"):
                utility.config.Flush()
                                
            self.handler = MultiHandler(self.rawserver, self.doneflag, btconfig)
            self.rawserver.add_task(self.stats, 0)

            # DHT
            if btconfig["dht"] and self.listen_port:
                utility.dht = Khashmir(btconfig['bind'], self.listen_port, utility.getDatabaseDir(),
                                       ipv6_enable = btconfig['ipv6_enabled'],
                                       upnp = self.upnp_type, natpmp = btconfig['natpmp'])
            else:
                utility.dht = None
                OPTION_PATTERN[63] = False
                
            # Tracker
            self.tracker = None
            if btconfig["tracker"] and self.listen_port:
                self.enableTracker()

        except IOError:
            data = StringIO()
            print_exc(file = data)
            self.Output.exception(data.getvalue())

    def enableTracker(self):
        if self.tracker is None and self.listen_port:
            presets = {'port': self.listen_port,
                       'allowed_dir': os.path.join(utility.configdir.dir_root, 'tracker'),
                       'dfile': os.path.join(utility.getDatabaseDir(), 'tracker.db'),
                      }
            trackconfig, args = parseargs('', defaults, presets = presets)
            self.tracker = Tracker(trackconfig, self.rawserver)
            self.handler.http = HTTPHandler(self.tracker.get, trackconfig['min_time_between_log_flushes'])

    def disableTracker(self):
        if self.tracker is not None:
            self.handler.http.shutdown()
            self.handler.http = None
            self.tracker.save_state()
            self.tracker = None
            
    def getPort(self, btconfig):
        listen_port = None
        
        self.upnp_type = UPnP_test(btconfig['upnp_nat_access'])
        while True:
            try:
                listen_port = self.rawserver.find_and_bind(btconfig['minport'], 
                                                           btconfig['maxport'], 
                                                           btconfig['bind'], 
                                                           ipv6_socket_style = btconfig['ipv6_binds_v4'], 
                                                           upnp = self.upnp_type,
                                                           randomizer = False,
                                                           natpmp = btconfig['natpmp'])
                utility.listen_port = listen_port
                break
            except socketerror, e:
                message = _('listening port not available') + \
                              "\n" + \
                              _('would you like to try another port?') #+ \
                              #"\n\n" + _('Details:') + forceunicode(e.strerror)
                dialog = wx.MessageDialog(None, message, _('Error'), wx.YES_NO|wx.ICON_ERROR)
                result = dialog.ShowModal()
                dialog.Destroy()
                if(result == wx.ID_NO):
                    self.failed(_('listening port not available'))
                    break
                btconfig['minport'] = btconfig['minport'] + 1
                btconfig['maxport'] = btconfig['maxport'] + 1
                    
        return listen_port