Я пишу скрипт на 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)