| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | #!/bin/sh | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # 2010 Nico Schottelius (nico-cdist at schottelius.org) | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This file is part of cdist. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # cdist is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | # it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | # the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | # (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # cdist is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with cdist. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  | 
					
						
							|  |  |  | # For each created object | 
					
						
							|  |  |  | # run the manifest of the type (with object id), | 
					
						
							|  |  |  | # try to merge back newly created objects (otherwise fail), | 
					
						
							|  |  |  | # mark the object as being run | 
					
						
							|  |  |  | # and iterate until all objects are marked being run. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | . cdist-config | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 00:08:05 +01:00
										 |  |  | if [ $# -ne 2 ]; then | 
					
						
							|  |  |  |    __cdist_usage "<target host> <object_dir>" | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | set -eu | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 00:08:05 +01:00
										 |  |  | __cdist_target_host="$1"; shift | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | __cdist_object_dir="$1"; shift | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  | # change to directory containing objects | 
					
						
							|  |  |  | cd "$__cdist_object_dir" | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  | # Loop until we do not create new objects anymore | 
					
						
							|  |  |  | # which is equal to all objects have been run | 
					
						
							|  |  |  | __cdist_object_created_new=1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while [ "$__cdist_object_created_new" = 1 ]; do | 
					
						
							|  |  |  |    # assume we're done after this run | 
					
						
							|  |  |  |    __cdist_object_created_new=0 | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 15:52:28 +01:00
										 |  |  |    # find all objects (every object has the source recorded) | 
					
						
							|  |  |  |    find . -name "$__cdist_object_source" |   \ | 
					
						
							|  |  |  |       sed -e "s;$__cdist_object_source\$;;"  \ | 
					
						
							|  |  |  |           -e 's;^./;;'                       \ | 
					
						
							|  |  |  |       > "$__cdist_tmp_file" | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-07 18:40:43 +01:00
										 |  |  |    # FIXME: DEBUG | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |    cat "$__cdist_tmp_file" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 15:52:28 +01:00
										 |  |  |    while read object; do | 
					
						
							|  |  |  |       if [ ! -f "${object}/$__cdist_object_finished" ]; then | 
					
						
							| 
									
										
										
										
											2011-02-07 18:40:43 +01:00
										 |  |  |          echo "Working on object ${object} ..." | 
					
						
							| 
									
										
										
										
											2011-02-07 18:34:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |          type=${object%%/*} | 
					
						
							|  |  |  |          manifest="$__cdist_type_dir/${type}/${__cdist_name_init}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |          if [ -x "${manifest}" ]; then | 
					
						
							| 
									
										
										
										
											2011-02-07 18:40:43 +01:00
										 |  |  |             echo "Running manifest of type ${type} ..." | 
					
						
							| 
									
										
										
										
											2011-02-08 00:26:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # FIXME: use subdir in tmpdir? | 
					
						
							| 
									
										
										
										
											2011-02-08 00:08:05 +01:00
										 |  |  |             cdist-manifest-run "$__cdist_target_host" "${manifest}" "${__cdist_tmp_dir}" | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  |             echo "Trying to merge... " | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # list of new objects | 
					
						
							|  |  |  |             cd "${__cdist_tmp_dir}" | 
					
						
							|  |  |  |             find . -name "$__cdist_object_source" |   \ | 
					
						
							|  |  |  |                sed -e "s;$__cdist_object_source\$;;"  \ | 
					
						
							|  |  |  |                    -e 's;^./;;'                       \ | 
					
						
							|  |  |  |                > "$__cdist_tmp_file" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             while read newobject; do | 
					
						
							|  |  |  |                if [ -e "$__cdist_object_dir/${newobject}" ]; then | 
					
						
							| 
									
										
										
										
											2011-02-08 00:08:05 +01:00
										 |  |  |                   __cdist_exit_err "${newobject} already exists, merge failed." | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  |                else | 
					
						
							| 
									
										
										
										
											2011-02-08 00:26:26 +01:00
										 |  |  |                   # Fine, merge back! FIXME: touch correct here? | 
					
						
							|  |  |  |                   touch "${object}/$__cdist_object_finished" | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  |                   pax -r -w "$newobject" "$__cdist_object_dir" | 
					
						
							|  |  |  |                fi | 
					
						
							|  |  |  |             done < "$__cdist_tmp_file" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Always rerun the whole loop if we ran | 
					
						
							|  |  |  |             # a manifest of an object | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |             # FIXME: continue here | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  |             # tar, cp, pax, mv? | 
					
						
							|  |  |  |             # mv/cp -n look good - posix? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # pax: | 
					
						
							|  |  |  |             # pax -r -w  -k could work, but -k does not raise an error if files | 
					
						
							|  |  |  |             # are already existing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |             # - copy if not existing | 
					
						
							|  |  |  |             # fail (abort whole recursive run) if existing | 
					
						
							|  |  |  |             #  | 
					
						
							|  |  |  |             # iterate over all new objects and copy each back? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          else | 
					
						
							|  |  |  |             # Be nice, warn user if manifests exists, but is not executable | 
					
						
							|  |  |  |             if [ -f "${manifest}" ]; then | 
					
						
							|  |  |  |                echo "Warning ${manifest} is not executable" | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |          fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          # At least one more run needed | 
					
						
							|  |  |  |          __cdist_object_created_new=1 | 
					
						
							| 
									
										
										
										
											2011-02-06 15:52:28 +01:00
										 |  |  |       fi | 
					
						
							|  |  |  |    done < "$__cdist_tmp_file" | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | exit 0 |