forked from ungleich-public/cdist
		
	
		
			
				
	
	
		
			426 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			426 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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.6.2"
 | |
| 
 | |
| # 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_cache:=cache}
 | |
| : ${__cdist_name_code:=code}
 | |
| : ${__cdist_name_conf_dir:=conf}
 | |
| : ${__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_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_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
 | |
| #
 | |
| __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
 | |
| 
 | |
|    case "$__cdist_echo_type" in
 | |
|       debug)
 | |
|          if [ "$__cdist_debug" ]; 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
 | |
| }
 | |
| 
 | |
| __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
 | |
| #
 | |
| __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}"
 | |
| }
 | |
| 
 | |
| 
 | |
| ################################################################################
 | |
| # Temp clenup
 | |
| #
 | |
| __cdist_tmp_removal()
 | |
| {
 | |
|    rm -rf "${__cdist_tmp_dir}"
 | |
| }
 | |
| 
 | |
| 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}"
 | |
| }
 |