Gabriel Nagy
3 years ago
No known key found for this signature in database
GPG Key ID: A2B2C9C0F6B672B3
2 changed files with 1012 additions and 0 deletions
-
74install.rb
-
938install.sh
@ -0,0 +1,74 @@ |
|||||
|
# This script generates an install.sh file which can be used to install |
||||
|
# puppet-agent on supported FOSS POSIX platforms. |
||||
|
# |
||||
|
# The script leverages tasks from the puppet_agent and facts modules, and |
||||
|
# attempts to change as few things as possible. |
||||
|
|
||||
|
# we just need the variables from here |
||||
|
facts_script = `sed '/munge_name "$family"/q' < modules/facts/tasks/bash.sh` |
||||
|
install_script = File.read('modules/puppet_agent/tasks/install_shell.sh') |
||||
|
.sub('[ -f "$PT__installdir/facts/tasks/bash.sh" ]', 'true') |
||||
|
.sub('$(bash $PT__installdir/facts/tasks/bash.sh "platform")', '$ID') |
||||
|
.sub('$(bash $PT__installdir/facts/tasks/bash.sh "release")', '$full') |
||||
|
|
||||
|
File.write('install.sh', <<-SH) |
||||
|
#!/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 |
||||
|
{ |
||||
|
#{facts_script} |
||||
|
#{install_script} |
||||
|
} |
||||
|
|
||||
|
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) |
||||
|
dpkg -r ${collection}-release |
||||
|
;; |
||||
|
esac |
||||
|
fi |
||||
|
fi |
||||
|
SH |
||||
|
|
@ -0,0 +1,938 @@ |
|||||
|
#!/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";; |
||||
|
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";; |
||||
|
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) |
||||
|
dpkg -r ${collection}-release |
||||
|
;; |
||||
|
esac |
||||
|
fi |
||||
|
fi |
Write
Preview
Loading…
Cancel
Save
Reference in new issue