mirror of https://github.com/fail2ban/fail2ban
110 lines
3.1 KiB
Python
110 lines
3.1 KiB
Python
# 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: 1.2 $
|
|
|
|
__author__ = "Cyril Jaquier"
|
|
__version__ = "$Revision: 1.2 $"
|
|
__date__ = "$Date: 2005/11/20 17:07:47 $"
|
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
|
__license__ = "GPL"
|
|
|
|
import os, logging
|
|
|
|
# Gets the instance of the logger.
|
|
logSys = logging.getLogger("fail2ban")
|
|
|
|
class PIDLock:
|
|
""" Manages the PID lock file.
|
|
|
|
The following class shows how to implement the singleton pattern[1] in
|
|
Python. A singleton is a class that makes sure only one instance of it
|
|
is ever created. Typically such classes are used to manage resources
|
|
that by their very nature can only exist once.
|
|
|
|
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558
|
|
"""
|
|
|
|
class __impl:
|
|
""" Implementation of the singleton interface """
|
|
|
|
def setPath(self, path):
|
|
""" Set PID lock file path.
|
|
"""
|
|
self.path = path
|
|
|
|
def create(self):
|
|
""" Create PID lock.
|
|
"""
|
|
try:
|
|
fileHandler = open(self.path, mode='w')
|
|
pid = os.getpid()
|
|
fileHandler.write(`pid` + '\n')
|
|
fileHandler.close()
|
|
logSys.debug("Created PID lock (" + `pid` + ") in " + self.path)
|
|
return True
|
|
except:
|
|
logSys.error("Unable to create PID lock " + self.path)
|
|
return False
|
|
|
|
def remove(self):
|
|
""" Remove PID lock.
|
|
"""
|
|
try:
|
|
os.remove(self.path)
|
|
logSys.debug("Removed PID lock " + self.path)
|
|
except OSError:
|
|
logSys.error("Unable to remove PID lock " + self.path)
|
|
except AttributeError:
|
|
# AttributeError if self.path wasn't specified yet
|
|
logSys.debug("PID lock not removed because not defined yet")
|
|
|
|
def exists(self):
|
|
""" Returns the current PID if Fail2Ban is running or False
|
|
if no instance found.
|
|
"""
|
|
try:
|
|
fileHandler = open(self.path)
|
|
pid = fileHandler.readline()
|
|
fileHandler.close()
|
|
return pid
|
|
except IOError:
|
|
return False
|
|
|
|
# storage for the instance reference
|
|
__instance = None
|
|
|
|
def __init__(self):
|
|
""" Create singleton instance """
|
|
# Check whether we already have an instance
|
|
if PIDLock.__instance is None:
|
|
# Create and remember instance
|
|
PIDLock.__instance = PIDLock.__impl()
|
|
|
|
# Store instance reference as the only member in the handle
|
|
self.__dict__['_PIDLock__instance'] = PIDLock.__instance
|
|
|
|
def __getattr__(self, attr):
|
|
""" Delegate access to implementation """
|
|
return getattr(self.__instance, attr)
|
|
|
|
def __setattr__(self, attr, value):
|
|
""" Delegate access to implementation """
|
|
return setattr(self.__instance, attr, value)
|
|
|