#!/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 <http://www.gnu.org/licenses/>. # # __cdist_version="1.3.0" # Fail if something bogus is going on set -u ################################################################################ # 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_code:=code} : ${__cdist_name_code_finished:=.codedone} : ${__cdist_name_conf_dir:=conf} : ${__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_id:=object_id} : ${__cdist_name_object_source:=.source} : ${__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_singleton:=singleton} : ${__cdist_name_target_host:=target_host} : ${__cdist_name_type:=type} : ${__cdist_name_type_bin:=type_bin} : ${__cdist_name_type_explorer:=type_explorer} # 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_object:=__$__cdist_name_object} : ${__cdist_name_var_object_id:=__$__cdist_name_object_id} : ${__cdist_name_var_type:=__$__cdist_name_type} ################################################################################ # Tempfiles # __cdist_tmp_dir=$(mktemp -d "/tmp/cdist.XXXXXXXXXXXX") __cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX") ################################################################################ # Local Base # : ${__cdist_local_base_dir:=$__cdist_tmp_dir} : ${__cdist_conf_dir:="$(cd "$__cdist_abs_mydir/../conf" && 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_bin_dir:=$__cdist_out_dir/$__cdist_name_type_bin} ################################################################################ # 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_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_base_dir:=$__cdist_remote_out_dir/$__cdist_name_object} ################################################################################ # Function list # __cdist_debug_echo() { if [ "$__cdist_debug" ]; then echo "Debug: $@" fi } __cdist_exit_err() { echo "$@" >&2 exit 1 } __cdist_usage() { __cdist_exit_err "$__cdist_myname: $@" } __cdist_init_deploy() { echo "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" } __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_dir() { echo "${__cdist_type_dir}/$1" } __cdist_type_explorer_dir() { echo "${__cdist_type_dir}/$1/${__cdist_name_explorer}" } __cdist_remote_type_explorer_dir() { echo "${__cdist_remote_type_dir}/$1/${__cdist_name_explorer}" } __cdist_type_gencode() { echo "${__cdist_type_dir}/$1/${__cdist_name_gencode}" } __cdist_type_singleton() { echo "${__cdist_type_dir}/$1/${__cdist_name_singleton}" } __cdist_type_parameter_dir() { echo "$(__cdist_type_dir "$1")/${__cdist_name_parameter}" } # Shorthand for required and optional __cdist_type_parameter_required() { echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_required" } __cdist_type_parameter_optional() { echo "$(__cdist_type_parameter_dir "$1")/$__cdist_name_parameter_optional" } __cdist_type_from_object() { echo "${1%%/*}" } __cdist_object_id_from_object() { echo "${1#*/}" } __cdist_object_dir() { __cdist_object_dir="${__cdist_out_object_dir}/$1" echo "$__cdist_object_dir" } __cdist_remote_object_dir() { echo "${__cdist_remote_out_object_base_dir}/$1" } __cdist_object_code() { echo "$(__cdist_object_dir "$1")/${__cdist_name_code}" } __cdist_object_code_finished() { echo "$(__cdist_object_dir "$1")/${__cdist_name_code_finished}" } __cdist_object_parameter_dir() { echo "$(__cdist_object_dir "$1")/${__cdist_name_parameter}" } __cdist_remote_object_parameter_dir() { echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_parameter}" } __cdist_object_require() { echo "$(__cdist_object_dir "$1")/${__cdist_name_require}" } __cdist_object_type_explorer_dir() { echo "$(__cdist_object_dir "$1")/${__cdist_name_explorer}" } __cdist_remote_object_type_explorer_dir() { echo "$(__cdist_remote_object_dir "$1")/${__cdist_name_explorer}" } # 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_object_source" | \ sed -e 's;^./;;' -e "s;/${__cdist_name_object_source}\$;;" ) } __cdist_object_source() { local object_dir="$1"; shift cat "${object_dir}/${__cdist_name_object_source}" } __cdist_exec_fail_on_error() { sh -e "$@" [ "$?" -eq 0 ] || __cdist_exit_err "Error: $1 exited non-zero." } __cdist_tmp_removal() { rm -rf "${__cdist_tmp_dir}" } ################################################################################ # Trap for tmp removal # trap __cdist_tmp_removal EXIT