#!/usr/bin/python2

import os
import re
import sys
import logging
import logging.handlers
import syslog
import subprocess

class DirectSyslogHandler(logging.Handler):
    def __init__(self, name):
        self.levelmap = { 'DEBUG': syslog.LOG_DEBUG, 'INFO': syslog.LOG_INFO, 'NOTICE': syslog.LOG_NOTICE,
                          'WARNING': syslog.LOG_WARNING, 'ERROR': syslog.LOG_ERR, 'CRITICAL': syslog.LOG_CRIT }
        logging.Handler.__init__(self)
        syslog.openlog(name, syslog.LOG_PID)

    def emit(self, record):
        try:
            msg = self.format(record)
            level = self.levelmap.get(record.levelname, syslog.LOG_INFO)
            syslog.syslog(level, msg)
        except Exception, e:
            pass

def setup_logger(progname):
    logger = logging.getLogger(progname)
    logger.setLevel(logging.INFO)

    handler = DirectSyslogHandler(progname)
    handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
    logger.addHandler(handler)

    return logger

progname = os.path.basename(os.path.abspath(sys.argv[0]))

logger = setup_logger(progname)

mode = None
name = None

try:
    mode = re.compile('if(up|down)-local').match(progname).group(1)
except:
    logger.error('unable to find mode from program name %s' % progname)
    sys.exit(1)

try:
    name = sys.argv[1]
except:
    logger.error('interface name missing')
    sys.exit(1)

logger.debug('called %s for interface %s...' % (progname, name))

scriptpath = '/etc/ifupdown-local.d/'
scriptlist = []

try:
    logger.debug('listing scripts in %s...' % scriptpath)
    scriptlist = os.listdir(scriptpath).sort()
except Exception, e:
    logger.warning('open %s failed: %s' % (scriptpath, str(e)))
    sys.exit(1)

for fn in os.listdir(scriptpath):
    fullpath = os.path.join(scriptpath, fn)
    if os.access(fullpath, os.X_OK):
        try:
            logger.debug('running script %s...' % fullpath)
            ret = subprocess.call([fullpath, mode, name])

            if ret > 0:
                logger.warning('script %s returned %d' % (fn, ret))
            elif ret < 0:
                logger.warning('script %s killed with signal %d' % (fn, 0 - ret))
        except Exception, e:
            logger.warning('error running script %s: %s' % (fn, str(e)))
    else:
        logger.debug('script %s not executable, skipping' % fn)

