set -e
set -u
-PUPPET_CONF="/etc/puppetlabs/puppet/puppet.conf"
-CERTNAME=$(cat /etc/puppetlabs/puppet/puppet.conf | \
- grep -P -v '^\s*#' | \
- grep -P -v '^\s*$' | \
- grep -P -o '^\s*certname(\s|=).*' | \
- awk -F'=' '{print $2}' | \
- sed -e 's/^[ ]*//' -e 's/[ ]*$//')
-if [[ -z "${CERTNAME}" ]] ; then
- CERTNAME=$(hostname -f)
+BASE_NAME="$( basename "${0}" )"
+MY_REAL_NAME=$( readlink -f "$0" )
+# shellcheck disable=SC2034
+BIN_DIR=$( dirname "${MY_REAL_NAME}" )
+BASE_DIR=$( dirname "${BIN_DIR}" )
+SCRIPTS_DIR="${BASE_DIR}/scripts"
+
+RC_FILE='/usr/libexec/dpx-puppet-tools/functions.rc'
+if [[ -d "${SCRIPTS_DIR}" && -f "${SCRIPTS_DIR}/functions.rc" ]] ; then
+ RC_FILE="${SCRIPTS_DIR}/functions.rc"
+elif [[ ! -f "${RC_FILE}" ]] ; then
+ echo "Bash resource file '${RC_FILE}' not found" >&2
+ exit 5
fi
-echo
-echo "###########################################"
-echo "Current node: '${CERTNAME}'"
-echo
+# echo "Sourcing '${RC_FILE}' ..."
+. "${RC_FILE}"
-envs=$( ls -1 /etc/puppetlabs/code/environments )
-if [[ "$#" != "0" ]] ; then
- envs="$*"
-fi
+detect_color
-for env in ${envs} ; do
+PUPPET_CONF="/etc/puppetlabs/puppet/puppet.conf"
+ENVS_ROOT_DIR="/etc/puppetlabs/code/environments"
+CERTNAME=
- env_dir="/etc/puppetlabs/code/environments/${env}"
+declare -a ENVS=()
- echo
- echo "###########################################"
- echo "Performing environment '${env}' ..."
- echo "###########################################"
- echo
+# shellcheck disable=SC2034
+DESCRIPTION=$( cat <<-EOF
+ Updating the given or all Puppet environments.
+ EOF
+)
- cmd="/opt/puppetlabs/puppet/bin/r10k deploy environment \"${env}\" -v -p"
- echo "${cmd}"
- eval ${cmd}
+#------------------------------------------------------------------------------
+usage() {
+ cat <<-EOF
+ Usage: ${BASE_NAME} [Common Options] [ENV [ENV ...]]
+ ${BASE_NAME} [-h|--help]
+ ${BASE_NAME} [-V|--version]
+
+ Common Options:
+ ${STD_USAGE_MSG}
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+get_options() {
+
+ local tmp=
+ # declare -a REMAINING_ARGS=()
+ # declare -a REMAINING_OPTS=()
+ set +e
+ tmp=$( getopt -o "${STD_SHORT_OPTIONS}" \
+ --long "${STD_LONG_OPTIONS}" \
+ -n "${BASE_NAME}" -- "$@" )
+ # shellcheck disable=SC2181
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp}"
+ eval_common_options "$@"
+ if [[ "${DEBUG}" == 'y' ]] ; then
+ declare -p REMAINING_OPTS
+ declare -p REMAINING_ARGS
+ fi
+
+ local len="${#REMAINING_OPTS[*]}"
+ local i="0"
+ local j=
+ local arg=
+
+ while [[ "$i" -lt "${len}" ]] ; do
+ j=$(( i + 1 ))
+ arg="${REMAINING_OPTS[$i]}"
+
+ case "${arg}" in
+ *) echo -e "Internal error - option '${RED}${arg}${NORMAL} was wrong!"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${#REMAINING_OPTS[@]}" -gt 0 ]] ; then
+ error "Unknown options: ${REMAINING_OPTS[*]}"
+ echo >&2
+ usage >&2
+ exit 1
+ fi
- if [[ -d "${env_dir}" ]] ; then
+ set +u
+ i="0"
+ for arg in "${REMAINING_ARGS[@]}" ; do
+ if [[ "${i}" == "0" && "${arg}" == '--' ]] ; then
+ continue
+ fi
+ i=$(( i + 1 ))
+ ENVS+=( "${arg}" )
+ done
+ set -u
+
+ if [[ ! -d "${ENVS_ROOT_DIR}" ]] ; then
+ error "Root dir of Puppet environments '${RED}${ENVS_ROOT_DIR}${NORMAL}' not found."
+ exit 6
+ fi
+
+ if [[ ! -f "${PUPPET_CONF}" ]] ; then
+ error "Puppet configuration file '${RED}${ENVS_ROOT_DIR}${NORMAL}' not found."
+ exit 6
+ fi
+
+ local env=
+ local env_dir=
+ local all_found="y"
+ if [[ "${#ENVS[@]}" -gt 0 ]] ; then
+ for env in "${ENVS[@]}" ; do
+ env_dir="${ENVS_ROOT_DIR}/${env}"
+ if [[ ! -d "${env_dir}" || ! -f "${env_dir}/Puppetfile" ]] ; then
+ error "Puppet environment '${RED}${env}${NORMAL}' not found."
+ all_found="n"
+ fi
+ done
+ if [[ "${all_found}" != "y" ]] ; then
+ exit 1
+ fi
+ else
+ for env in $( ls -1 "${ENVS_ROOT_DIR}" ) ; do
+ env_dir="${ENVS_ROOT_DIR}/${env}"
+ if [[ -d "${env_dir}" && -f "${env_dir}/Puppetfile" ]] ; then
+ debug "Found env '$CYAN}${env}${NORMAL}'."
+ ENVS+=( "${env}" )
+ fi
+ done
+ fi
+ if [[ "${QUIET}" != "y" ]] ; then
+ echo "Puppet environments to update:"
+ for e in "${ENVS[@]}" ; do
+ echo " * '${e}'"
+ done
echo
- sleep 1
+ fi
- cmd="/usr/bin/curl -i"
- cmd+=" --cert /etc/puppetlabs/puppet/ssl/certs/${CERTNAME}.pem"
- cmd+=" --key /etc/puppetlabs/puppet/ssl/private_keys/${CERTNAME}.pem"
- cmd+=" --cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem"
- cmd+=" -X DELETE"
- cmd+=" \"https://${CERTNAME}:8140/puppet-admin-api/v1/environment-cache?environment=${env}\""
+ if [[ "${#ENVS[@]}" == "0" ]] ; then
+ info "No environments found."
+ exit 1
+ fi
+
+ CERTNAME=$(cat "${PUPPET_CONF}" | \
+ grep -P -v '^\s*#' | \
+ grep -P -v '^\s*$' | \
+ grep -P -o '^\s*certname(\s|=).*' | \
+ awk -F'=' '{print $2}' | \
+ sed -e 's/^[ ]*//' -e 's/[ ]*$//')
+ if [[ -z "${CERTNAME}" ]] ; then
+ CERTNAME=$( hostname -f )
+ fi
+
+ check_for_root
- echo "${cmd}"
+}
+
+#------------------------------------------------------------------------------
+r10k_deploy() {
+
+ local env="$1"
+ local cmd=
+
+ empty_line
+ info "Deploying r10k environment '${CYAN}${env}${NORMAL}' ..."
+ cmd="/opt/puppetlabs/puppet/bin/r10k deploy environment \"${env}\" -v -p"
+ if [[ "${SIMULATE}" == "y" ]] ; then
+ info "Simulate executing: ${cmd}"
+ else
+ debug "Executing: ${cmd}"
eval ${cmd}
+ fi
+}
+
+#------------------------------------------------------------------------------
+clean_cache() {
+ local env="$1"
+ local env_dir=
+ local cmd=
+
+ empty_line
+ env_dir="${ENVS_ROOT_DIR}/${env}"
+ if [[ ! -d "${env_dir}" ]] ; then
+ debug "Environment directory '${CYAN}${env_dir}${NORMAL}' does not exists."
+ return
+ fi
+
+ info "Deleting cache for environment '${CYAN}${env}${NORMAL}' ..."
+
+ cmd="/usr/bin/curl -i"
+ cmd+=" --cert /etc/puppetlabs/puppet/ssl/certs/${CERTNAME}.pem"
+ cmd+=" --key /etc/puppetlabs/puppet/ssl/private_keys/${CERTNAME}.pem"
+ cmd+=" --cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem"
+ cmd+=" -X DELETE"
+ cmd+=" \"https://${CERTNAME}:8140/puppet-admin-api/v1/environment-cache?environment=${env}\""
+ if [[ "${SIMULATE}" == "y" ]] ; then
+ info "Simulate executing: ${cmd}"
else
- echo -e "\nEnvironment-Verzeichnis '${env_dir}' existiert nicht." >&2
+ debug "Executing: ${cmd}"
+ eval ${cmd}
fi
+}
+
+#------------------------------------------------------------------------------
+generate_types() {
+
+ local env="$1"
+ local env_dir=
+ local cmd=
+
+ empty_line
+ env_dir="${ENVS_ROOT_DIR}/${env}"
+ if [[ ! -d "${env_dir}" ]] ; then
+ debug "Environment directory '${CYAN}${env_dir}${NORMAL}' does not exists."
+ return
+ fi
+
+ info "Generating types for environment '${CYAN}${env}${NORMAL}' ..."
+
cmd="/opt/puppetlabs/puppet/bin/puppet generate types --environment \"${env}\""
- echo "${cmd}"
- eval ${cmd}
+ if [[ "${SIMULATE}" == "y" ]] ; then
+ info "Simulate executing: ${cmd}"
+ else
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+ fi
+
+}
+
+################################################################################
+##
+## Main
+##
+################################################################################
+
+#------------------------------------------------------------------------------
+main() {
+
+ local my_env=
+ local first=
+
+ get_options "$@"
+
+ set_locale 'en_US.utf8'
+ empty_line
+ line '#'
+ info "Current node: '${GREEN}${CERTNAME}${NORMAL}'."
+
+ first="y"
+
+ for my_env in "${ENVS[@]}" ; do
+
+ if [[ "${first}" != "y" ]] ; then
+ sleep 1
+ fi
+ first="n"
+
+ empty_line
+ if [[ "${QUIET}" != "y" ]] ; then
+ echo -e "${GREEN}#############################################${NORMAL}"
+ echo -e "${GREEN}#${NORMAL} Performing environment '${CYAN}${my_env}${NORMAL}' ..."
+ echo -e "${GREEN}#############################################${NORMAL}"
+ fi
+ r10k_deploy "${my_env}"
+ clean_cache "${my_env}"
+ generate_types "${my_env}"
+
+ empty_line
+ info "Finished environment '${CYAN}${my_env}${NORMAL}'."
+
+
+ done
+
+ info "Finished."
+
+}
+
+main "$@"
- echo
- echo "Finished environment '${env}'."
- sleep 1
-done
+exit 0
-# vim: ts=4 et list
+# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 list