#!/usr/bin/env bash set -eo pipefail cat<&2; exit $rc' ERR operating_system(){ uname -s | awk '{print tolower($0)}' } architecture(){ uname -m } print_eula() { local pager if command -v less >/dev/null; then pager=(less --prompt="Hit SPACE to move to next page" --quit-at-eof) elif command -v more >/dev/null; then pager=(more) else pager=(cat) fi "${pager[@]}" <> "$log" latest_version="$(echo "$api_response" | grep -oP '(?<="tag_name": ")[^"]+' | tr -d '\r\n' || true)" if [[ -z "$latest_version" ]]; then if echo "$api_response" | grep -qi "API rate limit exceeded"; then echo "GitHub API rate limit exceeded for your IP. Try again later." >&2 exit 1 fi under_maintenance fi # GitHub computes a per-asset digest server-side; we use it as the trust # anchor instead of uploading a separate hash file. Format: "sha256:". expected_digest="$(echo "$api_response" | grep -oP '(?<="digest": ")[^"]+' | head -1)" if [[ -z "$expected_digest" ]]; then echo "[ERROR] Release asset is missing a digest field; refusing to proceed without verification." >&2 exit 1 fi rkn_archive="apex-recon-v$latest_version-$(operating_system)-$(architecture).tar.gz" rkn_url="https://github.com/ecsypno/apex-recon/releases/download/$latest_version/$rkn_archive" rkn_dir="./apex-recon-v$latest_version" rkn_package="./$rkn_archive" rkn_license_file="$HOME/.rkn/license.key" # Clear any partial state from a prior interrupted attempt so the next steps # don't mix old + new files. rm -rf "$rkn_dir" "$rkn_package" echo echo " * Downloading..." curl -fL -C - --retry 12 --retry-delay 1 --retry-all-errors \ "$rkn_url" -o "$rkn_package" echo " * Verifying..." expected_algo="${expected_digest%%:*}" expected_hash="${expected_digest#*:}" case "$expected_algo" in sha256) actual_hash="$(sha256sum "$rkn_package" | awk '{print $1}')" ;; sha512) actual_hash="$(sha512sum "$rkn_package" | awk '{print $1}')" ;; *) echo "[ERROR] Unsupported digest algorithm '$expected_algo'." >&2; exit 1 ;; esac echo "expected $expected_digest, got $expected_algo:$actual_hash" >> "$log" if [[ "$actual_hash" != "$expected_hash" ]]; then echo "[ERROR] Checksum verification failed — the downloaded archive does not match its published $expected_algo hash." >&2 echo " See $log for details. The download has been removed; do not run it." >&2 rm -f "$rkn_package" exit 1 fi echo -n " * Installing..." tar xf "$rkn_package" 2>>"$log" rm -f "$rkn_package" echo "done." if ! [ -f "$rkn_license_file" ]; then echo echo "Apex Recon activation" echo "(If you don't have a license key, get one from https://ecsypno.com -- a free Trial edition is available too.)" key="" read -p "License key: " key if ! "$rkn_dir/bin/apex_activate" "$key"; then echo "Activation was unsuccessful, contact support if you believe this to be a bug." exit 1 fi echo fi if [[ -x "$rkn_dir/bin/apex_edition" ]]; then rkn_edition="$("$rkn_dir/bin/apex_edition")" else rkn_edition="unknown" fi echo echo -n "Apex Recon installed at: " echo $rkn_dir echo "Installation log at: $log" echo echo "* For a CLI scan you can run: $rkn_dir/bin/apex URL" if [[ $rkn_edition == "dev" || $rkn_edition == "trial" || $rkn_edition == "pro" || $rkn_edition == "enterprise" ]]; then echo "* To use Apex Recon Pro you can run: $rkn_dir/bin/apex_pro" fi echo echo "Documentation can be found at: https://documentation.ecsypno.com/rkn/" echo