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