diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py index 8d3f9014..75b3d85e 100644 --- a/fail2ban/server/filter.py +++ b/fail2ban/server/filter.py @@ -83,6 +83,8 @@ class Filter(JailThread): self.__lastDate = None ## External command self.__ignoreCommand = False + ## Default or preferred encoding (to decode bytes from file or journal): + self.__encoding = locale.getpreferredencoding() self.dateDetector = DateDetector() self.dateDetector.addDefaultTemplate() @@ -280,6 +282,27 @@ class Filter(JailThread): def getMaxLines(self): return self.__lineBufferSize + ## + # Set the log file encoding + # + # @param encoding the encoding used with log files + + def setLogEncoding(self, encoding): + if encoding.lower() == "auto": + encoding = locale.getpreferredencoding() + codecs.lookup(encoding) # Raise LookupError if invalid codec + self.__encoding = encoding + logSys.info("Set jail log file encoding to %s" % encoding) + return encoding + + ## + # Get the log file encoding + # + # @return log encoding value + + def getLogEncoding(self): + return self.__encoding + ## # Main loop. # @@ -584,7 +607,6 @@ class FileFilter(Filter): Filter.__init__(self, jail, **kwargs) ## The log file path. self.__logs = dict() - self.setLogEncoding("auto") ## # Add a log file path @@ -655,21 +677,9 @@ class FileFilter(Filter): # @param encoding the encoding used with log files def setLogEncoding(self, encoding): - if encoding.lower() == "auto": - encoding = locale.getpreferredencoding() - codecs.lookup(encoding) # Raise LookupError if invalid codec + encoding = super(FileFilter, self).setLogEncoding(encoding) for log in self.__logs.itervalues(): log.setEncoding(encoding) - self.__encoding = encoding - logSys.info("Set jail log file encoding to %s" % encoding) - - ## - # Get the log file encoding - # - # @return log encoding value - - def getLogEncoding(self): - return self.__encoding def getLog(self, path): return self.__logs.get(path, None) diff --git a/fail2ban/server/filtersystemd.py b/fail2ban/server/filtersystemd.py index 5c5481b9..3023155c 100644 --- a/fail2ban/server/filtersystemd.py +++ b/fail2ban/server/filtersystemd.py @@ -31,7 +31,7 @@ if LooseVersion(getattr(journal, '__version__', "0")) < '204': raise ImportError("Fail2Ban requires systemd >= 204") from .failmanager import FailManagerEmpty -from .filter import JournalFilter, Filter, locale +from .filter import JournalFilter, Filter from .mytime import MyTime from ..helpers import getLogger, logging, splitwords @@ -170,9 +170,8 @@ class FilterSystemd(JournalFilter): # pragma: systemd no cover def getJournalMatch(self): return self.__matches - @staticmethod - def uni_decode(x): - v = Filter.uni_decode(x, locale.getpreferredencoding()) + def uni_decode(self, x): + v = Filter.uni_decode(x, self.getLogEncoding()) return v ## @@ -181,10 +180,9 @@ class FilterSystemd(JournalFilter): # pragma: systemd no cover # @param entry systemd journal entry dict # @return format log line - @classmethod - def formatJournalEntry(cls, logentry): + def formatJournalEntry(self, logentry): # Be sure, all argument of line tuple should have the same type: - uni_decode = FilterSystemd.uni_decode + uni_decode = self.uni_decode logelements = [] v = logentry.get('_HOSTNAME') if v: diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py index f3d44829..abaf4dfd 100644 --- a/fail2ban/server/server.py +++ b/fail2ban/server/server.py @@ -237,13 +237,11 @@ class Server: def setLogEncoding(self, name, encoding): filter_ = self.__jails[name].filter - if isinstance(filter_, FileFilter): - filter_.setLogEncoding(encoding) + filter_.setLogEncoding(encoding) def getLogEncoding(self, name): filter_ = self.__jails[name].filter - if isinstance(filter_, FileFilter): - return filter_.getLogEncoding() + return filter_.getLogEncoding() def setFindTime(self, name, value): self.__jails[name].filter.setFindTime(value)