mirror of https://github.com/fail2ban/fail2ban
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.3 KiB
130 lines
3.3 KiB
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
|
|
# Author: Cyril Jaquier |
|
# |
|
# $Revision$ |
|
|
|
__author__ = "Cyril Jaquier" |
|
__version__ = "$Revision$" |
|
__date__ = "$Date$" |
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier" |
|
__license__ = "GPL" |
|
|
|
import re, sre_constants |
|
|
|
## |
|
# Regular expression class. |
|
# |
|
# This class represents a regular expression with its compiled version. |
|
|
|
class Regex: |
|
|
|
## |
|
# Constructor. |
|
# |
|
# Creates a new object. This method can throw RegexException in order to |
|
# avoid construction of invalid object. |
|
# @param value the regular expression |
|
|
|
def __init__(self, regex): |
|
self._matchCache = None |
|
# Perform shortcuts expansions. |
|
# Replace "<HOST>" with default regular expression for host. |
|
regex = regex.replace("<HOST>", "(?:::f{4,6}:)?(?P<host>[\w\-.^_]+)") |
|
if regex.lstrip() == '': |
|
raise RegexException("Cannot add empty regex") |
|
try: |
|
self._regexObj = re.compile(regex) |
|
self._regex = regex |
|
except sre_constants.error: |
|
raise RegexException("Unable to compile regular expression '%s'" % |
|
regex) |
|
|
|
## |
|
# Gets the regular expression. |
|
# |
|
# The effective regular expression used is returned. |
|
# @return the regular expression |
|
|
|
def getRegex(self): |
|
return self._regex |
|
|
|
## |
|
# Searches the regular expression. |
|
# |
|
# Sets an internal cache (match object) in order to avoid searching for |
|
# the pattern again. This method must be called before calling any other |
|
# method of this object. |
|
# @param value the line |
|
|
|
def search(self, value): |
|
self._matchCache = self._regexObj.search(value) |
|
|
|
## |
|
# Checks if the previous call to search() matched. |
|
# |
|
# @return True if a match was found, False otherwise |
|
|
|
def hasMatched(self): |
|
if self._matchCache: |
|
return True |
|
else: |
|
return False |
|
|
|
|
|
## |
|
# Exception dedicated to the class Regex. |
|
|
|
class RegexException(Exception): |
|
pass |
|
|
|
|
|
## |
|
# Regular expression class. |
|
# |
|
# This class represents a regular expression with its compiled version. |
|
|
|
class FailRegex(Regex): |
|
|
|
## |
|
# Constructor. |
|
# |
|
# Creates a new object. This method can throw RegexException in order to |
|
# avoid construction of invalid object. |
|
# @param value the regular expression |
|
|
|
def __init__(self, regex): |
|
# Initializes the parent. |
|
Regex.__init__(self, regex) |
|
# Check for group "host" |
|
if "host" not in self._regexObj.groupindex: |
|
raise RegexException("No 'host' group in '%s'" % self._regex) |
|
|
|
## |
|
# Returns the matched host. |
|
# |
|
# This corresponds to the pattern matched by the named group "host". |
|
# @return the matched host |
|
|
|
def getHost(self): |
|
host = self._matchCache.group("host") |
|
if host == None: |
|
# Gets a few information. |
|
s = self._matchCache.string |
|
r = self._matchCache.re |
|
raise RegexException("No 'host' found in '%s' using '%s'" % (s, r)) |
|
return host
|
|
|