BF: Lock server's executeCmd to prevent racing among iptables calls (Closes: #554162)

Many kudos go to Michael Saavedra for the solution and the patch.

git-svn-id: https://fail2ban.svn.sourceforge.net/svnroot/fail2ban/branches/FAIL2BAN-0_8@784 a942ae1a-1317-0410-a47c-b1dcaea8d605
pull/4/head
Yaroslav Halchenko 13 years ago
parent 3eb5e3b876
commit 3a58d0e6e4

@ -25,11 +25,15 @@ __copyright__ = "Copyright (c) 2004 Cyril Jaquier"
__license__ = "GPL"
import logging, os
import threading
#from subprocess import call
# Gets the instance of the logger.
logSys = logging.getLogger("fail2ban.actions.action")
# Create a lock for running system commands
_cmd_lock = threading.Lock()
##
# Execute commands.
#
@ -301,6 +305,8 @@ class Action:
#@staticmethod
def executeCmd(realCmd):
logSys.debug(realCmd)
_cmd_lock.acquire()
try: # Try wrapped within another try needed for python version < 2.5
try:
# The following line gives deadlock with multiple jails
#retcode = call(realCmd, shell=True)
@ -312,6 +318,8 @@ class Action:
logSys.error("%s returned %x" % (realCmd, retcode))
except OSError, e:
logSys.error("%s failed with %s" % (realCmd, e))
finally:
_cmd_lock.release()
return False
executeCmd = staticmethod(executeCmd)

Loading…
Cancel
Save