You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
8.4 KiB
255 lines
8.4 KiB
#!/bin/bash
|
|
|
|
# Version / 版本号
|
|
VERSION="v2.0.0"
|
|
|
|
# Configuration / 配置
|
|
KEEP_BINARY=false
|
|
DOWNLOAD_DIR="/tmp"
|
|
INSTALL_DIR="/usr/local/bin"
|
|
AUTO_SUDO=false
|
|
|
|
# Colors / 颜色
|
|
RED='\033[31m'
|
|
GREEN='\033[32m'
|
|
YELLOW='\033[33m'
|
|
BLUE='\033[36m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
|
|
# Separator / 分隔线
|
|
SEPARATOR="${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
|
|
# Bilingual message functions / 双语消息函数
|
|
error() {
|
|
echo -e "\n${SEPARATOR}"
|
|
echo -e "${RED}${BOLD}❌ Error:${NC} $1"
|
|
echo -e "${RED}${BOLD}❌ 错误:${NC}$2"
|
|
echo -e "${SEPARATOR}\n"
|
|
exit 1
|
|
}
|
|
|
|
info() {
|
|
echo -e "\n${BLUE}${BOLD}ℹ️ [EN]:${NC} $1"
|
|
echo -e "${BLUE}${BOLD}ℹ️ [中文]:${NC} $2\n"
|
|
}
|
|
|
|
success() {
|
|
echo -e "\n${SEPARATOR}"
|
|
echo -e "${GREEN}${BOLD}✅ [EN]:${NC} $1"
|
|
echo -e "${GREEN}${BOLD}✅ [中文]:${NC} $2"
|
|
echo -e "${SEPARATOR}\n"
|
|
}
|
|
|
|
warning() {
|
|
echo -e "\n${YELLOW}${BOLD}⚠️ [EN]:${NC} $1"
|
|
echo -e "${YELLOW}${BOLD}⚠️ [中文]:${NC} $2\n"
|
|
}
|
|
|
|
# System detection / 系统检测
|
|
detect_platform() {
|
|
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
|
ARCH=$(uname -m)
|
|
|
|
case "$OS" in
|
|
linux*)
|
|
case "$ARCH" in
|
|
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_linux_amd64" ;;
|
|
*) error "Unsupported Linux architecture: $ARCH" "不支持的Linux架构:$ARCH" ;;
|
|
esac
|
|
;;
|
|
darwin*)
|
|
case "$ARCH" in
|
|
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_darwin_amd64_intel" ;;
|
|
arm64) BINARY_NAME="cursor_id_modifier_${VERSION}_darwin_arm64_m1" ;;
|
|
*) error "Unsupported macOS architecture: $ARCH" "不支持的macOS架构:$ARCH" ;;
|
|
esac
|
|
;;
|
|
msys*|mingw*|cygwin*)
|
|
case "$ARCH" in
|
|
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_windows_amd64.exe" ;;
|
|
*) error "Unsupported Windows architecture: $ARCH" "不支持的Windows架构:$ARCH" ;;
|
|
esac
|
|
;;
|
|
*)
|
|
error "Unsupported operating system: $OS" "不支持的操作系统:$OS"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# System checks / 系统检查
|
|
check_requirements() {
|
|
info "Checking system requirements..." "正在检查系统要求..."
|
|
|
|
# Check network connectivity / 检查网络连接
|
|
if ! ping -c 1 github.com >/dev/null 2>&1; then
|
|
error "No network connection to GitHub" "无法连接到 GitHub"
|
|
fi
|
|
|
|
# Check curl / 检查curl
|
|
if ! command -v curl >/dev/null 2>&1; then
|
|
error "curl is required. Please install curl first." \
|
|
"需要安装 curl。请先安装 curl 后再运行此脚本。"
|
|
fi
|
|
}
|
|
|
|
# Privilege check / 权限检查
|
|
check_privileges() {
|
|
if [ "$EUID" -ne 0 ]; then
|
|
if [ "$AUTO_SUDO" = "true" ]; then
|
|
if command -v sudo >/dev/null 2>&1; then
|
|
info "Re-running with sudo..." "使用 sudo 重新运行..."
|
|
exec sudo bash "$0" "$@"
|
|
else
|
|
error "This script must be run as root. Please use sudo." \
|
|
"此脚本必须以 root 身份运行。请使用 sudo。"
|
|
fi
|
|
else
|
|
error "This script must be run as root. Please use sudo." \
|
|
"此脚本必须以 root 身份运行。请使用 sudo。"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Binary verification / 二进制验证
|
|
verify_binary() {
|
|
info "Verifying binary..." "正在验证二进制文件..."
|
|
|
|
# Check file existence / 检查文件是否存在
|
|
if [ ! -f "$DOWNLOAD_PATH" ]; then
|
|
error "Binary file download failed or does not exist" \
|
|
"二进制文件下载失败或不存在"
|
|
fi
|
|
|
|
# Check executable format / 检查可执行格式
|
|
if ! file "$DOWNLOAD_PATH" | grep -q "executable"; then
|
|
error "Downloaded file is not an executable" \
|
|
"下载的文件不是可执行文件"
|
|
fi
|
|
|
|
# Check file size / 检查文件大小
|
|
local size=$(wc -c < "$DOWNLOAD_PATH")
|
|
if [ "$size" -lt 1000000 ]; then # At least 1MB / 至少1MB
|
|
error "Downloaded file size is abnormal" \
|
|
"下载的文件大小异常"
|
|
fi
|
|
|
|
# Set executable permissions / 设置可执行权限
|
|
info "Setting executable permissions..." "正在设置可执行权限..."
|
|
if ! chmod +x "$DOWNLOAD_PATH"; then
|
|
error "Failed to set executable permissions" "无法设置可执行权限"
|
|
fi
|
|
}
|
|
|
|
# Cleanup functions / 清理函数
|
|
cleanup_old_version() {
|
|
if [ -f "$INSTALL_DIR/cursor-id-modifier" ]; then
|
|
info "Removing old version..." "正在删除旧版..."
|
|
rm -f "$INSTALL_DIR/cursor-id-modifier" || \
|
|
error "Failed to remove old version" "删除旧版本失败"
|
|
fi
|
|
}
|
|
|
|
cleanup_temp_files() {
|
|
if [ "$KEEP_BINARY" = "false" ]; then
|
|
rm -f "$DOWNLOAD_PATH"
|
|
rm -f "$INSTALL_DIR/cursor-id-modifier-wrapper"
|
|
fi
|
|
}
|
|
|
|
# Parse arguments / 解析参数
|
|
parse_args() {
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--auto-sudo)
|
|
AUTO_SUDO=true
|
|
shift
|
|
;;
|
|
--keep-binary)
|
|
KEEP_BINARY=true
|
|
shift
|
|
;;
|
|
--download-dir=*)
|
|
DOWNLOAD_DIR="${1#*=}"
|
|
shift
|
|
;;
|
|
*)
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Print banner / 打印横幅
|
|
print_banner() {
|
|
echo -e "\n${BLUE}${BOLD}"
|
|
echo " ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗"
|
|
echo " ██╔════╝██║ ██║██╔══██╗██╔════╝█╔═══██╗██╔══██╗"
|
|
echo " ██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝"
|
|
echo " ██║ ██║ ██║██╔══██╗╚════██ ██║ ██║██╔══██╗"
|
|
echo " ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║"
|
|
echo " ╚════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚════╝ ╚═╝ ╚═╝"
|
|
echo -e "${NC}"
|
|
echo -e "${YELLOW}${BOLD} >> Cursor ID Modifier ${VERSION} <<${NC}"
|
|
echo -e "${BLUE}${BOLD} [ By Pancake Fruit Rolled Shark Chili ]${NC}\n"
|
|
}
|
|
|
|
# Main installation process / 主安装流程
|
|
main() {
|
|
check_privileges "$@"
|
|
|
|
print_banner
|
|
|
|
info "Starting installation of cursor-id-modifier ${VERSION}..." \
|
|
"开始安装 cursor-id-modifier ${VERSION}..."
|
|
|
|
detect_platform
|
|
check_requirements
|
|
|
|
# Create installation directory / 创建安装目录
|
|
mkdir -p "$INSTALL_DIR" 2>/dev/null || \
|
|
error "Failed to create installation directory" "无法创建安装目录"
|
|
|
|
# Download binary / 下载二进制文件
|
|
info "Downloading cursor-id-modifier ($OS-$ARCH)..." \
|
|
"正在下载 cursor-id-modifier ($OS-$ARCH)..."
|
|
|
|
DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/raw/refs/heads/master/bin/$BINARY_NAME"
|
|
DOWNLOAD_PATH="$DOWNLOAD_DIR/$BINARY_NAME"
|
|
|
|
if ! curl -L --progress-bar "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"; then
|
|
error "Failed to download binary" "下载二进制文件失败"
|
|
fi
|
|
|
|
success "Download completed" "下载完成"
|
|
|
|
verify_binary
|
|
cleanup_old_version
|
|
|
|
# Install binary / 安装二进制文件
|
|
info "Installing binary..." "正在安装二进制文件..."
|
|
if ! cp "$DOWNLOAD_PATH" "$INSTALL_DIR/cursor-id-modifier"; then
|
|
error "Failed to install binary" "安装二进制文件失败"
|
|
fi
|
|
|
|
# Create wrapper script / 创建包装脚本
|
|
cat > "$INSTALL_DIR/cursor-id-modifier-wrapper" << 'EOF'
|
|
#!/bin/bash
|
|
if [ "$(uname -s)" = "Darwin" ]; then
|
|
sudo /usr/local/bin/cursor-id-modifier "$@"
|
|
else
|
|
sudo /usr/local/bin/cursor-id-modifier "$@"
|
|
fi
|
|
EOF
|
|
chmod +x "$INSTALL_DIR/cursor-id-modifier-wrapper"
|
|
|
|
# Cleanup / 清理
|
|
cleanup_temp_files
|
|
|
|
success "Installation successful! Run 'cursor-id-modifier-wrapper' from anywhere." \
|
|
"安装成功!现在可以在任何位置运行 'cursor-id-modifier-wrapper'。"
|
|
}
|
|
|
|
# Start installation / 开始安装
|
|
parse_args "$@"
|
|
main "$@"
|