Exemplo n.º 1
0
class Deployment(BaseDeployment):
    python = os.path.join(sys.prefix, "bin", "python")

    def __init__(self,
                 commands=None,
                 script=None,
                 crons=None,
                 config=None,
                 need_sudo=False,
                 supervisor_conf_path="/etc/supervisord.d/"):
        self.need_sudo = need_sudo
        self.supervisor_conf_path = supervisor_conf_path
        self.crons = self.get_crons(crons)
        self.scripts = self.get_scripts(script)
        self.commands = self.get_commands(commands)
        self.home = os.path.dirname(os.path.abspath(self.__module__))
        self.config = Config(self.home, config)
        self.cron = Plan(self.config.project)
        self.init_tasks()

    def init_tasks(self):
        for name, cmd in self.commands:
            self.config.add(name, cmd)
        for name, cmd in self.scripts:
            self.config.add(name, cmd)
        for cron in self.crons:
            self.cron.command(cron)

    def get_scripts(self, script_obj):
        if script_obj is None:
            return []
        else:
            # 存放脚本文件名称
            script_file_name = os.path.abspath(
                sys.modules[script_obj.__module__].__file__)
            scripts = [
                name for name in dir(script_obj) if not name.startswith("_")
            ]
            return [(script, f"{self.python} -u {script_file_name} {script}")
                    for script in scripts]

    def get_commands(self, commands):
        name_commands = []
        if commands:
            name_commands = commands
        return name_commands

    def get_crons(self, crons_config):
        crons = []
        if crons:
            crons = crons_config
        return crons

    def update_supervisor(self, file):
        if self.need_sudo:
            code1 = os.system(f"sudo mv {file} {self.supervisor_conf_path}")
            code2 = os.system("sudo supervisorctl update")
        else:
            code1 = os.system(f"mv {file} {self.supervisor_conf_path}")
            code2 = os.system("supervisorctl update")
        return code1 or code2

    def update_cron(self, action):
        try:
            self.cron.update_crontab(action)
        except PlanError:
            pass

    def start(self):
        config_file = self.config.export()
        self.update_cron("update")
        return self.update_supervisor(config_file)

    def stop(self):
        config_file = self.config.export(content="")
        self.update_cron("clear")
        return self.update_supervisor(config_file)