74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/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()
 |