You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
940 lines
25 KiB
940 lines
25 KiB
#!/usr/bin/env bash
|
|
|
|
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
|
|
|
|
function usage()
|
|
{
|
|
cat << HEREDOC
|
|
|
|
Usage: install.sh [--version VERSION] [--collection COLLECTION] [--cleanup] [--noop]
|
|
|
|
optional arguments:
|
|
-h, --help show this help message and exit
|
|
-v, --version VERSION install a specific puppet-agent version
|
|
-c, --collection COLLECTION install a specific puppet-agent collection (e.g. puppet7)
|
|
-n, --noop do a dry run, do not change any files
|
|
--cleanup remove the puppetlabs repository after installation finishes
|
|
|
|
HEREDOC
|
|
}
|
|
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case $1 in
|
|
-v|--version) PT_version="$2"; shift ;
|
|
if beginswith "6." "$PT_version"; then
|
|
PT_collection="puppet6"
|
|
elif beginswith "7." "$PT_version"; then
|
|
PT_collection="puppet7"
|
|
else
|
|
PT_collection="puppet"
|
|
fi ;;
|
|
-c|--collection) PT_collection="$2"; shift ;;
|
|
--cleanup) PT_cleanup=true; shift ;;
|
|
-n|--noop) PT__noop=true; shift ;;
|
|
-h|--help) usage; exit ;;
|
|
*) echo "Unknown parameter passed: $1"; usage; exit 1 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# shellcheck disable=SC1000-SC9999
|
|
{
|
|
#!/bin/bash
|
|
|
|
# This script may be called outside of a task, e.g. by puppet_agent
|
|
# so we have to just paste this code here. *grumbles*
|
|
# Exit with an error message and error code, defaulting to 1
|
|
fail() {
|
|
# Print a message: entry if there were anything printed to stderr
|
|
if [[ -s $_tmp ]]; then
|
|
# Hack to try and output valid json by replacing newlines with spaces.
|
|
error_data="{ \"msg\": \"$(tr '\n' ' ' <"$_tmp")\", \"kind\": \"bash-error\", \"details\": {} }"
|
|
else
|
|
error_data="{ \"msg\": \"Task error\", \"kind\": \"bash-error\", \"details\": {} }"
|
|
fi
|
|
echo "{ \"status\": \"failure\", \"_error\": $error_data }"
|
|
exit "${2:-1}"
|
|
}
|
|
|
|
validation_error() {
|
|
error_data="{ \"msg\": \""$1"\", \"kind\": \"bash-error\", \"details\": {} }"
|
|
echo "{ \"status\": \"failure\", \"_error\": $error_data }"
|
|
exit 255
|
|
}
|
|
|
|
success() {
|
|
echo "$1"
|
|
}
|
|
|
|
determine_command_for_facter_4() {
|
|
puppet_version="$(puppet --version)"
|
|
|
|
if (( ${puppet_version%%.*} == 6 )); then
|
|
# puppet 6 with facter 4
|
|
facts_command=(facter --json --show-legacy)
|
|
else
|
|
# puppet 7 with facter 4
|
|
facts_command=(puppet facts show --show-legacy --render-as json)
|
|
fi
|
|
}
|
|
|
|
maybe_delegate_to_facter() {
|
|
[[ $PATH =~ \/opt\/puppetlabs\/bin ]] || export PATH="${PATH}:/opt/puppetlabs/bin"
|
|
|
|
# Only use facter if we're running as the "facts" task, not the "facts::bash"
|
|
# task. This also skips calling facter if we're running as a script, which is
|
|
# used by the puppet_agent task.
|
|
if [[ $PT__task == facts ]] && type facter &>/dev/null; then
|
|
facter_version="$(facter -v)"
|
|
|
|
if (( ${facter_version%%.*} <= 2 )); then
|
|
facts_command=(facter -p --json)
|
|
elif (( ${facter_version%%.*} == 3 )); then
|
|
facts_command=(facter -p --json --show-legacy)
|
|
else
|
|
# facter 4
|
|
determine_command_for_facter_4
|
|
fi
|
|
|
|
exec -- "${facts_command[@]}"
|
|
fi
|
|
}
|
|
|
|
# Get info from one of /etc/os-release or /usr/lib/os-release
|
|
# This is the preferred method and is checked first
|
|
_systemd() {
|
|
# These files may have unquoted spaces in the "pretty" fields even if the spec says otherwise
|
|
# source cannot use process subsitution in some versions of bash, so redirect to stdin instead
|
|
source /dev/stdin <<<"$(sed 's/ /_/g' "$1")"
|
|
|
|
# According to `man os-release`, the first entry in ID_LIKE
|
|
# should be the one the platform most closely resembles
|
|
if [[ $ID = 'rhel' ]]; then
|
|
family='RedHat'
|
|
elif [[ $ID = 'debian' ]]; then
|
|
family='Debian'
|
|
elif [[ $ID_LIKE ]]; then
|
|
family="${ID_LIKE%% *}"
|
|
else
|
|
family="${ID}"
|
|
fi
|
|
}
|
|
|
|
# Get info from lsb_release
|
|
_lsb_release() {
|
|
read -r ID < <(lsb_release -si)
|
|
read -r VERSION_ID < <(lsb_release -sr)
|
|
read -r VERSION_CODENAME < <(lsb_release -sc)
|
|
}
|
|
|
|
# Get info from rhel /etc/*-release files
|
|
_rhel() {
|
|
family='RedHat'
|
|
# slurp the file
|
|
ver_info=$(<"$1")
|
|
# ID is the first word in the string
|
|
ID="${ver_info%% *}"
|
|
# Codename is hopefully the word(s) in parenthesis
|
|
if echo "$ver_info" | grep -q '('; then
|
|
VERSION_CODENAME="${ver_info##*\(}"
|
|
VERSION_CODENAME=""${VERSION_CODENAME//[()]/}""
|
|
fi
|
|
|
|
# Get a string like 'release 1.2.3' and grab everything after the space
|
|
release=$(echo "$ver_info" | grep -Eo 'release[[:space:]]*[0-9.]+')
|
|
VERSION_ID="${release#* }"
|
|
}
|
|
|
|
# Last resort
|
|
_uname() {
|
|
[[ $ID ]] || ID="$(uname)"
|
|
[[ $VERSION_ID ]] || VERSION_ID="$(uname -r)"
|
|
}
|
|
|
|
# Taken from https://github.com/puppetlabs/facter/blob/master/lib/inc/facter/facts/os.hpp
|
|
# If not in this list, we just uppercase the first character and lowercase the rest
|
|
munge_name() {
|
|
case "$1" in
|
|
redhat|rhel|red) echo "RedHat" ;;
|
|
ol|oracle) echo "OracleLinux" ;;
|
|
ubuntu) echo "Ubuntu" ;;
|
|
debian) echo "Debian" ;;
|
|
centos) echo "CentOS" ;;
|
|
cloud) echo "CloudLinux" ;;
|
|
virtuozzo) echo "VirtuozzoLinux" ;;
|
|
psbm) echo "PSBM" ;;
|
|
xenserver) echo "XenServer" ;;
|
|
linuxmint) echo "LinuxMint" ;;
|
|
sles) echo "SLES" ;;
|
|
suse) echo "SuSE" ;;
|
|
opensuse) echo "OpenSuSE" ;;
|
|
sunos) echo "SunOS" ;;
|
|
omni) echo "OmniOS" ;;
|
|
openindiana) echo "OpenIndiana" ;;
|
|
manjaro) echo "ManjaroLinux" ;;
|
|
smart) echo "SmartOS" ;;
|
|
openwrt) echo "OpenWrt" ;;
|
|
meego) echo "MeeGo" ;;
|
|
coreos) echo "CoreOS" ;;
|
|
zen) echo "XCP" ;;
|
|
kfreebsd) echo "GNU/kFreeBSD" ;;
|
|
arista) echo "AristaEOS" ;;
|
|
huawei) echo "HuaweiOS" ;;
|
|
photon) echo "PhotonOS" ;;
|
|
*) echo "$(tr '[:lower:]' '[:upper:]' <<<"${ID:0:1}")""$(tr '[:upper:]' '[:lower:'] <<<"${ID:1}")"
|
|
esac
|
|
}
|
|
|
|
_tmp="$(mktemp)"
|
|
exec 2>>"$_tmp"
|
|
|
|
shopt -s nocasematch
|
|
|
|
# Use indirection to munge PT_ environment variables
|
|
# e.g. "$PT_version" becomes "$version"
|
|
for v in ${!PT_*}; do
|
|
declare "${v#*PT_}"="${!v}"
|
|
done
|
|
|
|
# Delegate to facter executable if it exists. This function will `exec` and not
|
|
# return if facter exists. Otherwise, we'll continue on.
|
|
maybe_delegate_to_facter "$@"
|
|
|
|
if [[ -e /etc/os-release ]]; then
|
|
_systemd /etc/os-release
|
|
elif [[ -e /usr/lib/os-release ]]; then
|
|
_systemd /usr/lib/os-release
|
|
fi
|
|
|
|
# If either systemd is not installed or we didn't get a minor version or codename from os-release
|
|
if ! [[ $VERSION_ID ]] || (( ${VERSION_ID%%.*} == ${VERSION_ID#*.} )) || ! [[ $VERSION_CODENAME ]]; then
|
|
if [[ -e /etc/fedora-release ]]; then
|
|
_rhel /etc/fedora-release
|
|
elif [[ -e /etc/centos-release ]]; then
|
|
_rhel /etc/centos-release
|
|
elif [[ -e /etc/oracle-release ]]; then
|
|
_rhel /etc/oracle-release
|
|
elif [[ -e /etc/redhat-release ]]; then
|
|
_rhel /etc/redhat-release
|
|
elif type lsb_release &>/dev/null; then
|
|
_lsb_release
|
|
else
|
|
_uname
|
|
fi
|
|
fi
|
|
|
|
full="${VERSION_ID}"
|
|
major="${VERSION_ID%%.*}"
|
|
# Minor is considered the second part of the version string
|
|
IFS='.' read -ra minor <<<"$full"
|
|
minor="${minor[1]}"
|
|
|
|
ID="$(munge_name "$ID")"
|
|
family="$(munge_name "$family")"
|
|
|
|
#!/usr/bin/env bash
|
|
# Install puppet-agent as a task
|
|
#
|
|
# From https://github.com/petems/puppet-install-shell/blob/master/install_puppet_5_agent.sh
|
|
|
|
# Timestamp
|
|
now () {
|
|
date +'%H:%M:%S %z'
|
|
}
|
|
|
|
# Logging functions instead of echo
|
|
log () {
|
|
echo "`now` ${1}"
|
|
}
|
|
|
|
info () {
|
|
if [[ $PT__noop != true ]]; then
|
|
log "INFO: ${1}"
|
|
fi
|
|
}
|
|
|
|
warn () {
|
|
log "WARN: ${1}"
|
|
}
|
|
|
|
critical () {
|
|
log "CRIT: ${1}"
|
|
}
|
|
|
|
# Check whether a command exists - returns 0 if it does, 1 if it does not
|
|
exists() {
|
|
if command -v $1 >/dev/null 2>&1
|
|
then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Check whether the apt config file has been modified, warning and exiting early if it has
|
|
assert_unmodified_apt_config() {
|
|
puppet_list=/etc/apt/sources.list.d/puppet.list
|
|
puppet6_list=/etc/apt/sources.list.d/puppet6.list
|
|
puppet7_list=/etc/apt/sources.list.d/puppet7.list
|
|
|
|
if [[ -f $puppet_list ]]; then
|
|
list_file=puppet_list
|
|
elif [[ -f $puppet6_list ]]; then
|
|
list_file=puppet6_list
|
|
elif [[ -f $puppet7_list ]]; then
|
|
list_file=puppet7_list
|
|
fi
|
|
|
|
# If puppet.list exists, get its md5sum on disk and its md5sum from the puppet-release package
|
|
if [[ -n $list_file ]]; then
|
|
# For md5sum, the checksum is the first word
|
|
file_md5=($(md5sum "$list_file"))
|
|
# For dpkg-query with this output format, the sum is the second word
|
|
package_md5=($(dpkg-query -W -f='${Conffiles}\n' 'puppet-release' | grep -F "$list_file"))
|
|
|
|
# If the $package_md5 array is set, and the md5sum on disk doesn't match the md5sum from dpkg-query, it has been modified
|
|
if [[ $package_md5 && ${file_md5[0]} != ${package_md5[1]} ]]; then
|
|
warn "Configuration file $list_file has been modified from the default. Skipping agent installation."
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Check whether perl and LWP::Simple module are installed
|
|
exists_perl() {
|
|
if perl -e 'use LWP::Simple;' >/dev/null 2>&1
|
|
then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Get command line arguments
|
|
if [ -n "$PT_version" ]; then
|
|
version=$PT_version
|
|
fi
|
|
|
|
if [ -n "$PT_collection" ]; then
|
|
# Check whether collection is nightly
|
|
if [[ "$PT_collection" == *"nightly"* ]]; then
|
|
nightly=true
|
|
else
|
|
nightly=false
|
|
fi
|
|
|
|
collection=$PT_collection
|
|
else
|
|
collection='puppet'
|
|
fi
|
|
|
|
if [ -n "$PT_yum_source" ]; then
|
|
yum_source=$PT_yum_source
|
|
else
|
|
if [ "$nightly" = true ]; then
|
|
yum_source='http://nightlies.puppet.com/yum'
|
|
else
|
|
yum_source='http://yum.puppet.com'
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$PT_apt_source" ]; then
|
|
apt_source=$PT_apt_source
|
|
else
|
|
if [ "$nightly" = true ]; then
|
|
apt_source='http://nightlies.puppet.com/apt'
|
|
else
|
|
apt_source='http://apt.puppet.com'
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$PT_mac_source" ]; then
|
|
mac_source=$PT_mac_source
|
|
else
|
|
if [ "$nightly" = true ]; then
|
|
mac_source='http://nightlies.puppet.com/downloads'
|
|
else
|
|
mac_source='http://downloads.puppet.com'
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$PT_retry" ]; then
|
|
retry=$PT_retry
|
|
else
|
|
retry=5
|
|
fi
|
|
|
|
# Track to handle puppet5 to puppet6
|
|
if [ -f /opt/puppetlabs/puppet/VERSION ]; then
|
|
installed_version=`cat /opt/puppetlabs/puppet/VERSION`
|
|
else
|
|
installed_version=uninstalled
|
|
fi
|
|
|
|
# Only install the agent in cases where no agent is present, or the version of the agent
|
|
# has been explicitly defined and does not match the version of an installed agent.
|
|
if [ -z "$version" ]; then
|
|
if [ "$installed_version" == "uninstalled" ]; then
|
|
info "Version parameter not defined and no agent detected. Assuming latest."
|
|
version=latest
|
|
else
|
|
info "Version parameter not defined and agent detected. Nothing to do."
|
|
exit 0
|
|
fi
|
|
else
|
|
info "Version parameter defined: ${version}"
|
|
if [ "$version" == "$installed_version" ]; then
|
|
info "Version parameter defined: ${version}. Puppet Agent ${version} detected. Nothing to do."
|
|
exit 0
|
|
elif [ "$version" != "latest" ]; then
|
|
puppet_agent_version="$version"
|
|
fi
|
|
fi
|
|
|
|
# Error if non-root
|
|
if [ `id -u` -ne 0 ]; then
|
|
echo "puppet_agent::install task must be run as root"
|
|
exit 1
|
|
fi
|
|
|
|
# Retrieve Platform and Platform Version
|
|
# Utilize facts implementation when available
|
|
if true; then
|
|
# Use facts module bash.sh implementation
|
|
platform=$ID
|
|
platform_version=$full
|
|
|
|
# Handle CentOS
|
|
if test "x$platform" = "xCentOS"; then
|
|
platform="el"
|
|
|
|
# Handle Rocky
|
|
elif test "x$platform" = "xRocky"; then
|
|
platform="el"
|
|
|
|
# Handle Oracle
|
|
elif test "x$platform" = "xOracle Linux Server"; then
|
|
platform="el"
|
|
elif test "x$platform" = "xOracleLinux"; then
|
|
platform="el"
|
|
|
|
# Handle Scientific
|
|
elif test "x$platform" = "xScientific Linux"; then
|
|
platform="el"
|
|
elif test "x$platform" = "xScientific"; then
|
|
platform="el"
|
|
|
|
# Handle RedHat
|
|
elif test "x$platform" = "xRedHat"; then
|
|
platform="el"
|
|
|
|
# If facts task return "Linux" for platform, investigate.
|
|
elif test "x$platform" = "xLinux"; then
|
|
if test -f "/etc/SuSE-release"; then
|
|
if grep -q 'Enterprise' /etc/SuSE-release; then
|
|
platform="SLES"
|
|
platform_version=`awk '/^VERSION/ {V = $3}; /^PATCHLEVEL/ {P = $3}; END {print V "." P}' /etc/SuSE-release`
|
|
else
|
|
echo "No builds for platform: SUSE"
|
|
exit 1
|
|
fi
|
|
elif test -f "/etc/redhat-release"; then
|
|
platform="el"
|
|
platform_version=`sed 's/^.\+ release \([.0-9]\+\).*/\1/' /etc/redhat-release`
|
|
fi
|
|
|
|
# Handle OSX
|
|
elif test "x$platform" = "xDarwin"; then
|
|
platform="mac_os_x"
|
|
# Matching the tab-space with sed is error-prone
|
|
platform_version=`sw_vers | awk '/^ProductVersion:/ { print $2 }'`
|
|
|
|
major_version=`echo $platform_version | cut -d. -f1,2`
|
|
|
|
# Excepting MacOS 10.x, the major version is the first number only
|
|
if ! echo "${major_version}" | grep -q '^10\.'; then
|
|
major_version=$(echo "${major_version}" | cut -d '.' -f 1);
|
|
fi
|
|
|
|
case $major_version in
|
|
"10.11") platform_version="10.11";;
|
|
"10.12") platform_version="10.12";;
|
|
"10.13") platform_version="10.13";;
|
|
"10.14") platform_version="10.14";;
|
|
"10.15") platform_version="10.15";;
|
|
"11") platform_version="11";;
|
|
*) echo "No builds for platform: $major_version"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
else
|
|
echo "This module depends on the puppetlabs-facts module"
|
|
exit 1
|
|
fi
|
|
|
|
if test "x$platform" = "x"; then
|
|
critical "Unable to determine platform version!"
|
|
exit 1
|
|
fi
|
|
|
|
# Mangle $platform_version to pull the correct build
|
|
# for various platforms
|
|
major_version=`echo $platform_version | cut -d. -f1`
|
|
case $platform in
|
|
"el")
|
|
platform_version=$major_version
|
|
;;
|
|
"Fedora")
|
|
case $major_version in
|
|
"23") platform_version="22";;
|
|
*) platform_version=$major_version;;
|
|
esac
|
|
;;
|
|
"Debian")
|
|
case $major_version in
|
|
"5") platform_version="6";;
|
|
"6") platform_version="6";;
|
|
"7") platform_version="6";;
|
|
esac
|
|
;;
|
|
"SLES")
|
|
platform_version=$major_version
|
|
;;
|
|
"Amzn"|"Amazon Linux")
|
|
case $platform_version in
|
|
"2") platform_version="7";;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Find which version of puppet is currently installed if any
|
|
|
|
if test "x$platform_version" = "x"; then
|
|
critical "Unable to determine platform version!"
|
|
exit 1
|
|
fi
|
|
|
|
unable_to_retrieve_package() {
|
|
critical "Unable to retrieve a valid package!"
|
|
exit 1
|
|
}
|
|
|
|
random_hexdump () {
|
|
hexdump -n 2 -e '/2 "%u"' /dev/urandom
|
|
}
|
|
|
|
if test "x$TMPDIR" = "x"; then
|
|
tmp="/tmp"
|
|
else
|
|
tmp=${TMPDIR}
|
|
# TMPDIR has trailing file sep for OSX test box
|
|
penultimate=$((${#tmp}-1))
|
|
if test "${tmp:$penultimate:1}" = "/"; then
|
|
tmp="${tmp:0:$penultimate}"
|
|
fi
|
|
fi
|
|
|
|
# Random function since not all shells have $RANDOM
|
|
if exists hexdump; then
|
|
random_number=$(random_hexdump)
|
|
else
|
|
random_number="`date +%N`"
|
|
fi
|
|
|
|
tmp_dir="$tmp/install.sh.$$.$random_number"
|
|
(umask 077 && mkdir $tmp_dir) || exit 1
|
|
|
|
tmp_stderr="$tmp/stderr.$$.$random_number"
|
|
|
|
capture_tmp_stderr() {
|
|
# spool up tmp_stderr from all the commands we called
|
|
if test -f $tmp_stderr; then
|
|
output=`cat ${tmp_stderr}`
|
|
stderr_results="${stderr_results}\nSTDERR from $1:\n\n$output\n"
|
|
fi
|
|
}
|
|
|
|
trap "rm -f $tmp_stderr; rm -rf $tmp_dir; exit $1" 1 2 15
|
|
|
|
# Run command and retry on failure
|
|
# run_cmd CMD
|
|
run_cmd() {
|
|
eval $1
|
|
rc=$?
|
|
|
|
if test $rc -ne 0; then
|
|
attempt_number=0
|
|
while test $attempt_number -lt $retry; do
|
|
info "Retrying... [$((attempt_number + 1))/$retry]"
|
|
eval $1
|
|
rc=$?
|
|
|
|
if test $rc -eq 0; then
|
|
break
|
|
fi
|
|
|
|
info "Return code: $rc"
|
|
sleep 1s
|
|
((attempt_number=attempt_number+1))
|
|
done
|
|
fi
|
|
|
|
return $rc
|
|
}
|
|
|
|
# do_wget URL FILENAME
|
|
do_wget() {
|
|
info "Trying wget..."
|
|
run_cmd "wget -O '$2' '$1' 2>$tmp_stderr"
|
|
rc=$?
|
|
|
|
# check for 404
|
|
grep "ERROR 404" $tmp_stderr 2>&1 >/dev/null
|
|
if test $? -eq 0; then
|
|
critical "ERROR 404"
|
|
unable_to_retrieve_package
|
|
fi
|
|
|
|
# check for bad return status or empty output
|
|
if test $rc -ne 0 || test ! -s "$2"; then
|
|
capture_tmp_stderr "wget"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# do_curl URL FILENAME
|
|
do_curl() {
|
|
info "Trying curl..."
|
|
run_cmd "curl -1 -sL -D $tmp_stderr '$1' > '$2'"
|
|
rc=$?
|
|
|
|
# check for 404
|
|
grep "404 Not Found" $tmp_stderr 2>&1 >/dev/null
|
|
if test $? -eq 0; then
|
|
critical "ERROR 404"
|
|
unable_to_retrieve_package
|
|
fi
|
|
|
|
# check for bad return status or empty output
|
|
if test $rc -ne 0 || test ! -s "$2"; then
|
|
capture_tmp_stderr "curl"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# do_fetch URL FILENAME
|
|
do_fetch() {
|
|
info "Trying fetch..."
|
|
run_cmd "fetch -o '$2' '$1' 2>$tmp_stderr"
|
|
rc=$?
|
|
|
|
# check for 404
|
|
grep "404 Not Found" $tmp_stderr 2>&1 >/dev/null
|
|
if test $? -eq 0; then
|
|
critical "ERROR 404"
|
|
unable_to_retrieve_package
|
|
fi
|
|
|
|
# check for bad return status or empty output
|
|
if test $rc -ne 0 || test ! -s "$2"; then
|
|
capture_tmp_stderr "fetch"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# do_perl URL FILENAME
|
|
do_perl() {
|
|
info "Trying perl..."
|
|
run_cmd "perl -e 'use LWP::Simple; getprint(\$ARGV[0]);' '$1' > '$2' 2>$tmp_stderr"
|
|
rc=$?
|
|
|
|
# check for 404
|
|
grep "404 Not Found" $tmp_stderr 2>&1 >/dev/null
|
|
if test $? -eq 0; then
|
|
critical "ERROR 404"
|
|
unable_to_retrieve_package
|
|
fi
|
|
|
|
# check for bad return status or empty output
|
|
if test $rc -ne 0 || test ! -s "$2"; then
|
|
capture_tmp_stderr "perl"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# do_download URL FILENAME
|
|
do_download() {
|
|
info "Downloading $1"
|
|
info " to file $2"
|
|
|
|
# we try all of these until we get success.
|
|
# perl, in particular may be present but LWP::Simple may not be installed
|
|
|
|
if exists wget; then
|
|
do_wget $1 $2 && return 0
|
|
fi
|
|
|
|
if exists curl; then
|
|
do_curl $1 $2 && return 0
|
|
fi
|
|
|
|
if exists fetch; then
|
|
do_fetch $1 $2 && return 0
|
|
fi
|
|
|
|
if exists_perl; then
|
|
do_perl $1 $2 && return 0
|
|
fi
|
|
|
|
critical "Cannot download package as none of wget/curl/fetch/perl-LWP-Simple is found"
|
|
unable_to_retrieve_package
|
|
}
|
|
|
|
# install_file TYPE FILENAME
|
|
# TYPE is "rpm", "deb", "solaris" or "dmg"
|
|
install_file() {
|
|
case "$1" in
|
|
"rpm")
|
|
info "installing puppetlabs yum repo with rpm..."
|
|
if test -f "/etc/yum.repos.d/puppetlabs-pc1.repo"; then
|
|
info "existing puppetlabs yum repo found, moving to old location"
|
|
mv /etc/yum.repos.d/puppetlabs-pc1.repo /etc/yum.repos.d/puppetlabs-pc1.repo.old
|
|
fi
|
|
|
|
if test "x$installed_version" != "xuninstalled"; then
|
|
info "Version ${installed_version} detected..."
|
|
major=$(echo $installed_version | cut -d. -f1)
|
|
pkg="puppet${major}-release"
|
|
|
|
if echo $2 | grep $pkg; then
|
|
info "No collection upgrade detected"
|
|
else
|
|
info "Collection upgrade detected, replacing puppet${major}-release"
|
|
rpm -e "puppet${major}-release"
|
|
fi
|
|
fi
|
|
|
|
rpm -Uvh --oldpackage --replacepkgs "$2"
|
|
if test "$version" = 'latest'; then
|
|
run_cmd "yum install -y puppet-agent && yum upgrade -y puppet-agent"
|
|
else
|
|
run_cmd "yum install -y 'puppet-agent-${puppet_agent_version}'"
|
|
fi
|
|
;;
|
|
"noarch.rpm")
|
|
info "installing puppetlabs yum repo with zypper..."
|
|
|
|
if test "x$installed_version" != "xuninstalled"; then
|
|
info "Version ${installed_version} detected..."
|
|
major=$(echo $installed_version | cut -d. -f1)
|
|
pkg="puppet${major}-release"
|
|
|
|
if echo $2 | grep $pkg; then
|
|
info "No collection upgrade detected"
|
|
else
|
|
info "Collection upgrade detected, replacing puppet${major}-release"
|
|
zypper remove --no-confirm "puppet${major}-release"
|
|
fi
|
|
fi
|
|
|
|
run_cmd "zypper install --no-confirm '$2'"
|
|
if test "$version" = "latest"; then
|
|
run_cmd "zypper install --no-confirm 'puppet-agent'"
|
|
else
|
|
run_cmd "zypper install --no-confirm --oldpackage --no-recommends --no-confirm 'puppet-agent-${puppet_agent_version}'"
|
|
fi
|
|
;;
|
|
"deb")
|
|
info "Installing puppetlabs apt repo with dpkg..."
|
|
|
|
if test "x$installed_version" != "xuninstalled"; then
|
|
info "Version ${installed_version} detected..."
|
|
major=$(echo $installed_version | cut -d. -f1)
|
|
pkg="puppet${major}-release"
|
|
|
|
if echo $2 | grep $pkg; then
|
|
info "No collection upgrade detected"
|
|
else
|
|
info "Collection upgrade detected, replacing puppet${major}-release"
|
|
dpkg --purge "puppet${major}-release"
|
|
fi
|
|
fi
|
|
|
|
assert_unmodified_apt_config
|
|
|
|
dpkg -i --force-confmiss "$2"
|
|
run_cmd 'apt-get update -y'
|
|
|
|
if test "$version" = 'latest'; then
|
|
run_cmd "apt-get install -y puppet-agent"
|
|
else
|
|
if test "x$deb_codename" != "x"; then
|
|
run_cmd "apt-get install -y 'puppet-agent=${puppet_agent_version}-1${deb_codename}'"
|
|
else
|
|
run_cmd "apt-get install -y 'puppet-agent=${puppet_agent_version}'"
|
|
fi
|
|
fi
|
|
;;
|
|
"dmg" )
|
|
info "installing puppetlabs dmg with hdiutil and installer"
|
|
mountpoint="$(mktemp -d -t $(random_hexdump))"
|
|
/usr/bin/hdiutil attach "${download_filename?}" -nobrowse -readonly -mountpoint "${mountpoint?}"
|
|
/usr/sbin/installer -pkg ${mountpoint?}/puppet-agent-*-installer.pkg -target /
|
|
/usr/bin/hdiutil detach "${mountpoint?}"
|
|
rm -f $download_filename
|
|
;;
|
|
*)
|
|
critical "Unknown filetype: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
if test $? -ne 0; then
|
|
critical "Installation failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
info "Downloading Puppet $version for ${platform}..."
|
|
case $platform in
|
|
"SLES")
|
|
info "SLES platform! Lets get you an RPM..."
|
|
|
|
if [[ $PT__noop != true ]]; then
|
|
for key in "puppet" "puppet-20250406"; do
|
|
gpg_key="${tmp_dir}/RPM-GPG-KEY-${key}"
|
|
do_download "https://yum.puppet.com/RPM-GPG-KEY-${key}" "$gpg_key"
|
|
rpm --import "$gpg_key"
|
|
rm -f "$gpg_key"
|
|
done
|
|
fi
|
|
|
|
filetype="noarch.rpm"
|
|
filename="${collection}-release-sles-${platform_version}.noarch.rpm"
|
|
download_url="${yum_source}/${filename}"
|
|
;;
|
|
"el")
|
|
info "Red hat like platform! Lets get you an RPM..."
|
|
filetype="rpm"
|
|
filename="${collection}-release-el-${platform_version}.noarch.rpm"
|
|
download_url="${yum_source}/${filename}"
|
|
;;
|
|
"Amzn"|"Amazon Linux")
|
|
info "Amazon platform! Lets get you an RPM..."
|
|
filetype="rpm"
|
|
filename="${collection}-release-el-${platform_version}.noarch.rpm"
|
|
download_url="${yum_source}/${filename}"
|
|
;;
|
|
"Fedora")
|
|
info "Fedora platform! Lets get the RPM..."
|
|
filetype="rpm"
|
|
filename="${collection}-release-fedora-${platform_version}.noarch.rpm"
|
|
download_url="${yum_source}/${filename}"
|
|
;;
|
|
"Debian")
|
|
info "Debian platform! Lets get you a DEB..."
|
|
case $major_version in
|
|
"5") deb_codename="lenny";;
|
|
"6") deb_codename="squeeze";;
|
|
"7") deb_codename="wheezy";;
|
|
"8") deb_codename="jessie";;
|
|
"9") deb_codename="stretch";;
|
|
"10") deb_codename="buster";;
|
|
"11"|"testing") deb_codename="bullseye";; # FIXME: testing to be removed when Debian is released and major_version is changed to 11
|
|
esac
|
|
filetype="deb"
|
|
filename="${collection}-release-${deb_codename}.deb"
|
|
download_url="${apt_source}/${filename}"
|
|
;;
|
|
"Linuxmint"|"LinuxMint")
|
|
info "Mint platform! Lets get you a DEB..."
|
|
case $major_version in
|
|
"3") deb_codename="stretch";;
|
|
"4") deb_codename="buster";;
|
|
"20") deb_codename="focal";;
|
|
"19") deb_codename="bionic";;
|
|
"18") deb_codename="xenial";;
|
|
"17") deb_codename="trusty";;
|
|
esac
|
|
filetype="deb"
|
|
filename="${collection}-release-${deb_codename}.deb"
|
|
download_url="${apt_source}/${filename}"
|
|
;;
|
|
"Ubuntu")
|
|
info "Ubuntu platform! Lets get you a DEB..."
|
|
case $platform_version in
|
|
"12.04") deb_codename="precise";;
|
|
"12.10") deb_codename="quantal";;
|
|
"13.04") deb_codename="raring";;
|
|
"13.10") deb_codename="saucy";;
|
|
"14.04") deb_codename="trusty";;
|
|
"14.10") deb_codename="trusty";;
|
|
"15.04") deb_codename="vivid";;
|
|
"15.10") deb_codename="wily";;
|
|
"16.04") deb_codename="xenial";;
|
|
"16.10") deb_codename="yakkety";;
|
|
"17.04") deb_codename="zesty";;
|
|
"18.04") deb_codename="bionic";;
|
|
"20.04") deb_codename="focal";;
|
|
"22.04") deb_codename="focal";;
|
|
esac
|
|
filetype="deb"
|
|
filename="${collection}-release-${deb_codename}.deb"
|
|
download_url="${apt_source}/${filename}"
|
|
;;
|
|
"mac_os_x")
|
|
info "OSX platform! Lets get you a DMG..."
|
|
filetype="dmg"
|
|
if test "$version" = "latest"; then
|
|
filename="puppet-agent-latest.dmg"
|
|
else
|
|
filename="puppet-agent-${version}-1.osx${platform_version}.dmg"
|
|
fi
|
|
download_url="${mac_source}/mac/${collection}/${platform_version}/x86_64/${filename}"
|
|
;;
|
|
*)
|
|
critical "Sorry $platform is not supported yet!"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if [[ $PT__noop != true ]]; then
|
|
download_filename="${tmp_dir}/${filename}"
|
|
|
|
do_download "$download_url" "$download_filename"
|
|
|
|
install_file $filetype "$download_filename"
|
|
|
|
if [[ $PT_stop_service = true ]]; then
|
|
/opt/puppetlabs/bin/puppet resource service puppet ensure=stopped enable=false
|
|
fi
|
|
|
|
#Cleanup
|
|
if test "x$tmp_dir" != "x"; then
|
|
rm -r "$tmp_dir"
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
if [[ $PT__noop != true ]]; then
|
|
if [[ $PT_cleanup == true ]]; then
|
|
info "Cleanup requested, removing ${collection}-release repository..."
|
|
case $platform in
|
|
SLES|el|Amzn|"Amazon Linux"|Fedora)
|
|
rpm -e --allmatches ${collection}-release
|
|
;;
|
|
Debian|LinuxMint|Linuxmint|Ubuntu)
|
|
apt-get purge ${collection}-release -y
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|