Improve install script (#144)

* Use `python3` instead of `curl` and `jq`

* Use quote to word splitting

* Remove undefined `local` in POSIX sh

* Added `LLAMA_SWAP_DEFAULT_ADDRESS` to customize the server address

* Added `mktemp` to `NEEDS`
This commit is contained in:
Yuta Hayashibe
2025-05-24 01:39:55 +09:00
committed by GitHub
parent fb44cf4e08
commit 8d2b568897

View File

@@ -4,6 +4,8 @@
set -eu set -eu
LLAMA_SWAP_DEFAULT_ADDRESS=${LLAMA_SWAP_DEFAULT_ADDRESS:-"127.0.0.1:8080"}
red="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 1 || :) 2>&-)" red="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 1 || :) 2>&-)"
plain="$( (/usr/bin/tput sgr0 || :) 2>&-)" plain="$( (/usr/bin/tput sgr0 || :) 2>&-)"
@@ -11,16 +13,16 @@ status() { echo ">>> $*" >&2; }
error() { echo "${red}ERROR:${plain} $*"; exit 1; } error() { echo "${red}ERROR:${plain} $*"; exit 1; }
warning() { echo "${red}WARNING:${plain} $*"; } warning() { echo "${red}WARNING:${plain} $*"; }
available() { command -v $1 >/dev/null; } available() { command -v "$1" >/dev/null; }
require() { require() {
local MISSING='' _MISSING=''
for TOOL in $*; do for TOOL in "$@"; do
if ! available $TOOL; then if ! available "$TOOL"; then
MISSING="$MISSING $TOOL" _MISSING="$_MISSING $TOOL"
fi fi
done done
echo $MISSING echo "$_MISSING"
} }
SUDO= SUDO=
@@ -32,7 +34,7 @@ if [ "$(id -u)" -ne 0 ]; then
SUDO="sudo" SUDO="sudo"
fi fi
NEEDS=$(require curl tee jq tar) NEEDS=$(require tee tar python3 mktemp)
if [ -n "$NEEDS" ]; then if [ -n "$NEEDS" ]; then
status "ERROR: The following tools are required but missing:" status "ERROR: The following tools are required but missing:"
for NEED in $NEEDS; do for NEED in $NEEDS; do
@@ -62,18 +64,40 @@ esac
download_binary() { download_binary() {
ASSET_NAME="linux_$ARCH" ASSET_NAME="linux_$ARCH"
# Fetch the latest release info and extract the matching asset URL TMPDIR=$(mktemp -d)
DL_URL=$(curl -s "https://api.github.com/repos/mostlygeek/llama-swap/releases/latest" | \ trap 'rm -rf "${TMPDIR}"' EXIT INT TERM HUP
jq -r --arg name "$ASSET_NAME" \ PYTHON_SCRIPT=$(cat <<EOF
'.assets[] | select(.name | contains($name)) | .browser_download_url') import os
import json
import sys
import urllib.request
# Check if a URL was successfully extracted ASSET_NAME = "${ASSET_NAME}"
if [ -z "$DL_URL" ]; then
error "No matching asset found with name containing '$ASSET_NAME'." with urllib.request.urlopen("https://api.github.com/repos/mostlygeek/llama-swap/releases/latest") as resp:
data = json.load(resp)
for asset in data.get("assets", []):
if ASSET_NAME in asset.get("name", ""):
url = asset["browser_download_url"]
break
else:
print("ERROR: Matching asset not found.", file=sys.stderr)
exit(1)
print("Downloading:", url, file=sys.stderr)
output_path = os.path.join("${TMPDIR}", "llama-swap.tar.gz")
urllib.request.urlretrieve(url, output_path)
print(output_path)
EOF
)
TARFILE=$(python3 -c "$PYTHON_SCRIPT")
if [ ! -f "$TARFILE" ]; then
error "Failed to download binary."
fi fi
status "Downloading Linux $ARCH binary" status "Extracting to /usr/local/bin"
curl -s -L "$DL_URL" | $SUDO tar -xzf - -C /usr/local/bin llama-swap $SUDO tar -xzf "$TARFILE" -C /usr/local/bin llama-swap
} }
download_binary download_binary
@@ -96,7 +120,7 @@ configure_systemd() {
fi fi
status "Adding current user to llama-swap group..." status "Adding current user to llama-swap group..."
$SUDO usermod -a -G llama-swap $(whoami) $SUDO usermod -a -G llama-swap "$(whoami)"
if [ ! -f "/usr/share/llama-swap/config.yaml" ]; then if [ ! -f "/usr/share/llama-swap/config.yaml" ]; then
status "Creating default config.yaml..." status "Creating default config.yaml..."
@@ -138,7 +162,7 @@ User=llama-swap
Group=llama-swap Group=llama-swap
# set this to match your environment # set this to match your environment
ExecStart=/usr/local/bin/llama-swap --config /usr/share/llama-swap/config.yaml --watch-config ExecStart=/usr/local/bin/llama-swap --config /usr/share/llama-swap/config.yaml --watch-config -listen ${LLAMA_SWAP_DEFAULT_ADDRESS}
Restart=on-failure Restart=on-failure
RestartSec=3 RestartSec=3
@@ -172,7 +196,7 @@ if available systemctl; then
fi fi
install_success() { install_success() {
status 'The llama-swap API is now available at 127.0.0.1:8080.' status "The llama-swap API is now available at http://${LLAMA_SWAP_DEFAULT_ADDRESS}"
status 'Customize the config file at /usr/share/llama-swap/config.yaml.' status 'Customize the config file at /usr/share/llama-swap/config.yaml.'
status 'Install complete.' status 'Install complete.'
} }