181 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
# shellcheck shell=dash
 | 
						|
 | 
						|
# A simple script that is run on a remote host to download and install the
 | 
						|
# agent binary.
 | 
						|
 | 
						|
set -u
 | 
						|
 | 
						|
PRYMN_ROOT_URL=${PRYMN_ROOT_URL:-"https://static.prymn.net/agent"}
 | 
						|
 | 
						|
main() {
 | 
						|
    if [ $# -eq 0 ]; then
 | 
						|
        exit_error "I was not called correctly. Please make sure you copied the installation command correctly."
 | 
						|
    fi
 | 
						|
 | 
						|
    check_user_is_root
 | 
						|
 | 
						|
    check_os
 | 
						|
    local arch=${RETURN_VALUE}
 | 
						|
 | 
						|
    check_for_command curl
 | 
						|
    check_for_command mktemp
 | 
						|
 | 
						|
    local dir
 | 
						|
    dir="$(mktemp -d)"
 | 
						|
    local file="${dir}/prymn_agent"
 | 
						|
    local url="${PRYMN_ROOT_URL}/${arch}/prymn_agent"
 | 
						|
 | 
						|
    info "Download the Prymn agent..."
 | 
						|
 | 
						|
    ensure download "${url}" "${file}"
 | 
						|
    ensure chmod u+x "${file}"
 | 
						|
 | 
						|
    # Run the installer
 | 
						|
    "${file}" --install "$@"
 | 
						|
    local ret=$?
 | 
						|
 | 
						|
    rm "${file}"
 | 
						|
    rmdir "${dir}"
 | 
						|
 | 
						|
    return $ret
 | 
						|
}
 | 
						|
 | 
						|
check_user_is_root() {
 | 
						|
    if [ "$(id -u)" -ne 0 ]; then
 | 
						|
        exit_error "You must run me as the root user. For example you may execute:
 | 
						|
 | 
						|
  wget -O- <url> | sudo sh -s <token>
 | 
						|
 | 
						|
replace <url> and <token> with the ones provided in the server creation page."
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
check_os() {
 | 
						|
    local os_release os_id os_version_id os_pretty os_old_flag
 | 
						|
    if test -e /etc/os-release; then
 | 
						|
        os_release="/etc/os-release"
 | 
						|
    elif test -e /usr/lib/os-release; then
 | 
						|
        os_release="/usr/lib/os-release"
 | 
						|
    else
 | 
						|
        exit_error "could not determine your operating system; it might not be supported."
 | 
						|
    fi
 | 
						|
 | 
						|
    # shellcheck disable=SC1090
 | 
						|
    . "${os_release}"
 | 
						|
 | 
						|
    local os_id=${ID:-0}
 | 
						|
    local os_version_id=${VERSION_ID:-0}
 | 
						|
    local os_pretty=${PRETTY_NAME:-Linux}
 | 
						|
 | 
						|
    if [ "${os_id}" = 0 ] || [ "${os_version_id}" = 0 ]; then
 | 
						|
        exit_error "could not detect your operating system type or version."
 | 
						|
    fi
 | 
						|
 | 
						|
    case "${os_id}" in
 | 
						|
        debian)
 | 
						|
            local min_version=10
 | 
						|
            if [ "${os_version_id}" -lt ${min_version} ]; then
 | 
						|
                warning "detected Debian version ${os_version_id} which may be too old."
 | 
						|
            fi
 | 
						|
            ;;
 | 
						|
 | 
						|
        ubuntu)
 | 
						|
            local min_version="20.09"
 | 
						|
            os_old_flag="$(echo "${os_version_id}" | awk -v n=${min_version} '{print $1 < n}')"
 | 
						|
            if [ "${os_old_flag}" -eq 1 ]; then
 | 
						|
                warning "detected Ubuntu version ${os_version_id} which may be too old."
 | 
						|
            fi
 | 
						|
            ;;
 | 
						|
 | 
						|
        *)
 | 
						|
            exit_error "your operating system ${os_pretty} is not be supported."
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
 | 
						|
    local arch clib kernel cputype
 | 
						|
    clib="musl"
 | 
						|
    kernel="$(uname -s)"
 | 
						|
    cputype="$(uname -m)"
 | 
						|
 | 
						|
    case "${kernel}" in
 | 
						|
        Linux)
 | 
						|
            arch=unknown-linux-${clib}
 | 
						|
            ;;
 | 
						|
 | 
						|
        *)
 | 
						|
            exit_error "your operating system type ${kernel} is not supported."
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
 | 
						|
    case "${cputype}" in
 | 
						|
        x86_64 | x64)
 | 
						|
            arch="x86_64-${arch}"
 | 
						|
            ;;
 | 
						|
 | 
						|
        aarch64 | arm64)
 | 
						|
            arch="aarch64-${arch}"
 | 
						|
            ;;
 | 
						|
 | 
						|
        *)
 | 
						|
            exit_error "your CPU architecture ${cputype} is not supported."
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
 | 
						|
    RETURN_VALUE="${arch}"
 | 
						|
}
 | 
						|
 | 
						|
download() {
 | 
						|
    local download
 | 
						|
    if command -v curl > /dev/null; then
 | 
						|
        download="curl -sSfL $1 -o $2"
 | 
						|
    elif command -v wget > /dev/null; then
 | 
						|
        download="wget -O $2 $1"
 | 
						|
    else
 | 
						|
        exit_error "No downloader found in your system. Please install either 'wget' or 'curl'."
 | 
						|
    fi
 | 
						|
 | 
						|
    local err
 | 
						|
    err=$("$download" 2>&1)
 | 
						|
    if [ -n "$err" ]; then
 | 
						|
        exit_error "$err"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
check_downloader() {
 | 
						|
    local downloader
 | 
						|
    if command -v curl > /dev/null; then
 | 
						|
        downloader="curl -sSfL"
 | 
						|
    elif command -v wget > /dev/null; then
 | 
						|
        downloader="wget -O-"
 | 
						|
    else
 | 
						|
        exit_error "No downloader found in your system. Please install either 'wget' or 'curl'."
 | 
						|
    fi
 | 
						|
 | 
						|
    RETURN_VALUE="${downloader}"
 | 
						|
}
 | 
						|
 | 
						|
info() {
 | 
						|
    printf "%s\n" "$1" 1>&2
 | 
						|
}
 | 
						|
 | 
						|
warning() {
 | 
						|
    printf "Warning: %s\n" "$1" >&2
 | 
						|
}
 | 
						|
 | 
						|
exit_error() {
 | 
						|
    printf "Error: %s\n" "$1" >&2
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
check_for_command() {
 | 
						|
    if ! command -v "$1" > /dev/null 2>&1; then
 | 
						|
        exit_error "the program '$1' is required, but it was not found in your system."
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
ensure() {
 | 
						|
    "$@" || exit_error "failed to execute: $*"
 | 
						|
}
 | 
						|
 | 
						|
main "$@" || exit 1
 |