]> Frank Brehm's Git Trees - pixelpark/puppet-tools.git/commitdiff
Finishing bin/update-puppet-env
authorFrank Brehm <frank.brehm@pixelpark.com>
Fri, 3 Feb 2023 15:41:11 +0000 (16:41 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Fri, 3 Feb 2023 15:41:11 +0000 (16:41 +0100)
bin/update-puppet-env

index d5dc73acd9efec657616b3b9133f9158d7a3b26c..a0c77697dddbe1d533b8b5402713a79266c76575 100755 (executable)
 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