Skip to content

Instantly share code, notes, and snippets.

@artman41
Created September 18, 2024 18:58
Show Gist options
  • Save artman41/08b5d3ccd3fad54743595ee112c9f9ba to your computer and use it in GitHub Desktop.
Save artman41/08b5d3ccd3fad54743595ee112c9f9ba to your computer and use it in GitHub Desktop.
Installs an erlang ubuntu installation without clashing
#!/bin/bash
ARCH=$(dpkg --print-architecture);
PACKAGES_URL="https://packages.erlang-solutions.com/ubuntu/pool/";
function usage() {
{
echo "Usage:";
echo "- $0 list";
echo "- $0 install \$otp_version";
} >&2;
}
function validate_var() {
if [[ -n "$1" ]]; then
return;
fi;
test -n "$2" && echo "$2" >&2;
if [[ -z "$NO_USAGE" ]]; then
usage;
fi;
exit 1;
}
function grab_versions() {
local package;
local version;
local release;
local versions; declare -A versions;
local releases=(
[lucid]=10
[maverick]=10
[natty]=11
[oneiric]=11
[precise]=12
[quantal]=12
[raring]=13
[saucy]=13
[trusty]=14
[utopic]=14
[vivid]=15
[wily]=15
[xenial]=16
[yakkety]=16
[zesty]=17
[artful]=17
[bionic]=18
[cosmic]=18
[disco]=19
[eoan]=19
[focal]=20
[groovy]=20
[hirsute]=21
[impish]=21
[jammy]=22
[kinetic]=22
[lunar]=23
[mantic]=23
[noble]=24
)
function process_package() {
# esl-erlang_14.b.2-1~debian~wheezy_amd64.deb
sed 's|esl-erlang_\(.*\)-.*~.*~\(.*\)_.*|\1 \2|g;s|esl-erlang_\(.*\)~.*~\(.*\)_.*|\1 \2|g';
}
while read -r package; do
# esl-erlang_15.b.1~debian~squeeze_amd64.deb
read -r version release< <(echo "$package" | process_package);
NO_USAGE=1 validate_var "$version" "Failed to read package name '$package'.";
NO_USAGE=1 validate_var "$release" "Failed to read package name '$package'.";
local existing="${versions[$version]}";
if [[ -z "$existing" ]]; then
versions[$version]="$package";
else
local existing_release="$(echo $existing | process_package | read -r version release | echo $release)";
if [[ ${releases[$existing_release]} -lt ${releases[$release]} ]]; then
versions[$version]="$package";
fi;
fi;
done< <(curl -s "$PACKAGES_URL" | grep 'esl-erlang_' | grep 'ubuntu' | grep "$ARCH" | sed 's|.*href="\(.*\)">.*|\1|g')
for key in "${!versions[@]}"; do
echo "[\"$key\]=\"${versions[$key]}\""
done;
}
declare -A VERSIONS;
VERSIONS=(
[14.b.2]="esl-erlang_14.b.2-1~ubuntu~precise_amd64.deb"
[14.b.4]="esl-erlang_14.b.4-1~ubuntu~precise_amd64.deb"
[15.b]="esl-erlang_15.b-1~ubuntu~natty_amd64.deb"
[15.b.1]="esl-erlang_15.b.1~ubuntu~lucid_amd64.deb"
[15.b.2]="esl-erlang_15.b.2~ubuntu~lucid_amd64.deb"
[15.b.3]="esl-erlang_15.b.3-1~ubuntu~oneiric_amd64.deb"
[16.a]="esl-erlang_16.a~ubuntu~lucid_amd64.deb"
[16.b]="esl-erlang_16.b~ubuntu~lucid_amd64.deb"
[16.b.1]="esl-erlang_16.b.1~ubuntu~precise_amd64.deb"
[16.b.2]="esl-erlang_16.b.2-1~ubuntu~precise_amd64.deb"
[16.b.2.basho10]="esl-erlang_16.b.2.basho10-1~ubuntu~artful_amd64.deb"
[16.b.3]="esl-erlang_16.b.3-1~ubuntu~precise_amd64.deb"
[17.0]="esl-erlang_17.0-1~ubuntu~precise_amd64.deb"
[17.1]="esl-erlang_17.1-1~ubuntu~precise_amd64.deb"
[17.3]="esl-erlang_17.3-2~ubuntu~precise_amd64.deb"
[17.3.2]="esl-erlang_17.3.2-1~ubuntu~precise_amd64.deb"
[17.4]="esl-erlang_17.4-2~ubuntu~precise_amd64.deb"
[17.5]="esl-erlang_17.5-1~ubuntu~precise_amd64.deb"
[17.5.3]="esl-erlang_17.5.3-1~ubuntu~precise_amd64.deb"
[18.0]="esl-erlang_18.0-1~ubuntu~precise_amd64.deb"
[18.1]="esl-erlang_18.1-1~ubuntu~precise_amd64.deb"
[18.2]="esl-erlang_18.2-1~ubuntu~precise_amd64.deb"
[18.3]="esl-erlang_18.3-1~ubuntu~precise_amd64.deb"
[18.3.4]="esl-erlang_18.3.4-1~ubuntu~precise_amd64.deb"
[18.3.4.11]="esl-erlang_18.3.4.11-1~ubuntu~bionic_amd64.deb"
[18.3.4.5]="esl-erlang_18.3.4.5-1~ubuntu~yakkety_amd64.deb"
[19.0]="esl-erlang_19.0-1~ubuntu~precise_amd64.deb"
[19.0.7]="esl-erlang_19.0.7-1~ubuntu~precise_amd64.deb"
[19.1.5]="esl-erlang_19.1.5-1~ubuntu~precise_amd64.deb"
[19.2]="esl-erlang_19.2-1~ubuntu~precise_amd64.deb"
[19.2.3]="esl-erlang_19.2.3-1~ubuntu~precise_amd64.deb"
[19.3]="esl-erlang_19.3-1~ubuntu~precise_amd64.deb"
[19.3.6]="esl-erlang_19.3.6-1~ubuntu~artful_amd64.deb"
[19.3.6.12]="esl-erlang_19.3.6.12-1~ubuntu~bionic_amd64.deb"
[19.3.6.13]="esl-erlang_19.3.6.13-1~ubuntu~bionic_amd64.deb"
[19.3.6.8]="esl-erlang_19.3.6.8-1~ubuntu~bionic_amd64.deb"
[20.0]="esl-erlang_20.0-1~ubuntu~trusty_amd64.deb"
[20.1]="esl-erlang_20.1-1~ubuntu~artful_amd64.deb"
[20.1.7]="esl-erlang_20.1.7-1~ubuntu~artful_amd64.deb"
[20.2.0.1]="esl-erlang_20.2.0.1-1~ubuntu~bionic_amd64.deb"
[20.2.2]="esl-erlang_20.2.2-1~ubuntu~artful_amd64.deb"
[20.3]="esl-erlang_20.3-1~ubuntu~artful_amd64.deb"
[20.3.2.1]="esl-erlang_20.3.2.1-1~ubuntu~bionic_amd64.deb"
[20.3.6]="esl-erlang_20.3.6-1~ubuntu~artful_amd64.deb"
[20.3.8.14]="esl-erlang_20.3.8.14-1~ubuntu~artful_amd64.deb"
[20.3.8.15]="esl-erlang_20.3.8.15-1~ubuntu~bionic_amd64.deb"
[20.3.8.16]="esl-erlang_20.3.8.16-1~ubuntu~bionic_amd64.deb"
[20.3.8.17]="esl-erlang_20.3.8.17-1~ubuntu~bionic_amd64.deb"
[20.3.8.18]="esl-erlang_20.3.8.18-1~ubuntu~bionic_amd64.deb"
[20.3.8.19]="esl-erlang_20.3.8.19-1~ubuntu~bionic_amd64.deb"
[20.3.8.20]="esl-erlang_20.3.8.20-1~ubuntu~bionic_amd64.deb"
[20.3.8.21]="esl-erlang_20.3.8.21-1~ubuntu~bionic_amd64.deb"
[20.3.8.22]="esl-erlang_20.3.8.22-1~ubuntu~bionic_amd64.deb"
[20.3.8.23]="esl-erlang_20.3.8.23-1~ubuntu~bionic_amd64.deb"
[20.3.8.24]="esl-erlang_20.3.8.24-1~ubuntu~bionic_amd64.deb"
[20.3.8.25]="esl-erlang_20.3.8.25-1~ubuntu~bionic_amd64.deb"
[20.3.8.26]="esl-erlang_20.3.8.26-1~ubuntu~bionic_amd64.deb"
[20.3.8.6]="esl-erlang_20.3.8.6-1~ubuntu~artful_amd64.deb"
[21.0]="esl-erlang_21.0-1~ubuntu~artful_amd64.deb"
[21.0.5]="esl-erlang_21.0.5-1~ubuntu~artful_amd64.deb"
[21.1]="esl-erlang_21.1-1~ubuntu~artful_amd64.deb"
[21.1.1]="esl-erlang_21.1.1-1~ubuntu~bionic_amd64.deb"
[21.1.2]="esl-erlang_21.1.2-1~ubuntu~artful_amd64.deb"
[21.1.3]="esl-erlang_21.1.3-1~ubuntu~bionic_amd64.deb"
[21.1.4]="esl-erlang_21.1.4-1~ubuntu~bionic_amd64.deb"
[21.2]="esl-erlang_21.2-1~ubuntu~bionic_amd64.deb"
[21.2.1]="esl-erlang_21.2.1-1~ubuntu~bionic_amd64.deb"
[21.2.2]="esl-erlang_21.2.2-1~ubuntu~bionic_amd64.deb"
[21.2.3]="esl-erlang_21.2.3-1~ubuntu~bionic_amd64.deb"
[21.2.4]="esl-erlang_21.2.4-1~ubuntu~bionic_amd64.deb"
[21.2.5]="esl-erlang_21.2.5-1~ubuntu~bionic_amd64.deb"
[21.2.6]="esl-erlang_21.2.6-1~ubuntu~bionic_amd64.deb"
[21.2.7]="esl-erlang_21.2.7-1~ubuntu~bionic_amd64.deb"
[21.3]="esl-erlang_21.3-1~ubuntu~bionic_amd64.deb"
[21.3.1]="esl-erlang_21.3.1-1~ubuntu~bionic_amd64.deb"
[21.3.2]="esl-erlang_21.3.2-1~ubuntu~bionic_amd64.deb"
[21.3.3]="esl-erlang_21.3.3-1~ubuntu~bionic_amd64.deb"
[21.3.4]="esl-erlang_21.3.4-1~ubuntu~bionic_amd64.deb"
[21.3.5]="esl-erlang_21.3.5-1~ubuntu~bionic_amd64.deb"
[21.3.6]="esl-erlang_21.3.6-1~ubuntu~bionic_amd64.deb"
[21.3.7]="esl-erlang_21.3.7-1~ubuntu~bionic_amd64.deb"
[21.3.7.1]="esl-erlang_21.3.7.1-1~ubuntu~bionic_amd64.deb"
[21.3.8]="esl-erlang_21.3.8-1~ubuntu~bionic_amd64.deb"
[21.3.8.1]="esl-erlang_21.3.8.1-1~ubuntu~bionic_amd64.deb"
[21.3.8.10]="esl-erlang_21.3.8.10-1~ubuntu~bionic_amd64.deb"
[21.3.8.11]="esl-erlang_21.3.8.11-1~ubuntu~bionic_amd64.deb"
[21.3.8.12]="esl-erlang_21.3.8.12-1~ubuntu~bionic_amd64.deb"
[21.3.8.13]="esl-erlang_21.3.8.13-1~ubuntu~bionic_amd64.deb"
[21.3.8.14]="esl-erlang_21.3.8.14-1~ubuntu~bionic_amd64.deb"
[21.3.8.15]="esl-erlang_21.3.8.15-1~ubuntu~bionic_amd64.deb"
[21.3.8.16]="esl-erlang_21.3.8.16-1~ubuntu~bionic_amd64.deb"
[21.3.8.17]="esl-erlang_21.3.8.17-1~ubuntu~bionic_amd64.deb"
[21.3.8.2]="esl-erlang_21.3.8.2-1~ubuntu~bionic_amd64.deb"
[21.3.8.3]="esl-erlang_21.3.8.3-1~ubuntu~bionic_amd64.deb"
[21.3.8.4]="esl-erlang_21.3.8.4-1~ubuntu~bionic_amd64.deb"
[21.3.8.5]="esl-erlang_21.3.8.5-1~ubuntu~bionic_amd64.deb"
[21.3.8.6]="esl-erlang_21.3.8.6-1~ubuntu~bionic_amd64.deb"
[21.3.8.7]="esl-erlang_21.3.8.7-1~ubuntu~bionic_amd64.deb"
[21.3.8.8]="esl-erlang_21.3.8.8-1~ubuntu~bionic_amd64.deb"
[21.3.8.9]="esl-erlang_21.3.8.9-1~ubuntu~bionic_amd64.deb"
[22.0]="esl-erlang_22.0-1~ubuntu~bionic_amd64.deb"
[22.0.1]="esl-erlang_22.0.1-1~ubuntu~bionic_amd64.deb"
[22.0.2]="esl-erlang_22.0.2-1~ubuntu~bionic_amd64.deb"
[22.0.3]="esl-erlang_22.0.3-1~ubuntu~bionic_amd64.deb"
[22.0.4]="esl-erlang_22.0.4-1~ubuntu~bionic_amd64.deb"
[22.0.5]="esl-erlang_22.0.5-1~ubuntu~bionic_amd64.deb"
[22.0.6]="esl-erlang_22.0.6-1~ubuntu~bionic_amd64.deb"
[22.0.7]="esl-erlang_22.0.7-1~ubuntu~bionic_amd64.deb"
[22.1]="esl-erlang_22.1-1~ubuntu~bionic_amd64.deb"
[22.1.1]="esl-erlang_22.1.1-1~ubuntu~bionic_amd64.deb"
[22.1.2]="esl-erlang_22.1.2-1~ubuntu~bionic_amd64.deb"
[22.1.3]="esl-erlang_22.1.3-1~ubuntu~bionic_amd64.deb"
[22.1.4]="esl-erlang_22.1.4-1~ubuntu~bionic_amd64.deb"
[22.1.5]="esl-erlang_22.1.5-1~ubuntu~bionic_amd64.deb"
[22.1.6]="esl-erlang_22.1.6-1~ubuntu~bionic_amd64.deb"
[22.1.7]="esl-erlang_22.1.7-1~ubuntu~bionic_amd64.deb"
[22.1.8]="esl-erlang_22.1.8-1~ubuntu~bionic_amd64.deb"
[22.1.8.1]="esl-erlang_22.1.8.1-1~ubuntu~bionic_amd64.deb"
[22.2]="esl-erlang_22.2-1~ubuntu~bionic_amd64.deb"
[22.2.1]="esl-erlang_22.2.1-1~ubuntu~bionic_amd64.deb"
[22.2.2]="esl-erlang_22.2.2-1~ubuntu~bionic_amd64.deb"
[22.2.3]="esl-erlang_22.2.3-1~ubuntu~bionic_amd64.deb"
[22.2.4]="esl-erlang_22.2.4-1~ubuntu~bionic_amd64.deb"
[22.2.5]="esl-erlang_22.2.5-1~ubuntu~bionic_amd64.deb"
[22.2.6]="esl-erlang_22.2.6-1~ubuntu~bionic_amd64.deb"
[22.2.7]="esl-erlang_22.2.7-1~ubuntu~bionic_amd64.deb"
[22.2.8]="esl-erlang_22.2.8-1~ubuntu~bionic_amd64.deb"
[22.3]="esl-erlang_22.3-1~ubuntu~bionic_amd64.deb"
[22.3.1]="esl-erlang_22.3.1-1~ubuntu~bionic_amd64.deb"
[22.3.2]="esl-erlang_22.3.2-1~ubuntu~bionic_amd64.deb"
[22.3.3]="esl-erlang_22.3.3-1~ubuntu~bionic_amd64.deb"
[22.3.4]="esl-erlang_22.3.4-1~ubuntu~bionic_amd64.deb"
[22.3.4.1]="esl-erlang_22.3.4.1-1~ubuntu~bionic_amd64.deb"
[22.3.4.2]="esl-erlang_22.3.4.2-1~ubuntu~bionic_amd64.deb"
[22.3.4.3]="esl-erlang_22.3.4.3-1~ubuntu~bionic_amd64.deb"
[22.3.4.4]="esl-erlang_22.3.4.4-1~ubuntu~bionic_amd64.deb"
[22.3.4.5]="esl-erlang_22.3.4.5-1~ubuntu~bionic_amd64.deb"
[22.3.4.6]="esl-erlang_22.3.4.6-1~ubuntu~bionic_amd64.deb"
[22.3.4.7]="esl-erlang_22.3.4.7-1~ubuntu~bionic_amd64.deb"
[22.3.4.8]="esl-erlang_22.3.4.8-1~ubuntu~bionic_amd64.deb"
[22.3.4.9]="esl-erlang_22.3.4.9-1~ubuntu~bionic_amd64.deb"
[23.0]="esl-erlang_23.0-1~ubuntu~bionic_amd64.deb"
[23.0.1]="esl-erlang_23.0.1-1~ubuntu~bionic_amd64.deb"
[23.0.2]="esl-erlang_23.0.2-1~ubuntu~bionic_amd64.deb"
[23.0.3]="esl-erlang_23.0.3-1~ubuntu~bionic_amd64.deb"
[23.1]="esl-erlang_23.1-1~ubuntu~bionic_amd64.deb"
[23.1.2]="esl-erlang_23.1.2-1~ubuntu~bionic_amd64.deb"
[23.1.5]="esl-erlang_23.1.5-1~ubuntu~bionic_amd64.deb"
[23.2]="esl-erlang_23.2-1~ubuntu~bionic_amd64.deb"
[23.2.1]="esl-erlang_23.2.1-1~ubuntu~bionic_amd64.deb"
[23.2.3]="esl-erlang_23.2.3-1~ubuntu~bionic_amd64.deb"
[23.2.7.4]="esl-erlang_23.2.7.4-1~ubuntu~bionic_amd64.deb"
[23.3.1]="esl-erlang_23.3.1-1~ubuntu~bionic_amd64.deb"
[23.3.4.5]="esl-erlang_23.3.4.5-1~ubuntu~bionic_amd64.deb"
[24.0]="esl-erlang_24.0-1~ubuntu~bionic_amd64.deb"
[24.0.1]="esl-erlang_24.0.1-1~ubuntu~bionic_amd64.deb"
[24.0.2]="esl-erlang_24.0.2-1~ubuntu~bionic_amd64.deb"
[24.0.4]="esl-erlang_24.0.4-1~ubuntu~bionic_amd64.deb"
[24.0.5]="esl-erlang_24.0.5-1~ubuntu~bionic_amd64.deb"
[24.0.6]="esl-erlang_24.0.6-1~ubuntu~bionic_amd64.deb"
[24.1]="esl-erlang_24.1-1~ubuntu~bionic_amd64.deb"
[24.1.1]="esl-erlang_24.1.1-1~ubuntu~bionic_amd64.deb"
[24.1.2]="esl-erlang_24.1.2-1~ubuntu~bionic_amd64.deb"
[24.1.3]="esl-erlang_24.1.3-1~ubuntu~bionic_amd64.deb"
[24.1.4]="esl-erlang_24.1.4-1~ubuntu~bionic_amd64.deb"
[24.1.5]="esl-erlang_24.1.5-1~ubuntu~bionic_amd64.deb"
[24.1.6]="esl-erlang_24.1.6-1~ubuntu~bionic_amd64.deb"
[24.1.7]="esl-erlang_24.1.7-1~ubuntu~bionic_amd64.deb"
[24.2]="esl-erlang_24.2-1~ubuntu~bionic_amd64.deb"
[24.2.1]="esl-erlang_24.2.1-1~ubuntu~bionic_amd64.deb"
[24.2.2]="esl-erlang_24.2.2-1~ubuntu~bionic_amd64.deb"
[24.3]="esl-erlang_24.3-1~ubuntu~bionic_amd64.deb"
[24.3.1]="esl-erlang_24.3.1-1~ubuntu~bionic_amd64.deb"
[24.3.2]="esl-erlang_24.3.2-1~ubuntu~bionic_amd64.deb"
[24.3.3]="esl-erlang_24.3.3-1~ubuntu~bionic_amd64.deb"
[25.0]="esl-erlang_25.0-1~ubuntu~bionic_amd64.deb"
[25.0.1]="esl-erlang_25.0.1-1~ubuntu~bionic_amd64.deb"
[25.0.2]="esl-erlang_25.0.2-1~ubuntu~bionic_amd64.deb"
[25.0.3]="esl-erlang_25.0.3-1~ubuntu~bionic_amd64.deb"
[25.0.4]="esl-erlang_25.0.4-1~ubuntu~bionic_amd64.deb"
[25.2.3]="esl-erlang_25.2.3-1~ubuntu~bionic_amd64.deb"
[25.3]="esl-erlang_25.3-1~ubuntu~bionic_amd64.deb"
)
function list_versions() {
for key in "${!VERSIONS[@]}"; do
echo "* $key"
done | sort;
}
function install() {
if ! mkdir -p /usr/local/erlang/; then
echo "Can't create /usr/local/erlang! Maybe try running as root?" >&2;
exit 1;
fi;
local otp_ver="$1";
validate_var "$otp_ver" "No OTP version provided!";
if [[ -d /usr/local/erlang/${otp_ver}/ ]]; then
echo "Erlang installation already exists at /usr/local/erlang/${otp_ver}" >&2;
exit 0;
fi;
local package="${VERSIONS[$otp_ver]}";
validate_var "$package" "No package found for version '$otp_ver'"
rm -f /tmp/erlang_${otp_ver}.deb;
if ! curl -s "$PACKAGES_URL/$package" -o /tmp/erlang_${otp_ver}.deb; then
echo "Failed to download $PACKAGES_URL/$package!";
exit 1;
fi;
rm -rf /tmp/erlang_${otp_ver};
mkdir /tmp/erlang_${otp_ver};
ar x /tmp/erlang_${otp_ver}.deb --output /tmp/erlang_${otp_ver}/;
local flags="-xJf";
if [[ -f /tmp/erlang_${otp_ver}/data.tar.gz ]]; then
flags="-xzf";
fi;
tar $flags /tmp/erlang_${otp_ver}/data.tar.*z -C /tmp/erlang_${otp_ver}/;
if ! mv /tmp/erlang_${otp_ver}/usr/lib/erlang /usr/local/erlang/${otp_ver}; then
echo "Can't move erlang installation to /usr/local/erlang/! Maybe try running as root?" >&2;
exit 1;
fi;
local depends=$(tar $flags /tmp/erlang_${otp_ver}/control.tar.*z -O | grep Depends | cut -d':' -f2);
echo "It is recommended that you install: $depends" >&2;
if ! /usr/local/erlang/${otp_ver}/Install -minimal /usr/local/erlang/${otp_ver}; then
echo "Failed to run erlang install! Maybe try running as root?" >&2;
exit 1;
fi;
rm -f /tmp/erlang_${otp_ver}.deb;
rm -rf /tmp/erlang_${otp_ver};
}
function main() {
local action="$1";
validate_var "$action" "No action specified!";
case $action in
list)
list_versions;
;;
install)
install "$2";
;;
*)
usage;
;;
esac
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment