cdist-backup/bin/cdist-config
Nico Schottelius f75f2a0de5 Cleanup local and remote base_dir before execution
Signed-off-by: Nico Schottelius <nico@kr.ethz.ch>
2011-03-03 09:43:04 +01:00

272 lines
7 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/>.
#
#
# Fail if something bogus is going on and export all variables
set -u
__cdist_version="1.0.0"
# Most values can be overriden from outside, so you can
# customise paths as you like (for distributors, geeks and hackers)
# Names / Constants
: ${__cdist_name_bin:=bin}
: ${__cdist_name_code:=code}
: ${__cdist_name_conf_dir:=conf}
: ${__cdist_name_explorer:=explorer}
: ${__cdist_name_gencode:=gencode}
: ${__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_target_host:=target_host}
: ${__cdist_name_type:=type}
: ${__cdist_name_type_bin:=type_bin}
: ${__cdist_name_type_explorer:=type_explorer}
# 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_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}
# Base
: ${__cdist_conf_dir:=/etc/cdist}
: ${__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}
# Used for IDs
__cdist_sane_regexp='[A-Za-z0-9/]*[-A-Za-z0-9_/]*'
# Default remote user
: ${__cdist_remote_user:=root}
# Remote base
: ${__cdist_remote_base_dir:=/var/lib/cdist}
# Remote config
: ${__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_bin_dir:=$__cdist_remote_conf_dir/$__cdist_name_bin}
: ${__cdist_remote_type_dir:=$__cdist_remote_conf_dir/$__cdist_name_type}
# Remote out
: ${__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}
# Tempfiles
__cdist_tmp_dir=$(mktemp -d "/tmp/cdist.XXXXXXXXXXXX")
__cdist_tmp_file=$(mktemp "$__cdist_tmp_dir/cdist.XXXXXXXXXXXX")
# Local output base directory
: ${__cdist_local_base_dir:=$__cdist_tmp_dir}
: ${__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}
################################################################################
# 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"
################################################################################
# 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 structur ..."
# 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_cache_host()
# {
# echo "${__cdist_cache_hosts}/${__cdist_target_host}"
# }
__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_param_file()
{
# FIXME: local == posix?
local type="$1"; shift
local paramtype="$1"; shift
echo "${__cdist_type_dir}/${type}/${__cdist_name_parameter}/${paramtype}"
}
__cdist_type_from_object()
{
echo "${1%%/*}"
}
__cdist_object_id_from_object()
{
echo "${1#*/}"
}
__cdist_object_dir()
{
echo "${__cdist_object_base_dir}/$1"
}
__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_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_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