diff --git a/install.sh b/install.sh index 23724a1..cd8745d 100644 --- a/install.sh +++ b/install.sh @@ -1,10 +1,10 @@ -#!/usr/bin/env bash +#!/bin/sh # This script will install the latest version of Mailpit. # Check dependencias is installed for cmd in curl tar; do - if ! command -v "$cmd" &>/dev/null; then + if ! command -v "$cmd" >/dev/null 2>&1; then echo "Then $cmd command is required but not installed." echo "Please install $cmd and try again." exit 1 @@ -42,58 +42,75 @@ esac GH_REPO="axllent/mailpit" INSTALL_PATH="/usr/local/bin" -TIMEOUT=90 # --max-time in curl - -# The arguments in extended format for the curl command. -CURL_ARGS=( - "--silent" - "--fail" - "--location" - "--max-time" "$TIMEOUT" -) +TIMEOUT=90 # This is used to authenticate with the GitHub API. (Fix the public rate limiting issue) -AUTH_TOKEN="${GITHUB_TOKEN:-}" +# Try the GITHUB_TOKEN environment variable is set globally. +GITHUB_API_TOKEN="${GITHUB_TOKEN:-}" # Update the default values if the user has set. -while [[ $# -gt 0 ]]; do +while [ $# -gt 0 ]; do case $1 in --install-path) shift - INSTALL_PATH="$1" + case "$1" in + */*) + # Remove trailing slashes from the path. + INSTALL_PATH="$(echo "$1" | sed 's#/\+$##')" + [ -z "$INSTALL_PATH" ] && INSTALL_PATH="/" + ;; + esac ;; --auth | --auth-token | --github-token | --token) shift - [[ "${1:-}" =~ ^- ]] || AUTH_TOKEN="$1" + case "$1" in + gh*) + GITHUB_API_TOKEN="$1" + ;; + esac ;; *) ;; esac shift done -# Set the header auth if the user has set a GitHub token. -if [[ -n "$AUTH_TOKEN" ]] && [[ "$AUTH_TOKEN" =~ ^gh[pousr]_[A-Za-z0-9_]{36,251}$ ]]; then - CURL_ARGS+=("--header" "Authorization: 'Bearer $AUTH_TOKEN'") +# Description of the sort parameters for curl command. +# -s: Silent mode. +# -f: Fail silently on server errors. +# -L: Follow redirects. +# -m: Set maximum time allowed for the transfer. + +if [ -n "$GITHUB_API_TOKEN" ] && [ "${#GITHUB_API_TOKEN}" -gt 36 ]; then + CURL_OUTPUT="$(curl -sfL -m $TIMEOUT -H "Authorization: Bearer $GITHUB_API_TOKEN" https://api.github.com/repos/${GH_REPO}/releases/latest)" + EXIT_CODE=$? +else + CURL_OUTPUT="$(curl --sfL -m $TIMEOUT https://api.github.com/repos/${GH_REPO}/releases/latest)" + EXIT_CODE=$? fi -CURL_OUTPUT=$(curl "${CURL_ARGS[@]}" "https://api.github.com/repos/${GH_REPO}/releases/latest") -EXIT_CODE=$? -if [[ $EXIT_CODE -eq 0 ]]; then +VERSION="" +if [ $EXIT_CODE -eq 0 ]; then # Extracts the latest version using jq, awk, or sed. - if command -v jq &>/dev/null; then - VERSION=$(echo "$CURL_OUTPUT" | jq -r '.tag_name') - elif command -v awk &>/dev/null; then + if command -v jq >/dev/null 2>&1; then + # Use jq -n because the output is not a valid JSON in sh. + VERSION=$(jq -n "$CURL_OUTPUT" | jq -r '.tag_name') + elif command -v awk >/dev/null 2>&1; then VERSION=$(echo "$CURL_OUTPUT" | awk -F: '$1 ~ /tag_name/ {gsub(/[^v0-9\.]+/, "", $2) ;print $2; exit}') - else + elif command -v sed >/dev/null 2>&1; then VERSION=$(echo "$CURL_OUTPUT" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p') + else + EXIT_CODE=3 fi fi # Validate the version. -if ! [[ "$VERSION" =~ ^v[0-9]{1,}[0-9\.]+$ ]]; then +case "$VERSION" in +v[0-9][0-9\.]*) ;; +*) echo "There was an error trying to check what is the latest version of Mailpit." echo "Please try again later." exit $EXIT_CODE -fi + ;; +esac TEMP_DIR="$(mktemp -qd)" EXIT_CODE=$? @@ -104,33 +121,64 @@ if [ -z "$TEMP_DIR" ] || [ ! -d "$TEMP_DIR" ]; then fi GH_REPO_BIN="mailpit-${OS}-${OS_ARCH}.tar.gz" -CURL_ARGS+=("--output" "${GH_REPO_BIN}") - -if ! cd "$TEMP_DIR"; then - EXIT_CODE=$? - echo "ERROR: Changing to temporary directory." +if [ "$INSTALL_PATH" = "/" ]; then + INSTALL_BIN_PATH="/mailpit" else + INSTALL_BIN_PATH="${INSTALL_PATH}/mailpit" +fi +cd "$TEMP_DIR" || EXIT_CODE=$? +if [ $EXIT_CODE -eq 0 ]; then # Download the latest release. - curl "${CURL_ARGS[@]}" "https://github.com/${GH_REPO}/releases/download/${VERSION}/${GH_REPO_BIN}" + # + # Description of the sort parameters for curl command. + # -s: Silent mode. + # -f: Fail silently on server errors. + # -L: Follow redirects. + # -m: Set maximum time allowed for the transfer. + # -o: Write output to a file instead of stdout. + curl -sfL -m $TIMEOUT -o "${GH_REPO_BIN}" "https://github.com/${GH_REPO}/releases/download/${VERSION}/${GH_REPO_BIN}" EXIT_CODE=$? # The following conditions check each step of the installation. # If there is an error in any of the steps, an error message is printed. - if ! [[ -f "${GH_REPO_BIN}" ]]; then - echo "ERROR: Downloading latest release." - elif ! tar zxf "$GH_REPO_BIN"; then + if [ $EXIT_CODE -eq 0 ]; then + if ! [ -f "${GH_REPO_BIN}" ]; then + EXIT_CODE=1 + echo "ERROR: Downloading latest release." + fi + fi + + if [ $EXIT_CODE -eq 0 ]; then + tar zxf "$GH_REPO_BIN" EXIT_CODE=$? - echo "ERROR: Extracting \"${GH_REPO_BIN}\"." - elif ! mkdir -p "${INSTALL_PATH}"; then + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: Extracting \"${GH_REPO_BIN}\"." + fi + fi + + if [ $EXIT_CODE -eq 0 ] && [ ! -d "$INSTALL_PATH" ]; then + mkdir -p "${INSTALL_PATH}" EXIT_CODE=$? - echo "ERROR: Creating \"${INSTALL_PATH}\" directory." - elif ! cp -f mailpit "${INSTALL_PATH}"; then + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: Creating \"${INSTALL_PATH}\" directory." + fi + fi + + if [ $EXIT_CODE -eq 0 ]; then + cp mailpit "$INSTALL_BIN_PATH" EXIT_CODE=$? - echo "ERROR: Copying mailpit to \"${INSTALL_PATH}\" directory." - elif ! chmod 755 "${INSTALL_PATH}/mailpit"; then + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: Copying mailpit to \"${INSTALL_PATH}\" directory." + fi + fi + + if [ $EXIT_CODE -eq 0 ]; then + chmod 755 "$INSTALL_BIN_PATH" EXIT_CODE=$? - echo "ERROR: Setting permissions for \"${INSTALL_PATH}/mailpit\" binary." + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: Setting permissions for \"$INSTALL_BIN_PATH\" binary." + fi fi # Set the owner and group to root:root if the script is run as root. @@ -143,20 +191,25 @@ else *) ;; esac - if ! chown "${OWNER}:${GROUP}" "${INSTALL_PATH}/mailpit"; then - EXIT_CODE=$? - echo "ERROR: Setting ownership for \"${INSTALL_PATH}/mailpit\" binary." + chown "${OWNER}:${GROUP}" "$INSTALL_BIN_PATH" + EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: Setting ownership for \"$INSTALL_BIN_PATH\" binary." fi fi +else + echo "ERROR: Changing to temporary directory." + exit $EXIT_CODE fi # Cleanup the temporary directory. rm -rf "$TEMP_DIR" # Check the EXIT_CODE variable, and print the success or error message. -if [[ $EXIT_CODE -eq 0 ]]; then - echo "Installed successfully to \"${INSTALL_PATH}/mailpit\"" -else +if [ $EXIT_CODE -ne 0 ]; then echo "There was an error installing Mailpit." echo "Please try again later." + exit $EXIT_CODE fi -exit $EXIT_CODE + +echo "Installed successfully to \"$INSTALL_BIN_PATH\"." +exit 0