#!/usr/bin/env bash
set -euo pipefail

readonly LOG_TAG="contabo-rc"
readonly TARGET_DIR="/usr/local/lib/contabo-rc"
readonly TARGET_PATH="${TARGET_DIR}/update.sh"
readonly MAX_RETRIES=3
readonly RETRY_DELAY=3

log() {
  logger -t "$LOG_TAG" -p daemon.info "$*"
  echo "[contabo-rc-fetch] $*"
}

parse_rc_url() {
  local cmdline param
  cmdline="$(< /proc/cmdline)"
  for param in $cmdline; do
    case "$param" in
      contabo-rc=*)
        echo "${param#contabo-rc=}"
        return 0
        ;;
    esac
  done
  return 1
}

download() {
  local url="$1" dest="$2" attempt tmp
  tmp="$(mktemp "${TARGET_DIR}/update.sh.XXXXXX")"
  trap 'rm -f "$tmp"' RETURN
  for attempt in $(seq 1 "$MAX_RETRIES"); do
    log "Downloading ${url} (attempt ${attempt}/${MAX_RETRIES})"
    if wget -q -O "$tmp" --timeout=30 --tries=1 "$url" 2>/dev/null && [[ -s "$tmp" ]]; then
      mv -f "$tmp" "$dest"
      trap - RETURN
      return 0
    fi
    rm -f "$tmp"
    tmp="$(mktemp "${TARGET_DIR}/update.sh.XXXXXX")"
    sleep "$RETRY_DELAY"
  done
  rm -f "$tmp"
  trap - RETURN
  return 1
}

main() {
  local rc_url
  if ! rc_url="$(parse_rc_url)"; then
    log "No contabo-rc= found. Skipping."
    exit 0
  fi
  if [[ -z "$rc_url" ]]; then
    log "contabo-rc is empty. Skipping."
    exit 0
  fi
  if [[ "$rc_url" != http://* && "$rc_url" != https://* ]]; then
    log "contabo-rc URL is invalid: $rc_url"
    exit 0
  fi

  mkdir -p "$TARGET_DIR"
  if ! download "$rc_url" "$TARGET_PATH"; then
    log "Download failed from $rc_url. Continuing boot."
    exit 0
  fi
  if [[ ! -s "$TARGET_PATH" ]]; then
    log "Downloaded script is empty. Continuing boot."
    exit 0
  fi

  chmod 0700 "$TARGET_PATH"
  if ! "$TARGET_PATH"; then
    log "Downloaded script exited non-zero. Continuing boot."
    exit 0
  fi
}

main "$@"
