예제 #1
0
파일: runner.py 프로젝트: taavi/dirt
 def run_script(self, script_path):
     dirtscript = ModuleType("dirtscript")
     dirtscript.__dict__.update({"settings": self.settings})
     sys.modules["dirtscript"] = dirtscript
     setup_logging(script_path, self.settings)
     execfile(script_path)
     return 0
예제 #2
0
 def run_script(self, script_path):
     dirtscript = ModuleType("dirtscript")
     dirtscript.__dict__.update({
         "settings": self.settings,
     })
     sys.modules["dirtscript"] = dirtscript
     setup_logging(script_path, self.settings)
     execfile(script_path)
     return 0
예제 #3
0
파일: runner.py 프로젝트: taavi/dirt
    def run_app(self, app_name, app_settings, app_argv):
        app_settings.get_api = self.get_api_factory()
        setup_logging(app_name, app_settings)
        use_reloader = getattr(app_settings, "USE_RELOADER", False)
        if use_reloader and not app_settings.stop_app:
            from .reloader import run_with_reloader

            setproctitle("%s-reloader" % (app_name,))
            return run_with_reloader(lambda: self._run(app_name, app_settings, app_argv))
        else:
            return self._run(app_name, app_settings, app_argv)
예제 #4
0
 def run_app(self, app_name, app_settings, app_argv):
     app_settings.get_api = self.get_api_factory()
     setup_logging(app_name, app_settings)
     use_reloader = getattr(app_settings, "USE_RELOADER", False)
     if use_reloader and not app_settings.stop_app:
         from .reloader import run_with_reloader
         setproctitle("%s-reloader" %(app_name, ))
         return run_with_reloader(
             lambda: self._run(app_name, app_settings, app_argv))
     else:
         return self._run(app_name, app_settings, app_argv)
예제 #5
0
파일: runner.py 프로젝트: taavi/dirt
    def run_many(self, argv=None):
        if argv is None:
            argv = sys.argv

        run_argv, app_argvs = self.parse_argv(argv)
        ret = self.handle_argv(run_argv)
        if ret is not None:
            return ret

        if not app_argvs:
            self.usage(argv)
            return 1

        class RUN_SETTINGS:
            log_to_hub = False

        logging_settings = SettingsWrapper(RUN_SETTINGS, self.settings)
        setup_logging("run", logging_settings)

        # Check to see if we're running a script
        if "/" in app_argvs[0][0]:
            # XXX: Hack. Not sure how we want to rewrite sys.argv in the case
            # of running scripts (which don't fork, so can't have multiple
            # things running, so the argv parsing we did above is partially
            # moot)
            argv[0] = "%s %s" % (run_argv[0], app_argvs[0][0])
            script_path = argv.pop(len(run_argv))
            return self.run_script(script_path)

        app_names_settings = [(app_argv[0], self.get_app_settings(app_argv[0]), app_argv[1:]) for app_argv in app_argvs]

        self._get_api_force_no_mock.update(argv[1:])

        app_colors = iter(itertools.cycle(["blue", "magenta", "cyan", "green", "grey", "white"]))

        pid = -1
        try:
            app_pids = {}
            for app_name, app_settings, app_argv in app_names_settings:
                app_color = next(app_colors)
                pid = fork()
                if pid > 0:
                    app_pids[pid] = app_name
                else:
                    os.setsid()
                    ColoredFormatter.app_color = app_color
                    return self.run_app(app_name, app_settings, app_argv)

            while app_pids:
                try:
                    child, status_sig = os.waitpid(-1, 0)
                    status = status_sig >> 8
                except KeyboardInterrupt:
                    status = 4

                if status == 99:
                    app_pids.pop(child, None)
                    status = 0
                    continue

                if status != 4:
                    log_message = (status == 0) and log.info or log.warning
                    log_message("app %s exited with status %s", app_pids.get(child, child), status)

                break

        finally:
            pids_to_kill = (pid > 0) and app_pids.keys() or []
            for pid_to_kill in pids_to_kill:
                try:
                    os.killpg(pid_to_kill, signal.SIGTERM)
                except OSError as e:
                    # errno 3 == "ESRCH" (not found), and we expect to get at least
                    #     one of those when we exit as a result of one of the
                    #     apps exiting.
                    # errno 1 == "EPERM" (permision denied), and this seems
                    #     to be related to a specific "issue" related to killing
                    #     process groups which contain zombies on Darwin/BSD. It
                    #     doesn't seem to come up on Linux, though, and so should
                    #     be safe to ignore.
                    #     See discussion: http://stackoverflow.com/q/12521705/71522
                    if e.errno not in [1, 3]:
                        log.error("killing %r: %s", pid_to_kill, e)
        return status
예제 #6
0
    def run_many(self, argv=None):
        if argv is None:
            argv = sys.argv

        run_argv, app_argvs = self.parse_argv(argv)
        ret = self.handle_argv(run_argv)
        if ret is not None:
            return ret

        if not app_argvs:
            self.usage(argv)
            return 1

        class RUN_SETTINGS:
            log_to_hub = False
        logging_settings = SettingsWrapper(RUN_SETTINGS, self.settings)
        setup_logging("run", logging_settings)

        # Check to see if we're running a script
        if "/" in app_argvs[0][0]:
            # XXX: Hack. Not sure how we want to rewrite sys.argv in the case
            # of running scripts (which don't fork, so can't have multiple
            # things running, so the argv parsing we did above is partially
            # moot)
            argv[0] = "%s %s" % (run_argv[0], app_argvs[0][0])
            script_path = argv.pop(len(run_argv))
            return self.run_script(script_path)

        app_names_settings = [
            (app_argv[0], self.get_app_settings(app_argv[0]), app_argv[1:])
            for app_argv in app_argvs
        ]

        self._get_api_force_no_mock.update(argv[1:])

        app_colors = iter(itertools.cycle(
            ["blue", "magenta", "cyan", "green", "grey", "white"]
        ))

        pid = -1
        try:
            app_pids = {}
            for app_name, app_settings, app_argv in app_names_settings:
                app_color = next(app_colors)
                pid = fork()
                if pid > 0:
                    app_pids[pid] = app_name
                else:
                    os.setsid()
                    ColoredFormatter.app_color = app_color
                    return self.run_app(app_name, app_settings, app_argv)

            while app_pids:
                try:
                    child, status_sig = os.waitpid(-1, 0)
                    status = status_sig >> 8
                except KeyboardInterrupt:
                    status = 4

                if status == 99:
                    app_pids.pop(child, None)
                    status = 0
                    continue

                if status != 4:
                    log_message = (status == 0) and log.info or log.warning
                    log_message("app %s exited with status %s",
                                app_pids.get(child, child), status)

                break

        finally:
            pids_to_kill = (pid > 0) and app_pids.keys() or []
            for pid_to_kill in pids_to_kill:
                try:
                    os.killpg(pid_to_kill, signal.SIGTERM)
                except OSError as e:
                    # errno 3 == "ESRCH" (not found), and we expect to get at least
                    #     one of those when we exit as a result of one of the
                    #     apps exiting.
                    # errno 1 == "EPERM" (permision denied), and this seems
                    #     to be related to a specific "issue" related to killing
                    #     process groups which contain zombies on Darwin/BSD. It
                    #     doesn't seem to come up on Linux, though, and so should
                    #     be safe to ignore.
                    #     See discussion: http://stackoverflow.com/q/12521705/71522
                    if e.errno not in [1, 3]:
                        log.error("killing %r: %s", pid_to_kill, e)
        return status