#!/usr/bin/python3
import os  # do not edit
import sys  # do not edit
import platform # do not edit
import signal  # do not edit
import time  # do not edit
# denyhosts     Bring up/down the DenyHosts daemon
#
# chkconfig: 2345 98 02
# description: Activates/Deactivates the
#    DenyHosts daemon to block ssh attempts
#
###############################################

###############################################
#    Edit these to suit your configuration    #
###############################################

DENYHOSTS_BIN = "/usr/sbin/denyhosts.py"
DENYHOSTS_LOCK = "/run/denyhosts.pid"
DENYHOSTS_CFG = "/etc/denyhosts.conf"

PYTHON_BIN = "/usr/bin/python3"

distro = platform.uname()[3]
distro2 = platform.uname()[2]
if distro.find('Debian') >= 0:
    DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
elif distro.find('FreeBSD') >= 0:
    DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
else:
    #centos
    if distro2.find('el6') >= 0 or distro2.find('el7') >= 0:
        DENYHOSTS_BIN = "/usr/bin/denyhosts.py"

###############################################
###############################################
#            Do not edit below                #
###############################################
###############################################


DENYHOSTS_BIN = '{0} {1}'.format(PYTHON_BIN, DENYHOSTS_BIN)

# make sure 'ps' command is accessible (which should be
# in either /usr/bin or /bin.  Modify the PATH so
# popen can find it
env = os.environ.get('PATH', "")
os.environ['PATH'] = '/usr/bin:/bin:{0}'.format(env)

STATE_NOT_RUNNING = -1
STATE_LOCK_EXISTS = -2


def usage():
    print(
        'Usage: {0} start [args...] | stop | restart [args...] | status | debug | condrestart [args...]'.format(
            sys.argv[0]
        )
    )
    print()
    print('For a list of valid "args" refer to:')
    print("$ denyhosts.py --help")
    print()
    sys.exit(0)


def getpid():
    try:
        fp = open(DENYHOSTS_LOCK, "r")
        pid = int(fp.readline().rstrip())
        fp.close()
    except Exception as e:
        return STATE_NOT_RUNNING

    if not sys.platform.startswith('freebsd') and os.access("/proc", os.F_OK):
        # proc filesystem exists, look for pid
        if os.access(os.path.join("/proc", str(pid)), os.F_OK):
            return pid
        else:
            return STATE_LOCK_EXISTS
    else:
        # proc filesystem doesn't exist (or it doesn't contain PIDs), use 'ps'
        p = os.popen("ps -p %d" % pid, "r")
        p.readline()  # get the header line
        pid_running = p.readline()
        # pid_running will be '' if no process is found
        if pid_running:
            return pid
        else:
            return STATE_LOCK_EXISTS


def start(*sargs):
    scmd = '{0} --daemon '.format(DENYHOSTS_BIN)
    if sargs:
        scmd += ' '.join(sargs)

    print('starting DenyHosts:  {0}'.format(scmd))

    os.system(scmd)


def stop():
    pid = getpid()
    if pid >= 0:
        os.kill(pid, signal.SIGTERM)
        print('sent DenyHosts SIGTERM')
    else:
        print('DenyHosts is not running')


def debug():
    pid = getpid()
    if pid >= 0:
        os.kill(pid, signal.SIGUSR1)
        print('sent DenyHosts SIGUSR1')
    else:
        print('DenyHosts is not running')


def status():
    pid = getpid()
    if pid == STATE_LOCK_EXISTS:
        print('{0} exists but DenyHosts is not running'.format(DENYHOSTS_LOCK))
    elif pid == STATE_NOT_RUNNING:
        print('Denyhosts is not running')
    else:
        print('DenyHosts is running with pid = {0}'.format(pid))


def condrestart(*cargs):
    pid = getpid()
    if pid >= 0:
        restart(*cargs)


def restart(*rargs):
    stop()
    time.sleep(1)
    start(*rargs)


if __name__ == '__main__':
    cases = {'start':       start,
             'stop':        stop,
             'debug':       debug,
             'status':      status,
             'condrestart': condrestart,
             'restart':     restart}

    try:
        args = sys.argv[2:]
    except Exception:
        args = []

    try:
        # arg 1 should contain one of the cases above
        option = sys.argv[1]
    except Exception:
        # try to infer context (from an /etc/init.d/ script, perhaps)
        procname = os.path.basename(sys.argv[0])
        infer_dict = {'K': 'stop',
                      'S': 'start'}
        option = infer_dict.get(procname[0])
        if not option:
            usage()

    try:
        if option in ('start', 'restart', 'condrestart'):
            anystartswith = lambda prefix, xs: any(map(lambda x: x.startswith(prefix), xs))
            if not anystartswith('--config', args) and '-c' not in args:
                args.append("--config=%s" % DENYHOSTS_CFG)

        cmd = cases[option]
        getattr(sys.modules[__name__], 'cmd')(*args)
    except Exception:
        usage()
