#!/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 . # # __cdist_version="1.8.0" # Fail if something bogus is going on set -u # Fail if exited non-zero as well set -e ################################################################################ # cconf standard vars prefixed with cdist __cdist_pwd="$(pwd -P)" __cdist_mydir="${0%/*}"; __cdist_abs_mydir="$(cd "$__cdist_mydir" && pwd -P)" __cdist_myname=${0##*/}; __cdist_abs_myname="$__cdist_abs_mydir/$__cdist_myname" ################################################################################ # Names / Constants # # Most values can be overriden from outside, so you can # customise paths as you like (for distributors, geeks and hackers) # : ${__cdist_name_bin:=bin} : ${__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} : ${__cdist_name_gencode_local:=local} : ${__cdist_name_gencode_remote:=remote} : ${__cdist_name_global:=global} : ${__cdist_name_host:=host} : ${__cdist_name_init:=init} : ${__cdist_name_manifest:=manifest} : ${__cdist_name_object:=object} : ${__cdist_name_object_finished:=done} : ${__cdist_name_object_prepared:=prepared} : ${__cdist_name_object_id:=object_id} : ${__cdist_name_object_source:=source} : ${__cdist_name_objects_created:=.objects_created} : ${__cdist_name_out_dir:=out} : ${__cdist_name_parameter:=parameter} : ${__cdist_name_parameter_required:=required} : ${__cdist_name_parameter_optional:=optional} : ${__cdist_name_require:=require} : ${__cdist_name_self:=self} : ${__cdist_name_singleton:=singleton} : ${__cdist_name_target_host:=target_host} : ${__cdist_name_target_user:=target_user} : ${__cdist_name_type:=type} : ${__cdist_name_type_bin:=type_bin} : ${__cdist_name_type_explorer:=type_explorer} : ${__cdist_name_type_explorer_pushed:=.explorer_pushed} # Used for IDs: Allow everything not starting with - and . : ${__cdist_sane_regexp:=[^-\.].*} # Default remote user : ${__cdist_remote_user:=root} ################################################################################ # Exported variable names (usable for non core) # : ${__cdist_name_var_explorer:=__$__cdist_name_explorer} : ${__cdist_name_var_type_explorer:=__$__cdist_name_type_explorer} : ${__cdist_name_var_global:=__$__cdist_name_global} : ${__cdist_name_var_manifest:=__$__cdist_name_manifest} : ${__cdist_name_var_target_host:=__$__cdist_name_target_host} : ${__cdist_name_var_target_user:=__$__cdist_name_target_user} : ${__cdist_name_var_object:=__$__cdist_name_object} : ${__cdist_name_var_object_id:=__$__cdist_name_object_id} : ${__cdist_name_var_self:=__$__cdist_name_self} : ${__cdist_name_var_type:=__$__cdist_name_type} ################################################################################ # Tempfiles # : ${__cdist_tmp_base_dir=/tmp} __cdist_tmp_dir=$(mktemp -d "$__cdist_tmp_base_dir/cdist.XXXXXXXXXXXX") __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX") ################################################################################ # Local Base # : ${__cdist_local_base_dir:=$__cdist_tmp_dir} # Cache may *NOT* be below __cdist_local_base_dir! : ${__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} : ${__cdist_manifest_init:=$__cdist_manifest_dir/$__cdist_name_init} : ${__cdist_type_dir:=$__cdist_conf_dir/$__cdist_name_type} ################################################################################ # Local output # : ${__cdist_out_dir:=$__cdist_local_base_dir/$__cdist_name_out_dir} : ${__cdist_out_explorer_dir:=$__cdist_out_dir/$__cdist_name_explorer} : ${__cdist_out_object_dir:=$__cdist_out_dir/$__cdist_name_object} : ${__cdist_out_type_dir:=$__cdist_out_dir/$__cdist_name_type} : ${__cdist_out_type_bin_dir:=$__cdist_out_dir/$__cdist_name_type_bin} : ${__cdist_objects_created:=$__cdist_out_object_dir/$__cdist_name_objects_created} ################################################################################ # Remote base # : ${__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} ################################################################################ # Remote output # : ${__cdist_remote_out_dir:=$__cdist_remote_base_dir/$__cdist_name_out_dir} : ${__cdist_remote_out_explorer_dir:=$__cdist_remote_out_dir/$__cdist_name_explorer} : ${__cdist_remote_out_object_dir:=$__cdist_remote_out_dir/$__cdist_name_object} ################################################################################ # Internal functions # # *NEW* Load functions from library for __cdist_lib in $__cdist_core_dir/*; do # echo Loading $__cdist_lib ... . "$__cdist_lib" done __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_lib_path() { echo $_ } ################################################################################ # Cache # __cdist_cache_dir() { cd "${__cdist_local_base_cache_dir}" && pwd -P } __cdist_host_cache_dir() { echo "$(__cdist_cache_dir)/$1" } ################################################################################ # Object # __cdist_object_code() { echo "$(__cdist_object_dir "$1")/${__cdist_name_code}-$2" } __cdist_object_prepared() { echo "$(__cdist_object_dir "$1")/${__cdist_name_object_prepared}" } __cdist_object_finished() { echo "$(__cdist_object_dir "$1")/${__cdist_name_object_finished}" } __cdist_object_dir() { echo "$(__cdist_object_base_dir "$1")/${__cdist_name_dot_cdist}" } __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}" } __cdist_object_require() { echo "$(__cdist_object_dir "$1")/${__cdist_name_require}" } __cdist_object_source_name() { echo "$1/${__cdist_name_object_source}" } __cdist_object_source() { cat "$(__cdist_object_source_name "$1")" } __cdist_object_source_add() { echo "$__cdist_manifest" >> "$(__cdist_object_source_name "$1")" } __cdist_object_type_explorer_dir() { echo "$(__cdist_object_dir "$1")/${__cdist_name_explorer}" } ################################################################################ # Remote # __cdist_remote_object_base_dir() { echo "${__cdist_remote_out_object_dir}/$1" } __cdist_remote_object_dir() { echo "$(__cdist_remote_object_base_dir "$1")/${__cdist_name_dot_cdist}" } __cdist_remote_object_parameter_dir() { echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_parameter}" } __cdist_remote_object_type_explorer_dir() { echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_explorer}" } __cdist_remote_type_explorer_dir() { echo "${__cdist_remote_type_dir}/$1/${__cdist_name_explorer}" } ################################################################################ # 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 ################################################################################ # Type # __cdist_type_dir() { echo "${__cdist_type_dir}/$1" } __cdist_type_explorer_dir() { echo "${__cdist_type_dir}/$1/${__cdist_name_explorer}" } __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}" ] \ && grep -q "$1" "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" } __cdist_type_explorer_pushed_add() { [ -d "$__cdist_out_type_dir" ] || mkdir "$__cdist_out_type_dir" echo "$1" >> "${__cdist_out_type_dir}/${__cdist_name_type_explorer_pushed}" } __cdist_type_gencode() { echo "${__cdist_type_dir}/$1/${__cdist_name_gencode}-$2" } __cdist_type_manifest() { echo "${__cdist_type_dir}/$1/${__cdist_name_manifest}" } __cdist_type_parameter_dir() { echo "$(__cdist_type_dir "$1")/${__cdist_name_parameter}" } __cdist_type_parameter_optional() { echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_optional" } __cdist_type_parameter_required() { echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_required" } __cdist_type_singleton() { echo "${__cdist_type_dir}/$1/${__cdist_name_singleton}" }