forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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()
 |