Use syslogsocket value "auto" to determine syslog socket's path

pull/949/head
Lee Clemens 2015-02-06 19:14:09 -05:00
parent d676a9fd4f
commit 6268eb32be
6 changed files with 23 additions and 9 deletions

View File

@ -36,8 +36,9 @@ logtarget = /var/log/fail2ban.log
# Option: syslogsocket # Option: syslogsocket
# Notes: Set the syslog socket file. Only used when logtarget is SYSLOG # Notes: Set the syslog socket file. Only used when logtarget is SYSLOG
# Values: [ FILE ] Default: /dev/log # auto uses platform.system() to determine predefined paths
syslogsocket = /dev/log # Values: [ auto | FILE ] Default: auto
syslogsocket = auto
# Option: socket # Option: socket
# Notes.: Set the socket file. This is used to communicate with the daemon. Do # Notes.: Set the socket file. This is used to communicate with the daemon. Do

View File

@ -46,7 +46,7 @@ class Fail2banReader(ConfigReader):
def getOptions(self): def getOptions(self):
opts = [["string", "loglevel", "INFO" ], opts = [["string", "loglevel", "INFO" ],
["string", "logtarget", "STDERR"], ["string", "logtarget", "STDERR"],
["string", "syslogsocket", "/dev/log"], ["string", "syslogsocket", "auto"],
["string", "dbfile", "/var/lib/fail2ban/fail2ban.sqlite3"], ["string", "dbfile", "/var/lib/fail2ban/fail2ban.sqlite3"],
["int", "dbpurgeage", 86400]] ["int", "dbpurgeage", 86400]]
self.__opts = ConfigReader.getOptions(self, "Definition", opts) self.__opts = ConfigReader.getOptions(self, "Definition", opts)

View File

@ -44,7 +44,7 @@ protocol = [
["get loglevel", "gets the logging level"], ["get loglevel", "gets the logging level"],
["set logtarget <TARGET>", "sets logging target to <TARGET>. Can be STDOUT, STDERR, SYSLOG or a file"], ["set logtarget <TARGET>", "sets logging target to <TARGET>. Can be STDOUT, STDERR, SYSLOG or a file"],
["get logtarget", "gets logging target"], ["get logtarget", "gets logging target"],
["set syslogsocket <SOCKET>", "sets the syslog socket path to <SOCKET>. Only used if logtarget is SYSLOG"], ["set syslogsocket auto|<SOCKET>", "sets the syslog socket path to auto or <SOCKET>. Only used if logtarget is SYSLOG"],
["get syslogsocket", "gets syslog socket path"], ["get syslogsocket", "gets syslog socket path"],
["flushlogs", "flushes the logtarget if a file and reopens it. For log rotation."], ["flushlogs", "flushes the logtarget if a file and reopens it. For log rotation."],
['', "DATABASE", ""], ['', "DATABASE", ""],

View File

@ -56,10 +56,16 @@ class Server:
self.__logLevel = None self.__logLevel = None
self.__logTarget = None self.__logTarget = None
self.__syslogSocket = None self.__syslogSocket = None
self.__autoSyslogSocketPaths = {
'Darwin': '/var/run/syslog',
'FreeBSD': '/var/run/log',
'Linux': '/dev/log',
}
# Set logging level # Set logging level
self.setLogLevel("INFO") self.setLogLevel("INFO")
self.setLogTarget("STDOUT") self.setLogTarget("STDOUT")
self.setSyslogSocket("/dev/log") self.setSyslogSocket("auto")
def __sigTERMhandler(self, signum, frame): def __sigTERMhandler(self, signum, frame):
logSys.debug("Caught signal %d. Exiting" % signum) logSys.debug("Caught signal %d. Exiting" % signum)
@ -378,7 +384,12 @@ class Server:
# Syslog daemons already add date to the message. # Syslog daemons already add date to the message.
formatter = logging.Formatter("%(name)s[%(process)d]: %(levelname)s %(message)s") formatter = logging.Formatter("%(name)s[%(process)d]: %(levelname)s %(message)s")
facility = logging.handlers.SysLogHandler.LOG_DAEMON facility = logging.handlers.SysLogHandler.LOG_DAEMON
if os.path.exists(self.__syslogSocket)\ if self.__syslogSocket == "auto":
import platform
self.__syslogSocket = self.__autoSyslogSocketPaths.get(
platform.system())
if self.__syslogSocket is not None\
and os.path.exists(self.__syslogSocket)\
and stat.S_ISSOCK(os.stat( and stat.S_ISSOCK(os.stat(
self.__syslogSocket).st_mode): self.__syslogSocket).st_mode):
hdlr = logging.handlers.SysLogHandler( hdlr = logging.handlers.SysLogHandler(

View File

@ -624,7 +624,7 @@ class JailsReaderTest(LogCaptureTestCase):
['set', 'dbpurgeage', 86400], ['set', 'dbpurgeage', 86400],
['set', 'loglevel', "INFO"], ['set', 'loglevel', "INFO"],
['set', 'logtarget', '/var/log/fail2ban.log'], ['set', 'logtarget', '/var/log/fail2ban.log'],
['set', 'syslogsocket', '/dev/log']]) ['set', 'syslogsocket', 'auto']])
# and if we force change configurator's fail2ban's baseDir # and if we force change configurator's fail2ban's baseDir
# there should be an error message (test visually ;) -- # there should be an error message (test visually ;) --

View File

@ -739,7 +739,7 @@ class TransmitterLogging(TransmitterBase):
self.server = Server() self.server = Server()
self.server.setLogTarget("/dev/null") self.server.setLogTarget("/dev/null")
self.server.setLogLevel("CRITICAL") self.server.setLogLevel("CRITICAL")
self.server.setSyslogSocket("/dev/log") self.server.setSyslogSocket("auto")
super(TransmitterLogging, self).setUp() super(TransmitterLogging, self).setUp()
def testLogTarget(self): def testLogTarget(self):
@ -767,7 +767,9 @@ class TransmitterLogging(TransmitterBase):
raise unittest.SkipTest("'/dev/log' not present") raise unittest.SkipTest("'/dev/log' not present")
elif not os.path.exists("/dev/log"): elif not os.path.exists("/dev/log"):
return return
self.assertTrue(self.server.getSyslogSocket(), "auto")
self.setGetTest("logtarget", "SYSLOG") self.setGetTest("logtarget", "SYSLOG")
self.assertTrue(self.server.getSyslogSocket(), "/dev/log")
def testSyslogSocket(self): def testSyslogSocket(self):
self.setGetTest("syslogsocket", "/dev/log/NEW/PATH") self.setGetTest("syslogsocket", "/dev/log/NEW/PATH")