diff options
| author | Lukasz Kasprzak <lukasz.kasprzak@pm.me> | 2026-04-14 22:32:43 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukasz.kasprzak@pm.me> | 2026-04-14 22:32:43 +0200 |
| commit | 83f7fe4b8402bab171d110703a1b1115efbc9b28 (patch) | |
| tree | 19110702c7d740f6bd8ee4f5d2ebcb97442be237 /straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py | |
| parent | 51d43498b07dc97d795947964534f0903cd05db5 (diff) | |
| download | bin-83f7fe4b8402bab171d110703a1b1115efbc9b28.tar.gz bin-83f7fe4b8402bab171d110703a1b1115efbc9b28.zip | |
cleaned up many scrits and deleted some that were of no use; renamed a lot
Diffstat (limited to 'straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py')
| -rw-r--r-- | straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py b/straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py deleted file mode 100644 index 40eda1b..0000000 --- a/straper/db/public/fail2ban/etc-fail2ban/action.d/smtp.py +++ /dev/null @@ -1,240 +0,0 @@ -# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: t -*- -# vi: set ft=python sts=4 ts=4 sw=4 noet : - -# This file is part of Fail2Ban. -# -# Fail2Ban is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# Fail2Ban is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Fail2Ban; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import socket -import smtplib -from email.mime.text import MIMEText -from email.utils import formatdate, formataddr - -from fail2ban.server.actions import ActionBase, CallingMap - -messages = {} -messages['start'] = \ -"""Hi, - -The jail %(jailname)s has been started successfully. - -Regards, -Fail2Ban""" - -messages['stop'] = \ -"""Hi, - -The jail %(jailname)s has been stopped. - -Regards, -Fail2Ban""" - -messages['ban'] = {} -messages['ban']['head'] = \ -"""Hi, - -The IP %(ip)s has just been banned for %(bantime)i seconds -by Fail2Ban after %(failures)i attempts against %(jailname)s. -""" -messages['ban']['tail'] = \ -""" -Regards, -Fail2Ban""" -messages['ban']['matches'] = \ -""" -Matches for this ban: -%(matches)s -""" -messages['ban']['ipmatches'] = \ -""" -Matches for %(ip)s: -%(ipmatches)s -""" -messages['ban']['ipjailmatches'] = \ -""" -Matches for %(ip)s for jail %(jailname)s: -%(ipjailmatches)s -""" - - -class SMTPAction(ActionBase): - """Fail2Ban action which sends emails to inform on jail starting, - stopping and bans. - """ - - def __init__( - self, jail, name, host="localhost", ssl=False, user=None, password=None, - sendername="Fail2Ban", sender="fail2ban", dest="root", matches=None): - """Initialise action. - - Parameters - ---------- - jail : Jail - The jail which the action belongs to. - name : str - Named assigned to the action. - host : str, optional - SMTP host, of host:port format. Default host "localhost" and - port "25" - ssl : bool, optional - Whether to use TLS for the SMTP connection or not. Default False. - user : str, optional - Username used for authentication with SMTP server. - password : str, optional - Password used for authentication with SMTP server. - sendername : str, optional - Name to use for from address in email. Default "Fail2Ban". - sender : str, optional - Email address to use for from address in email. - Default "fail2ban". - dest : str, optional - Email addresses of intended recipient(s) in comma space ", " - delimited format. Default "root". - matches : str, optional - Type of matches to be included from ban in email. Can be one - of "matches", "ipmatches" or "ipjailmatches". Default None - (see man jail.conf.5). - """ - - super(SMTPAction, self).__init__(jail, name) - - self.host = host - self.ssl = ssl - - self.user = user - self.password =password - - self.fromname = sendername - self.fromaddr = sender - self.toaddr = dest - - self.matches = matches - - self.message_values = CallingMap( - jailname = self._jail.name, - hostname = socket.gethostname, - bantime = lambda: self._jail.actions.getBanTime(), - ) - - # bypass ban/unban for restored tickets - self.norestored = 1 - - def _sendMessage(self, subject, text): - """Sends message based on arguments and instance's properties. - - Parameters - ---------- - subject : str - Subject of the email. - text : str - Body of the email. - - Raises - ------ - SMTPConnectionError - Error on connecting to host. - SMTPAuthenticationError - Error authenticating with SMTP server. - SMTPException - See Python `smtplib` for full list of other possible - exceptions. - """ - msg = MIMEText(text) - msg['Subject'] = subject - msg['From'] = formataddr((self.fromname, self.fromaddr)) - msg['To'] = self.toaddr - msg['Date'] = formatdate() - - smtp_host, smtp_port = self.host.split(':') - smtp = smtplib.SMTP(host=smtp_host, port=smtp_port) - try: - r = smtp.connect(host=smtp_host, port=smtp_port) - self._logSys.debug("Connected to SMTP '%s', response: %i: %s", - self.host, *r) - - if self.ssl: # pragma: no cover - r = smtp.starttls()[0]; - if r != 220: # pragma: no cover - raise Exception("Failed to starttls() on '%s': %s" % (self.host, r)) - - if self.user and self.password: # pragma: no cover (ATM no tests covering that) - smtp.login(self.user, self.password) - failed_recipients = smtp.sendmail( - self.fromaddr, self.toaddr.split(", "), msg.as_string()) - except smtplib.SMTPConnectError: # pragma: no cover - self._logSys.error("Error connecting to host '%s'", self.host) - raise - except smtplib.SMTPAuthenticationError: # pragma: no cover - self._logSys.error( - "Failed to authenticate with host '%s' user '%s'", - self.host, self.user) - raise - except smtplib.SMTPException: # pragma: no cover - self._logSys.error( - "Error sending mail to host '%s' from '%s' to '%s'", - self.host, self.fromaddr, self.toaddr) - raise - else: - if failed_recipients: # pragma: no cover - self._logSys.warning( - "Email to '%s' failed to following recipients: %r", - self.toaddr, failed_recipients) - self._logSys.debug("Email '%s' successfully sent", subject) - finally: - try: - self._logSys.debug("Disconnected from '%s', response %i: %s", - self.host, *smtp.quit()) - except smtplib.SMTPServerDisconnected: # pragma: no cover - pass # Not connected - - def start(self): - """Sends email to recipients informing that the jail has started. - """ - self._sendMessage( - "[Fail2Ban] %(jailname)s: started on %(hostname)s" % - self.message_values, - messages['start'] % self.message_values) - - def stop(self): - """Sends email to recipients informing that the jail has stopped. - """ - self._sendMessage( - "[Fail2Ban] %(jailname)s: stopped on %(hostname)s" % - self.message_values, - messages['stop'] % self.message_values) - - def ban(self, aInfo): - """Sends email to recipients informing that ban has occurred. - - Parameters - ---------- - aInfo : dict - Dictionary which includes information in relation to - the ban. - """ - if aInfo.get('restored'): - return - aInfo.update(self.message_values) - message = "".join([ - messages['ban']['head'], - messages['ban'].get(self.matches, ""), - messages['ban']['tail'] - ]) - self._sendMessage( - "[Fail2Ban] %(jailname)s: banned %(ip)s from %(hostname)s" % - aInfo, - message % aInfo) - -Action = SMTPAction |
