56 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | Symptom:  | ||
|  |     running something in a manifest and that fails does not exist | ||
|  |     the cdist run | ||
|  | 
 | ||
|  | Analysis: | ||
|  |     Find out what the shell does: | ||
|  | 
 | ||
|  |     [23:56] bento:testshell% cat a.sh  | ||
|  |     # source something that fails | ||
|  |     . b.sh | ||
|  |     [23:57] bento:testshell% cat b.sh  | ||
|  |     nosuchcommand | ||
|  |     [23:57] bento:testshell% sh -e a.sh | ||
|  |     a.sh: 2: .: b.sh: not found | ||
|  |     [23:57] bento:testshell% echo $? | ||
|  |     2 | ||
|  | 
 | ||
|  |     -> exit 2 -> looks good | ||
|  | 
 | ||
|  | 
 | ||
|  |     Find out what the python does: | ||
|  | 
 | ||
|  |     [23:57] bento:testshell% python3 | ||
|  |     Python 3.3.2 (default, May 21 2013, 15:40:45)  | ||
|  |     [GCC 4.8.0 20130502 (prerelease)] on linux | ||
|  |     Type "help", "copyright", "credits" or "license" for more information. | ||
|  |     >>> import subprocess | ||
|  |     >>> subprocess.check_call(["/bin/sh", "-e", "a.sh"]) | ||
|  |     a.sh: 2: .: b.sh: not found | ||
|  |     Traceback (most recent call last): | ||
|  |       File "<stdin>", line 1, in <module> | ||
|  |       File "/usr/lib/python3.3/subprocess.py", line 544, in check_call | ||
|  |         raise CalledProcessError(retcode, cmd) | ||
|  |     subprocess.CalledProcessError: Command '['/bin/sh', '-e', 'a.sh']' returned non-zero exit status 2 | ||
|  |     >>>  | ||
|  | 
 | ||
|  | 
 | ||
|  | Conclusion: | ||
|  |     Manifests that execute (!) other shell scripts does | ||
|  |     not necessarily give the -e flag to the other script | ||
|  |         -> called script can have failures, but exit 0 | ||
|  |             if something the last thing executed does exit 0! | ||
|  | 
 | ||
|  | Solution: | ||
|  |     Instead of doing stuff like | ||
|  |     "$__manifest/special" | ||
|  | 
 | ||
|  |     use | ||
|  |     sh -e "$__manifest/special" | ||
|  | 
 | ||
|  |     or source the script: | ||
|  |     . "$__manifest/special" | ||
|  | 
 | ||
|  |     (runs the script in the same namespace/process as everything in the | ||
|  |     calling script) | ||
|  |          |