#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: ai ts=4 sts=4 et sw=4 nu
import sys
import signal
import multiprocessing
import os
import os.path
import subprocess
import stat


def touch(fname, times=None):
    dirname = '/'.join(fname.split('/')[:-1])
    if not os.path.exists(dirname):
        os.makedirs(dirname)
    with file(fname, 'a'):
        os.utime(fname, times)


def listdir(path):
    try:
        result = os.stat(path)
    except OSError:
        return []
    if stat.S_ISDIR(result.st_mode):
        return sorted(os.listdir(path))
    else:
        return []


def is_exe(path):
    try:
        return os.path.isfile(path) and os.access(path, os.X_OK)
    except OSError:
        return False


def run_command(filename):
    def call():
        print("Running : %s" % filename)
        subprocess.call([filename])
    process = multiprocessing.Process(target=call)
    process.start()
    return process


def collect_scripts(my_initd_path, level=0, prefixes=[]):
    def check(script):
        if not is_exe(script):
            return False
        if len(prefixes) > 0:
            for prefix in prefixes:
                if os.path.basename(script).startswith(prefix):
                    return True
            return False
        else:
            return True
    for name in listdir(my_initd_path):
        filename = os.path.join(my_initd_path, name)
        if check(filename):
            yield filename
        elif listdir(filename) and name in os.uname()[1] and level == 0:

            for script in collect_scripts(filename, level + 1, prefixes):
                yield script

def collect_startup_scripts(my_initd_path):
    if is_exe("/etc/rc.local"):
        yield "/etc/rc.local"
    if is_exe("/usr/local/sbin/enable_insecure_key"):
        yield "/usr/local/sbin/enable_insecure_key"
    prefixes = ["start", "init", "setup"]
    for script in collect_scripts(my_initd_path, prefixes=prefixes):
        yield script


def collect_shudown_scripts(my_initd_path):
    prefixes = ["stop", "clean"]
    for script in collect_scripts(my_initd_path, prefixes=prefixes):
        yield script


def terminate_processes(processes, wait=False):
    for process in processes:
        if process.is_alive() and not wait:
            process.terminate()
        process.join()


if __name__ == '__main__':
    print("Initializing the container...")
    startup_processes = []
    for script in collect_startup_scripts("/var/lib/container/my_init.d"):
        startup_processes.append(run_command(script))

    def shutdwon(*args, **kwargs):
        terminate_processes(startup_processes)
        print("Stopping the container...")
        shutdown_processes = []
        for script in collect_shudown_scripts("/var/lib/container/my_init.d"):
            print "%s" % script
            startup_processes.append(run_command(script))
        terminate_processes(shutdown_processes, wait=True)
        sys.exit(0)


    signal.signal(signal.SIGHUP, shutdwon)
    signal.signal(signal.SIGINT, shutdwon)
    signal.signal(signal.SIGTERM, shutdwon)

    if len(sys.argv) > 1:
        subprocess.call(sys.argv[1:])
    else:
        multiprocessing.Queue().get()
