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