diff options
-rw-r--r-- | module/PluginThread.py | 1 | ||||
-rw-r--r-- | module/ThreadManager.py | 151 | ||||
-rw-r--r-- | module/plugins/hooks/UpdateManager.py | 2 |
3 files changed, 80 insertions, 74 deletions
diff --git a/module/PluginThread.py b/module/PluginThread.py index 32426766a..005dedd99 100644 --- a/module/PluginThread.py +++ b/module/PluginThread.py @@ -123,6 +123,7 @@ class DownloadThread(PluginThread): pyfile = self.active if self.active == "quit": + self.m.threads.remove(self) return True self.m.log.info(_("Download starts: %s" % pyfile.name)) diff --git a/module/ThreadManager.py b/module/ThreadManager.py index b9c407484..a482ff311 100644 --- a/module/ThreadManager.py +++ b/module/ThreadManager.py @@ -37,131 +37,136 @@ class ThreadManager: """Constructor""" self.core = core self.log = core.log - + self.threads = [] # thread list self.localThreads = [] #hook+decrypter threads - + #self.infoThread = PluginThread.InfoThread(self) - + self.pause = True - + self.reconnecting = Event() self.reconnecting.clear() - + for i in range(0, self.core.config.get("general", "max_downloads")): self.createThread() - - - + + + #---------------------------------------------------------------------- def createThread(self): """create a download thread""" - - thread = PluginThread.DownloadThread(self) + + thread = PluginThread.DownloadThread(self) self.threads.append(thread) - + #---------------------------------------------------------------------- def createInfoThread(self, data, pid): """ start a thread whichs fetches online status and other infos data = [ .. () .. ] """ - + PluginThread.InfoThread(self, data, pid) - - + + #---------------------------------------------------------------------- def downloadingIds(self): """get a list of the currently downloading pyfile's ids""" return [x.active.id for x in self.threads if x.active and x.active != "quit"] - + #---------------------------------------------------------------------- def processingIds(self): """get a id list of all pyfiles processed""" return [x.active.id for x in self.threads + self.localThreads if x.active and x.active != "quit"] - - + + #---------------------------------------------------------------------- def work(self): """run all task which have to be done (this is for repetivive call by core)""" - + self.tryReconnect() self.checkThreadCount() self.assignJob() - + #---------------------------------------------------------------------- def tryReconnect(self): """checks if reconnect needed""" - - if not (self.core.server_methods.is_time_reconnect() and self.core.config["reconnect"]["activated"]): + + if not (self.core.config["reconnect"]["activated"] and self.core.server_methods.is_time_reconnect()): return False - + active = [x.active.plugin.wantReconnect and x.active.plugin.waiting for x in self.threads if x.active] - if active.count(True) > 0 and len(active) == active.count(True): - - if not exists(self.core.config['reconnect']['method']): - if exists(join(pypath, self.core.config['reconnect']['method'])): - self.core.config['reconnect']['method'] = join(pypath, self.core.config['reconnect']['method']) - else: - self.core.config["reconnect"]["activated"] = False - self.log.warning(_("Reconnect script not found!")) - return - - - self.reconnecting.set() - - #Do reconnect - self.log.info(_("Starting reconnect")) - - - while [x.active.plugin.waiting for x in self.threads if x.active].count(True) != 0: - sleep(0.25) - - - ip = re.match(".*Current IP Address: (.*)</body>.*", getURL("http://checkip.dyndns.org/")).group(1) - - self.core.hookManager.beforeReconnecting(ip) - reconn = Popen(self.core.config['reconnect']['method'])#, stdout=subprocess.PIPE) - reconn.wait() - sleep(1) - ip = "" - while ip == "": - try: - ip = re.match(".*Current IP Address: (.*)</body>.*", getURL("http://checkip.dyndns.org/")).group(1) #get new ip - except: - ip = "" - sleep(1) - self.core.hookManager.afterReconnecting(ip) - - self.log.info(_("Reconnected, new IP: %s") % ip) - - + if not (active.count(True) > 0 and len(active) == active.count(True)): + return False + + if not exists(self.core.config['reconnect']['method']): + if exists(join(pypath, self.core.config['reconnect']['method'])): + self.core.config['reconnect']['method'] = join(pypath, self.core.config['reconnect']['method']) + else: + self.core.config["reconnect"]["activated"] = False + self.log.warning(_("Reconnect script not found!")) + return + + self.reconnecting.set() + + #Do reconnect + self.log.info(_("Starting reconnect")) + + while [x.active.plugin.waiting for x in self.threads if x.active].count(True) != 0: + sleep(0.25) + + ip = re.match(".*Current IP Address: (.*)</body>.*", getURL("http://checkip.dyndns.org/")).group(1) + + self.core.hookManager.beforeReconnecting(ip) + + self.log.debug(_("Old IP: %s") % ip) + + try: + reconn = Popen(self.core.config['reconnect']['method'], bufsize=-1)#, stdout=subprocess.PIPE) + except: + self.log.warning(_("Failed executing reconnect script!")) + self.core.config["reconnect"]["activated"] = False self.reconnecting.clear() - + return + + reconn.wait() + sleep(1) + ip = "" + while ip == "": + try: + ip = re.match(".*Current IP Address: (.*)</body>.*", getURL("http://checkip.dyndns.org/")).group(1) #get new ip + except: + ip = "" + sleep(1) + self.core.hookManager.afterReconnecting(ip) + + self.log.info(_("Reconnected, new IP: %s") % ip) + + self.reconnecting.clear() + #---------------------------------------------------------------------- def checkThreadCount(self): """checks if there are need for increasing or reducing thread count""" - + if len(self.threads) == self.core.config.get("general", "max_downloads"): return True elif len(self.threads) < self.core.config.get("general", "max_downloads"): self.createThread() else: - #@TODO: close thread + #@TODO: close thread pass - - + + #---------------------------------------------------------------------- def assignJob(self): """assing a job to a thread if possible""" - + if self.pause or not self.core.server_methods.is_time_download(): return - - free = [x for x in self.threads if not x.active] + free = [x for x in self.threads if not x.active] - occ = [x.active.pluginname for x in self.threads if x.active and not x.active.plugin.multiDL] occ.sort() occ = tuple(set(occ)) @@ -173,17 +178,17 @@ class ThreadManager: self.log.critical(str(e)) if self.core.debug: print_exc() - + if job.plugin.__type__ == "hoster": if free: thread = free[0] thread.put(job) else: - #put job back + #put job back if not self.core.files.jobCache.has_key(occ): self.core.files.jobCache[occ] = [] self.core.files.jobCache[occ].append(job.id) - + else: thread = PluginThread.DecrypterThread(self, job) diff --git a/module/plugins/hooks/UpdateManager.py b/module/plugins/hooks/UpdateManager.py index 8e2c4368b..f8e65c017 100644 --- a/module/plugins/hooks/UpdateManager.py +++ b/module/plugins/hooks/UpdateManager.py @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>. - @author: mkaay + @author: RaNaN @interface-version: 0.1 """ |