#!/usr/bin/env 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()
