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