Расширенный механизм блокировки и выключения планировщика Python - PullRequest
0 голосов
/ 30 октября 2019

Я пишу скрипт на python, который обрабатывает лог-файлы honeypot и отправляет электронные письма об оповещениях.

class Follower:
honey_ips = []
attackers = []

def scheduled_email():
sendemail.send_mail(Follower.attackers)

def follow_log():
for logline in tailer.follow(open("logs.log")):
    parts = logline.split()

    if (len(parts) >= 7):
        if (parts[5] in Follower.honey_ips):
            if(parts[2] == "E"):
                continue

            exist_attacker = False
            exist_hp = False
            attacker = Attacker(parts[3])
            honeypot = Honeypot(parts[5])
            port = Port(parts[6], parts[0])

            for a in Follower.attackers:
                if(parts[3] == a.ip):
                    exist_attacker = True

                    for h in a.honeypots:
                        if(parts[5] == h.ip):
                            exist_hp = True
                            h.add_port(port)
                            break

                    if(exist_hp == False):
                        honeypot.add_port(port)
                        a.add_honeypot(honeypot)
                    break

            if(exist_attacker == False):
                honeypot.add_port(port)
                attacker.add_honeypot(honeypot)
                Follower.attackers.append(attacker)

            sendemail.send_alert_mail(attacker, honeypot, port)

scheduler = BlockingScheduler()
scheduler.add_job(scheduled_email, trigger="cron", minute="0-59")
scheduler.add_job(follow_log, trigger="date")
scheduler.start()

Я использую модуль Advanced Python Scheduler и у меня есть два метода в качестве заданий. follow_log всегда запускается, а schedule_mail периодически отправляет оповещения по электронной почте. Оба метода используют список злоумышленников, поэтому я хотел бы реализовать механизм блокировки, так что schedule_mail может запускаться только тогда, когда новая строка читается в начале цикла, а не во время его обработки. Я попытался поместить логическое значение в цикл, которое указывает, было ли отправлено письмо, но это не помешало пропустить запись в журнале. Есть ли в APS механизм блокировки? Например, другая работа может начаться только тогда, когда логическое значение истинно.

Мой второй вопрос, как я мог остановить обе работы одновременно? Я попробовал следующий метод, но мне все еще нужно дважды нажать Ctrl + C, чтобы остановить скрипт.

try:
  scheduler.start()
except (KeyboardInterrupt):
  scheduler.shutdown(wait=False)
...