dotfiles/get_prymn.sh
Nikos Papadakis 7fe45ca94b
setup CI and a more complete installation script
Use woodpecker-ci to deploy binaries to the R2 object storage. Use
multi-target builds to deploy multiple binaries for one or more CPU
architectures.

Now the installation script lives on the root of the repo, and it is
more complete checking the machine's requirements, operating system and
cpu architecture.
2023-07-19 23:01:18 +03:00

153 lines
3.5 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
ROOT_URL=${ROOT_URL:-"https://static.prymn.net/agent/dist"}
main() {
if [ $# -eq 0 ]; then
exit_error "missing command parameters. 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="${ROOT_URL}/${arch}/prymn_agent"
printf "info: downloading prymn agent...\n" 1>&2
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 "this script must be run as the root user."
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
# TODO: check for musl (probably not be needed because we support distros
# that don't use it)
clib="gnu"
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 err
err=$(curl -sSfL "$1" -o "$2" 2>&1)
if [ -n "$err" ]; then
exit_error "$err"
fi
}
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