# -*- coding: utf-8 -*-
# @Author: wangkun
# @Time: 2023/7/17
import os
from crontab import CronTab


class Control:
    @classmethod
    def crontab_add(cls, rule, command):
        """
        添加 crontab 任务
        :param rule: 运行时间规则，如：* * * * *；00 00 * * *
        :param command: crontab 任务，如："python3 control/monitor/monitor_logs.py"
        :return:None
        """
        # 创建CronTab对象
        cron = CronTab(user=True)

        # 新增一行
        job = cron.new(command=command)
        job.setall(rule)

        # 保存更改
        cron.write()

    @classmethod
    def crontab_edit(cls, enable, command):
        """
        注释 / 取消注释 crontab 任务
        :param enable: True：取消注释 crontab 任务；False：注释 crontab 任务
        :param command: 需要注释的 crontab 任务，如："python3 control/monitor/monitor_logs.py"
        :return: None
        """
        # 创建一个新的crontab对象
        cron = CronTab(user=True)

        # 选择要注释掉的cron任务
        # find_command方法返回一个生成器对象，而不是单个任务对象。因此，需要使用next函数来获取生成器的下一个元素，然后对该元素调用enable方法来取消注释cron任务
        job = next(cron.find_command(command))

        # 取消注释cron任务
        job.enable(enable)

        # 将更改写入crontab
        cron.write()

    @classmethod
    def crontab_remove(cls, command):
        """
        删除 crontab 任务
        :param command: crontab 任务，如："python3 control/monitor/monitor_logs.py"
        :return:
        """
        # 创建一个新的crontab对象
        cron = CronTab(user=True)

        # 选择要删除的cron任务
        job = cron.find_command(command)

        # 删除cron任务
        cron.remove(job)

        # 将更改写入crontab
        cron.write()

    @classmethod
    def crawler_stop(cls, command):
        cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9"
        print(cmd)
        print("执行杀进程命令")
        os.system(cmd)
        # 创建一个新的crontab对象
        cron = CronTab(user=True)
        if command in [job.command for job in cron]:
            print("command已存在，开始停用\n")
            cls.crontab_edit(False, command)
            return
        else:
            print("command不存在，无需停用\n")
            return

    @classmethod
    def crawler_start(cls, rule, command):
        # 创建一个新的crontab对象
        cron = CronTab(user=True)
        if command in [job.command for job in cron]:
            print("command 已存在，开始启用\n")
            cls.crontab_edit(True, command)
            return
        else:
            print("command 不存在，新增并启用\n")
            cls.crontab_add(rule, command)
            return

    @classmethod
    def crawler_restart(cls, rule, command):
        cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9"
        print(cmd)
        print("执行杀进程命令")
        os.system(cmd)
        print("正在启动 command")
        cls.crawler_start(rule, command)


if __name__ == "__main__":
    # Control.crontab_add("* * * * *", "python3 control/monitor/monitor_logs.py")
    # Control.crontab_edit(False, "python3 control/monitor/monitor_logs.py")
    # Control.crontab_remove("python3 control/monitor/monitor_logs.py")
    #
    # Control.crawler_start("* * * * *", "python3 control/monitor/monitor_logs.py")
    # Control.crawler_stop("python3 control/monitor/monitor_logs.py")
    Control.crawler_restart("* * * * *", "python3 control/monitor/monitor_logs.py")
    pass