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.

Revisions

  1. artman41 created this gist Sep 18, 2024.
    342 changes: 342 additions & 0 deletions install_erlang.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,342 @@
    #!/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 "$@"