diff --git a/BUG b/BUG
new file mode 100644
index 00000000..9d57ee49
--- /dev/null
+++ b/BUG
@@ -0,0 +1 @@
+See core/__cdist_object_run.
diff --git a/bin/cdist-config b/bin/cdist-config
index f7fb5ac0..b15d1f3e 100644
--- a/bin/cdist-config
+++ b/bin/cdist-config
@@ -19,7 +19,18 @@
#
#
-__cdist_version="1.7.0"
+__cdist_version="1.8.0"
+
+#
+# Enable debugging:
+#
+# __cdist_debug unset -> no debug
+# __cdist_debug = 1 -> debug via __cdist_echo
+# __cdist_debug = 2 -> debug via set -x
+#
+
+: ${__cdist_debug:=0}
+[ "$__cdist_debug" = 2 ] && set -x
# Fail if something bogus is going on
set -u
@@ -44,6 +55,7 @@ __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname"
: ${__cdist_name_cache:=cache}
: ${__cdist_name_code:=code}
: ${__cdist_name_conf_dir:=conf}
+: ${__cdist_name_core_dir:=core}
: ${__cdist_name_dot_cdist:=.cdist}
: ${__cdist_name_explorer:=explorer}
: ${__cdist_name_gencode:=gencode}
@@ -81,7 +93,7 @@ __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname"
################################################################################
-# Exported variable names (usable for non core
+# Exported variable names (usable for non core)
#
: ${__cdist_name_var_explorer:=__$__cdist_name_explorer}
: ${__cdist_name_var_type_explorer:=__$__cdist_name_type_explorer}
@@ -111,6 +123,7 @@ __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
: ${__cdist_local_base_cache_dir:=$__cdist_abs_mydir/../$__cdist_name_cache}
: ${__cdist_conf_dir:="$(cd "$__cdist_abs_mydir/../conf" && pwd -P)"}
+: ${__cdist_core_dir:="$(cd "$__cdist_abs_mydir/../$__cdist_name_core_dir" && pwd -P)"}
: ${__cdist_explorer_dir:=$__cdist_conf_dir/$__cdist_name_explorer}
: ${__cdist_manifest_dir:=$__cdist_conf_dir/$__cdist_name_manifest}
@@ -134,6 +147,7 @@ __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
: ${__cdist_remote_base_dir:=/var/lib/cdist}
: ${__cdist_remote_bin_dir:=$__cdist_remote_base_dir/$__cdist_name_bin}
: ${__cdist_remote_conf_dir:=$__cdist_remote_base_dir/$__cdist_name_conf_dir}
+: ${__cdist_remote_core_dir:=$__cdist_remote_base_dir/$__cdist_name_core_dir}
: ${__cdist_remote_explorer_dir:=$__cdist_remote_conf_dir/$__cdist_name_explorer}
: ${__cdist_remote_type_dir:=$__cdist_remote_conf_dir/$__cdist_name_type}
@@ -149,80 +163,13 @@ __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
################################################################################
# Internal functions
#
-__cdist_echo()
-{
- __cdist_echo_type="$1"; shift
- set +u
- if [ "$__cdist_object_self" ]; then
- __cdist_echo_prefix="${__cdist_object_self}:"
- else
- __cdist_echo_prefix="core: "
- fi
- set -u
+# *NEW* Load functions from library
+for __cdist_lib in $__cdist_core_dir/*; do
+ # echo Loading $__cdist_lib ...
+ . "$__cdist_lib"
+done
- case "$__cdist_echo_type" in
- debug)
- set +u
- if [ "$__cdist_debug" ]; then
- echo $__cdist_echo_prefix "Debug: $@"
- fi
- set -u
- ;;
- info)
- echo $__cdist_echo_prefix "$@"
- ;;
- warn)
- echo $__cdist_echo_prefix "Warning: $@"
- ;;
- error)
- echo $__cdist_echo_prefix "Error: $@" >&2
- ;;
- *)
- echo "CORE BUG, who created the broken commit in $0?" >&2
- exit 23
- ;;
- esac
-}
-
-__cdist_exec_fail_on_error()
-{
- set +e
- sh -e "$@"
- if [ "$?" -ne 0 ]; then
- __cdist_echo error "$1 exited non-zero"
- __cdist_echo warn "Faulty code:"
- cat "$1"
- __cdist_exit_err "Aborting due to non-zero exit code."
- fi
-}
-
-__cdist_exit_err()
-{
- __cdist_echo error "$@"
- exit 1
-}
-
-__cdist_usage()
-{
- __cdist_exit_err "$__cdist_myname: $@"
-}
-
-__cdist_init_deploy()
-{
- __cdist_echo info "Creating clean directory structure "
-
- # Ensure there is no old stuff, neither local nor remote
- rm -rf "$__cdist_local_base_dir"
- ssh "${__cdist_remote_user}@$1" "rm -rf ${__cdist_remote_base_dir}"
-
- # Init base
- mkdir -p "$__cdist_local_base_dir"
- ssh "${__cdist_remote_user}@$1" "mkdir -p ${__cdist_remote_base_dir}"
-
- # Link configuration source directory - consistent with remote
- ln -sf "$__cdist_conf_dir" "$__cdist_local_base_dir/$__cdist_name_conf_dir"
-}
################################################################################
# Cache
@@ -266,26 +213,11 @@ __cdist_object_base_dir()
echo "${__cdist_out_object_dir}/$1"
}
-
__cdist_object_id_from_object()
{
echo "${1#*/}"
}
-# Find objects, remove ./ and /MARKER
-__cdist_object_list()
-{
- local basedir="$1"; shift
-
- # Use subshell to prevent changing cwd in program
- (
- cd "${basedir}"
-
- find . -name "$__cdist_name_dot_cdist" | \
- sed -e 's;^./;;' -e "s;/${__cdist_name_dot_cdist}\$;;"
- )
-}
-
__cdist_object_parameter_dir()
{
echo "$(__cdist_object_dir "$1")/${__cdist_name_parameter}"
@@ -330,6 +262,13 @@ __cdist_remote_object_dir()
echo "$(__cdist_remote_object_base_dir "$1")/${__cdist_name_dot_cdist}"
}
+__cdist_remote_object_code()
+{
+ # FIXME: this should probably be __cdist_name_CODE_remote instead, although
+ # they have the same name always
+ echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_code}-${__cdist_name_gencode_remote}"
+}
+
__cdist_remote_object_parameter_dir()
{
echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_parameter}"
@@ -350,19 +289,6 @@ __cdist_remote_type_explorer_dir()
################################################################################
# Traps
#
-__cdist_tmp_removal()
-{
- rm -rf "${__cdist_tmp_dir}"
-}
-
-# Does not work in children, will be called again in every script!
-# Use only in interactive "front end" scripts
-__cdist_kill_on_interrupt()
-{
- __cdist_tmp_removal
- kill 0
- exit 1
-}
# Remove tempfiles at normal exit
trap __cdist_tmp_removal EXIT
@@ -386,15 +312,6 @@ __cdist_type_from_object()
echo "${1%%/*}"
}
-__cdist_type_has_explorer()
-{
- # We only create output, if there's at least one explorer
- # and can thus be used as a boolean ;-)
- if [ -d "$(__cdist_type_explorer_dir "$1")" ]; then
- ls -1 "$(__cdist_type_explorer_dir "$1")"
- fi
-}
-
__cdist_type_explorer_pushed()
{
[ -f "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" ] \
diff --git a/bin/cdist-deploy-to b/bin/cdist-deploy-to
index bf5614bc..49c8a6fc 100755
--- a/bin/cdist-deploy-to
+++ b/bin/cdist-deploy-to
@@ -36,6 +36,7 @@ export $__cdist_name_var_target_user="$__cdist_remote_user"
# Export variables for core, which others do not reset
export __cdist_local_base_dir
+export __cdist_core_dir
__cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host "
@@ -47,13 +48,16 @@ __cdist_echo info "cdist $__cdist_version: Configuring $__cdist_target_host "
__cdist_init_deploy "$__cdist_target_host"
# Transfer cdist executables
-__cdist_echo info "Transferring cdist binaries to the target host "
-cdist-dir push "$__cdist_target_host" \
- "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}"
-cdist-explorer-run-global "$__cdist_target_host"
-cdist-manifest-run-init "$__cdist_target_host"
-cdist-object-all "$__cdist_target_host" cdist-object-prepare
-cdist-object-all "$__cdist_target_host" cdist-object-run
-cdist-cache "$__cdist_target_host"
+__cdist_echo info "Transferring cdist binaries/functions to the target host "
+__cdist_dir push "${__cdist_abs_mydir}" "${__cdist_remote_bin_dir}"
+__cdist_dir push "${__cdist_core_dir}" "${__cdist_remote_core_dir}"
+
+__cdist_explorer_run_global
+__cdist_manifest_run_init
+__cdist_object_all __cdist_object_prepare
+__cdist_object_all __cdist_object_run
+unset __cdist_object_self
+
+__cdist_cache
__cdist_echo info "cdist $__cdist_version: Successfully finished run"
diff --git a/bin/cdist-explorer-run-global b/bin/cdist-explorer-run-global
deleted file mode 100755
index b0c024f2..00000000
--- a/bin/cdist-explorer-run-global
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-#
-# 2010-2011 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 .
-#
-#
-# Copy & run the global explorers, i.e. not bound to types
-#
-
-. cdist-config
-[ $# -eq 1 ] || __cdist_usage ""
-set -ue
-
-__cdist_target_host="$1"; shift
-
-__cdist_echo info "Running global explorers "
-
-# copy the explorers
-cdist-dir push "$__cdist_target_host" \
- "${__cdist_explorer_dir}" "${__cdist_remote_explorer_dir}"
-
-# run the initial explorers remotely
-cdist-run-remote "${__cdist_target_host}" cdist-remote-explorer-run \
- "$__cdist_name_var_explorer" "$__cdist_remote_explorer_dir" \
- "$__cdist_remote_out_explorer_dir"
-
-# retrieve the results
-cdist-dir pull "$__cdist_target_host" \
- "${__cdist_remote_out_explorer_dir}" "${__cdist_out_explorer_dir}"
diff --git a/bin/cdist-manifest-run b/bin/cdist-manifest-run
deleted file mode 100755
index d4ea18bb..00000000
--- a/bin/cdist-manifest-run
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/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 .
-#
-#
-# Let's build a cconfig tree from a configuration
-# And save it into the cache tree
-#
-
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -u
-
-__cdist_target_host="$1"; shift
-__cdist_manifest="$1"; shift
-
-################################################################################
-# Export information for cdist-type-emulator or manifest
-#
-
-# Config dir should not get reset - FIXME: why did I do this?
-export __cdist_conf_dir
-
-# Used to record the source in the object
-export __cdist_manifest
-
-# Export information for manifests - __cdist_out_dir comes from cdist-config
-export __global="$__cdist_out_dir"
-
-################################################################################
-# The actual run
-#
-
-# Ensure binaries exist and are up-to-date
-cdist-type-build-emulation "${__cdist_out_type_bin_dir}" \
- || __cdist_exit_err "Failed to build type emulation binaries"
-
-# prepend our path, so all cdist tools come before other tools
-export PATH="${__cdist_out_type_bin_dir}:$PATH"
-
-__cdist_exec_fail_on_error "${__cdist_manifest}"
diff --git a/bin/cdist-object-all b/bin/cdist-object-all
deleted file mode 100755
index 391c9cc7..00000000
--- a/bin/cdist-object-all
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/sh
-#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
-#
-# 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 .
-#
-#
-# Run the given command for each created object.
-#
-
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
-
-__cdist_target_host="$1"; shift
-__cdist_command="$1"; shift
-
-__cdist_objects="$__cdist_tmp_dir/objects"
-
-# Ensure object dir exists, so marker can be created
-mkdir -p "${__cdist_out_object_dir}"
-
-# Loop until we do not create new objects anymore
-# which is equal to all objects have been run
-touch "$__cdist_objects_created"
-while [ -f "$__cdist_objects_created" ]; do
- # Assume we're done after this run
- rm "$__cdist_objects_created"
-
- # Get listing of objects
- __cdist_object_list "$__cdist_out_object_dir" > "$__cdist_objects"
-
- # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP
- while read __cdist_object; do
- set -- "$@" "$__cdist_object"
- done < "$__cdist_objects"
-
- while [ $# -gt 0 ]; do
- __cdist_object="$1"; shift
- $__cdist_command "$__cdist_target_host" "$__cdist_object"
- done
-done
diff --git a/bin/cdist-object-explorer-run b/bin/cdist-object-explorer-run
deleted file mode 100755
index b65c5cc1..00000000
--- a/bin/cdist-object-explorer-run
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
-#
-# 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 .
-#
-#
-# Run the explorers for the given object on the target host.
-#
-
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
-
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-
-__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
-__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
-
-# Check if type of object has >= 1 explorer
-__cdist_has_explorer="$(__cdist_type_has_explorer "$__cdist_type")"
-# Run the type explorers for the current object if any
-if [ "$__cdist_has_explorer" ]; then
- if ! __cdist_type_explorer_pushed "$__cdist_type"; then
- src_dir="$(__cdist_type_explorer_dir "$__cdist_type")"
- dst_dir="$(__cdist_remote_type_explorer_dir "$__cdist_type")"
- __cdist_echo info "Transfering explorers for $__cdist_type "
- cdist-dir push "$__cdist_target_host" "$src_dir" "$dst_dir"
- __cdist_type_explorer_pushed_add "$__cdist_type"
- fi
-
- __cdist_echo info "Running explorers"
- # Copy object parameters
- cdist-dir push "$__cdist_target_host" \
- "$(__cdist_object_parameter_dir "$__cdist_object_self")" \
- "$(__cdist_remote_object_parameter_dir "$__cdist_object_self")"
-
- # Execute explorers
- cdist-run-remote "$__cdist_target_host" \
- "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\"" \
- "$__cdist_name_var_object_id=\"$__cdist_object_id\"" \
- "$__cdist_name_var_self=\"$__cdist_object_self\"" \
- cdist-remote-explorer-run \
- "$__cdist_name_var_type_explorer" \
- "$(__cdist_remote_type_explorer_dir "$__cdist_type")" \
- "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")"
-
- # Copy back results
- cdist-dir pull "$__cdist_target_host" \
- "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" \
- "$(__cdist_object_type_explorer_dir "$__cdist_object_self")"
-fi
diff --git a/bin/cdist-object-gencode b/bin/cdist-object-gencode
deleted file mode 100755
index e21568a3..00000000
--- a/bin/cdist-object-gencode
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# 2011 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 .
-#
-#
-# Generate code from one object (object must be relative path!)
-# WARNING: OUTPUT ON STDOUT, ERRORS NEED TO BE ON STDERR!
-#
-
-. cdist-config
-[ $# -eq 3 ] || __cdist_usage "" "" ""
-set -eu
-
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-__cdist_gencode_type="$1"; shift
-
-__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
-__cdist_type_gencode="$(__cdist_type_gencode "$__cdist_type" "$__cdist_gencode_type")"
-__cdist_code_output="$(__cdist_object_code "$__cdist_object_self" "$__cdist_gencode_type")"
-
-# export variables for the gencode script
-export __object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
-export __object="$(__cdist_object_dir "$__cdist_object_self")"
-export __global="$__cdist_out_dir"
-
-if [ -x "$__cdist_type_gencode" ]; then
- __cdist_exec_fail_on_error "$__cdist_type_gencode" > "$__cdist_tmp_file"
-else
- if [ -e "$__cdist_type_gencode" ]; then
- __cdist_exit_err "$__cdist_type_gencode exists, but is not executable"
- fi
-
- # Ensure it's empty, if there is no gencode
- : > "$__cdist_tmp_file"
-fi
-
-# Only create code, if gencode created output
-if [ "$(wc -l < "$__cdist_tmp_file")" -gt 0 ]; then
- cat - "$__cdist_tmp_file" << eof > "$__cdist_code_output"
-#
-# The following code was generated by $__cdist_type_gencode
-#
-
-eof
- chmod u+x "${__cdist_code_output}"
-fi
diff --git a/bin/cdist-object-manifest-run b/bin/cdist-object-manifest-run
deleted file mode 100755
index 34d4f867..00000000
--- a/bin/cdist-object-manifest-run
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-#
-# 2010 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
-#
-# 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 .
-#
-#
-# Run the manifest for the given object.
-#
-
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
-
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-
-# FIXME: rename to __cdist_object_dir (everywhere!)
-__cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
-__cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
-
-__cdist_echo info "Checking manifest "
-
-__cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
-__cdist_manifest="$(__cdist_type_manifest "$__cdist_type")"
-
-if [ -f "$__cdist_manifest" ]; then
- if [ -x "$__cdist_manifest" ]; then
- # Make __cdist_manifest available for cdist-type-emulator
- export __cdist_manifest
-
- __cdist_echo info "Executing manifest "
- export $__cdist_name_var_object="$__cdist_cur_object_dir"
- export $__cdist_name_var_object_id="$__cdist_object_id"
- export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")"
-
- cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest"
-
- # Tell cdist-object-run-all that there may be new objects
- touch "$__cdist_objects_created"
- else
- __cdist_exit_err "${__cdist_manifest} needs to be executable."
- fi
-fi
diff --git a/bin/cdist-object-run b/bin/cdist-object-run
deleted file mode 100755
index 4f40e7c1..00000000
--- a/bin/cdist-object-run
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/sh
-#
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
-#
-# 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 the given object:
-# - run type explorers
-# - run type manifest
-# - generate code
-# - copy object to target
-# - execute code on target
-#
-
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
-
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-__cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
-[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined"
-
-# Export to non-core for use in manifest and gencode scripts
-export $__cdist_name_var_self=$__cdist_object_self
-
-__cdist_object_finished="$(__cdist_object_finished "$__cdist_object_self")"
-if [ ! -f "$__cdist_object_finished" ]; then
- # Resolve dependencies, if any
- __cdist_object_require="$(__cdist_object_require "$__cdist_object_self")"
- if [ -f "$__cdist_object_require" ]; then
- # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP
- while read __cdist_requirement; do
- set -- "$@" "$__cdist_requirement"
- done < "$__cdist_object_require"
-
- while [ $# -gt 0 ]; do
- __cdist_requirement="$1"; shift
- __cdist_echo info "Resolving requirement $__cdist_requirement"
- cdist-object-run "$__cdist_target_host" "$__cdist_requirement"
- done
- fi
-
- cdist-object-gencode-run "$__cdist_target_host" "$__cdist_object_self"
- cdist-object-push "$__cdist_target_host" "$__cdist_object_self"
- cdist-object-code-run "$__cdist_target_host" "$__cdist_object_self"
-
- # Mark this object as done
- touch "$__cdist_object_finished"
-fi
diff --git a/bin/cdist-remote-explorer-run b/bin/cdist-remote-explorer-run
deleted file mode 100755
index d95913ba..00000000
--- a/bin/cdist-remote-explorer-run
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/sh
-#
-# 2011 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 .
-#
-#
-# This binary is executed on the remote side to execute explorers
-#
-# It supports different variables names to be used, so __explorers
-# and __type_explorers can be submitted :-)
-#
-
-. cdist-config
-[ $# -eq 3 ] || __cdist_usage " "
-set -ue
-
-# Variable that defines the home of the explorers
-__cdist_variable_name="$1"; shift
-
-# Find explorers here
-__cdist_explorer_dir="$1"; shift
-
-# Write output here
-__cdist_my_out_dir="$1"; shift
-
-# Setup environment
-export $__cdist_variable_name="$__cdist_explorer_dir"
-export __global="$__cdist_remote_out_dir"
-
-mkdir -p "$__cdist_my_out_dir"
-
-# Ensure there is at least one explorer
-num="$(ls -1 "$__cdist_explorer_dir" | wc -l)"
-if [ "$num" -lt 1 ]; then
- __cdist_exit_err "${__cdist_explorer_dir}: Contains no explorers"
-fi
-
-# Execute all explorers
-for explorer in "$__cdist_explorer_dir/"*; do
- explorer_name="${explorer##*/}"
-
- if [ -f "$explorer" ]; then
- if [ ! -x "$explorer" ]; then
- __cdist_exit_err "Explorer \"$explorer\" exists, but is not executable."
- fi
-
- # Execute explorers and save results in remote destination directory
- "$explorer" > "${__cdist_my_out_dir}/$explorer_name"
- else
- if [ -e "$explorer" ]; then
- __cdist_exit_err "Explorer \"$explorer\" exists, but is not a file."
- fi
- fi
-done
diff --git a/bin/cdist-object-push b/core/__cdist_cache
similarity index 62%
rename from bin/cdist-object-push
rename to core/__cdist_cache
index 62b00cb2..95764d3d 100755
--- a/bin/cdist-object-push
+++ b/core/__cdist_cache
@@ -1,7 +1,6 @@
#!/bin/sh
#
# 2010 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
@@ -19,17 +18,17 @@
# along with cdist. If not, see .
#
#
-# Transfer the given object to the target host.
+# Save the configuration tree into the local cache
#
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
+__cdist_cache()
+{
+ # Create base to move into
+ mkdir -p "${__cdist_local_base_cache_dir}"
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-
-__cdist_echo info "Transferring object"
-cdist-dir push "$__cdist_target_host" \
- "$(__cdist_object_dir "$__cdist_object_self")" \
- "$(__cdist_remote_object_dir "$__cdist_object_self")"
+ __cdist_echo info \
+ "Caching to $(__cdist_host_cache_dir "$__cdist_target_host")"
+ rm -rf "$(__cdist_host_cache_dir "$__cdist_target_host")"
+ mv "$__cdist_local_base_dir" \
+ "$(__cdist_host_cache_dir "$__cdist_target_host")"
+}
diff --git a/bin/cdist-dir b/core/__cdist_dir
similarity index 50%
rename from bin/cdist-dir
rename to core/__cdist_dir
index 0d30e14a..32ee0075 100755
--- a/bin/cdist-dir
+++ b/core/__cdist_dir
@@ -23,29 +23,24 @@
# Pull a directory from a target, both sides have the same name (i.e. explorers)
#
+__cdist_dir()
+{
+ [ $# -eq 3 ] || __cdist_usage " "
-. cdist-config
-[ $# -eq 4 ] || __cdist_usage " "
-set -ue
+ # ${3%/*} will be the destination directory, so no subdirectories
+ # of the same name are created, if the directory is already existing
-__cdist_action="$1"; shift
-__cdist_target_host="$1"; shift
-__cdist_src_dir="$1"; shift
-__cdist_dst_dir="$1"; shift
-
-# This will be the destination directory, so no subdirectories
-# of the same name are created, if the directory is already existing
-__cdist_top_dir="${__cdist_dst_dir%/*}"
-
-if [ "$__cdist_action" = "push" ]; then
- ssh "${__cdist_remote_user}@${__cdist_target_host}" \
- "mkdir -p \"${__cdist_dst_dir}\""
- scp -qr "$__cdist_src_dir" \
- "${__cdist_remote_user}@${__cdist_target_host}:${__cdist_top_dir}"
-elif [ "$__cdist_action" = "pull" ]; then
- mkdir -p "${__cdist_dst_dir}"
- scp -qr "${__cdist_remote_user}@${__cdist_target_host}:${__cdist_src_dir}" \
- "${__cdist_top_dir}"
-else
- __cdist_exit_err "Unknown action $__cdist_action"
-fi
+ if [ "$1" = "push" ]; then
+ # FIXME: add error handling with __cdist_run_remote_... or so
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "mkdir -p \"$3\""
+ scp -qr "$2" \
+ "${__cdist_remote_user}@${__cdist_target_host}:${3%/*}"
+ elif [ "$1" = "pull" ]; then
+ mkdir -p "$3"
+ scp -qr "${__cdist_remote_user}@${__cdist_target_host}:$2" \
+ "${3%/*}"
+ else
+ __cdist_exit_err "Unknown action $1"
+ fi
+}
diff --git a/core/__cdist_dir_listing b/core/__cdist_dir_listing
new file mode 100755
index 00000000..f4aa2320
--- /dev/null
+++ b/core/__cdist_dir_listing
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# List files in a directory, if it exists
+#
+# We only create output, if there's at least one entry
+# and can thus be used as a boolean ;-)
+#
+
+__cdist_dir_listing()
+{
+ [ -d "$1" ] && ls -1 "$1"
+}
diff --git a/bin/cdist-code-run b/core/__cdist_echo
similarity index 50%
rename from bin/cdist-code-run
rename to core/__cdist_echo
index 3d7499bf..a89d1821 100755
--- a/bin/cdist-code-run
+++ b/core/__cdist_echo
@@ -18,33 +18,39 @@
# along with cdist. If not, see .
#
#
-# This binary is executed on the remote side to execute code
-#
+# echo / syslog alike function
+#
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -ue
+__cdist_echo()
+{
+ __cdist_echo_type="$1"; shift
-__cdist_object_self="$1"; shift
-__cdist_code_type="$1"; shift
-
-if [ ! -d "$(__cdist_object_dir "$__cdist_object_self")" ]; then
- __cdist_exit_err "Object undefined"
-fi
-
-__cdist_code="$(__cdist_object_code "$__cdist_object_self" "${__cdist_code_type}")"
-
-__cdist_echo info "Checking code-${__cdist_code_type}"
-
-if [ -e "$__cdist_code" ]; then
- if [ -f "$__cdist_code" ]; then
- if [ -x "$__cdist_code" ]; then
- __cdist_echo info "Executing code-${__cdist_code_type}"
- __cdist_exec_fail_on_error "$__cdist_code"
- else
- __cdist_exit_err "$__cdist_code exists, but is not executable."
- fi
+ set +u
+ if [ "$__cdist_object_self" ]; then
+ __cdist_echo_prefix="${__cdist_object_self}:"
else
- __cdist_exit_err "$__cdist_code exists, but is not a file."
+ __cdist_echo_prefix="core: "
fi
-fi
+ set -u
+
+ case "$__cdist_echo_type" in
+ debug)
+ if [ "$__cdist_debug" = 1 ]; then
+ echo $__cdist_echo_prefix "DEBUG: $@"
+ fi
+ ;;
+ info)
+ echo $__cdist_echo_prefix "$@"
+ ;;
+ warn)
+ echo $__cdist_echo_prefix "Warning: $@"
+ ;;
+ error)
+ echo $__cdist_echo_prefix "Error: $@" >&2
+ ;;
+ *)
+ echo "CORE BUG, who created the broken commit in $0?" >&2
+ exit 23
+ ;;
+ esac
+}
diff --git a/core/__cdist_exit_err b/core/__cdist_exit_err
new file mode 100755
index 00000000..303dbf20
--- /dev/null
+++ b/core/__cdist_exit_err
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Print error and exit (perror() alike)
+#
+
+__cdist_exit_err()
+{
+ __cdist_echo error "$@"
+ exit 1
+}
diff --git a/core/__cdist_explorer_run b/core/__cdist_explorer_run
new file mode 100755
index 00000000..9e58fa09
--- /dev/null
+++ b/core/__cdist_explorer_run
@@ -0,0 +1,79 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Run explorers - FIXME: this function is ugly
+#
+
+__cdist_explorer_run()
+{
+ [ $# -eq 5 ] || __cdist_usage " "
+
+ # Ensure there is at least one explorer
+ num="$(ls -1 "$__cdist_explorer_dir" | wc -l)"
+ if [ "$num" -lt 1 ]; then
+ __cdist_exit_err "${__cdist_explorer_dir}: Contains no explorers"
+ fi
+
+ # Check whether to setup variable for type explorer
+ case "$1" in
+ global)
+ ;;
+ type)
+ # FIXME: think about how and where this gets setup!
+ "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\""
+ ;;
+ esac
+
+ # Transfer explorers
+ __cdist_dir push "$2" "$3"
+
+ # Create output directory
+ __cdist_run_remote mkdir -p "$4"
+
+ # Execute all explorers - FIXME: isolate cd call?
+ cd "$2";
+ # FIXME: cleanup double variable, no need when in directory
+ for __cdist_explorer_run_explorer in *; do
+ __cdist_explorer_explorer_name="${__cdist_explorer_run_explorer##*/}"
+
+ if [ -f "$__cdist_explorer_run_explorer" ]; then
+ if [ ! -x "$__cdist_explorer_run_explorer" ]; then
+ __cdist_exit_err "Explorer \"$__cdist_explorer_run_explorer\" exists, but is not executable."
+ fi
+
+ else
+ if [ -e "$__cdist_explorer_run_explorer" ]; then
+ __cdist_exit_err "Explorer \"$__cdist_explorer_run_explorer\" exists, but is not a file."
+ fi
+ fi
+
+ # FIXME: no need for remote out dir probably?
+ # or should we leave it and continue using __cdist_dir pull?
+ __cdist_run_remote \
+ "export $__cdist_name_var_explorer=\"$__cdist_remote_explorer_dir\";" \
+ "export $__cdist_name_var_global=\"$__cdist_remote_out_dir\";" \
+ "$3/$__cdist_explorer_run_explorer" ">" \
+ "$4/$__cdist_explorer_run_explorer" || \
+ __cdist_exit_err "Explorer $__cdist_explorer_run_explorer failed."
+ done
+
+ # Transfer results back
+ __cdist_dir pull "$4" "$5"
+}
diff --git a/bin/cdist-object-code-run b/core/__cdist_explorer_run_global
similarity index 58%
rename from bin/cdist-object-code-run
rename to core/__cdist_explorer_run_global
index fa63aaba..27359713 100755
--- a/bin/cdist-object-code-run
+++ b/core/__cdist_explorer_run_global
@@ -1,7 +1,6 @@
#!/bin/sh
#
# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
-# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
#
# This file is part of cdist.
#
@@ -19,20 +18,15 @@
# along with cdist. If not, see .
#
#
-# Exec the code for the given object locally and remote
+# Copy & run the global explorers, i.e. not bound to types
#
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -e
+__cdist_explorer_run_global()
+{
+ __cdist_echo info "Running global explorers "
-__cdist_target_host="$1"; shift
-__cdist_object="$1"; shift
-
-# Code local
-export __cdist_out_object_dir="$__cdist_out_object_dir"
-cdist-code-run "$__cdist_object" "${__cdist_name_gencode_local}"
-
-# Code remote
-cdist-run-remote "$__cdist_target_host" \
- "cdist-code-run" "$__cdist_object" "${__cdist_name_gencode_remote}"
+ # run the global explorers remotely
+ __cdist_explorer_run global \
+ "$__cdist_explorer_dir" "$__cdist_remote_explorer_dir" \
+ "$__cdist_remote_out_explorer_dir" "$__cdist_out_explorer_dir"
+}
diff --git a/core/__cdist_init_deploy b/core/__cdist_init_deploy
new file mode 100755
index 00000000..4ac3168c
--- /dev/null
+++ b/core/__cdist_init_deploy
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Prepare deployment
+#
+
+__cdist_init_deploy()
+{
+ __cdist_echo info "Creating clean directory structure "
+
+ # Ensure there is no old stuff, neither local nor remote
+ rm -rf "$__cdist_local_base_dir"
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "rm -rf ${__cdist_remote_base_dir}"
+
+ # Init base
+ mkdir -p "$__cdist_local_base_dir"
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "mkdir -p ${__cdist_remote_base_dir}"
+
+ # Link configuration source directory - consistent with remote
+ ln -sf "$__cdist_conf_dir" "$__cdist_local_base_dir/$__cdist_name_conf_dir"
+}
diff --git a/core/__cdist_is_executable b/core/__cdist_is_executable
new file mode 100755
index 00000000..a7a6d174
--- /dev/null
+++ b/core/__cdist_is_executable
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Test whether something is executable (that should be executable) or
+# is missing
+#
+
+__cdist_is_executable()
+{
+ [ $# -eq 1 ] || __cdist_exit_err ""
+
+ if [ -e "$1" ]; then
+ if [ -f "$1" ]; then
+ if [ -x "$1" ]; then
+ # Exists and is a correct executable
+ true
+ else
+ __cdist_exit_err "$1 exists, but is not executable."
+ fi
+ else
+ __cdist_exit_err "$1 exists, but is not a file."
+ fi
+ else
+ # Does not exist
+ false
+ fi
+}
diff --git a/core/__cdist_kill_on_interrupt b/core/__cdist_kill_on_interrupt
new file mode 100644
index 00000000..7cb711fa
--- /dev/null
+++ b/core/__cdist_kill_on_interrupt
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Run the given command for each created object.
+#
+
+# Does not work in children, will be called again in every script!
+# Use only in interactive "front end" scripts
+__cdist_kill_on_interrupt()
+{
+ __cdist_tmp_removal
+ kill 0
+ exit 1
+}
diff --git a/core/__cdist_manifest_run b/core/__cdist_manifest_run
new file mode 100755
index 00000000..cf85d646
--- /dev/null
+++ b/core/__cdist_manifest_run
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# 2010-2011 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 .
+#
+#
+# Let's build a cconfig tree from a configuration
+# And save it into the cache tree
+#
+
+__cdist_manifest_run()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_manifest="$1"; shift
+
+ ################################################################################
+ # Export information for cdist-type-emulator or manifest
+ #
+
+ # Config dir should not get reset - FIXME: why did I do this?
+ export __cdist_conf_dir
+
+ # Used to record the source in the object
+ export __cdist_manifest
+
+ # Export information for manifests - __cdist_out_dir comes from cdist-config
+ export $__cdist_name_var_global="$__cdist_out_dir"
+
+ ################################################################################
+ # The actual run
+ #
+
+ # Ensure binaries are existing - FIXME: move error handling into __cdist_type_build_emulation
+ __cdist_type_build_emulation \
+ || __cdist_exit_err "Failed to build type emulation binaries"
+
+ __cdist_run_shell "${__cdist_manifest}"
+}
diff --git a/bin/cdist-manifest-run-init b/core/__cdist_manifest_run_init
similarity index 72%
rename from bin/cdist-manifest-run-init
rename to core/__cdist_manifest_run_init
index 28acc623..e8fa63de 100755
--- a/bin/cdist-manifest-run-init
+++ b/core/__cdist_manifest_run_init
@@ -22,13 +22,11 @@
# And save it into the cache tree
#
-. cdist-config
-[ $# -eq 1 ] || __cdist_usage ""
-set -e
+__cdist_manifest_run_init()
+{
+ # FIXME: probably do not export but always set explicitly?
+ export $__cdist_name_var_manifest="$__cdist_manifest_dir"
-__cdist_target_host="$1"; shift
-
-eval export $__cdist_name_var_manifest=\"\$__cdist_manifest_dir\"
-
-__cdist_echo info "Running initial manifest for $__cdist_target_host "
-cdist-manifest-run "$__cdist_target_host" "$__cdist_manifest_init"
+ __cdist_echo info "Running initial manifest for $__cdist_target_host "
+ __cdist_manifest_run "$__cdist_manifest_init"
+}
diff --git a/core/__cdist_object_all b/core/__cdist_object_all
new file mode 100755
index 00000000..965d08f6
--- /dev/null
+++ b/core/__cdist_object_all
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Run the given command for each created object.
+#
+
+__cdist_object_all()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_object_all_object_all_command="$1"; shift
+
+ __cdist_object_all_object_all_objects="$__cdist_tmp_dir/objects"
+
+ # Ensure object dir exists, so marker can be created
+ mkdir -p "${__cdist_out_object_dir}"
+
+ # FIXME: : - why do we use a file?
+ # core/__cdist_object_manifest_run: touch "$__cdist_objects_created"
+
+ # Loop until we do not create new objects anymore
+ # which is equal to all objects have been run
+ touch "$__cdist_objects_created"
+ while [ -f "$__cdist_objects_created" ]; do
+ # Assume we're done after this run
+ rm "$__cdist_objects_created"
+
+ # Get listing of objects
+ __cdist_object_list "$__cdist_out_object_dir" > \
+ "$__cdist_object_all_object_all_objects"
+
+ # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP
+ while read __cdist_object_all_object; do
+ set -- "$@" "$__cdist_object_all_object"
+ done < "$__cdist_object_all_object_all_objects"
+
+ while [ $# -gt 0 ]; do
+ __cdist_object_all_object="$1"; shift
+ $__cdist_object_all_object_all_command "$__cdist_object_all_object"
+ done
+ done
+}
diff --git a/core/__cdist_object_code_run b/core/__cdist_object_code_run
new file mode 100755
index 00000000..8af67ab8
--- /dev/null
+++ b/core/__cdist_object_code_run
@@ -0,0 +1,54 @@
+#!/bin/sh
+#
+# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Exec the code for the given object locally and remote
+#
+
+__cdist_object_code_run()
+{
+ [ $# -eq 1 ] || __cdist_exit_err ""
+
+
+ if [ ! -d "$(__cdist_object_dir "$1")" ]; then
+ __cdist_exit_err "Object undefined"
+ fi
+
+ # Code local
+ export __cdist_out_object_dir="$__cdist_out_object_dir"
+ __cdist_echo debug "Trying to run local code"
+ if __cdist_is_executable \
+ "$(__cdist_object_code "$1" "${__cdist_name_gencode_local}")"; then
+ __cdist_run_shell \
+ "$(__cdist_object_code "$1" "${__cdist_name_gencode_local}")"
+ else
+ __cdist_echo debug "Local code: none"
+ fi
+
+ # Code remote
+ __cdist_echo debug "Trying to run remote code"
+ if __cdist_is_executable \
+ "$(__cdist_object_code "$1" "${__cdist_name_gencode_remote}")"; then
+
+ __cdist_run_remote $(__cdist_remote_object_code "$1")
+ else
+ __cdist_echo debug "Remote code: none"
+ fi
+}
diff --git a/core/__cdist_object_explorer_run b/core/__cdist_object_explorer_run
new file mode 100755
index 00000000..da59d6c3
--- /dev/null
+++ b/core/__cdist_object_explorer_run
@@ -0,0 +1,89 @@
+#!/bin/sh
+#
+# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Run the explorers for the given object on the target host.
+#
+
+# FIXME: many cleanups needed before going production!
+
+__cdist_object_explorer_run()
+{
+ __cdist_object_self="$1"; shift
+
+ __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
+ __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
+
+ # Check if type of object has >= 1 explorer
+ __cdist_has_explorer="$(__cdist_dir_listing "$(__cdist_type_explorer_dir "$__cdist_type")" | wc -l)"
+ # Run the type explorers for the current object if any
+ if [ "$__cdist_has_explorer" -ge 1 ]; then
+ if ! __cdist_type_explorer_pushed "$__cdist_type"; then
+ # FIXME: variables!
+ src_dir="$(__cdist_type_explorer_dir "$__cdist_type")"
+ dst_dir="$(__cdist_remote_type_explorer_dir "$__cdist_type")"
+ __cdist_echo info "Transfering explorers for $__cdist_type "
+ __cdist_dir push "$src_dir" "$dst_dir"
+ __cdist_type_explorer_pushed_add "$__cdist_type"
+ fi
+
+ __cdist_echo info "Running explorers"
+ # Copy object parameters
+ __cdist_dir push \
+ "$(__cdist_object_parameter_dir "$__cdist_object_self")" \
+ "$(__cdist_remote_object_parameter_dir "$__cdist_object_self")"
+
+ # Execute explorers
+ # FIXME: STOPPED:
+ # - remove cdist-remote-explorer-run
+ # - problem: new variables / need to run explorer directly?
+ # -> or put logic into __cdist_explorer_run
+ # -> think about having _one_ wrapper script for remote to execute
+ # shell functions
+
+ # Create remote output directory
+ __cdist_run_remote mkdir -p "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")"
+
+ cd "$(__cdist_type_explorer_dir "$__cdist_type")"
+
+
+ for __cdist_object_explorer_run_explorer in *; do
+ __cdist_run_remote \
+ "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\"" \
+ "$__cdist_name_var_object_id=\"$__cdist_object_id\"" \
+ "$__cdist_name_var_self=\"$__cdist_object_self\"" \
+ "$(__cdist_remote_type_explorer_dir "$__cdist_type")/$__cdist_object_explorer_run_explorer" \
+ ">" "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")/$__cdist_object_explorer_run_explorer"
+ done
+
+# __cdist_run_remote \
+# "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\"" \
+# "$__cdist_name_var_object_id=\"$__cdist_object_id\"" \
+# "$__cdist_name_var_self=\"$__cdist_object_self\"" \
+# cdist-remote-explorer-run \
+# "$__cdist_name_var_type_explorer" \
+# "$(__cdist_remote_type_explorer_dir "$__cdist_type")" \
+# "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")"
+
+ # Copy back results
+ __cdist_dir pull "$(__cdist_remote_object_type_explorer_dir "$__cdist_object_self")" \
+ "$(__cdist_object_type_explorer_dir "$__cdist_object_self")"
+ fi
+}
diff --git a/core/__cdist_object_gencode b/core/__cdist_object_gencode
new file mode 100755
index 00000000..08ef8b7d
--- /dev/null
+++ b/core/__cdist_object_gencode
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Generate code from one object (object must be relative path!)
+# WARNING: OUTPUT ON STDOUT, ERRORS NEED TO BE ON STDERR!
+#
+
+# FIXME: check variable names:
+# either prefix or use global or use functions directly
+# functions looks good, they are cheap anyway!
+
+__cdist_object_gencode()
+{
+ [ $# -eq 2 ] || __cdist_usage "" ""
+
+ __cdist_object_self="$1"; shift
+ __cdist_gencode_type="$1"; shift
+
+ __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
+ __cdist_type_gencode="$(__cdist_type_gencode "$__cdist_type" "$__cdist_gencode_type")"
+ __cdist_code_output="$(__cdist_object_code "$__cdist_object_self" "$__cdist_gencode_type")"
+
+ # export variables for the gencode script
+ export __object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
+ export __object="$(__cdist_object_dir "$__cdist_object_self")"
+ export __global="$__cdist_out_dir"
+
+ if [ -x "$__cdist_type_gencode" ]; then
+ __cdist_run_shell "$__cdist_type_gencode" > "$__cdist_tmp_file"
+ else
+ if [ -e "$__cdist_type_gencode" ]; then
+ __cdist_exit_err "$__cdist_type_gencode exists, but is not executable"
+ fi
+
+ # Ensure it's empty, if there is no gencode
+ : > "$__cdist_tmp_file"
+ fi
+
+ # Only create code, if gencode created output
+ if [ "$(wc -l < "$__cdist_tmp_file")" -gt 0 ]; then
+ cat - "$__cdist_tmp_file" << eof > "$__cdist_code_output"
+#
+# The following code was generated by $__cdist_type_gencode
+#
+
+eof
+ chmod u+x "${__cdist_code_output}"
+ fi
+}
diff --git a/bin/cdist-object-gencode-run b/core/__cdist_object_gencode_run
similarity index 68%
rename from bin/cdist-object-gencode-run
rename to core/__cdist_object_gencode_run
index 254ac1e4..308f5f33 100755
--- a/bin/cdist-object-gencode-run
+++ b/core/__cdist_object_gencode_run
@@ -22,17 +22,15 @@
# For the given object create the code to be executed on the target.
#
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
+__cdist_object_gencode_run()
+{
+ __cdist_object_gencode_run_object="$1"; shift
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
+ __cdist_echo info "Generating local code "
+ __cdist_object_gencode "$__cdist_object_gencode_run_object" \
+ "${__cdist_name_gencode_local}"
-__cdist_echo info "Generating local code "
-cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \
- "${__cdist_name_gencode_local}"
-
-__cdist_echo info "Generating remote code "
-cdist-object-gencode "$__cdist_target_host" "$__cdist_object_self" \
+ __cdist_echo info "Generating remote code "
+ __cdist_object_gencode "$__cdist_object_gencode_run_object" \
"${__cdist_name_gencode_remote}"
+}
diff --git a/core/__cdist_object_list b/core/__cdist_object_list
new file mode 100755
index 00000000..f2785c30
--- /dev/null
+++ b/core/__cdist_object_list
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Print error and exit (perror() alike)
+#
+
+__cdist_object_list()
+{
+ # FIXME: no local in posix
+ local basedir="$1"; shift
+
+ # Use subshell to prevent changing cwd in program
+ (
+ cd "${basedir}"
+
+ find . -name "$__cdist_name_dot_cdist" | \
+ sed -e 's;^./;;' -e "s;/${__cdist_name_dot_cdist}\$;;"
+ )
+}
diff --git a/core/__cdist_object_manifest_run b/core/__cdist_object_manifest_run
new file mode 100755
index 00000000..efc85539
--- /dev/null
+++ b/core/__cdist_object_manifest_run
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# 2010 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Run the manifest for the given object.
+#
+
+
+__cdist_object_manifest_run()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_object_self="$1"; shift
+
+ # FIXME: rename to __cdist_object_dir (everywhere!)
+ __cdist_cur_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
+ __cdist_object_id="$(__cdist_object_id_from_object "$__cdist_object_self")"
+
+ __cdist_echo info "Checking manifest "
+
+ __cdist_type="$(__cdist_type_from_object "$__cdist_object_self")"
+ __cdist_manifest="$(__cdist_type_manifest "$__cdist_type")"
+
+ if [ -f "$__cdist_manifest" ]; then
+ if [ -x "$__cdist_manifest" ]; then
+ # Make __cdist_manifest available for cdist-type-emulator
+ export __cdist_manifest
+
+ __cdist_echo info "Executing manifest "
+ export $__cdist_name_var_object="$__cdist_cur_object_dir"
+ export $__cdist_name_var_object_id="$__cdist_object_id"
+ export $__cdist_name_var_type="$(__cdist_type_dir "$__cdist_type")"
+
+ __cdist_manifest_run "$__cdist_manifest"
+
+ # Tell cdist-object-run-all that there may be new objects
+ touch "$__cdist_objects_created"
+ else
+ __cdist_exit_err "${__cdist_manifest} needs to be executable."
+ fi
+ fi
+}
diff --git a/bin/cdist-object-prepare b/core/__cdist_object_prepare
similarity index 52%
rename from bin/cdist-object-prepare
rename to core/__cdist_object_prepare
index d21d8a63..24039be0 100755
--- a/bin/cdist-object-prepare
+++ b/core/__cdist_object_prepare
@@ -24,24 +24,24 @@
# - run type manifest
#
-. cdist-config
-[ $# -eq 2 ] || __cdist_usage " "
-set -eu
+__cdist_object_prepare()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
-__cdist_target_host="$1"; shift
-__cdist_object_self="$1"; shift
-__cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
-[ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined"
+ __cdist_object_self="$1"; shift
+ __cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
+ [ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined"
-# Export to non-core for use in manifest and gencode scripts
-export $__cdist_name_var_self=$__cdist_object_self
+ # Export to non-core for use in manifest and gencode scripts
+ export $__cdist_name_var_self=$__cdist_object_self
-__cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object_self")"
-if [ ! -f "$__cdist_object_prepared" ]; then
- __cdist_echo info "Preparing object"
- cdist-object-explorer-run "$__cdist_target_host" "$__cdist_object_self"
- cdist-object-manifest-run "$__cdist_target_host" "$__cdist_object_self"
+ __cdist_object_prepared="$(__cdist_object_prepared "$__cdist_object_self")"
+ if [ ! -f "$__cdist_object_prepared" ]; then
+ __cdist_echo info "Preparing object"
+ __cdist_object_explorer_run "$__cdist_object_self"
+ __cdist_object_manifest_run "$__cdist_object_self"
- # Mark this object as prepared
- touch "$__cdist_object_prepared"
-fi
+ # Mark this object as prepared
+ touch "$__cdist_object_prepared"
+ fi
+}
diff --git a/core/__cdist_object_run b/core/__cdist_object_run
new file mode 100755
index 00000000..d2c7df6e
--- /dev/null
+++ b/core/__cdist_object_run
@@ -0,0 +1,74 @@
+#!/bin/sh
+#
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 the given object:
+# - run type explorers
+# - run type manifest
+# - generate code
+# - copy object to target
+# - execute code on target
+#
+
+__cdist_object_run()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_object_self="$1"; shift
+ __cdist_object_dir="$(__cdist_object_dir "$__cdist_object_self")"
+ [ -d "$__cdist_object_dir" ] || __cdist_exit_err "Object undefined"
+
+ # Export to non-core for use in manifest and gencode scripts
+ export $__cdist_name_var_self=$__cdist_object_self
+
+ # FIXME: BUG: should be named differently!
+ # FIXME: BUG: I can be called recursively! -> variables are probably already set / overwritten!
+ __cdist_object_finished="$(__cdist_object_finished "$__cdist_object_self")"
+ if [ ! -f "$__cdist_object_finished" ]; then
+ # Resolve dependencies, if any
+ __cdist_object_require="$(__cdist_object_require "$__cdist_object_self")"
+ if [ -f "$__cdist_object_require" ]; then
+ # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP
+ while read __cdist_requirement; do
+ set -- "$@" "$__cdist_requirement"
+ done < "$__cdist_object_require"
+
+ while [ $# -gt 0 ]; do
+ __cdist_requirement="$1"; shift
+ __cdist_echo info "Resolving requirement $__cdist_requirement"
+ # FIXME: BUG: at this point, the other __cdist_object_run may have
+ # overwritten all our variables!
+ __cdist_object_run "$__cdist_requirement"
+ done
+ fi
+
+ __cdist_echo debug "Before gencode"
+ __cdist_object_gencode_run "$__cdist_object_self"
+ __cdist_echo debug "Before push"
+ __cdist_dir push "$(__cdist_object_dir "$__cdist_object_self")" \
+ "$(__cdist_remote_object_dir "$__cdist_object_self")"
+ __cdist_echo debug "Before run"
+ __cdist_object_code_run "$__cdist_object_self"
+ __cdist_echo debug "Object run done"
+
+ # Mark this object as done
+ touch "$__cdist_object_finished"
+ fi
+}
diff --git a/core/__cdist_run b/core/__cdist_run
new file mode 100755
index 00000000..8febe550
--- /dev/null
+++ b/core/__cdist_run
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Exit if an error occurs running something
+#
+
+__cdist_run()
+{
+ "$@" || __cdist_echo error "$1 exited non-zero, aborting."
+}
diff --git a/bin/cdist-run-remote b/core/__cdist_run_remote
similarity index 70%
rename from bin/cdist-run-remote
rename to core/__cdist_run_remote
index 4a4452a2..17074049 100755
--- a/bin/cdist-run-remote
+++ b/core/__cdist_run_remote
@@ -21,13 +21,12 @@
# Run a cdist binary on the remote side
#
-. cdist-config
-[ $# -ge 2 ] || __cdist_usage " [opts]"
-set -ue
+__cdist_run_remote()
+{
+ [ $# -ge 1 ] || __cdist_usage " [opts]"
-__cdist_target_host="$1"; shift
-
-ssh "${__cdist_remote_user}@${__cdist_target_host}" \
- "export PATH=\"${__cdist_remote_bin_dir}:\$PATH\";" \
- "export __cdist_out_object_dir=\"$__cdist_remote_out_object_dir\";" \
- "$@"
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "export PATH=\"${__cdist_remote_bin_dir}:\$PATH\";" \
+ "export __cdist_out_object_dir=\"$__cdist_remote_out_object_dir\";" \
+ "$@"
+}
diff --git a/core/__cdist_run_shell b/core/__cdist_run_shell
new file mode 100755
index 00000000..b6e0a57d
--- /dev/null
+++ b/core/__cdist_run_shell
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Exit if an error occurs when running a shell script
+#
+
+__cdist_run_shell()
+{
+ # Prepend our path, so all cdist tools come before other tools
+ PATH="${__cdist_out_type_bin_dir}:$PATH" sh -e "$@"
+ if [ "$?" -ne 0 ]; then
+ __cdist_echo error "$1 exited non-zero"
+ __cdist_echo warn "Faulty code:"
+ cat "$1"
+ __cdist_exit_err "Aborting due to non-zero exit code."
+ fi
+}
diff --git a/core/__cdist_tmp_removal b/core/__cdist_tmp_removal
new file mode 100755
index 00000000..74d74936
--- /dev/null
+++ b/core/__cdist_tmp_removal
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Remove tmp dir
+#
+
+__cdist_tmp_removal()
+{
+ rm -rf "${__cdist_tmp_dir}"
+}
diff --git a/bin/cdist-type-build-emulation b/core/__cdist_type_build_emulation
similarity index 50%
rename from bin/cdist-type-build-emulation
rename to core/__cdist_type_build_emulation
index 51c2f5b4..3c7270ca 100755
--- a/bin/cdist-type-build-emulation
+++ b/core/__cdist_type_build_emulation
@@ -20,24 +20,30 @@
# Build pseudo binaries for type emulation
#
-. cdist-config
-[ $# -eq 1 ] || __cdist_usage ""
-set -eu
+__cdist_type_build_emulation()
+{
+ [ $# -eq 0 ] || __cdist_usage "No arguments"
-__cdist_output_dir="$1"; shift
+ [ -f "${__cdist_out_type_bin_dir}/.marker" ] && return 0
-__cdist_type_emulator="$__cdist_abs_mydir/cdist-type-emulator"
+ __cdist_type_emulator="$__cdist_abs_mydir/cdist-type-emulator"
-if [ ! -d "${__cdist_type_dir}" ]; then
- __cdist_exit_err "$__cdist_type_dir must exist and contain available types"
-fi
+ if [ ! -d "${__cdist_type_dir}" ]; then
+ __cdist_exit_err "$__cdist_type_dir must exist and contain available types"
+ fi
-# Get Types
-cd "${__cdist_type_dir}"
-ls -1 > "${__cdist_tmp_file}"
+ # Get Types
+ (
+ cd "${__cdist_type_dir}"
+ ls -1 > "${__cdist_tmp_file}"
+ )
-# Create binaries
-mkdir -p "${__cdist_output_dir}"
-while read type; do
- ln -sf "${__cdist_type_emulator}" "${__cdist_output_dir}/${type}"
-done < "${__cdist_tmp_file}"
+ # Create binaries
+ mkdir -p "${__cdist_out_type_bin_dir}"
+ while read __cdist_type_build_emulation_type; do
+ ln -sf "${__cdist_type_emulator}" \
+ "${__cdist_out_type_bin_dir}/${__cdist_type_build_emulation_type}"
+ done < "${__cdist_tmp_file}"
+
+ touch "${__cdist_out_type_bin_dir}/.marker"
+}
diff --git a/core/__cdist_usage b/core/__cdist_usage
new file mode 100755
index 00000000..9dfa30e4
--- /dev/null
+++ b/core/__cdist_usage
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Print error and exit (perror() alike)
+#
+
+__cdist_usage()
+{
+ __cdist_exit_err "$__cdist_myname: $@"
+}
diff --git a/doc/changelog b/doc/changelog
index 82ae4b95..a0d114a1 100644
--- a/doc/changelog
+++ b/doc/changelog
@@ -1,3 +1,7 @@
+1.8.0:
+ * Added debug (via __cdist_debug={1,2} environment variable)
+ * Transformed shell script based approach to shell functions (performance improvement)
+
1.7.1: 2011-07-26
* Documentation: Add explorers to reference
* Documentation: Typo cleanup (Derek Brost)
diff --git a/doc/dev/logs/2011-06-14.library_for_user b/doc/dev/logs/2011-06-14.library_for_user
index 325150e2..5c0eb6f0 100644
--- a/doc/dev/logs/2011-06-14.library_for_user
+++ b/doc/dev/logs/2011-06-14.library_for_user
@@ -17,3 +17,6 @@ run_code_from_user()
load_lib
. file_from_user
}
+
+Introduce global variables:
+ __cdist_target_host
diff --git a/doc/dev/logs/2011-06-14.timing b/doc/dev/logs/2011-06-14.timing
new file mode 100644
index 00000000..dcfd4884
--- /dev/null
+++ b/doc/dev/logs/2011-06-14.timing
@@ -0,0 +1,6 @@
+ikq04:
+
+cdist-deploy-to ikq04.ethz.ch 35.44s user 30.65s system 34% cpu 3:11.45 total # also migrate cdist-object-gencode
+cdist-deploy-to ikq04.ethz.ch 23.56s user 22.44s system 35% cpu 2:09.78 total # ../bin/cdist-object-all -> __cdist_object_all
+cdist-deploy-to ikq04.ethz.ch 17.35s user 16.83s system 30% cpu 1:53.69 total # bin/cdist-object-manifest-run -> core/__cdist_object_manifest_run
+cdist-deploy-to ikq04.ethz.ch 19.76s user 23.58s system 35% cpu 2:03.33 total # ../core/__cdist_manifest_run_init
diff --git a/doc/dev/logs/2011-06-17.design-ideas b/doc/dev/logs/2011-06-17.design-ideas
new file mode 100644
index 00000000..26845360
--- /dev/null
+++ b/doc/dev/logs/2011-06-17.design-ideas
@@ -0,0 +1,9 @@
+Should __run_remote be used or should the workflow more be
+"I'm working here, part of it is executed remote?"
+
+Indirect call to functions like __cdist_remote_explorer_run are
+partly hard to debug / think about.
+
+Setting up variables is needed for non-core (i.e. explorers)
+
+
diff --git a/doc/dev/logs/2011-06-21.execute_remote b/doc/dev/logs/2011-06-21.execute_remote
new file mode 100644
index 00000000..a9c88df2
--- /dev/null
+++ b/doc/dev/logs/2011-06-21.execute_remote
@@ -0,0 +1,61 @@
+Steven, Nico:
+
+Problem:
+ How to execute a function instead of binary
+
+Solutions:
+
+ 1)
+ (
+ cat $lib/*
+ cat bin/cdist-config
+ echo $function $args
+ ) | ssh foo
+
+ Works partly, does not work for export = ...
+ Needs to copy over lib every time again!
+
+ 2)
+ scp $dir/lib.sh root@foo:/tmp/lib.sh
+ cat << DONE | ssh root@foo sh
+ source /tmp/lib.sh
+ export foo=bla
+ function args
+ DONE
+
+ Caches lib directory
+
+ 3) follow up to 1)
+ __run_remote()
+ {
+ cat << eof | ssh foo
+
+ . /cdist-config
+ "$@" # NOT USABLE, no export = export = lines possible!
+
+ eof
+
+ 4) final solution
+ - write for every remote job a new function
+ - this functions prepares env + reuses ssh header
+
+ __cdist_remote_explorer()
+ {
+ cat << eof
+ $__cdist_remote_header
+ export foo1=bar
+ export foo2=bar
+ export foo3=bar
+
+ "$@"
+ eof | __cdist_ssh
+ }
+
+
+Problems found and solved:
+
+ - remote shell cannot work due to multi line variable export
+ - caching library directory with scp
+ - create function for every remote action
+ -> prepares environment
+
diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME
index abe98cb4..8670c8f1 100644
--- a/doc/dev/todo/TAKEME
+++ b/doc/dev/todo/TAKEME
@@ -5,6 +5,8 @@ Feel free to pick one!
CORE
----
+- Fix warnings / __cdist_usage in core/*
+ -> __cdist_usage prints $0! not function name!
- Inconsistent error messages if object is not existing!
-> always use "Object undefined"
- Add echo function / beautify output
diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext
index 28762ef4..cd4f8e70 100644
--- a/doc/dev/todo/niconext
+++ b/doc/dev/todo/niconext
@@ -1,7 +1,7 @@
-Catch broken instances in cdist-mass-deploy -p and report broken deployements at the end!
-
+BUG in core/__cdist_object_run: each recursive call overwrites the variables!
--------------------------------------------------------------------------------
+
Bug with requirements when indirect requires is scheduled late:
__package/collectd: Generating local code
@@ -24,3 +24,15 @@ __file/etc/collectd/collectd.conf: Warning: Faulty code:
scp /home/users/nico/oeffentlich/rechner/projekte/cdist-nutzung/conf/type/__ethz_collectd/files/collectd.conf.client root@shrek08:/etc/collectd/collectd.conf
__file/etc/collectd/collectd.conf: Error: Aborting due to non-zero exit code.
+--------------------------------------------------------------------------------
+
+Bad error reporting in functions:
+
+[15:15] ikn:cdist-nutzung% cdist-deploy-to ikn
+core: cdist 1.8.0: Configuring ikn
+core: Creating clean directory structure
+core: Transferring cdist binaries/functions to the target host
+core: Running global explorers
+core: Running initial manifest for ikn
+core: Error: cdist-deploy-to: No arguments
+
diff --git a/test/README b/test/README
new file mode 100644
index 00000000..ce5cde4d
--- /dev/null
+++ b/test/README
@@ -0,0 +1,4 @@
+This directory should contain unit tests.
+
+I have not yet searched (or found) a good way to implement this for cdist,
+feel free to take the hat.
diff --git a/bin/cdist-cache b/test/fail_if_explorer_fails.sh
similarity index 56%
rename from bin/cdist-cache
rename to test/fail_if_explorer_fails.sh
index ee27ffb4..3acfdbeb 100755
--- a/bin/cdist-cache
+++ b/test/fail_if_explorer_fails.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# 2010 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
#
# This file is part of cdist.
#
@@ -17,23 +17,9 @@
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see .
#
-#
-# Let's build a cconfig tree from a configuration
-# And save it into the cache tree
#
. cdist-config
-[ $# -eq 1 ] || __cdist_usage ""
-set -u
-__cdist_target_host="$1"; shift
-
-# Create base to move into
-mkdir -p "${__cdist_local_base_cache_dir}"
-
-# Now determine absolute path
-__cdist_ddir="$(__cdist_host_cache_dir "$__cdist_target_host")"
-
-__cdist_echo info "Saving cache to $__cdist_ddir "
-rm -rf "$__cdist_ddir"
-mv "$__cdist_local_base_dir" "$__cdist_ddir"
+mkdir -p /tmp/cdist/...
+__cdist_explorer_run global