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