#!/usr/bin/python

"""CaptureCmd - A generic tool for capturing information about the
invocations of another program.

Usage
--
1. Move the original tool to a safe known location.

2. Link CaptureCmd to the original tool's location.

3. Define CAPTURE_CMD_PROGRAM to the known location of the original
tool; this must be an absolute path.

4. Define CAPTURE_CMD_DIR to a directory to write invocation
information to.
"""

import hashlib
import os
import sys
import time

def saveCaptureData(prefix, dir, object):
    string = repr(object) + '\n'
    key = hashlib.sha1(string).hexdigest()
    path = os.path.join(dir,
                        prefix + key)
    if not os.path.exists(path):
        f = open(path, 'wb')
        f.write(string)
        f.close()
    return prefix + key

def main():
    program = os.getenv('CAPTURE_CMD_PROGRAM')
    dir = os.getenv('CAPTURE_CMD_DIR')
    fallback = os.getenv('CAPTURE_CMD_FALLBACK')
    if not program:
        raise ValueError('CAPTURE_CMD_PROGRAM is not defined!')
    if not dir:
        raise ValueError('CAPTURE_CMD_DIR is not defined!')

    # Make the output directory if it doesn't already exist.
    if not os.path.exists(dir):
        os.mkdir(dir, 0700)

    # Get keys for various data.
    env = os.environ.items()
    env.sort()
    envKey = saveCaptureData('env-', dir, env)
    cwdKey = saveCaptureData('cwd-', dir, os.getcwd())
    argvKey = saveCaptureData('argv-', dir, sys.argv)
    entry = (time.time(), envKey, cwdKey, argvKey)
    saveCaptureData('cmd-', dir, entry)

    if fallback:
        pid = os.fork()
        if not pid:
            os.execv(program, sys.argv)
            os._exit(1)
        else:
            res = os.waitpid(pid, 0)
            if not res:
                os.execv(fallback, sys.argv)
                os._exit(1)
            os._exit(res)                
    else:
        os.execv(program, sys.argv)
        os._exit(1)

if __name__ == '__main__':
    main()
