refactor: remove Docker from Linux install.sh; fix log file path; add confirm prompt
This commit is contained in:
+38
-167
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# HAPI 管理脚本 (Linux)
|
# HAPI 管理脚本 (Linux)
|
||||||
# 功能:状态查看、安装/升级/卸载 HAPI CLI、部署 Hub Docker、配置开机自启
|
# 功能:状态查看、安装/升级/卸载 HAPI CLI、配置 Hub、配置开机自启
|
||||||
# 支持:版本检测、多途径升级、GitHub Release 自动匹配架构
|
# 支持:版本检测、多途径升级、GitHub Release 自动匹配架构
|
||||||
#
|
#
|
||||||
# 用法:
|
# 用法:
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
# bash install.sh --source github-official # 指定官方 GitHub Release
|
# bash install.sh --source github-official # 指定官方 GitHub Release
|
||||||
# bash install.sh --force # 强制重新安装
|
# bash install.sh --force # 强制重新安装
|
||||||
# bash install.sh --upgrade # 仅升级模式
|
# bash install.sh --upgrade # 仅升级模式
|
||||||
# bash install.sh --skip-hub # 跳过 Hub Docker 配置
|
# bash install.sh --skip-hub # 跳过 Hub 配置(仅安装/升级 CLI)
|
||||||
# bash install.sh --npm-registry https://registry.npmmirror.com
|
# bash install.sh --npm-registry https://registry.npmmirror.com
|
||||||
# bash install.sh --github-mirror https://ghproxy.com
|
# bash install.sh --github-mirror https://ghproxy.com
|
||||||
# bash install.sh --help # 显示帮助
|
# bash install.sh --help # 显示帮助
|
||||||
@@ -24,7 +24,7 @@ set -e
|
|||||||
INSTALL_DIR=""
|
INSTALL_DIR=""
|
||||||
HAPI_BIN_DIR=""
|
HAPI_BIN_DIR=""
|
||||||
HAPI_DATA=""
|
HAPI_DATA=""
|
||||||
LOG_FILE="/tmp/hapi-install.log"
|
LOG_FILE=""
|
||||||
VERSION_FILE=""
|
VERSION_FILE=""
|
||||||
SOURCE_FILE=""
|
SOURCE_FILE=""
|
||||||
NODE_MIN_VERSION=22
|
NODE_MIN_VERSION=22
|
||||||
@@ -68,7 +68,6 @@ INSTALLED_SOURCE=""
|
|||||||
REMOTE_VERSION=""
|
REMOTE_VERSION=""
|
||||||
SELECTED_SOURCE=""
|
SELECTED_SOURCE=""
|
||||||
IS_ROOT=false
|
IS_ROOT=false
|
||||||
HAS_DOCKER=false
|
|
||||||
|
|
||||||
# 系统状态
|
# 系统状态
|
||||||
STATUS_CLI_INSTALLED=false
|
STATUS_CLI_INSTALLED=false
|
||||||
@@ -76,7 +75,6 @@ STATUS_CLI_VERSION=""
|
|||||||
STATUS_CLI_SOURCE=""
|
STATUS_CLI_SOURCE=""
|
||||||
STATUS_CLI_PATH=""
|
STATUS_CLI_PATH=""
|
||||||
STATUS_REMOTE_VERSION=""
|
STATUS_REMOTE_VERSION=""
|
||||||
STATUS_HUB_RUNNING=false
|
|
||||||
STATUS_HUB_CONFIGURED=false
|
STATUS_HUB_CONFIGURED=false
|
||||||
STATUS_AUTOSTART_HUB_ENABLED=""
|
STATUS_AUTOSTART_HUB_ENABLED=""
|
||||||
STATUS_AUTOSTART_HUB_ACTIVE=""
|
STATUS_AUTOSTART_HUB_ACTIVE=""
|
||||||
@@ -88,7 +86,7 @@ CLI_TOKEN=""
|
|||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
# 日志输出
|
# 日志输出
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
log() { echo -e "$1" | tee -a "$LOG_FILE"; }
|
log() { echo -e "$1"; [[ -n "$LOG_FILE" ]] && echo -e "$1" >> "$LOG_FILE"; }
|
||||||
info() { log "${CYAN}[INFO]${NC} $1"; }
|
info() { log "${CYAN}[INFO]${NC} $1"; }
|
||||||
ok() { log "${GREEN}[OK]${NC} $1"; }
|
ok() { log "${GREEN}[OK]${NC} $1"; }
|
||||||
warn() { log "${YELLOW}[WARN]${NC} $1"; }
|
warn() { log "${YELLOW}[WARN]${NC} $1"; }
|
||||||
@@ -112,7 +110,7 @@ HAPI 管理脚本 (Linux)
|
|||||||
github-fork - arkylin/Hapi-Docker GitHub Release
|
github-fork - arkylin/Hapi-Docker GitHub Release
|
||||||
--force 强制重新安装(即使版本相同)
|
--force 强制重新安装(即使版本相同)
|
||||||
--upgrade 仅升级模式(已是最新则退出)
|
--upgrade 仅升级模式(已是最新则退出)
|
||||||
--skip-hub 跳过 Hub Docker 配置(仅安装/升级 CLI)
|
--skip-hub 跳过 Hub 配置(仅安装/升级 CLI)
|
||||||
--npm-registry URL 自定义 npm registry
|
--npm-registry URL 自定义 npm registry
|
||||||
--github-mirror URL 自定义 GitHub 镜像前缀
|
--github-mirror URL 自定义 GitHub 镜像前缀
|
||||||
--help, -h 显示此帮助
|
--help, -h 显示此帮助
|
||||||
@@ -732,18 +730,6 @@ install_nodejs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
# 检查 Docker 权限
|
|
||||||
# ─────────────────────────────────────────
|
|
||||||
check_docker() {
|
|
||||||
if command -v docker &>/dev/null; then
|
|
||||||
if docker info &>/dev/null; then
|
|
||||||
HAS_DOCKER=true
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
HAS_DOCKER=false
|
|
||||||
}
|
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
# 选择安装来源
|
# 选择安装来源
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
@@ -795,15 +781,6 @@ select_source() {
|
|||||||
# 配置 HAPI Hub
|
# 配置 HAPI Hub
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
setup_hub() {
|
setup_hub() {
|
||||||
if [[ "$HAS_DOCKER" != true ]]; then
|
|
||||||
err "Docker 不可用,无法配置 Hub"
|
|
||||||
if [[ "$IS_ROOT" != true ]]; then
|
|
||||||
warn "提示: 将当前用户加入 docker 组,然后重新登录:"
|
|
||||||
warn " sudo usermod -aG docker \$USER"
|
|
||||||
fi
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
step "配置 HAPI Hub"
|
step "配置 HAPI Hub"
|
||||||
|
|
||||||
mkdir -p "$INSTALL_DIR" "$HAPI_DATA"
|
mkdir -p "$INSTALL_DIR" "$HAPI_DATA"
|
||||||
@@ -839,67 +816,7 @@ EOF
|
|||||||
ok "已生成配置文件"
|
ok "已生成配置文件"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat > "$INSTALL_DIR/docker-compose.yml" <<'EOF'
|
ok "HAPI Hub 配置完成,请手动启动 Hub"
|
||||||
services:
|
|
||||||
hapi-hub:
|
|
||||||
image: ghcr.io/arkylin/hapi-docker:latest
|
|
||||||
container_name: hapi-hub
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "3006:3006"
|
|
||||||
volumes:
|
|
||||||
- ./hapi-data:/root/.hapi
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
environment:
|
|
||||||
- HAPI_LISTEN_HOST=0.0.0.0
|
|
||||||
- HAPI_LISTEN_PORT=3006
|
|
||||||
EOF
|
|
||||||
|
|
||||||
(cd "$INSTALL_DIR" && docker compose pull >>"$LOG_FILE" 2>&1)
|
|
||||||
(cd "$INSTALL_DIR" && docker compose up -d >>"$LOG_FILE" 2>&1)
|
|
||||||
|
|
||||||
info "等待 Hub 启动..."
|
|
||||||
for i in {1..30}; do
|
|
||||||
curl -s http://localhost:3006 &>/dev/null && break
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
ok "HAPI Hub 已启动"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
|
||||||
# 停止 HAPI Hub
|
|
||||||
# ─────────────────────────────────────────
|
|
||||||
stop_hub() {
|
|
||||||
if [[ ! -f "$INSTALL_DIR/docker-compose.yml" ]]; then
|
|
||||||
warn "未找到 Hub 配置,无需停止"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$HAS_DOCKER" != true ]]; then
|
|
||||||
err "Docker 不可用"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
step "停止 HAPI Hub"
|
|
||||||
(cd "$INSTALL_DIR" && docker compose down >>"$LOG_FILE" 2>&1)
|
|
||||||
ok "HAPI Hub 已停止"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
|
||||||
# 启动 HAPI Hub
|
|
||||||
# ─────────────────────────────────────────
|
|
||||||
start_hub_only() {
|
|
||||||
if [[ "$HAS_DOCKER" != true ]]; then
|
|
||||||
err "Docker 不可用"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f "$INSTALL_DIR/docker-compose.yml" ]]; then
|
|
||||||
(cd "$INSTALL_DIR" && docker compose up -d >>"$LOG_FILE" 2>&1)
|
|
||||||
ok "HAPI Hub 已启动"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
@@ -916,17 +833,15 @@ setup_systemd() {
|
|||||||
|
|
||||||
cat > /etc/systemd/system/hapi-hub.service <<EOF
|
cat > /etc/systemd/system/hapi-hub.service <<EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=HAPI Hub (Docker Compose)
|
Description=HAPI Hub
|
||||||
After=docker.service network-online.target
|
After=network-online.target
|
||||||
Wants=docker.service
|
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
WorkingDirectory=$INSTALL_DIR
|
WorkingDirectory=$INSTALL_DIR
|
||||||
ExecStartPre=-/usr/bin/docker compose pull
|
ExecStart=$hapi_bin hub start
|
||||||
ExecStart=/usr/bin/docker compose up -d
|
ExecStop=$hapi_bin hub stop
|
||||||
ExecStop=/usr/bin/docker compose down
|
|
||||||
TimeoutStartSec=0
|
TimeoutStartSec=0
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
@@ -1059,7 +974,6 @@ collect_status() {
|
|||||||
STATUS_CLI_SOURCE=""
|
STATUS_CLI_SOURCE=""
|
||||||
STATUS_CLI_PATH=""
|
STATUS_CLI_PATH=""
|
||||||
STATUS_REMOTE_VERSION=""
|
STATUS_REMOTE_VERSION=""
|
||||||
STATUS_HUB_RUNNING=false
|
|
||||||
STATUS_HUB_CONFIGURED=false
|
STATUS_HUB_CONFIGURED=false
|
||||||
STATUS_AUTOSTART_HUB_ENABLED=""
|
STATUS_AUTOSTART_HUB_ENABLED=""
|
||||||
STATUS_AUTOSTART_HUB_ACTIVE=""
|
STATUS_AUTOSTART_HUB_ACTIVE=""
|
||||||
@@ -1076,13 +990,8 @@ collect_status() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Hub 状态
|
# Hub 状态
|
||||||
if [[ -f "$INSTALL_DIR/docker-compose.yml" ]]; then
|
if [[ -f "$INSTALL_DIR/.env" ]]; then
|
||||||
STATUS_HUB_CONFIGURED=true
|
STATUS_HUB_CONFIGURED=true
|
||||||
if [[ "$HAS_DOCKER" == true ]]; then
|
|
||||||
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^hapi-hub$'; then
|
|
||||||
STATUS_HUB_RUNNING=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 自启动状态
|
# 自启动状态
|
||||||
@@ -1114,18 +1023,6 @@ print_status() {
|
|||||||
cli_color=$GREEN
|
cli_color=$GREEN
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local hub_status="未配置"
|
|
||||||
local hub_color=$RED
|
|
||||||
if [[ "$STATUS_HUB_CONFIGURED" == true ]]; then
|
|
||||||
if [[ "$STATUS_HUB_RUNNING" == true ]]; then
|
|
||||||
hub_status="运行中"
|
|
||||||
hub_color=$GREEN
|
|
||||||
else
|
|
||||||
hub_status="已配置 (未运行)"
|
|
||||||
hub_color=$YELLOW
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
local autostart_hub="未设置"
|
local autostart_hub="未设置"
|
||||||
local autostart_runner="未设置"
|
local autostart_runner="未设置"
|
||||||
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" ]]; then
|
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" ]]; then
|
||||||
@@ -1161,12 +1058,6 @@ print_status() {
|
|||||||
echo -e "${BOLD}║${NC} 路径: ${STATUS_CLI_PATH} ${BOLD}║${NC}"
|
echo -e "${BOLD}║${NC} 路径: ${STATUS_CLI_PATH} ${BOLD}║${NC}"
|
||||||
fi
|
fi
|
||||||
echo -e "${BOLD}║${NC} ${BOLD}║${NC}"
|
echo -e "${BOLD}║${NC} ${BOLD}║${NC}"
|
||||||
echo -e "${BOLD}║${NC} ${BOLD}HAPI Hub${NC} ${BOLD}║${NC}"
|
|
||||||
echo -e "${BOLD}║${NC} 状态: ${hub_color}${hub_status}${NC} ${BOLD}║${NC}"
|
|
||||||
if [[ "$STATUS_HUB_CONFIGURED" == true ]]; then
|
|
||||||
echo -e "${BOLD}║${NC} 配置: $INSTALL_DIR ${BOLD}║${NC}"
|
|
||||||
fi
|
|
||||||
echo -e "${BOLD}║${NC} ${BOLD}║${NC}"
|
|
||||||
echo -e "${BOLD}║${NC} ${BOLD}开机自启${NC} ${BOLD}║${NC}"
|
echo -e "${BOLD}║${NC} ${BOLD}开机自启${NC} ${BOLD}║${NC}"
|
||||||
echo -e "${BOLD}║${NC} Hub: ${autostart_hub} ${BOLD}║${NC}"
|
echo -e "${BOLD}║${NC} Hub: ${autostart_hub} ${BOLD}║${NC}"
|
||||||
echo -e "${BOLD}║${NC} Runner: ${autostart_runner} ${BOLD}║${NC}"
|
echo -e "${BOLD}║${NC} Runner: ${autostart_runner} ${BOLD}║${NC}"
|
||||||
@@ -1208,27 +1099,6 @@ main_menu() {
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [[ "$HAS_DOCKER" == true ]]; then
|
|
||||||
if [[ "$STATUS_HUB_CONFIGURED" == false ]]; then
|
|
||||||
echo " $i) 配置并启动 HAPI Hub"
|
|
||||||
options+=("hub")
|
|
||||||
((i++))
|
|
||||||
else
|
|
||||||
if [[ "$STATUS_HUB_RUNNING" == true ]]; then
|
|
||||||
echo " $i) 停止 HAPI Hub"
|
|
||||||
options+=("stop_hub")
|
|
||||||
else
|
|
||||||
echo " $i) 启动 HAPI Hub"
|
|
||||||
options+=("start_hub")
|
|
||||||
fi
|
|
||||||
((i++))
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo -e " ${DIM}Hub 管理 (Docker 不可用)${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
if [[ "$IS_ROOT" == true ]]; then
|
if [[ "$IS_ROOT" == true ]]; then
|
||||||
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" || -n "$STATUS_AUTOSTART_RUNNER_ENABLED" ]]; then
|
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" || -n "$STATUS_AUTOSTART_RUNNER_ENABLED" ]]; then
|
||||||
if [[ "$STATUS_AUTOSTART_HUB_ENABLED" == "enabled" || "$STATUS_AUTOSTART_RUNNER_ENABLED" == "enabled" ]]; then
|
if [[ "$STATUS_AUTOSTART_HUB_ENABLED" == "enabled" || "$STATUS_AUTOSTART_RUNNER_ENABLED" == "enabled" ]]; then
|
||||||
@@ -1366,21 +1236,9 @@ main_menu() {
|
|||||||
read -rp "按 Enter 继续..."
|
read -rp "按 Enter 继续..."
|
||||||
;;
|
;;
|
||||||
|
|
||||||
start_hub)
|
|
||||||
start_hub_only
|
|
||||||
collect_status
|
|
||||||
read -rp "按 Enter 继续..."
|
|
||||||
;;
|
|
||||||
|
|
||||||
stop_hub)
|
|
||||||
stop_hub
|
|
||||||
collect_status
|
|
||||||
read -rp "按 Enter 继续..."
|
|
||||||
;;
|
|
||||||
|
|
||||||
setup_autostart|enable_autostart)
|
setup_autostart|enable_autostart)
|
||||||
if [[ "$STATUS_HUB_CONFIGURED" == false ]]; then
|
if [[ "$STATUS_HUB_CONFIGURED" == false ]]; then
|
||||||
warn "Hub 未配置,先执行配置并启动 HAPI Hub"
|
warn "Hub 未配置,先执行配置"
|
||||||
setup_hub || true
|
setup_hub || true
|
||||||
fi
|
fi
|
||||||
setup_systemd
|
setup_systemd
|
||||||
@@ -1417,17 +1275,6 @@ check_prerequisites() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
ok "基础工具检查通过"
|
ok "基础工具检查通过"
|
||||||
|
|
||||||
check_docker
|
|
||||||
if [[ "$HAS_DOCKER" == true ]]; then
|
|
||||||
ok "Docker 可用"
|
|
||||||
else
|
|
||||||
warn "Docker 不可用"
|
|
||||||
if [[ "$IS_ROOT" != true ]]; then
|
|
||||||
warn "提示: 将当前用户加入 docker 组,然后重新登录:"
|
|
||||||
warn " sudo usermod -aG docker \$USER"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─────────────────────────────────────────
|
# ─────────────────────────────────────────
|
||||||
@@ -1477,6 +1324,29 @@ run_quick_mode() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "$FORCE" != true && "$UPGRADE_ONLY" != true ]]; then
|
||||||
|
local action="安装"
|
||||||
|
[[ -n "$INSTALLED_VERSION" ]] && action="覆盖安装"
|
||||||
|
local src_label=""
|
||||||
|
case "$SELECTED_SOURCE" in
|
||||||
|
npm) src_label="npm registry" ;;
|
||||||
|
github-official) src_label="GitHub (tiann/hapi)" ;;
|
||||||
|
github-fork) src_label="GitHub (arkylin/Hapi-Docker)" ;;
|
||||||
|
esac
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}即将${action} HAPI CLI:${NC}"
|
||||||
|
echo -e " 版本: ${CYAN}v$REMOTE_VERSION${NC}"
|
||||||
|
echo -e " 来源: ${CYAN}$src_label${NC}"
|
||||||
|
echo -e " 目录: ${CYAN}$INSTALL_DIR${NC}"
|
||||||
|
echo ""
|
||||||
|
read -rp "确认${action}? [Y/n]: " confirm
|
||||||
|
if [[ "$confirm" =~ ^[Nn] ]]; then
|
||||||
|
info "已取消"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$SELECTED_SOURCE" == "npm" ]]; then
|
if [[ "$SELECTED_SOURCE" == "npm" ]]; then
|
||||||
install_nodejs || true
|
install_nodejs || true
|
||||||
fi
|
fi
|
||||||
@@ -1487,7 +1357,7 @@ run_quick_mode() {
|
|||||||
github-fork) install_from_github "$GITHUB_FORK_REPO" ;;
|
github-fork) install_from_github "$GITHUB_FORK_REPO" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "$HAS_DOCKER" == true && "$SKIP_HUB" != true ]]; then
|
if [[ "$SKIP_HUB" != true ]]; then
|
||||||
setup_hub
|
setup_hub
|
||||||
if [[ "$IS_ROOT" == true ]]; then
|
if [[ "$IS_ROOT" == true ]]; then
|
||||||
setup_systemd
|
setup_systemd
|
||||||
@@ -1501,7 +1371,8 @@ run_quick_mode() {
|
|||||||
main() {
|
main() {
|
||||||
parse_args "$@"
|
parse_args "$@"
|
||||||
|
|
||||||
: > "$LOG_FILE"
|
LOG_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/hapi-install.log"
|
||||||
|
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true
|
||||||
|
|
||||||
# 如果带有旧版参数,或是管道执行(curl | bash),进入快速模式
|
# 如果带有旧版参数,或是管道执行(curl | bash),进入快速模式
|
||||||
if [[ "$UPGRADE_ONLY" == true || "$FORCE" == true || -n "$SOURCE" || "$SKIP_HUB" == true || -n "$INSTALL_DIR_ARG" || ! -t 0 ]]; then
|
if [[ "$UPGRADE_ONLY" == true || "$FORCE" == true || -n "$SOURCE" || "$SKIP_HUB" == true || -n "$INSTALL_DIR_ARG" || ! -t 0 ]]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user