添加更新脚本,修改README
This commit is contained in:
@@ -58,6 +58,8 @@
|
|||||||
|
|
||||||
- [install.sh](./install.sh)
|
- [install.sh](./install.sh)
|
||||||
Linux 安装脚本
|
Linux 安装脚本
|
||||||
|
- [update.sh](./update.sh)
|
||||||
|
Linux 升级脚本
|
||||||
- [option/xboard.go](./option/xboard.go)
|
- [option/xboard.go](./option/xboard.go)
|
||||||
`services.xboard` 配置结构
|
`services.xboard` 配置结构
|
||||||
- [service/xboard/service.go](./service/xboard/service.go)
|
- [service/xboard/service.go](./service/xboard/service.go)
|
||||||
@@ -76,6 +78,13 @@ curl -fsSL https://s3.cloudyun.top/downloads/singbox/install.sh | bash
|
|||||||
```
|
```
|
||||||
`install.sh` 默认会从 `https://s3.cloudyun.top/downloads/singbox` 下载对应架构的预编译 `sing-box` 二进制,再继续进入面板和服务配置流程。
|
`install.sh` 默认会从 `https://s3.cloudyun.top/downloads/singbox` 下载对应架构的预编译 `sing-box` 二进制,再继续进入面板和服务配置流程。
|
||||||
|
|
||||||
|
升级已安装的 sing-box:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://s3.cloudyun.top/downloads/singbox/update.sh | bash
|
||||||
|
```
|
||||||
|
`update.sh` 会从同一发布地址下载对应架构的 `sing-box` 二进制,并自动重启已检测到的 `singbox` 或 `sing-box` 服务。
|
||||||
|
|
||||||
|
|
||||||
脚本会做这些事情:
|
脚本会做这些事情:
|
||||||
|
|
||||||
|
|||||||
141
update.sh
Normal file
141
update.sh
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
BINARY_PATH="${BINARY_PATH:-/usr/local/bin/sing-box}"
|
||||||
|
RELEASE_BASE_URL="${RELEASE_BASE_URL:-https://s3.cloudyun.top/downloads/singbox}"
|
||||||
|
SERVICE_CANDIDATES=("${SERVICE_NAME:-}" "singbox" "sing-box")
|
||||||
|
|
||||||
|
echo -e "${GREEN}sing-box binary update script${NC}"
|
||||||
|
|
||||||
|
if [[ ${EUID} -ne 0 ]]; then
|
||||||
|
echo -e "${RED}This script must be run as root${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
OS="$(uname -s)"
|
||||||
|
if [[ "$OS" != "Linux" ]]; then
|
||||||
|
echo -e "${RED}This update script currently supports Linux only. Current OS: ${OS}${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
case "$ARCH" in
|
||||||
|
x86_64) BINARY_ARCH="amd64" ;;
|
||||||
|
aarch64|arm64) BINARY_ARCH="arm64" ;;
|
||||||
|
armv7l|armv7) BINARY_ARCH="armv7" ;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Unsupported architecture: ${ARCH}${NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
DOWNLOAD_TARGET="${DOWNLOAD_TARGET:-linux-${BINARY_ARCH}}"
|
||||||
|
DOWNLOAD_URL="${DOWNLOAD_URL:-${RELEASE_BASE_URL}/sing-box-${DOWNLOAD_TARGET}}"
|
||||||
|
TMP_BINARY="$(mktemp)"
|
||||||
|
BACKUP_BINARY="$(mktemp)"
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -f "${TMP_BINARY}" "${BACKUP_BINARY}"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
detect_service_name() {
|
||||||
|
local candidate
|
||||||
|
for candidate in "${SERVICE_CANDIDATES[@]}"; do
|
||||||
|
if [[ -z "${candidate}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if systemctl list-unit-files --type=service --no-legend 2>/dev/null | awk '{print $1}' | grep -Fxq "${candidate}.service"; then
|
||||||
|
printf '%s\n' "${candidate}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
download_binary() {
|
||||||
|
echo -e "${YELLOW}Downloading sing-box binary...${NC}"
|
||||||
|
echo -e "${YELLOW}Target: ${DOWNLOAD_TARGET}${NC}"
|
||||||
|
echo -e "${YELLOW}URL: ${DOWNLOAD_URL}${NC}"
|
||||||
|
|
||||||
|
if command -v curl >/dev/null 2>&1; then
|
||||||
|
curl -fL "${DOWNLOAD_URL}" -o "${TMP_BINARY}"
|
||||||
|
elif command -v wget >/dev/null 2>&1; then
|
||||||
|
wget -O "${TMP_BINARY}" "${DOWNLOAD_URL}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}Neither curl nor wget is installed.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
chmod 0755 "${TMP_BINARY}"
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_binary() {
|
||||||
|
if ! "${TMP_BINARY}" version >/dev/null 2>&1; then
|
||||||
|
echo -e "${RED}Downloaded file is not a valid sing-box binary.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
current_version() {
|
||||||
|
if [[ -x "${BINARY_PATH}" ]]; then
|
||||||
|
"${BINARY_PATH}" version 2>/dev/null | head -n 1 || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
new_version() {
|
||||||
|
"${TMP_BINARY}" version 2>/dev/null | head -n 1 || true
|
||||||
|
}
|
||||||
|
|
||||||
|
rollback() {
|
||||||
|
echo -e "${RED}Update failed, rolling back to previous binary...${NC}"
|
||||||
|
install -m 0755 "${BACKUP_BINARY}" "${BINARY_PATH}"
|
||||||
|
if [[ -n "${SERVICE_NAME_DETECTED:-}" ]]; then
|
||||||
|
systemctl restart "${SERVICE_NAME_DETECTED}" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
download_binary
|
||||||
|
validate_binary
|
||||||
|
|
||||||
|
OLD_VERSION="$(current_version)"
|
||||||
|
NEW_VERSION="$(new_version)"
|
||||||
|
|
||||||
|
if [[ -n "${OLD_VERSION}" ]]; then
|
||||||
|
echo -e "${YELLOW}Current version: ${OLD_VERSION}${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}Current version: not installed or unreadable${NC}"
|
||||||
|
fi
|
||||||
|
echo -e "${YELLOW}New version: ${NEW_VERSION}${NC}"
|
||||||
|
|
||||||
|
if [[ -x "${BINARY_PATH}" ]]; then
|
||||||
|
cp -f "${BINARY_PATH}" "${BACKUP_BINARY}"
|
||||||
|
else
|
||||||
|
: > "${BACKUP_BINARY}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -m 0755 "${TMP_BINARY}" "${BINARY_PATH}"
|
||||||
|
|
||||||
|
SERVICE_NAME_DETECTED="$(detect_service_name || true)"
|
||||||
|
if [[ -n "${SERVICE_NAME_DETECTED}" ]]; then
|
||||||
|
echo -e "${YELLOW}Restarting service: ${SERVICE_NAME_DETECTED}${NC}"
|
||||||
|
if ! systemctl restart "${SERVICE_NAME_DETECTED}"; then
|
||||||
|
if [[ -s "${BACKUP_BINARY}" ]]; then
|
||||||
|
rollback
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}Service restarted successfully.${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}No systemd service detected. Binary updated only.${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}sing-box has been updated successfully.${NC}"
|
||||||
|
echo -e "${GREEN}Binary: ${BINARY_PATH}${NC}"
|
||||||
|
echo -e "${GREEN}Version: $(current_version)${NC}"
|
||||||
Reference in New Issue
Block a user