Signed-off-by: Nico Schottelius <nico@kr.ethz.ch>remotes/origin/1.0
parent
04dd1672b1
commit
1609e52873
@ -0,0 +1,127 @@ |
|||||||
|
#!/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. |
||||||
|
# |
||||||
|
# |
||||||
|
# |
||||||
|
|
||||||
|
. cdist-config |
||||||
|
|
||||||
|
if [ $# -ne 2 ]; then |
||||||
|
__cdist_usage "<target host> <object_dir>" |
||||||
|
fi |
||||||
|
|
||||||
|
set -eu |
||||||
|
|
||||||
|
__cdist_target_host="$1"; shift |
||||||
|
__cdist_object_dir="$1"; shift |
||||||
|
|
||||||
|
# change to directory containing objects |
||||||
|
cd "$__cdist_object_dir" |
||||||
|
|
||||||
|
# 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 |
||||||
|
|
||||||
|
# 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" |
||||||
|
|
||||||
|
# FIXME: DEBUG |
||||||
|
cat "$__cdist_tmp_file" |
||||||
|
|
||||||
|
while read object; do |
||||||
|
if [ ! -f "${object}/$__cdist_object_finished" ]; then |
||||||
|
echo "Working on object ${object} ..." |
||||||
|
|
||||||
|
type=${object%%/*} |
||||||
|
manifest="$__cdist_type_dir/${type}/${__cdist_name_init}" |
||||||
|
|
||||||
|
if [ -x "${manifest}" ]; then |
||||||
|
echo "Running manifest of type ${type} ..." |
||||||
|
|
||||||
|
# FIXME: use subdir in tmpdir? |
||||||
|
cdist-manifest-run "$__cdist_target_host" "${manifest}" "${__cdist_tmp_dir}" |
||||||
|
|
||||||
|
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 |
||||||
|
__cdist_exit_err "${newobject} already exists, merge failed." |
||||||
|
else |
||||||
|
# Fine, merge back! FIXME: touch correct here? |
||||||
|
touch "${newobject}/$__cdist_object_finished" |
||||||
|
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 |
||||||
|
|
||||||
|
|
||||||
|
# FIXME: continue here |
||||||
|
# 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 |
||||||
|
|
||||||
|
# - 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 |
||||||
|
fi |
||||||
|
done < "$__cdist_tmp_file" |
||||||
|
|
||||||
|
done |
||||||
|
|
||||||
|
exit 0 |
Loading…
Reference in new issue