diff --git a/bin/cdist-object-codegen-all b/bin/cdist-object-codegen-all new file mode 100755 index 00000000..99d86aec --- /dev/null +++ b/bin/cdist-object-codegen-all @@ -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 . +# +# +# 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 " " +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