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)
 | |
|         
 |