@ -18,13 +18,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Author: Cyril Jaquier
# Author: Cyril Jaquier
#
# $Revision$
__author__ = " Cyril Jaquier "
__author__ = " Cyril Jaquier, Lee Celemens, Yaroslav Halchenko "
__version__ = " $Revision$ "
__copyright__ = " Copyright (c) 2004 Cyril Jaquier, 2011-2012 Lee Clemens, 2012 Yaroslav Halchenko "
__date__ = " $Date$ "
__copyright__ = " Copyright (c) 2004 Cyril Jaquier "
__license__ = " GPL "
__license__ = " GPL "
import Queue , logging
import Queue , logging
@ -35,58 +31,62 @@ from actions import Actions
logSys = logging . getLogger ( " fail2ban.jail " )
logSys = logging . getLogger ( " fail2ban.jail " )
class Jail :
class Jail :
_BACKENDS = ( ' pyinotify ' , ' gamin ' , ' pull ' )
""" Known backends. Each backend should have corresponding
__initBackend method
"""
def __init__ ( self , name , backend = " auto " ) :
def __init__ ( self , name , backend = " auto " ) :
self . __name = name
self . __name = name
self . __queue = Queue . Queue ( )
self . __queue = Queue . Queue ( )
self . __filter = None
self . __filter = None
logSys . info ( " Creating new jail ' %s ' " % self . __name )
logSys . info ( " Creating new jail ' %s ' " % self . __name )
self . __setBackend = False
self . _setBackend ( backend )
if backend == " auto " :
# Quick-escape for auto (default/fall-back condition)
self . __setBackend = False
elif backend == " pyinotify " :
try :
self . __initPyinotify ( )
self . __setBackend = True
except ImportError :
self . __setBackend = False
elif backend == " gamin " :
try :
self . __initGamin ( )
self . __setBackend = True
except ImportError :
self . __setBackend = False
elif backend == " polling " :
self . __initPoller ( )
self . __setBackend = True
if not self . __setBackend :
def _setBackend ( self , backend ) :
# If auto, or unrecognized, or failed using an explicit value
backend = backend . lower ( ) # to assure consistent matching
backends = self . _BACKENDS
if backend != ' auto ' :
# we have got strict specification of the backend to use
if not ( backend in self . _BACKENDS ) :
raise ValueError ( " Unknown backend %s . Must be among %s or ' auto ' "
% ( backend , backends ) )
# so explore starting from it till the 'end'
backends = backends [ backends . index ( backend ) : ]
for b in backends :
initmethod = getattr ( self , ' _init %s ' % b . capitalize ( ) )
try :
try :
self . __initPyinotify ( )
initmethod ( )
except ImportError :
if backend != ' auto ' and b != backend :
try :
logSys . warning ( " Could only initiated %r backend whenever "
self . __initGamin ( )
" %r was requested " % ( b , backend ) )
except ImportError :
else :
self . __initPoller ( )
logSys . info ( " Initiated %r backend " % b )
self . __setBackend = True
self . __action = Actions ( self )
return # we are done
except ImportError , e :
logSys . debug (
" Backend %r failed to initialize due to %s " % ( b , e ) )
raise RuntimeError (
" We should have initialized at least ' polling ' backend " )
self . __action = Actions ( self )
def _initPoller ( self ) :
def __initPoller ( self ) :
logSys . info ( " Jail ' %s ' uses poller " % self . __name )
logSys . info ( " Jail ' %s ' uses poller " % self . __name )
from filterpoll import FilterPoll
from filterpoll import FilterPoll
self . __filter = FilterPoll ( self )
self . __filter = FilterPoll ( self )
def _ _ initGamin( self ) :
def _ initGamin( self ) :
# Try to import gamin
# Try to import gamin
import gamin
import gamin
logSys . info ( " Jail ' %s ' uses Gamin " % self . __name )
logSys . info ( " Jail ' %s ' uses Gamin " % self . __name )
from filtergamin import FilterGamin
from filtergamin import FilterGamin
self . __filter = FilterGamin ( self )
self . __filter = FilterGamin ( self )
def _ _ initPyinotify( self ) :
def _ initPyinotify( self ) :
# Try to import pyinotify
# Try to import pyinotify
import pyinotify
import pyinotify
logSys . info ( " Jail ' %s ' uses pyinotify " % self . __name )
logSys . info ( " Jail ' %s ' uses pyinotify " % self . __name )