#!/bin/bash if [ "$DEBUG" == "1" ]; then set -x fi TMP_DIR=$(mktemp -d -t krayt-installer-XXXXXXXXXX) function cleanup { rm -rf $TMP_DIR >/dev/null } function fail { cleanup msg=$1 echo "============" echo "Error: $msg" 1>&2 exit 1 } function check_uv { if ! command -v uv &>/dev/null; then echo " Error: uv is not installed" echo "krayt requires uv to run. You can install it with:" echo " curl -LsSf https://astral.sh/uv/install.sh | sh" echo "" echo "Or visit: https://github.com/astral/uv for more installation options" echo "" fail "uv not found" fi } function setup_config_dir { # Create config directory CONFIG_DIR="${HOME}/.config/krayt" mkdir -p "${CONFIG_DIR}/init.d" # Create example init script if it doesn't exist EXAMPLE_SCRIPT="${CONFIG_DIR}/init.d/00_proxy.sh.example" if [ ! -f "$EXAMPLE_SCRIPT" ]; then cat > "$EXAMPLE_SCRIPT" << 'EOF' #!/bin/sh # Example initialization script for Krayt inspector pods # This script runs before any packages are installed # To use this script, rename it to remove the .example extension # Example: Set up proxy configuration setup_proxy() { # Uncomment and modify these lines to set up your proxy # export HTTP_PROXY="http://proxy.example.com:8080" # export HTTPS_PROXY="http://proxy.example.com:8080" # export NO_PROXY="localhost,127.0.0.1,.example.com" # Set up proxy for apk if needed if [ ! -z "$HTTP_PROXY" ]; then echo "proxy = $HTTP_PROXY" >> /etc/apk/repositories fi } # Example: Add custom Alpine repositories setup_repos() { # Uncomment to add custom repos # echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories : } # Run the setup functions setup_proxy setup_repos # Log the configuration echo "Krayt inspector pod initialization complete" echo "Proxy settings:" echo "HTTP_PROXY=$HTTP_PROXY" echo "HTTPS_PROXY=$HTTPS_PROXY" echo "NO_PROXY=$NO_PROXY" EOF fi echo "Created config directory at ${CONFIG_DIR}" echo "Example init script created at ${EXAMPLE_SCRIPT}" } function install { #settings USER="waylonwalker" PROG="krayt" ASPROG="krayt" MOVE="false" RELEASE="{{VERSION}}" INSECURE="false" OUT_DIR="$(pwd)" GH="https://github.com" #bash check [ ! "$BASH_VERSION" ] && fail "Please use bash instead" [ ! -d $OUT_DIR ] && fail "output directory missing: $OUT_DIR" #dependency check, assume we are a standard POISX machine which find >/dev/null || fail "find not installed" which xargs >/dev/null || fail "xargs not installed" which sort >/dev/null || fail "sort not installed" which tail >/dev/null || fail "tail not installed" which cut >/dev/null || fail "cut not installed" which du >/dev/null || fail "du not installed" #choose an HTTP client GET="" if which curl >/dev/null; then GET="curl" if [[ $INSECURE = "true" ]]; then GET="$GET --insecure"; fi GET="$GET --fail -# -L" elif which wget >/dev/null; then GET="wget" if [[ $INSECURE = "true" ]]; then GET="$GET --no-check-certificate"; fi GET="$GET -qO-" else fail "neither wget/curl are installed" fi #debug HTTP if [ "$DEBUG" == "1" ]; then GET="$GET -v" fi #optional auth to install from private repos #NOTE: this also needs to be set on your instance of installer AUTH="${GITHUB_TOKEN}" if [ ! -z "$AUTH" ]; then GET="$GET -H 'Authorization: $AUTH'" fi #find OS #TODO BSDs and other posixs case $(uname -s) in Darwin) OS="darwin" ;; Linux) OS="linux" ;; *) fail "unknown os: $(uname -s)" ;; esac #find ARCH if uname -m | grep -E '(arm|arch)64' >/dev/null; then ARCH="arm64" # no m1 assets. if on mac arm64, rosetta allows fallback to amd64 if [[ $OS = "darwin" ]]; then ARCH="amd64" fi elif uname -m | grep 64 >/dev/null; then ARCH="amd64" elif uname -m | grep arm >/dev/null; then ARCH="arm" #TODO armv6/v7 elif uname -m | grep 386 >/dev/null; then ARCH="386" else fail "unknown arch: $(uname -m)" fi #choose from asset list URL="" FTYPE="" case "${OS}_${ARCH}" in "linux_amd64") URL="https://github.com/WaylonWalker/krayt/releases/download/v${RELEASE}/krayt-${RELEASE}-x86_64-unknown-linux-gnu.tar.gz" FTYPE=".tar.gz" ;; "linux_arm64") URL="https://github.com/WaylonWalker/krayt/releases/download/v${RELEASE}/krayt-${RELEASE}-aarch64-unknown-linux-gnu.tar.gz" FTYPE=".tar.gz" ;; *) fail "No asset for platform ${OS}-${ARCH}" ;; esac #got URL! download it... echo -n "Downloading" echo -n " $USER/$PROG" if [ ! -z "$RELEASE" ]; then echo -n " $RELEASE" fi if [ ! -z "$ASPROG" ]; then echo -n " as $ASPROG" fi echo -n " (${OS}/${ARCH})" echo "....." #enter tempdir mkdir -p $TMP_DIR cd $TMP_DIR if [[ $FTYPE = ".gz" ]]; then which gzip >/dev/null || fail "gzip is not installed" bash -c "$GET $URL" | gzip -d - >$PROG || fail "download failed" elif [[ $FTYPE = ".bz2" ]]; then which bzip2 >/dev/null || fail "bzip2 is not installed" bash -c "$GET $URL" | bzip2 -d - >$PROG || fail "download failed" elif [[ $FTYPE = ".tar.bz" ]] || [[ $FTYPE = ".tar.bz2" ]]; then which tar >/dev/null || fail "tar is not installed" which bzip2 >/dev/null || fail "bzip2 is not installed" bash -c "$GET $URL" | tar jxf - || fail "download failed" elif [[ $FTYPE = ".tar.gz" ]] || [[ $FTYPE = ".tgz" ]]; then which tar >/dev/null || fail "tar is not installed" which gzip >/dev/null || fail "gzip is not installed" bash -c "$GET $URL" | tar zxf - || fail "download failed" elif [[ $FTYPE = ".zip" ]]; then which unzip >/dev/null || fail "unzip is not installed" bash -c "$GET $URL" >tmp.zip || fail "download failed" unzip -o -qq tmp.zip || fail "unzip failed" rm tmp.zip || fail "cleanup failed" elif [[ $FTYPE = ".bin" ]]; then bash -c "$GET $URL" >"krayt_${OS}_${ARCH}" || fail "download failed" else fail "unknown file type: $FTYPE" fi #search subtree largest file (bin) TMP_BIN=$(find . -type f | xargs du | sort -n | tail -n 1 | cut -f 2) if [ ! -f "$TMP_BIN" ]; then fail "could not find find binary (largest file)" fi #ensure its larger than 1MB #TODO linux=elf/darwin=macho file detection? if [[ $(du -m $TMP_BIN | cut -f1) -lt 1 ]]; then fail "no binary found ($TMP_BIN is not larger than 1MB)" fi #move into PATH or cwd chmod +x $TMP_BIN || fail "chmod +x failed" DEST="$OUT_DIR/$PROG" if [ ! -z "$ASPROG" ]; then DEST="$OUT_DIR/$ASPROG" fi #move without sudo OUT=$(mv $TMP_BIN $DEST 2>&1) STATUS=$? # failed and string contains "Permission denied" if [ $STATUS -ne 0 ]; then if [[ $OUT =~ "Permission denied" ]]; then echo "mv with sudo..." sudo mv $TMP_BIN $DEST || fail "sudo mv failed" else fail "mv failed ($OUT)" fi fi echo "Downloaded to $DEST" #done cleanup check_uv } install setup_config_dir