def setup(self, config): # Listen for HTTP connections port = 6280 iface = None if config is not None: if 'port' in config: port = int(config['port']) if 'interface' in config: iface = config['interface'] if iface is None: iface = '0.0.0.0' templateLoader = PackageLoader('downpour.web', 'templates') self.templateFactory = Environment(loader=templateLoader) templateDir = os.path.dirname(templateLoader.get_source( self.templateFactory, 'base.html')[1]); # Custom filters for templateFactory self.templateFactory.filters['progressbar'] = self.progressbar self.templateFactory.filters['healthmeter'] = self.healthmeter self.templateFactory.filters['intervalformat'] = self.intervalformat self.templateFactory.filters['timestampformat'] = self.timestampformat self.templateFactory.filters['urlencode'] = urllib.quote self.templateFactory.filters['workinglink'] = self.workinglink self.templateFactory.filters['librarylink'] = self.librarylink root = SiteRoot(templateDir + '/media', self.application) site = server.Site(root) site.requestFactory = requestFactory(self) site.sessionFactory = sessionFactory(self) self.tryListen(port, site, get_interface(iface))
def listen(self, interface=None): ip = get_interface(interface) if not ip is None: self.session.listen_on(6881, 6891, ip) else: self.session.listen_on(6881, 6891) logging.debug(ip)
def get_status(self): s = os.statvfs(self.get_work_directory()) diskfree = s.f_bfree * s.f_bsize diskfreepct = (float(s.f_bfree) / s.f_blocks) * 100 s = os.statvfs(self.get_user_directory()) userdiskfree = s.f_bfree * s.f_bsize userdiskfreepct = (float(s.f_bfree) / s.f_blocks) * 100 queuedsize = 0 queueddone = 0 active_downloads = 0 download_rate = 0 upload_rate = 0 connections = 0 downloads = self.get_downloads() for d in downloads: if d.size: queuedsize += d.size queueddone += d.downloaded if d.active: active_downloads += 1 download_rate += d.downloadrate upload_rate += d.uploadrate connections += d.connections if queuedsize: progress = round((float(queueddone) / queuedsize) * 100, 2) else: progress = 0 interface = get_interface(self.get_option( ('downpour', 'interface'), '0.0.0.0')) if interface == '0.0.0.0': # Load IPs for local host ips = [i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None)] ips = filter(lambda ip: ip[:4] != '127.' and ip[:2] != '::', ips) interface = ', '.join(dict(map(lambda i: (i,1), ips)).keys()) hostname = '%s (%s)' % (socket.gethostname(), interface) status = {'host': hostname, 'version': VERSION, 'downloads': len(downloads), 'active_downloads': active_downloads, 'downloadrate': download_rate, 'uploadrate': upload_rate, 'progress': progress, 'diskfree': diskfree, 'diskfreepct': diskfreepct, 'userdiskfree': userdiskfree, 'userdiskfreepct': userdiskfreepct, 'connections': connections, 'paused': self.paused } return status
def rebind(self): interface = self.manager.get_option(('downpour', 'interface')) try: ip = get_interface(interface) except Exception as e: raise Exception('The specified network interface is not available: %s' % interface) lt_manager.listen(interface) if not self.torrent is None and not ip is None: self.torrent.use_interface(ip)
def rebind(self, errorTriggered=False): if self.rebinding and errorTriggered: logging.debug('Skipped rebind(), already waiting') return interface = self.manager.get_option(('downpour', 'interface')) try: logging.debug('Rebinding torrent manager to interface %s' % interface); ip = get_interface(interface) if lt_manager.session.is_paused(): lt_manager.session.resume() lt_manager.listen(interface) if not self.torrent is None and not ip is None: self.torrent.use_interface(ip) self.rebinding = False except IOError as e: if errorTriggered: logging.info('The specified network interface is not available: %s' % interface) self.rebinding = True lt_manager.session.pause() reactor.callLater(30.0, self.rebind)
def listen(self, interface=None): ip = get_interface(interface) if not ip is None: self.session.listen_on(6881, 6891, ip) else: self.session.listen_on(6881, 6891)
def get_status(self): s = os.statvfs(self.get_work_directory()) diskfree = s.f_bfree * s.f_bsize diskfreepct = (float(s.f_bfree) / s.f_blocks) * 100 s = os.statvfs(self.get_user_directory()) userdiskfree = s.f_bfree * s.f_bsize userdiskfreepct = (float(s.f_bfree) / s.f_blocks) * 100 queuedsize = 0 queueddone = 0 active_downloads = 0 queued_downloads = 0 download_rate = 0 upload_rate = 0 connections = 0 downloads = self.get_downloads() for d in downloads: if d.size: queuedsize += d.size queueddone += d.downloaded if d.active: active_downloads += 1 if d.status == Status.QUEUED: queued_downloads += 1 download_rate += d.downloadrate upload_rate += d.uploadrate connections += d.connections if queuedsize: progress = round((float(queueddone) / queuedsize) * 100, 2) else: progress = 0 interface = None try: interface = get_interface(self.get_option( ('downpour', 'interface'), '0.0.0.0')) if interface == '0.0.0.0': # Load IPs for local host ips = [i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None)] ips = filter(lambda ip: ip[:4] != '127.' and ip[:2] != '::', ips) interface = ', '.join(dict(map(lambda i: (i,1), ips)).keys()) except IOError as ioe: interface = 'disconnected' hostname = '%s (%s)' % (socket.gethostname(), interface) status = {'host': hostname, 'version': VERSION, 'downloads': len(downloads), 'active_downloads': active_downloads, 'queued_downloads': queued_downloads, 'downloadrate': download_rate, 'uploadrate': upload_rate, 'progress': progress, 'diskfree': diskfree, 'diskfreepct': diskfreepct, 'userdiskfree': userdiskfree, 'userdiskfreepct': userdiskfreepct, 'connections': connections, 'paused': self.paused } return status