X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=Robots%2Fbkmk_rforking.py;h=4ad998403417398b15643f3de2809c4c7c382f22;hb=79f49fc6dede0208846daa9422502ec615758034;hp=9e2d5d8408d212b9e7094567437823cb437d39e3;hpb=fb5c3b2b91aeeb615d6d6d890491af3fdff69556;p=bookmarks_db.git diff --git a/Robots/bkmk_rforking.py b/Robots/bkmk_rforking.py index 9e2d5d8..4ad9984 100644 --- a/Robots/bkmk_rforking.py +++ b/Robots/bkmk_rforking.py @@ -1,20 +1,30 @@ -""" - Forking robot +"""Forking robot - Written by BroytMann, Mar 2000 - Jun 2002. Copyright (C) 2000-2002 PhiloSoft Design +This file is a part of Bookmarks database and Internet robot. """ +__author__ = "Oleg Broytman " +__copyright__ = "Copyright (C) 2000-2012 PhiloSoft Design" +__license__ = "GNU GPL" + +__all__ = ['robot_forking'] + + +import sys, os try: - import cPickle - pickle = cPickle + import cPickle as pickle except ImportError: import pickle -import sys, os from subproc import Subprocess, RecordFile +from bkmk_objects import Robot +# This is to catch 'close failed: [Errno 9] Bad file descriptor' message +# from os.close() in Subprocess.die() and errors from the subprocess. +sys.stderr = open("err.log", 'a') + check_subp = None subp_pipe = None @@ -29,29 +39,44 @@ def restart_subp(log): global check_subp, subp_pipe stop_subp(log) - check_subp = Subprocess("%s/Robots/bkmk_rforking_sub.py" % os.path.dirname(sys.argv[0])) + check_subp = Subprocess("%s/Robots/bkmk_rforking_sub.py" % os.path.dirname(sys.argv[0]), + control_stderr=True) subp_pipe = RecordFile(check_subp) -from bkmk_objects import Robot +_set_subproc = True class robot_forking(Robot): - def check_url(self, bookmark, url_type, url_rest): + subproc = 'urllib2' # Default subprocess + + def check_url(self, bookmark): + global _set_subproc + if _set_subproc: + _set_subproc = False + + subproc = self.subproc + subproc_attrs = [] + for attr in dir(self): + if attr.startswith('subproc_'): + subproc_attrs.append((attr[len('subproc_'):], getattr(self, attr))) + if subproc_attrs: + subproc += ':' + ':'.join(['='.join((k,v)) for k,v in subproc_attrs]) + os.environ['BKMK_ROBOT'] = subproc + if not check_subp: restart_subp(self.log) # Not restart, just start afresh try: save_parent = bookmark.parent bookmark.parent = None - - bookmark.tempfname = self.tempfname subp_pipe.write_record(pickle.dumps(bookmark)) - if check_subp.waitForPendingChar(900): # wait 15 minutes + if check_subp.waitForPendingChar(60): # wait a minute new_b = pickle.loads(subp_pipe.read_record()) for attr in ("error", "no_error", "moved", "size", "md5", "real_title", - "last_tested", "last_modified", "test_time"): + "last_tested", "last_modified", "test_time", + "icon", "icon_href"): if hasattr(new_b, attr): setattr(bookmark, attr, getattr(new_b, attr)) else: @@ -60,12 +85,18 @@ class robot_forking(Robot): bookmark.parent = save_parent + while True: + error = check_subp.readPendingErrLine() + if not error: + break + sys.stderr.write("(subp) " + error) + sys.stderr.flush() + except KeyboardInterrupt: return 0 # Tested return 1 - def stop(self): stop_subp(None) # Stop subprocess; do not log restarting