--- /dev/null
+#!/bin/bash
+
+set -e
+set -u
+
+export LC_ALL="en_US.utf8"
+export LANG="en_US.utf8"
+
+VERBOSE="n"
+DEBUG="n"
+QUIET='n'
+DO_BACKUP="n"
+
+# console colors:
+RED=""
+YELLOW=""
+GREEN=""
+BLUE=""
+CYAN=""
+NORMAL=""
+
+HAS_TTY='y'
+HAS_COLORS="n"
+
+VERSION="0.6"
+
+BASENAME="$(basename ${0})"
+BASE_DIR="$(dirname ${0})"
+
+RESOLV_CONF="/etc/resolv.conf"
+DOMAIN=
+DATE_TPL="%Y-%m-%d_%H:%M:%S"
+
+declare -a SEARCH_DOMAINS=(
+ 'pixelpark.net'
+ 'pixelpark.com'
+)
+
+declare -a NAME_SERVERS=(
+ '217.66.52.10'
+ '93.188.109.13'
+ '212.91.225.75'
+)
+
+#-------------------------------------------------------------------
+detect_color() {
+
+ local safe_term="${TERM//[^[:alnum:]]/?}"
+ local match_lhs=""
+ local use_color="false"
+ local term=
+
+ if [[ -f ~/.dir_colors ]] ; then
+ match_lhs="${match_lhs}$( cat ~/.dir_colors | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -f /etc/DIR_COLORS ]] ; then
+ match_lhs="${match_lhs}$( cat /etc/DIR_COLORS | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -z ${match_lhs} ]] ; then
+ type -P dircolors >/dev/null && \
+ match_lhs=$(dircolors --print-database | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')
+ fi
+ for term in ${match_lhs} ; do
+ if [[ "${safe_term}" == ${term} || "${TERM}" == ${term} ]] ; then
+ use_color="true"
+ break
+ fi
+ done
+
+ # console colors:
+ if [ "${use_color}" = "true" ] ; then
+ RED="\033[38;5;196m"
+ YELLOW="\033[38;5;226m"
+ GREEN="\033[38;5;46m"
+ BLUE="\033[38;5;27m"
+ CYAN="\033[38;5;36m"
+ NORMAL="\033[39m"
+ HAS_COLORS="y"
+ else
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ fi
+
+ local my_tty=$(tty)
+ if [[ "${my_tty}" =~ 'not a tty' ]] ; then
+ my_tty='-'
+ fi
+
+ if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then
+ HAS_TTY='n'
+ fi
+
+}
+detect_color
+
+#------------------------------------------------------------------------------
+description() {
+
+ local nr=
+ local i=
+
+ echo "Generates a sane version of '${RESOLV_CONF}'."
+ echo
+
+ printf "Included are always the search domains: "
+ local domain=
+ i=0
+ nr="${#SEARCH_DOMAINS[*]}"
+ for domain in "${SEARCH_DOMAINS[@]}" ; do
+ i=$(( $i + 1 ))
+ printf "'${domain}'"
+ if [[ "${i}" != "${nr}" ]] ; then
+ printf ", "
+ fi
+ done
+ echo
+
+ printf "As nameservers are always used: "
+ local ns=
+ i=0
+ nr="${#NAME_SERVERS[*]}"
+ for ns in "${NAME_SERVERS[@]}" ; do
+ i=$(( $i + 1 ))
+ printf "'${ns}'"
+ if [[ "${i}" != "${nr}" ]] ; then
+ printf ", "
+ fi
+ done
+ echo
+
+}
+
+#------------------------------------------------------------------------------
+usage() {
+ cat <<-EOF
+ Usage: ${BASENAME} [-d|--debug] [[-v|--verbose] | [-q|--quiet]]] [-b|--backup] [-D|--domain DOMAIN] [--nocolor]
+ ${BASENAME} [-h|--help]
+ ${BASENAME} [-V|--version]
+
+ Options:
+ -b|--backup Creates a backup of an existing file
+ of the form '${RESOLV_CONF}.${DATE_TPL}.bak'.
+ -D|--domain DOMAIN
+ Including the given domain at the first position in the search domains.
+ -d|--debug Debug output (bash -x).
+ -v|--verbose Set verbosity on. Mutually exclusive to '--quiet'.
+ -q|--quiet Quiet execution, only errors and warnings are shown.
+ --nocolor Don't use colors on display.
+ -h|--help Show this output and exit.
+ -V|--version prints out version number of the script and exit
+ EOF
+}
+
+#------------------------------------------------------------------------------
+get_options() {
+
+ local tmp=
+ local base_dir=
+
+ set +e
+ tmp=$( getopt -o D:bdvqhV \
+ --long domain:,backup,debug,verbose,quiet,nocolor,help,version \
+ -n "${BASENAME}" -- "$@" )
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp}"
+
+ local p=
+
+ while true ; do
+ case "$1" in
+ -D|--domain)
+ DOMAIN=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -b|--backup)
+ DO_BACKUP="y"
+ shift
+ ;;
+ -d|--debug)
+ DEBUG="y"
+ shift
+ ;;
+ -v|--verbose)
+ VERBOSE="y"
+ shift
+ ;;
+ -q|--quiet)
+ QUIET="y"
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ --nocolor)
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ -h|--help)
+ description
+ echo
+ usage
+ exit 0
+ ;;
+ -V|--version)
+ echo "${BASENAME} version: ${VERSION}"
+ exit 0
+ ;;
+ --) shift
+ break
+ ;;
+ *) echo "Internal error!"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${DEBUG}" = "y" ]] ; then
+ set -x
+ fi
+ if [[ "${VERBOSE}" == "y" && "${QUIET}" == "y" ]] ; then
+ error "The parameters '${RED}--verbose${NORMAL}' and '${RED}--quiet${NORMAL}' are mutually exclusive."
+ usage >&2
+ exit 1
+ fi
+
+}
+
+#########################################
+# Some often used funktions
+
+#------------------------------------------------------------------------------
+my_date() {
+ date --rfc-3339=seconds
+}
+
+#------------------------------------------------------------------------------
+debug() {
+ if [[ "${VERBOSE}" != "y" ]] ; then
+ return 0
+ fi
+ echo -e " * [$(my_date)] [${BASENAME}:${CYAN}DEBUG${NORMAL}]: $@"
+}
+
+#------------------------------------------------------------------------------
+info() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@"
+}
+
+#------------------------------------------------------------------------------
+warn() {
+ echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+error() {
+ echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+empty_line() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo
+}
+
+#------------------------------------------------------------------------------
+CP() {
+ local cmd="cp"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ cmd+=" --verbose"
+ fi
+ eval ${cmd} "$@"
+}
+
+#------------------------------------------------------------------------------
+MV() {
+ local cmd="mv"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ cmd+=" --verbose"
+ fi
+ eval ${cmd} "$@"
+}
+
+#------------------------------------------------------------------------------
+do_backup() {
+
+ if [[ "${DO_BACKUP}" != "y" ]] ; then
+ return 0
+ fi
+
+ if [[ -f "${RESOLV_CONF}" ]] ; then
+ empty_line
+ info "Creating ${GREEN}backup of '${RESOLV_CONF}'${NORMAL} ..."
+ CP -p "${RESOLV_CONF}" "${RESOLV_CONF}.$( date -r ${RESOLV_CONF} +"${DATE_TPL}").bak"
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+
+generate() {
+
+ empty_line
+ info "Generating a new '${GREEN}${RESOLV_CONF}${NORMAL}' ..."
+
+ local content="# Generated by '${BASENAME}' version '${VERSION}' at: $( date --rfc-3339=seconds )"
+ content+="
+"
+
+ content+="search "
+
+ if [[ -n "${DOMAIN}" ]] ; then
+ if [[ "${DOMAIN}" != 'pixelpark.com' && "${DOMAIN}" != 'pixelpark.com' ]] ; then
+ info "Including '${GREEN}${DOMAIN}${NORMAL}' as a search domain."
+ content+=$( printf "${DOMAIN} " )
+ else
+ warn "Domain '${YELLOW}${DOMAIN}${NORMAL}' is already a search domain."
+ fi
+ fi
+
+ local domain=
+ local i=0
+ local nr="${#SEARCH_DOMAINS[*]}"
+ for domain in "${SEARCH_DOMAINS[@]}" ; do
+ i=$(( $i + 1 ))
+ content+=$( printf "${domain}" )
+ if [[ "${i}" != "${nr}" ]] ; then
+ content+=$( printf " " )
+ fi
+ done
+ echo
+ content+="
+"
+
+ local ns=
+ i=0
+ for ns in "${NAME_SERVERS[@]}" ; do
+ content+=$( echo "nameserver ${ns}" )
+ content+="
+"
+ done
+ content+="
+"
+
+ empty_line
+ debug "Generated content of '${RESOLV_CONF}':"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ printf "${content}"
+ fi
+
+ printf "${content}" >"${RESOLV_CONF}"
+
+}
+
+
+################################################################################
+##
+## Main
+##
+################################################################################
+
+#------------------------------------------------------------------------------
+main() {
+
+ get_options "$@"
+ do_backup
+ generate
+
+}
+
+main "$@"
+
+exit 0
+
+
+
+# vim: list
--- /dev/null
+#!/bin/bash
+
+set -e
+set -u
+
+export LC_ALL="en_US.utf8"
+export LANG="en_US.utf8"
+
+VERBOSE="n"
+DEBUG="n"
+QUIET='n'
+
+# console colors:
+RED=""
+YELLOW=""
+GREEN=""
+BLUE=""
+CYAN=""
+NORMAL=""
+
+HAS_TTY='y'
+HAS_COLORS="n"
+
+VERSION="0.5"
+
+BASENAME="$(basename ${0})"
+BASE_DIR="$(dirname ${0})"
+
+#-------------------------------------------------------------------
+detect_color() {
+
+ local safe_term="${TERM//[^[:alnum:]]/?}"
+ local match_lhs=""
+ local use_color="false"
+ local term=
+
+ if [[ -f ~/.dir_colors ]] ; then
+ match_lhs="${match_lhs}$( cat ~/.dir_colors | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -f /etc/DIR_COLORS ]] ; then
+ match_lhs="${match_lhs}$( cat /etc/DIR_COLORS | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -z ${match_lhs} ]] ; then
+ type -P dircolors >/dev/null && \
+ match_lhs=$(dircolors --print-database | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')
+ fi
+ for term in ${match_lhs} ; do
+ if [[ "${safe_term}" == ${term} || "${TERM}" == ${term} ]] ; then
+ use_color="true"
+ break
+ fi
+ done
+
+ # console colors:
+ if [ "${use_color}" = "true" ] ; then
+ RED="\033[38;5;196m"
+ YELLOW="\033[38;5;226m"
+ GREEN="\033[38;5;46m"
+ BLUE="\033[38;5;27m"
+ CYAN="\033[38;5;36m"
+ NORMAL="\033[39m"
+ HAS_COLORS="y"
+ else
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ fi
+
+ local my_tty=$(tty)
+ if [[ "${my_tty}" =~ 'not a tty' ]] ; then
+ my_tty='-'
+ fi
+
+ if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then
+ HAS_TTY='n'
+ fi
+
+}
+detect_color
+
+
+#------------------------------------------------------------------------------
+get_ip() {
+ local iface=
+
+ IP=
+
+ for iface in $( ip link show | grep '^[^ ]' | tail -n +2 | awk '{print $2}' | sed -e 's/:$//' ); do
+
+ IP=$( ip addr show dev ${iface} | grep -w inet | head -n 1 | awk '{print $2}' | sed -e 's|/.*||' )
+ if [[ -n "${IP}" ]] ; then
+ break
+ fi
+
+ done
+
+}
+
+
+
+NODENAME=$(hostname -s)
+PURPOSE="Projekt Kunde"
+DOMAIN=$(hostname --fqdn | cut -d. -f 2- )
+LOCATION="L105"
+get_ip
+HARDWARE=$( uname -p )
+OWNER="Publicis Pixelpark GmbH"
+CONTACT="8x5@pixelpark.com"
+COMMENTS=
+ZONE="N/A"
+OS_NAME=$( cat /etc/os-release | grep '^PRETTY_NAME' | awk -F= '{print $2}' | sed -e 's/^"//' -e 's/"$//' )
+KERNEL=$( uname -r | cut -d. -f1,2,3 )
+CUSTOMER="pixelpark"
+
+#------------------------------------------------------------------------------
+description() {
+ cat <<-EOF
+ Prints out an initial version of a MOTD.
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+usage() {
+ cat <<-EOF
+ Usage: ${BASENAME} [-d|--debug] [-v|--verbose] [--nocolor] [<Other options>]
+ ${BASENAME} [-h|--help]
+ ${BASENAME} [-V|--version]
+
+ Options:
+ -n|--node NODENAME
+ The nodename in the MOTD, Default: '${NODENAME}'.
+ -p|--purpose PURPOSE
+ The purpose in the MOTD, Default: '${PURPOSE}'.
+ -D|--domain DOMAIN
+ The domain the MOTD, Default: '${DOMAIN}'.
+ -l|--location LOCATION
+ The location in the MOTD, Default: '${LOCATION}'.
+ -i|--ip IP The IP address in the MOTD, Default: '${IP}'.
+ -H|--hardware HARDWARE
+ The type of hardware, Default: '${HARDWARE}'.
+ -o|--owner OWNER
+ The owning Customer if this host, Default: '${OWNER}'.
+ -e|--email EMAIL_ADDRESS
+ The E-Mail-Address of the responsible Person
+ or Mailgroup, Default: <${CONTACT}>.
+ -c|--comments COMMENTS
+ Some additional comments to this machine.
+ -z|--zone ZONE_HOST
+ The containing zone host of this zone, VM or container, Default: '${ZONE}'.
+ -C|--customer HIERA_CUSTOMER
+ The hiera customer used for Puppet, Default: '${CUSTOMER}'.
+ -d|--debug Debug output (bash -x).
+ -v|--verbose Set verbosity on.
+ --nocolor Don't use colors on display.
+ -h|--help Show this output and exit.
+ -V|--version prints out version number of the script and exit
+ EOF
+}
+
+#------------------------------------------------------------------------------
+get_options() {
+
+ local tmp=
+ local base_dir=
+ local short_options="n:p:D:l:i:H:o:e:c:z:C:dvhV"
+ local long_options="node:,purpose:,domain:,location:,ip:,hardware:,owner:,"
+ long_options+="email:,comments:,zone:,customer:,debug,verbose,nocolor,help,version"
+
+ set +e
+ tmp=$( getopt -o "${short_options}" --long "${long_options}" -n "${BASENAME}" -- "$@" )
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp}"
+
+ local p=
+
+ while true ; do
+ case "$1" in
+ -n|--node)
+ NODENAME="$2"
+ shift
+ shift
+ ;;
+ -p|--purpose)
+ PURPOSE="$2"
+ shift
+ shift
+ ;;
+ -D|--domain)
+ DOMAIN="$2"
+ shift
+ shift
+ ;;
+ -l|--location)
+ LOCATION="$2"
+ shift
+ shift
+ ;;
+ -i|--ip)
+ IP="$2"
+ shift
+ shift
+ ;;
+ -H|--hardware)
+ HARDWARE="$2"
+ shift
+ shift
+ ;;
+ -o|--owner)
+ OWNER="$2"
+ shift
+ shift
+ ;;
+ -e|--email)
+ CONTACT="$2"
+ shift
+ shift
+ ;;
+ -c|--comments)
+ COMMENTS="$2"
+ shift
+ shift
+ ;;
+ -z|--zone)
+ ZONE="$2"
+ shift
+ shift
+ ;;
+ -C|--customer)
+ CUSTOMER="$2"
+ shift
+ shift
+ ;;
+ -d|--debug)
+ DEBUG="y"
+ shift
+ ;;
+ -v|--verbose)
+ VERBOSE="y"
+ shift
+ ;;
+ --nocolor)
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ -h|--help)
+ description
+ echo
+ usage
+ exit 0
+ ;;
+ -V|--version)
+ echo "${BASENAME} version: ${VERSION}"
+ exit 0
+ ;;
+ --) shift
+ break
+ ;;
+ *) echo "Internal error!"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${DEBUG}" = "y" ]] ; then
+ set -x
+ fi
+
+}
+
+#########################################
+# Some often used funktions
+
+#------------------------------------------------------------------------------
+my_date() {
+ date --rfc-3339=seconds
+}
+
+#------------------------------------------------------------------------------
+debug() {
+ if [[ "${VERBOSE}" != "y" ]] ; then
+ return 0
+ fi
+ echo -e " * [$(my_date)] [${BASENAME}:${CYAN}DEBUG${NORMAL}]: $@"
+}
+
+#------------------------------------------------------------------------------
+info() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@"
+}
+
+#------------------------------------------------------------------------------
+warn() {
+ echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+error() {
+ echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+empty_line() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo
+}
+
+#------------------------------------------------------------------------------
+
+generate() {
+
+ local -a left=()
+ local -a right=()
+ local -a lines=()
+
+ local text=
+
+ info "Generating a new ${GREEN}/etc/motd${NORMAL} (Message of the day) ..." >&2
+
+ # Texte linke Spalte
+ text="Nodename: ${NODENAME}"
+ left+=("${text}")
+
+ text="Domain: ${DOMAIN}"
+ left+=("${text}")
+
+ text="Network: ${IP}"
+ left+=("${text}")
+
+ text="Hardware: ${HARDWARE}"
+ left+=("${text}")
+
+ text="OS: ${OS_NAME} (${KERNEL})"
+ left+=("${text}")
+
+ text=""
+ left+=("${text}")
+
+ # Texte rechte Spalte
+ text="Purpose: ${PURPOSE}"
+ right+=("${text}")
+
+ text="Location: ${LOCATION}"
+ right+=("${text}")
+
+ text="Owner: ${OWNER}"
+ right+=("${text}")
+
+ text="Contact: ${CONTACT}"
+ right+=("${text}")
+
+ text="Zone-Host: ${ZONE}"
+ right+=("${text}")
+
+ text="Customer: ${CUSTOMER}"
+ right+=("${text}")
+
+ local length=
+ local max_left="1"
+ local max_right="1"
+ local max="1"
+
+ for text in "${left[@]}" ; do
+ length=$( printf "${text}" | wc -c )
+ if [[ "${length}" -gt "${max_left}" ]] ; then
+ max_left="${length}"
+ fi
+ done
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ echo "Max. length left: ${max_left}" >&2
+ fi
+
+ for text in "${right[@]}" ; do
+ length=$( printf "${text}" | wc -c )
+ if [[ "${length}" -gt "${max_right}" ]] ; then
+ max_right="${length}"
+ fi
+ done
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ echo "Max. length right: ${max_right}" >&2
+ fi
+
+ local i=
+ for i in 0 1 2 3 4 5 ; do
+ text=$( printf "%-*s %-*s" "${max_left}" "${left[${i}]}" \
+ "${max_right}" "${right[${i}]}" )
+ lines+=("${text}")
+ length=$( printf "${text}" | wc -c )
+ if [[ "${length}" -gt "${max}" ]] ; then
+ max="${length}"
+ fi
+ done
+ if [[ -n "${COMMENTS}" ]] ; then
+ text="Comments: ${COMMENTS}"
+ lines+=("${text}")
+ length=$( printf "${text}" | wc -c )
+ if [[ "${length}" -gt "${max}" ]] ; then
+ max="${length}"
+ fi
+ fi
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ echo "Max. line length: ${max}" >&2
+ fi
+
+ local ruler="+"
+ local i=0
+ local ruler_length=$(( ${max} + 2 ))
+ while [[ "${i}" -lt "${ruler_length}" ]] ; do
+ i=$(( $i + 1 ))
+ ruler+="-"
+ done
+ ruler+="+"
+
+ echo "${ruler}"
+ for text in "${lines[@]}" ; do
+ printf "| %-*s |\n" ${max} "${text}"
+ done
+ echo "${ruler}"
+ echo
+
+}
+
+################################################################################
+##
+## Main
+##
+################################################################################
+
+#------------------------------------------------------------------------------
+main() {
+
+ get_options "$@"
+ generate
+
+}
+
+main "$@"
+
+exit 0
+
+
+
+# vim: list
--- /dev/null
+#!/bin/bash
+
+set -e
+set -u
+
+export LC_ALL="en_US.utf8"
+export LANG="en_US.utf8"
+
+VERBOSE="n"
+DEBUG="n"
+QUIET='n'
+
+# console colors:
+RED=""
+YELLOW=""
+GREEN=""
+BLUE=""
+CYAN=""
+NORMAL=""
+
+HAS_TTY='y'
+HAS_COLORS="n"
+
+VERSION="0.9"
+
+BASENAME="$(basename ${0})"
+BASE_DIR="$(dirname ${0})"
+FQDN=$( hostname -f )
+
+ENVIRONMENT=
+TIER=
+CUSTOMER="pixelpark"
+OWNER=
+PURPOSE="Projekt Kunde"
+CONTACT="8x5@pixelpark.com"
+OS=
+RELEASE=
+PKG_NAME="puppet-agent"
+PUPPET_BIN="/opt/puppetlabs/bin/puppet"
+PKG_INSTALLED="n"
+ROLE="base_oel7"
+PROJECT=
+
+
+#########################################
+# Some often used funktions
+
+#-------------------------------------------------------------------
+detect_color() {
+
+ local safe_term="${TERM//[^[:alnum:]]/?}"
+ local match_lhs=""
+ local use_color="false"
+ local term=
+
+ if [[ -f ~/.dir_colors ]] ; then
+ match_lhs="${match_lhs}$( cat ~/.dir_colors | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -f /etc/DIR_COLORS ]] ; then
+ match_lhs="${match_lhs}$( cat /etc/DIR_COLORS | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -z ${match_lhs} ]] ; then
+ type -P dircolors >/dev/null && \
+ match_lhs=$(dircolors --print-database | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')
+ fi
+ for term in ${match_lhs} ; do
+ if [[ "${safe_term}" == ${term} || "${TERM}" == ${term} ]] ; then
+ use_color="true"
+ break
+ fi
+ done
+
+ # console colors:
+ if [ "${use_color}" = "true" ] ; then
+ RED="\033[38;5;196m"
+ YELLOW="\033[38;5;226m"
+ GREEN="\033[38;5;46m"
+ BLUE="\033[38;5;27m"
+ CYAN="\033[38;5;36m"
+ NORMAL="\033[39m"
+ HAS_COLORS="y"
+ else
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ fi
+
+ local my_tty=$(tty)
+ if [[ "${my_tty}" =~ 'not a tty' ]] ; then
+ my_tty='-'
+ fi
+
+ if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then
+ HAS_TTY='n'
+ fi
+
+}
+detect_color
+
+#------------------------------------------------------------------------------
+my_date() {
+ date +'%F %T.%N %:::z'
+}
+
+#------------------------------------------------------------------------------
+debug() {
+ if [[ "${VERBOSE}" != "y" ]] ; then
+ return 0
+ fi
+ echo -e " * [$(my_date)] [${BASENAME}:${CYAN}DEBUG${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+info() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+warn() {
+ echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+error() {
+ echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+MKDIR() {
+
+ local cmd="mkdir -p"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ cmd="mkdir -v -p"
+ fi
+ debug "Executing: ${cmd}" "$@"
+ eval ${cmd} "$@"
+
+}
+
+#------------------------------------------------------------------------------
+RM() {
+
+ local cmd="rm"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ cmd="rm -v"
+ fi
+ debug "Executing: ${cmd} $*"
+ eval ${cmd} "$@"
+
+}
+
+#------------------------------------------------------------------------------
+description() {
+ cat <<-EOF
+ Initialize a Puppet5 agent and start it.
+
+ This script works only for Red Hat Linux and its derivates.
+
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+usage() {
+
+ cat <<-EOF
+ Usage: ${BASENAME} [OPTIONS ...]
+ ${BASENAME} [-h|--help]
+ ${BASENAME} [-V|--version]
+
+ Options:
+ -E|--env|--environment ENVIRONMENT
+ The Puppet environment to use. If not given, an autodetection
+ by the hostname is executed.
+ -C|--customer|--hiera-customer HIERA_CUSTOMER
+ The hiera customer used for Puppet, Default: '${CUSTOMER}'.
+ -p|--project CUSTOMER_PROJECT
+ The customer related name of the project - the next level
+ in the Hiera structure beyond the customer name.
+ If not given, the Hiera customer name will be used.
+ -O|--owner OWNER
+ The owning Customer if this host. If not given,
+ the Hiera customer will be used.
+ -T|--tier TIER The tier of the production state. If not given,
+ the Puppet environment will be used.
+ -R|--role ROLE The Puppet role of the host, Default: '${ROLE}'.
+ -P|--purpose PURPOSE
+ The purpose of the host, Default: '${PURPOSE}'.
+ -M|--email MAIL_ADDRESS
+ The E-Mail-Address of the responsible Person
+ or Mailgroup, Default: <${CONTACT}>.
+ -d|--debug Debug output (bash -x).
+ -v|--verbose Set verbosity on.
+ -q|--quiet Quiet execution. Mutually exclusive to --verbose.
+ --nocolor Don't use colors on display.
+ -h|--help Show this output and exit.
+ -V|--version Prints out version number of the script and exit.
+
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+autodetect_env() {
+
+ local hostname="$( hostname )"
+ local my_env="production"
+
+ if [[ "${hostname}" =~ ^dev(elop(ment)?)?- ]] ; then
+ my_env="development"
+ elif [[ "${hostname}" =~ ^(tst|test|int|stage|qas)[0-9]*- ]] ; then
+ my_env="test"
+ fi
+
+ echo "${my_env}"
+
+}
+
+#------------------------------------------------------------------------------
+get_options() {
+
+ local tmp=
+ local base_dir=
+ local short_options="E:C:p:O:T:R:P:M:dvqhV"
+ local long_options="env:,environment:,customer:,hiera-customer:,project:,owner:,tier:,role:,"
+ long_options+="purpose:,email:,debug,verbose,quiet,help,version"
+
+ set +e
+ tmp=$( getopt -o "${short_options}" --long "${long_options}" -n "${BASENAME}" -- "$@" )
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp}"
+
+ local p=
+
+ while true ; do
+ case "$1" in
+ -E|--env|--environment)
+ ENVIRONMENT=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -C|--customer|--hiera-customer)
+ CUSTOMER=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -p|--project)
+ PROJECT=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -O|--owner)
+ OWNER="$2"
+ shift
+ shift
+ ;;
+ -T|--tier)
+ TIER=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -R|--role)
+ ROLE=$( echo "$2" | tr '[:upper:]' '[:lower:]' )
+ shift
+ shift
+ ;;
+ -P|--purpose)
+ PURPOSE="$2"
+ shift
+ shift
+ ;;
+ -M|--email)
+ CONTACT="$2"
+ shift
+ shift
+ ;;
+ -d|--debug)
+ DEBUG="y"
+ shift
+ ;;
+ -v|--verbose)
+ VERBOSE="y"
+ shift
+ ;;
+ -q|--quiet)
+ QUIET="y"
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ --nocolor)
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ -h|--help)
+ description
+ echo
+ usage
+ exit 0
+ ;;
+ -V|--version)
+ echo "${BASENAME} version: ${VERSION}"
+ exit 0
+ ;;
+ --) shift
+ break
+ ;;
+ *) echo "Internal error!"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${DEBUG}" = "y" ]] ; then
+ set -x
+ fi
+
+ if [[ "${VERBOSE}" == "y" && "${QUIET}" == "y" ]] ; then
+ echo "Options '${RED}--verbose${NORMAL}' and '${RED}--quiet${NORMAL}' are mutually exclusive." >&2
+ echo >&2
+ usage >&2
+ exit 1
+ fi
+
+ if [[ -z "${ENVIRONMENT}" ]] ; then
+ ENVIRONMENT=$( autodetect_env )
+ fi
+
+ if [[ -z "${PROJECT}" ]] ; then
+ PROJECT="${CUSTOMER}"
+ fi
+
+ if [[ -z "${OWNER}" ]] ; then
+ OWNER="${CUSTOMER}"
+ fi
+
+ if [[ -z "${TIER}" ]] ; then
+ TIER="${ENVIRONMENT}"
+ fi
+
+ if [[ -z "${ROLE}" ]] ; then
+ echo "Option '${RED}-R|--role${NORMAL}' may not be empty." >&2
+ echo >&2
+ usage >&2
+ exit 1
+ fi
+
+ debug "Using following options:"
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ cat <<-EOF
+ FQDN: ${GREEN}${FQDN}${NORMAL}
+ Puppet environment: ${GREEN}${ENVIRONMENT}${NORMAL}
+ Tier: ${GREEN}${TIER}${NORMAL}
+ Role: ${GREEN}${ROLE}${NORMAL}
+ Hiera customer: ${GREEN}${CUSTOMER}${NORMAL}
+ Owner: ${GREEN}${OWNER}${NORMAL}
+ Contact address: ${GREEN}${CONTACT}${NORMAL}
+ Purpose: ${GREEN}${PURPOSE}${NORMAL}
+
+ EOF
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+check_for_root() {
+
+ debug "Checking for root execution ..."
+ if [[ "$( id -u )" != "0" ]] ; then
+ error "Only user '${RED}root${NORMAL}' may execute this script."
+ exit 1
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+check_os() {
+
+ info "Checking operating system ..."
+
+ if grep -i centos /etc/*-release >/dev/null 2>&1 ; then
+ OS=centos
+ elif grep -i oracle /etc/*-release >/dev/null 2>&1 ; then
+ OS=oracle
+ elif grep -i 'red hat' /etc/*-release >/dev/null 2>&1 ; then
+ OS=rhel
+ else
+ error "${RED}Operating system not supported${NORMAL} by this script."
+ exit 1
+ fi
+ debug "Found OS '${OS}'."
+
+ info "Checking OS release ..."
+ if [[ -f /etc/redhat-release ]] ; then
+ if grep --quiet -i "release 7" /etc/redhat-release ; then
+ RELEASE=7
+ elif grep --quiet -i "release 6" /etc/redhat-release ; then
+ RELEASE=6
+ else
+ error "Found invalid OS release: $(cat /etc/redhat-release)"
+ exit 1
+ fi
+ else
+ error "File '/etc/redhat-release' not found."
+ exit 5
+ fi
+ debug "Found OS Release '${RELEASE}'."
+
+}
+
+#------------------------------------------------------------------------------
+check_group_and_user() {
+
+ local cmd=
+ info "Checking for existence of ${GREEN}group 'puppet'${NORMAL} ..."
+ if getent group puppet >/dev/null ; then
+ info "Group 'puppet' is already existing, GID=$(id -g puppet)."
+ else
+ info "Creating group 'puppet' ..."
+ cmd="groupadd -g 63000 puppet"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+ fi
+
+ info "Checking for existence of u${GREEN}ser 'puppet'${NORMAL} ..."
+ if getent passwd puppet >/dev/null ; then
+ info "User 'puppet' is already existing, UID=$(id -u puppet)."
+ else
+ info "Creating user 'puppet' ..."
+ cmd="useradd -u 63000 -g puppet -d /var/lib/puppet -c \"Puppet configuration management\" -s /sbin/nologin puppet"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+check_installed_rpm() {
+
+ info "Checking for an already install ${GREEN}package '${PKG_NAME}'${NORMAL} ..."
+ if rpm -qa | grep -i "${PKG_NAME}" ; then
+ info "Puppet package is already installed."
+ PKG_INSTALLED="y"
+ else
+ warn "${YELLOW}Package '${PKG_NAME}'${NORMAL} not installed. Puppet agent cannot be executed or enabled."
+ error "Please install package '${YELLOW}${PKG_NAME}${NORMAL}' manually and enable and start the Puppet agent."
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+generate_puppetconf() {
+
+ local conf_dir="/etc/puppetlabs/puppet"
+ local conf_file="${conf_dir}/puppet.conf"
+
+ if [[ ! -d "${conf_dir}" ]] ; then
+ info "Ensuring existence of '${GREEN}${conf_dir}${NORMAL}' ..."
+ MKDIR "${conf_dir}"
+ fi
+
+ info "Generating Puppet configuration '${GREEN}${conf_file}${NORMAL}' ..."
+ local conf=$( cat <<-EOF
+ [main]
+ ca_ttl = 10y
+ [agent]
+ # The file in which puppetd stores a list of the classes
+ # associated with the retrieved configuratiion. Can be loaded in
+ # the separate "puppet" executable using the "--loadclasses"
+ # option.
+ # The default value is '\$confdir/classes.txt'.
+ classfile = \$vardir/classes.txt
+
+ environment = ${ENVIRONMENT}
+ report = true
+ pluginsync = true
+ splay = true
+ use_srv_records = true
+ srv_domain = pixelpark.info
+ pluginsource = puppet:///plugins
+ pluginfactsource = puppet:///pluginfacts
+ EOF
+ )
+
+ debug "Generatet content of '${conf_file}':\n${conf}"
+ echo "${conf}" > "${conf_file}"
+
+}
+
+#------------------------------------------------------------------------------
+generate_facts() {
+
+ info "Generating ${GREEN}YAML files for facter${NORMAL} ..."
+ local facts_dir="/etc/puppetlabs/facter/facts.d"
+ if [[ ! -d "${facts_dir}" ]] ; then
+ info "Creating '${GREEN}${facts_dir}${NORMAL}' ..."
+ MKDIR "${facts_dir}"
+ fi
+
+ local yfile="${facts_dir}/customer.yaml"
+ info "Generating '${GREEN}${yfile}${NORMAL}' ..."
+ local content=$( cat <<-EOF
+ ---
+ customer: ${CUSTOMER}
+ project: ${PROJECT}
+ EOF
+ )
+ debug "Generatet content of '${yfile}':\n${content}"
+ echo "${content}" > "${yfile}"
+
+ yfile="${facts_dir}/host.yaml"
+ info "Generating '${GREEN}${yfile}${NORMAL}' ..."
+ content=$( cat <<-EOF
+ ---
+ pp_purpose: ${PURPOSE}
+ pp_location: L105
+ pp_owner: ${OWNER}
+ pp_contact: ${CONTACT}
+ pp_zonehost: VMWare
+ EOF
+ )
+ debug "Generatet content of '${yfile}':\n${content}"
+ echo "${content}" > "${yfile}"
+
+ yfile="${facts_dir}/tier.yaml"
+ info "Generating '${GREEN}${yfile}${NORMAL}' ..."
+ content=$( cat <<-EOF
+ ---
+ tier: ${TIER}
+ EOF
+ )
+ debug "Generatet content of '${yfile}':\n${content}"
+ echo "${content}" > "${yfile}"
+
+ yfile="${facts_dir}/role.yaml"
+ info "Generating '${GREEN}${yfile}${NORMAL}' ..."
+ content=$( cat <<-EOF
+ ---
+ role: ${ROLE}
+ EOF
+ )
+ debug "Generatet content of '${yfile}':\n${content}"
+ echo "${content}" > "${yfile}"
+
+ yfile="${facts_dir}/initial_install.yaml"
+ info "Generating '${GREEN}${yfile}${NORMAL}' ..."
+ content=$( cat <<-EOF
+ ---
+ initial_install: true
+ EOF
+ )
+ debug "Generatet content of '${yfile}':\n${content}"
+ echo "${content}" > "${yfile}"
+
+ wrong_file="${facts_dir}/host"
+ if [[ -r "${wrong_file}" ]] ; then
+ info "Removing '${GREEN}${wrong_file}${NORMAL}' ..."
+ RM "${wrong_file}"
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+run_agent() {
+
+ info "${GREEN}Running Puppet agent${NORMAL} in --noop mode ..."
+
+ local cmd="${PUPPET_BIN} agent --test --noop || true"
+
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+ cat <<-EOF
+ If you got messages about an invalid certificate, go with SSH to
+ ${GREEN}puppetca01.pixelpark.com${NORMAL}
+ and sign the certificate for '${GREEN}${FQDN}${NORMAL}'.
+
+ EOF
+
+}
+
+################################################################################
+##
+## Main
+##
+################################################################################
+
+#------------------------------------------------------------------------------
+main() {
+
+ get_options "$@"
+ check_for_root
+ check_os
+ check_group_and_user
+ check_installed_rpm
+
+ generate_puppetconf
+ generate_facts
+
+ run_agent
+
+}
+
+main "$@"
+
+exit 0
+
+# vim: list
--- /dev/null
+#!/usr/bin/ksh
+# ------------------------------------
+# Andreas Gerstenberg (Pixelpark)
+#
+# Berlin - 18.05.2010
+# Update - 18.05.2010
+# Update - 20.02.2012 Sebastian Kachel - make Linux confirmed
+# ------------------------------------
+# Variablen, bitte ggf. anpassen
+# ------------------------------------
+version="1.00" # Script Version
+
+nodename="$(uname -n)"
+purpose="Projekt Kunde"
+domain="$(hostname --fqdn | cut -d. -f2,3)"
+location="L105"
+network="$(getent hosts $nodename | awk '{print $1}')"
+owner="Pixelpark AG"
+hardware="$(prtdiag 2> /dev/null | grep "System Configuration:" | sed -e "s/^System Configuration://" | awk '{print $3" "$4" "$5" "$6}')"
+check="$(prtdiag -l 2> /dev/null)"
+[[ $? -gt "0" ]] && hardware="$(uname -p)"
+contact="8x5@pixelpark.com"
+patch="$(cat /etc/*release | head -1 | awk '{print $4}' | cut -d_ -f2 | sed -e "s/wos//")"
+os="$(uname -sr | cut -d. -f1,2,3,6) $patch"
+managed[0]="No Filesystem Backup by Pixelpark"
+managed[1]="Managed Backup by Pixelpark"
+zone="N/A"
+
+# -------------------------
+# Ab hier bitte nix aendern
+# -------------------------
+
+# Print Functions
+# ---------------
+help() {
+ print ""
+ print "Version : $version"
+ print ""
+ print "Option : -n <nodename>"
+ print "Option : -p <purpose>"
+ print "Option : -d <domain>"
+ print "Option : -l <location>"
+ print "Option : -i <IP Address>"
+ print "Option : -h <hardware> "
+ print "Option : -e <contact email address>"
+ print "Option : -c <comment>"
+ print "Option : -z <zone host>"
+ print ""
+ print "Option : -b [No Managed Backup]"
+ print ""
+ print "Example : $0 -i 93.188.105.100 -p \"Deutsche Post\" -z silvanus"
+ print ""
+ exit
+}
+
+print_motd() {
+ t1=12; t2=28; t3=11; t4=20; t5=59;
+ echo "+----------------------------------------------------------------------+"
+ printf "%-${t1}s%-${t2}s%-${t3}s%-${t4}s%-s\n" "| Nodename:" "$nodename" "Purpose:" "$purpose" "|"
+ printf "%-${t1}s%-${t2}s%-${t3}s%-${t4}s%-s\n" "| Domain:" "$domain" "Location:" "$location" "|"
+ printf "%-${t1}s%-${t2}s%-${t3}s%-${t4}s%-s\n" "| Network:" "$network" "Owner:" "$owner" "|"
+ printf "%-${t1}s%-${t2}s%-${t3}s%-${t4}s%-s\n" "| Hardware:" "$hardware" "Contact:" "$contact" "|"
+ printf "%-${t1}s%-${t2}s%-${t3}s%-${t4}s%-s\n" "| OS:" "$os" "Zone-Host:" "$zone" "|"
+ printf "%-${t1}s%-${t5}s%-s\n" "| Comments:" "$comments" "|"
+ echo "+----------------------------------------------------------------------+"
+ echo "Linux System"
+}
+
+
+# Get Functions
+# -------------
+get_args() {
+ while getopts Vhbn:p:d:l:i:o:e:c:z: arguments ; do
+ case $arguments in
+
+ V) print $version
+ exit 0
+ ;;
+
+ h) help
+ exit 0
+ ;;
+
+ b) comments=${managed[0]} ;;
+ n) nodename="$OPTARG" ;;
+ p) purpose="$OPTARG" ;;
+ d) domain="$OPTARG" ;;
+ l) location="$OPTARG" ;;
+ i) network="$OPTARG" ;;
+ o) owner="$OPTARG" ;;
+ e) contact="$OPTARG" ;;
+ c) comments="$OPTARG" ;;
+ z) zone="$OPTARG" ;;
+
+ esac
+ done
+ shift `expr $OPTIND - 1`
+ comments=${comments:="${managed[1]}"}
+}
+
+get_args "$@"
+print_motd
--- /dev/null
+#!/bin/bash
+
+set -e
+set -u
+
+export LC_ALL="en_US.utf8"
+export LANG="en_US.utf8"
+
+VERBOSE="n"
+DEBUG="n"
+QUIET='n'
+
+# console colors:
+RED=""
+YELLOW=""
+GREEN=""
+BLUE=""
+CYAN=""
+NORMAL=""
+
+HAS_TTY='y'
+HAS_COLORS="n"
+
+VERSION="0.4"
+
+BASENAME="$(basename ${0})"
+BASE_DIR="$(dirname ${0})"
+FQDN=$( hostname -f )
+
+#########################################
+# Some often used funktions
+
+#-------------------------------------------------------------------
+detect_color() {
+
+ local safe_term="${TERM//[^[:alnum:]]/?}"
+ local match_lhs=""
+ local use_color="false"
+ local term=
+
+ if [[ -f ~/.dir_colors ]] ; then
+ match_lhs="${match_lhs}$( cat ~/.dir_colors | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -f /etc/DIR_COLORS ]] ; then
+ match_lhs="${match_lhs}$( cat /etc/DIR_COLORS | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')"
+ fi
+ if [[ -z ${match_lhs} ]] ; then
+ type -P dircolors >/dev/null && \
+ match_lhs=$(dircolors --print-database | grep '^TERM ' | sed -e 's/^TERM *//' -e 's/ .*//')
+ fi
+ for term in ${match_lhs} ; do
+ if [[ "${safe_term}" == ${term} || "${TERM}" == ${term} ]] ; then
+ use_color="true"
+ break
+ fi
+ done
+
+ # console colors:
+ if [ "${use_color}" = "true" ] ; then
+ RED="\033[38;5;196m"
+ YELLOW="\033[38;5;226m"
+ GREEN="\033[38;5;46m"
+ BLUE="\033[38;5;27m"
+ NORMAL="\033[39m"
+ CYAN="\033[38;5;36m"
+ HAS_COLORS="y"
+ else
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ fi
+
+ local my_tty=$(tty)
+ if [[ "${my_tty}" =~ 'not a tty' ]] ; then
+ my_tty='-'
+ fi
+
+ if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then
+ HAS_TTY='n'
+ fi
+
+}
+detect_color
+
+#------------------------------------------------------------------------------
+my_date() {
+ date --rfc-3339=seconds
+}
+
+#------------------------------------------------------------------------------
+debug() {
+ if [[ "${VERBOSE}" != "y" ]] ; then
+ return 0
+ fi
+ echo -e " * [$(my_date)] [${BASENAME}:${CYAN}DEBUG${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+info() {
+ if [[ "${QUIET}" == "y" ]] ; then
+ return 0
+ fi
+ echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+warn() {
+ echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+error() {
+ echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+description() {
+ cat <<-EOF
+ Performs a complete update of all packages.
+
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+usage() {
+
+ cat <<-EOF
+ Usage: ${BASENAME} [-d|--debug] [[-v|--verbose] | [-q|--quiet]] [--nocolor]
+ ${BASENAME} [-h|--help]
+ ${BASENAME} [-V|--version]
+
+ Options:
+ -d|--debug Debug output (bash -x).
+ -v|--verbose Set verbosity on.
+ -q|--quiet Quiet execution. Mutually exclusive to --verbose.
+ --nocolor Don't use colors on display.
+ -h|--help Show this output and exit.
+ -V|--version Prints out version number of the script and exit.
+
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+get_options() {
+
+ local tmp=
+ local short_options="dvqhV"
+ local long_options="debug,verbose,quiet,help,version"
+
+ set +e
+ tmp=$( getopt -o "${short_options}" --long "${long_options}" -n "${BASENAME}" -- "$@" )
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp}"
+
+ local p=
+
+ while true ; do
+ case "$1" in
+ -d|--debug)
+ DEBUG="y"
+ shift
+ ;;
+ -v|--verbose)
+ VERBOSE="y"
+ shift
+ ;;
+ -q|--quiet)
+ QUIET="y"
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ --nocolor)
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ CYAN=""
+ NORMAL=""
+ HAS_COLORS="n"
+ shift
+ ;;
+ -h|--help)
+ description
+ echo
+ usage
+ exit 0
+ ;;
+ -V|--version)
+ echo "${BASENAME} version: ${VERSION}"
+ exit 0
+ ;;
+ --) shift
+ break
+ ;;
+ *) echo "Internal error!"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${DEBUG}" = "y" ]] ; then
+ set -x
+ fi
+
+ if [[ "${VERBOSE}" == "y" && "${QUIET}" == "y" ]] ; then
+ echo "Options '${RED}--verbose${NORMAL}' and '${RED}--quiet${NORMAL}' are mutually exclusive." >&2
+ echo >&2
+ usage >&2
+ exit 1
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+check_for_root() {
+
+ debug "Checking for root execution ..."
+ if [[ "$( id -u )" != "0" ]] ; then
+ error "Only user '${RED}root${NORMAL}' may execute this script."
+ exit 1
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+do_el_upgrade() {
+
+ local tool="$1"
+
+ info "Performing dist upgrade with ${GREEN}${tool}${NORMAL} ..."
+ info "Tweaking '/etc/yum.conf' ..."
+
+ local found_ip_resolv="n"
+ local awk_script=''
+
+ if grep '^ip_resolve *= *4' /etc/yum.conf >/dev/null ; then
+ debug "Usage of IPv4 already configured"
+ else
+
+ if grep '^ip_resolve[ =]' /etc/yum.conf >/dev/null ; then
+ found_ip_resolv="y"
+ fi
+ if [[ "${found_ip_resolv}" == "y" ]] ; then
+ awk_script='/^[main]/ {ok=1}
+ok==1 && /^ip_resolve/ {print "ip_resolve=4"; ok=0; next}
+{print $0} '
+ else
+ awk_script='/^[main]/ {ok=1}
+ok==1 {print "ip_resolve=4"; ok=0}
+{print $0} '
+ fi
+ cp -p -v /etc/yum.conf /etc/yum.conf.$( date -r /etc/yum.conf +'%Y-%m-%d_%H:%M:%S').bak
+ awk "${awk_script}" /etc/yum.conf >/etc/yum.conf.new
+ if [[ -s /etc/yum.conf.new ]] ; then
+ mv -v /etc/yum.conf.new /etc/yum.conf
+ else
+ rm -f -v /etc/yum.conf.new
+ fi
+ fi
+
+ local verbose_opt=""
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ verbose_opt=" --verbose"
+ fi
+
+ echo
+ info "Cleaning ..."
+ local cmd="${tool}${verbose_opt} --assumeyes clean all"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+ echo
+ info "Making cache ..."
+ cmd="${tool}${verbose_opt} --assumeyes makecache"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+ echo
+ info "Doing upgrade ..."
+ cmd="${tool}${verbose_opt} --assumeyes upgrade"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+}
+
+#------------------------------------------------------------------------------
+do_deb_upgrade() {
+
+ local tool="$1"
+
+ info "Performing dist upgrade with ${GREEN}${tool}${NORMAL} ..."
+
+ local quiet_opt=""
+ if [[ "${QUIET}" == "y" ]] ; then
+ quiet_opt=" --quiet"
+ fi
+
+ echo
+ info "Updating indexes ..."
+ local cmd="${tool} update --yes${quiet_opt}"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+ echo
+ info "Doing upgrade ..."
+ local cmd="${tool} dist-upgrade --yes${quiet_opt}"
+ debug "Executing: ${cmd}"
+ eval ${cmd}
+
+}
+
+#------------------------------------------------------------------------------
+do_distupgrade() {
+
+ info "Performing a ${GREEN}dist upgrade${NORMAL}."
+ echo
+
+ if type -p dnf >/dev/null ; then
+ do_el_upgrade 'dnf'
+ elif type -p yum >/dev/null ; then
+ do_el_upgrade 'yum'
+ elif type -p apt >/dev/null ; then
+ do_deb_upgrade 'apt'
+ elif type -p apt-get >/dev/null ; then
+ do_deb_upgrade 'apt-get'
+ else
+ error "The operating system is not supported."
+ return 0
+ fi
+
+ echo
+ info "Finished"
+
+}
+
+
+################################################################################
+##
+## Main
+##
+################################################################################
+
+#------------------------------------------------------------------------------
+main() {
+
+ get_options "$@"
+ check_for_root
+ do_distupgrade
+
+}
+
+main "$@"
+
+exit 0
+
+# vim: list