| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | #!/bin/sh | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | # 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | # | 
					
						
							|  |  |  | # 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-17 09:28:35 +01:00
										 |  |  | [ $# -eq 2 ] || __cdist_usage "<target host> <object_base_dir>" | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | set -eu | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 00:08:05 +01:00
										 |  |  | __cdist_target_host="$1"; shift | 
					
						
							| 
									
										
										
										
											2011-02-16 22:12:21 +01:00
										 |  |  | __cdist_object_base_dir="$1"; shift | 
					
						
							| 
									
										
										
										
											2011-02-05 19:04:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  | __cdist_objects_list="${__cdist_tmp_dir}/objects_file" | 
					
						
							|  |  |  | __cdist_new_objects_list="${__cdist_tmp_dir}/new_objects_file" | 
					
						
							|  |  |  | __cdist_new_objects_dir="${__cdist_tmp_dir}/new_objects_dir" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:47:12 +01:00
										 |  |  | __cdist_new_objects_created=y | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  | while [ "$__cdist_new_objects_created" = "y"  ]; do | 
					
						
							| 
									
										
										
										
											2011-02-17 09:47:12 +01:00
										 |  |  |    # Assume we're done after this run | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |    __cdist_new_objects_created=n | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |    __cdist_object_list "$__cdist_object_base_dir" > "$__cdist_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  |    # Check every object, if we need to run it | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |    while read __cdist_object; do | 
					
						
							| 
									
										
										
										
											2011-02-22 11:54:50 +01:00
										 |  |  |       # Full path to current object | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |       __cdist_cur_object_dir="$__cdist_object_base_dir/$__cdist_object" | 
					
						
							| 
									
										
										
										
											2011-02-22 11:54:50 +01:00
										 |  |  |       # Only the id | 
					
						
							| 
									
										
										
										
											2011-02-23 09:50:30 +01:00
										 |  |  |       __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object")" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |       if [ ! -f "${__cdist_cur_object_dir}/$__cdist_name_object_finished" ]; then | 
					
						
							| 
									
										
										
										
											2011-02-25 01:22:40 +01:00
										 |  |  |          echo "Checking manifest for ${__cdist_object} ..." | 
					
						
							| 
									
										
										
										
											2011-02-07 18:34:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-23 09:50:30 +01:00
										 |  |  |          __cdist_type="$(__cdist_type_from_object "$__cdist_object")" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |          __cdist_manifest="$__cdist_type_dir/${__cdist_type}/${__cdist_name_manifest}" | 
					
						
							| 
									
										
										
										
											2011-02-07 18:34:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 14:47:52 +01:00
										 |  |  |          # Make __cdist_manifest available for cdist-type-emulator | 
					
						
							|  |  |  |          export __cdist_manifest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |          if [ -x "${__cdist_manifest}" ]; then | 
					
						
							|  |  |  |             echo "Executing manifest ${__cdist_manifest} ..." | 
					
						
							| 
									
										
										
										
											2011-02-22 11:54:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 15:34:17 +01:00
										 |  |  |             # Make variables available to non-core | 
					
						
							| 
									
										
										
										
											2011-02-24 15:40:34 +01:00
										 |  |  |             export $__cdist_name_var_object="$__cdist_cur_object_dir" | 
					
						
							|  |  |  |             export $__cdist_name_var_object_id="$__cdist_object_id" | 
					
						
							| 
									
										
										
										
											2011-02-25 18:42:38 +01:00
										 |  |  |             export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")" | 
					
						
							| 
									
										
										
										
											2011-02-24 15:34:17 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest" \ | 
					
						
							| 
									
										
										
										
											2011-02-24 15:43:53 +01:00
										 |  |  |                "$__cdist_new_objects_dir" | 
					
						
							| 
									
										
										
										
											2011-02-22 11:54:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |             __cdist_object_list "${__cdist_new_objects_dir}" > "$__cdist_new_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  |             # Verify no conflicting objects have been created | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |             while read __cdist_new_object; do | 
					
						
							|  |  |  |                grep -q "^$__cdist_new_object\$" "$__cdist_objects_list" && \ | 
					
						
							|  |  |  |                   __cdist_exit_err "${__cdist_manifest}: Tried to recreate ${__cdist_new_object}" | 
					
						
							|  |  |  |             done < "$__cdist_new_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-06 21:14:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  |             # Safe harbour: We can merge all objects into main tree | 
					
						
							| 
									
										
										
										
											2011-02-17 09:34:59 +01:00
										 |  |  |             # Merge = mkdir + mv parameters and source information | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |             while read __cdist_new_object; do | 
					
						
							|  |  |  |                 [ "$__cdist_new_objects_created" = "n" ] && __cdist_new_objects_created="y" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  |                 | 
					
						
							|  |  |  |                # where to save the newly created object | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |                __cdist_object_dir="$__cdist_object_base_dir/$__cdist_new_object" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                # Source of the new object | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |                __cdist_new_object_dir="${__cdist_new_objects_dir}/$__cdist_new_object" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |                mkdir -p "$__cdist_object_dir" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:47:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:28:35 +01:00
										 |  |  |                # Move parameters and source information | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |                mv "${__cdist_new_object_dir}/"* "$__cdist_object_dir" | 
					
						
							|  |  |  |                mv "${__cdist_new_object_dir}/${__cdist_name_object_source}" "$__cdist_object_dir" | 
					
						
							|  |  |  |             done < "$__cdist_new_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |             # Remove listing and objects, otherwise the next type will reuse it... | 
					
						
							|  |  |  |             rm -rf "$__cdist_new_objects_dir" "$__cdist_new_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |          else | 
					
						
							|  |  |  |             # Be nice, warn user if manifests exists, but is not executable | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |             if [ -f "${__cdist_manifest}" ]; then | 
					
						
							|  |  |  |                echo "Warning ${__cdist_manifest} exists, but is not executable." >&2 | 
					
						
							| 
									
										
										
										
											2011-02-06 16:04:28 +01:00
										 |  |  |             fi | 
					
						
							|  |  |  |          fi | 
					
						
							| 
									
										
										
										
											2011-02-06 15:52:28 +01:00
										 |  |  |       fi | 
					
						
							| 
									
										
										
										
											2011-02-05 19:49:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  |       # done with this object | 
					
						
							| 
									
										
										
										
											2011-02-17 09:44:36 +01:00
										 |  |  |       touch "$__cdist_cur_object_dir/$__cdist_name_object_finished" | 
					
						
							|  |  |  |    done < "$__cdist_objects_list" | 
					
						
							| 
									
										
										
										
											2011-02-17 09:23:38 +01:00
										 |  |  | done |