Files

197 lines
6.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$(cd "$(dirname "$0")" && pwd)"
# 安装目录确认(默认使用脚本所在目录)
DEFAULT_INSTALL_DIR="$REPO_DIR"
echo "默认安装目录: $DEFAULT_INSTALL_DIR"
read -r -p "请输入安装目录(回车使用默认): " INSTALL_DIR_INPUT
if [ -z "$INSTALL_DIR_INPUT" ]; then
INSTALL_DIR="$DEFAULT_INSTALL_DIR"
else
INSTALL_DIR="$INSTALL_DIR_INPUT"
fi
# 创建并解析目标路径为绝对路径
mkdir -p "$INSTALL_DIR"
INSTALL_DIR="$(cd "$INSTALL_DIR" && pwd)"
if [ "$INSTALL_DIR" != "$REPO_DIR" ]; then
echo "选择的安装目录 ($INSTALL_DIR) 与脚本所在目录 ($REPO_DIR) 不同。"
if [ -f "$INSTALL_DIR/run_main.sh" ] || [ -f "$INSTALL_DIR/install.sh" ]; then
echo "目标目录已包含仓库文件;将在该目录继续安装。"
REPO_DIR="$INSTALL_DIR"
else
read -r -p "目标目录不包含本仓库。是否将当前仓库复制到 $INSTALL_DIR 并在其下继续安装?输入 'yes' 或 'y' 表示同意(默认 no " COPY_REPLY
COPY_REPLY="${COPY_REPLY:-no}"
case "${COPY_REPLY,,}" in
y|yes||1)
COPY_CONFIRM=1
;;
*)
COPY_CONFIRM=0
;;
esac
if [ "$COPY_CONFIRM" -eq 1 ]; then
if command -v rsync >/dev/null 2>&1; then
rsync -a --exclude='.git' "$REPO_DIR/" "$INSTALL_DIR/"
else
cp -a "$REPO_DIR/." "$INSTALL_DIR/"
fi
REPO_DIR="$INSTALL_DIR"
echo "仓库已复制到 $REPO_DIR"
else
echo "将继续使用脚本所在目录作为仓库路径:$REPO_DIR"
echo "注意systemd 服务和脚本仍将引用 $REPO_DIR"
fi
fi
fi
# 依赖于 REPO_DIR 的路径和变量
VENV_DIR="$REPO_DIR/venv"
PYTHON_BIN="${PYTHON:-python3}"
PRUSA_URL="https://github.com/davidk/PrusaSlicer-ARM.AppImage/releases/download/version_2.9.4/PrusaSlicer-2.9.4-aarch64-full.AppImage"
PRUSA_DIR="$REPO_DIR/prusaslicer"
PRUSA_FILE="$PRUSA_DIR/$(basename "$PRUSA_URL")"
PRUSA_SKIP_DOWNLOAD="${PRUSA_SKIP_DOWNLOAD:-0}"
PRUSA_AGPL_ACCEPT="${PRUSA_AGPL_ACCEPT:-0}"
echo "正在将 AIO_3D_Print_Web_Platform 安装到:$REPO_DIR"
echo "使用的 Python: $PYTHON_BIN"
echo "如果服务正在运行,将尝试停止它们(可能需要 sudo"
sudo systemctl stop aio-3d-main.service 2>/dev/null || true
sudo systemctl stop aio-3d-huey.service 2>/dev/null || true
echo "正在创建虚拟环境(如果不存在):$VENV_DIR"
if [ ! -d "$VENV_DIR" ]; then
$PYTHON_BIN -m venv "$VENV_DIR"
fi
echo "正在激活虚拟环境并安装 Python 依赖"
# shellcheck disable=SC1091
source "$VENV_DIR/bin/activate"
# 检测 http(s) 代理(支持大小写环境变量)
PROXY=""
if [ -n "${HTTPS_PROXY:-}" ]; then
PROXY="$HTTPS_PROXY"
elif [ -n "${https_proxy:-}" ]; then
PROXY="$https_proxy"
elif [ -n "${HTTP_PROXY:-}" ]; then
PROXY="$HTTP_PROXY"
elif [ -n "${http_proxy:-}" ]; then
PROXY="$http_proxy"
fi
pip_with_proxy() {
# 用法: pip_with_proxy install [参数...]
if [ -n "$PROXY" ] && [ "$1" = "install" ]; then
shift
pip install --proxy "$PROXY" "$@"
else
pip "$@"
fi
}
pip_with_proxy install --upgrade pip setuptools wheel
if [ -f "$REPO_DIR/requirements.txt" ]; then
pip_with_proxy install -r "$REPO_DIR/requirements.txt"
else
echo "警告:在 $REPO_DIR 未找到 requirements.txt"
fi
echo "确保运行脚本具有可执行权限"
chmod +x "$REPO_DIR/run_main.sh" "$REPO_DIR/run_huey.sh"
echo "正在检查 PrusaSlicer AppImage可选"
mkdir -p "$PRUSA_DIR"
if [ ! -f "$PRUSA_FILE" ]; then
if [ "$PRUSA_SKIP_DOWNLOAD" = "1" ]; then
echo "检测到 PRUSA_SKIP_DOWNLOAD=1跳过 PrusaSlicer 下载。"
else
cat <<'AGPL_NOTICE'
PrusaSlicer 使用 GNU Affero General Public License v3 (AGPLv3) 授权。
源码仓库: https://github.com/prusa3d/PrusaSlicer
本安装器引用的二进制仓库: https://github.com/davidk/PrusaSlicer-ARM.AppImage
下载并运行 PrusaSlicer 即表示您同意 AGPLv3 的许可条款。
如果您通过网络向用户提供基于该软件的服务AGPLv3 可能要求您向用户提供相应源码。
详情请参见 third_party/PRUSASLICER.md 获取源码与合规说明。
AGPL_NOTICE
if [ "$PRUSA_AGPL_ACCEPT" != "1" ]; then
read -r -p "是否接受 AGPLv3 许可并允许下载 PrusaSlicer 二进制?输入 'yes' 或 'y' 表示同意(或设置 PRUSA_AGPL_ACCEPT=1 自动同意): " PRUSA_REPLY
else
PRUSA_REPLY="yes"
fi
case "${PRUSA_REPLY,,}" in
y|yes||1)
PRUSA_APPROVED=1
;;
*)
PRUSA_APPROVED=0
;;
esac
if [ "$PRUSA_APPROVED" -eq 1 ]; then
echo "正在下载 PrusaSlicer AppImage 到 $PRUSA_FILE"
if command -v curl >/dev/null 2>&1; then
if [ -n "$PROXY" ]; then
curl -x "$PROXY" -L -o "$PRUSA_FILE" "$PRUSA_URL"
else
curl -L -o "$PRUSA_FILE" "$PRUSA_URL"
fi
elif command -v wget >/dev/null 2>&1; then
if [ -n "$PROXY" ]; then
env HTTP_PROXY="$PROXY" HTTPS_PROXY="$PROXY" wget -O "$PRUSA_FILE" "$PRUSA_URL"
else
wget -O "$PRUSA_FILE" "$PRUSA_URL"
fi
else
echo "警告:未检测到 curl 或 wget无法自动下载 PrusaSlicer AppImage。"
fi
if [ -f "$PRUSA_FILE" ]; then
chmod +x "$PRUSA_FILE"
fi
else
echo "用户未接受 AGPL已跳过 PrusaSlicer 下载。"
fi
fi
else
echo "已存在 PrusaSlicer AppImage$PRUSA_FILE"
fi
echo "准备并安装 systemd 服务文件(需要 sudo"
for svc in "aio-3d-main.service" "aio-3d-huey.service"; do
SRC="$REPO_DIR/$svc"
if [ ! -f "$SRC" ]; then
echo "警告:未找到 $SRC,跳过"
continue
fi
if [ "$svc" = "aio-3d-main.service" ]; then
EXEC="$REPO_DIR/run_main.sh"
else
EXEC="$REPO_DIR/run_huey.sh"
fi
TMPFILE="/tmp/$svc"
awk -v wd="$REPO_DIR" -v exec="$EXEC" '
{ if ($0 ~ /^WorkingDirectory=/) { print "WorkingDirectory=" wd; next } \
if ($0 ~ /^ExecStart=/) { print "ExecStart=" exec; next } \
print $0 }' "$SRC" > "$TMPFILE"
echo "正在安装 $svc -> /etc/systemd/system/$svc"
sudo cp "$TMPFILE" "/etc/systemd/system/$svc"
done
echo "重新加载 systemd 守护进程并启用服务"
sudo systemctl daemon-reload
sudo systemctl enable aio-3d-main.service aio-3d-huey.service || true
sudo systemctl restart aio-3d-huey.service || true
sudo systemctl restart aio-3d-main.service || true
echo "安装完成"