|
@ -3,24 +3,50 @@ |
|
|
# Version / 版本号 |
|
|
# Version / 版本号 |
|
|
VERSION="v2.0.0" |
|
|
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 / 双语消息函数 |
|
|
# Bilingual message functions / 双语消息函数 |
|
|
error() { |
|
|
error() { |
|
|
echo "❌ Error: $1" |
|
|
|
|
|
echo "❌ 错误:$2" |
|
|
|
|
|
|
|
|
echo -e "\n${SEPARATOR}" |
|
|
|
|
|
echo -e "${RED}${BOLD}❌ Error:${NC} $1" |
|
|
|
|
|
echo -e "${RED}${BOLD}❌ 错误:${NC}$2" |
|
|
|
|
|
echo -e "${SEPARATOR}\n" |
|
|
exit 1 |
|
|
exit 1 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
info() { |
|
|
info() { |
|
|
echo "ℹ️ $1" |
|
|
|
|
|
echo "ℹ️ $2" |
|
|
|
|
|
|
|
|
echo -e "\n${BLUE}${BOLD}ℹ️ [EN]:${NC} $1" |
|
|
|
|
|
echo -e "${BLUE}${BOLD}ℹ️ [中文]:${NC} $2\n" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
success() { |
|
|
success() { |
|
|
echo "✅ $1" |
|
|
|
|
|
echo "✅ $2" |
|
|
|
|
|
|
|
|
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" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# Detect OS and architecture / 检测操作系统和架构 |
|
|
|
|
|
|
|
|
# System detection / 系统检测 |
|
|
detect_platform() { |
|
|
detect_platform() { |
|
|
OS=$(uname -s | tr '[:upper:]' '[:lower:]') |
|
|
OS=$(uname -s | tr '[:upper:]' '[:lower:]') |
|
|
ARCH=$(uname -m) |
|
|
ARCH=$(uname -m) |
|
@ -51,38 +77,51 @@ detect_platform() { |
|
|
esac |
|
|
esac |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# Check system requirements / 检查系统要求 |
|
|
|
|
|
|
|
|
# System checks / 系统检查 |
|
|
check_requirements() { |
|
|
check_requirements() { |
|
|
info "Checking system requirements..." "正在检查系统要求..." |
|
|
info "Checking system requirements..." "正在检查系统要求..." |
|
|
|
|
|
|
|
|
# 添加网络连接检查 |
|
|
|
|
|
|
|
|
# Check network connectivity / 检查网络连接 |
|
|
if ! ping -c 1 github.com >/dev/null 2>&1; then |
|
|
if ! ping -c 1 github.com >/dev/null 2>&1; then |
|
|
error "No network connection to GitHub" \ |
|
|
|
|
|
"无法连接到 GitHub" |
|
|
|
|
|
|
|
|
error "No network connection to GitHub" "无法连接到 GitHub" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
# Check curl |
|
|
|
|
|
|
|
|
# Check curl / 检查curl |
|
|
if ! command -v curl >/dev/null 2>&1; then |
|
|
if ! command -v curl >/dev/null 2>&1; then |
|
|
error "curl is required. Please install curl first." \ |
|
|
error "curl is required. Please install curl first." \ |
|
|
"需要安装 curl。请先安装 curl 后再运行此脚本。" |
|
|
"需要安装 curl。请先安装 curl 后再运行此脚本。" |
|
|
fi |
|
|
fi |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
# Check write permissions / 检查写入权限 |
|
|
|
|
|
if [ ! -w "$INSTALL_DIR" ]; then |
|
|
|
|
|
error "No write permission for $INSTALL_DIR. Please run with sudo." \ |
|
|
|
|
|
"没有 $INSTALL_DIR 的写入权限。请使用 sudo 运行此脚本。" |
|
|
|
|
|
|
|
|
# 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 |
|
|
fi |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# Verify binary / 验证二进制文件 |
|
|
|
|
|
|
|
|
# Binary verification / 二进制验证 |
|
|
verify_binary() { |
|
|
verify_binary() { |
|
|
info "Verifying binary..." "正在验证二进制文件..." |
|
|
info "Verifying binary..." "正在验证二进制文件..." |
|
|
|
|
|
|
|
|
|
|
|
# Check file existence / 检查文件是否存在 |
|
|
if [ ! -f "$DOWNLOAD_PATH" ]; then |
|
|
if [ ! -f "$DOWNLOAD_PATH" ]; then |
|
|
error "Binary file download failed or does not exist" \ |
|
|
error "Binary file download failed or does not exist" \ |
|
|
"二进制文件下载失败或不存在" |
|
|
"二进制文件下载失败或不存在" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
# 添加可执行文件格式检查 |
|
|
|
|
|
|
|
|
# Check executable format / 检查可执行格式 |
|
|
if ! file "$DOWNLOAD_PATH" | grep -q "executable"; then |
|
|
if ! file "$DOWNLOAD_PATH" | grep -q "executable"; then |
|
|
error "Downloaded file is not an executable" \ |
|
|
error "Downloaded file is not an executable" \ |
|
|
"下载的文件不是可执行文件" |
|
|
"下载的文件不是可执行文件" |
|
@ -91,8 +130,8 @@ verify_binary() { |
|
|
# Check file size / 检查文件大小 |
|
|
# Check file size / 检查文件大小 |
|
|
local size=$(wc -c < "$DOWNLOAD_PATH") |
|
|
local size=$(wc -c < "$DOWNLOAD_PATH") |
|
|
if [ "$size" -lt 1000000 ]; then # At least 1MB / 至少1MB |
|
|
if [ "$size" -lt 1000000 ]; then # At least 1MB / 至少1MB |
|
|
error "Downloaded file size is abnormal, download might be incomplete" \ |
|
|
|
|
|
"下载的文件大小异常,可能下载不完整" |
|
|
|
|
|
|
|
|
error "Downloaded file size is abnormal" \ |
|
|
|
|
|
"下载的文件大小异常" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
# Set executable permissions / 设置可执行权限 |
|
|
# Set executable permissions / 设置可执行权限 |
|
@ -102,14 +141,30 @@ verify_binary() { |
|
|
fi |
|
|
fi |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# 在文件开头添加配置项 |
|
|
|
|
|
KEEP_BINARY=true # 修改默认值为 true |
|
|
|
|
|
DOWNLOAD_DIR="." # 默认下载到当前目录 |
|
|
|
|
|
|
|
|
# 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 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
# 在 main 函数之前添加参数解析 |
|
|
|
|
|
|
|
|
# Parse arguments / 解析参数 |
|
|
parse_args() { |
|
|
parse_args() { |
|
|
while [[ $# -gt 0 ]]; do |
|
|
while [[ $# -gt 0 ]]; do |
|
|
case $1 in |
|
|
case $1 in |
|
|
|
|
|
--auto-sudo) |
|
|
|
|
|
AUTO_SUDO=true |
|
|
|
|
|
shift |
|
|
|
|
|
;; |
|
|
--keep-binary) |
|
|
--keep-binary) |
|
|
KEEP_BINARY=true |
|
|
KEEP_BINARY=true |
|
|
shift |
|
|
shift |
|
@ -125,104 +180,76 @@ parse_args() { |
|
|
done |
|
|
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 installation process / 主安装流程 |
|
|
main() { |
|
|
main() { |
|
|
|
|
|
check_privileges "$@" |
|
|
|
|
|
|
|
|
|
|
|
print_banner |
|
|
|
|
|
|
|
|
info "Starting installation of cursor-id-modifier ${VERSION}..." \ |
|
|
info "Starting installation of cursor-id-modifier ${VERSION}..." \ |
|
|
"开始安装 cursor-id-modifier ${VERSION}..." |
|
|
"开始安装 cursor-id-modifier ${VERSION}..." |
|
|
|
|
|
|
|
|
# Initialize installation / 初始化安装 |
|
|
|
|
|
detect_platform |
|
|
detect_platform |
|
|
INSTALL_DIR="/usr/local/bin" |
|
|
|
|
|
if [ ! -d "$INSTALL_DIR" ]; then |
|
|
|
|
|
if ! mkdir -p "$INSTALL_DIR" 2>/dev/null; then |
|
|
|
|
|
error "Failed to create installation directory" \ |
|
|
|
|
|
"无法创建安装目录" |
|
|
|
|
|
fi |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# Check requirements / 检查要求 |
|
|
|
|
|
check_requirements |
|
|
check_requirements |
|
|
|
|
|
|
|
|
# Create temp directory / 创建临时目录 |
|
|
|
|
|
info "Creating temporary directory..." \ |
|
|
|
|
|
"正在创建临时目录..." |
|
|
|
|
|
TEMP_DIR=$(mktemp -d) |
|
|
|
|
|
info "Note: Temporary directory will be automatically cleaned up after installation" \ |
|
|
|
|
|
"注意:临时目录将在安装完成后自动清理" |
|
|
|
|
|
trap 'rm -rf "$TEMP_DIR"' EXIT |
|
|
|
|
|
|
|
|
|
|
|
# 检查下载目录权限 |
|
|
|
|
|
if [ ! -w "$DOWNLOAD_DIR" ]; then |
|
|
|
|
|
error "No write permission for download directory: $DOWNLOAD_DIR" \ |
|
|
|
|
|
"下载目录无写入权限:$DOWNLOAD_DIR" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
# 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)..." \ |
|
|
info "Downloading cursor-id-modifier ($OS-$ARCH)..." \ |
|
|
"正在下载 cursor-id-modifier ($OS-$ARCH)..." |
|
|
"正在下载 cursor-id-modifier ($OS-$ARCH)..." |
|
|
|
|
|
|
|
|
# 定义下载 URL |
|
|
|
|
|
DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/raw/refs/heads/master/bin/$BINARY_NAME" |
|
|
DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/raw/refs/heads/master/bin/$BINARY_NAME" |
|
|
DOWNLOAD_PATH="$DOWNLOAD_DIR/$BINARY_NAME" |
|
|
DOWNLOAD_PATH="$DOWNLOAD_DIR/$BINARY_NAME" |
|
|
info "File will be downloaded to: $DOWNLOAD_PATH" \ |
|
|
|
|
|
"文件将下载到:$DOWNLOAD_PATH" |
|
|
|
|
|
|
|
|
|
|
|
if ! curl -L --progress-bar "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"; then |
|
|
if ! curl -L --progress-bar "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"; then |
|
|
error "Failed to download binary from: $DOWNLOAD_URL" \ |
|
|
|
|
|
"从以下地址下载二进制文件失败:$DOWNLOAD_URL" |
|
|
|
|
|
|
|
|
error "Failed to download binary" "下载二进制文件失败" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
success "Download completed to: $DOWNLOAD_PATH" \ |
|
|
|
|
|
"下载完成,文件位置:$DOWNLOAD_PATH" |
|
|
|
|
|
|
|
|
|
|
|
# 添加手动设置权限的提示 |
|
|
|
|
|
info "To make the file executable, run:" \ |
|
|
|
|
|
"要使文件可执行,请运行:" |
|
|
|
|
|
info "chmod +x $DOWNLOAD_PATH" \ |
|
|
|
|
|
"chmod +x $DOWNLOAD_PATH" |
|
|
|
|
|
info "Then you can run it with:" \ |
|
|
|
|
|
"然后可以通过以下命令运行:" |
|
|
|
|
|
info "./$BINARY_NAME" \ |
|
|
|
|
|
"./$BINARY_NAME" |
|
|
|
|
|
|
|
|
success "Download completed" "下载完成" |
|
|
|
|
|
|
|
|
# 验证和安装 |
|
|
|
|
|
verify_binary |
|
|
verify_binary |
|
|
|
|
|
cleanup_old_version |
|
|
|
|
|
|
|
|
# 安装到系统目录 |
|
|
|
|
|
|
|
|
# Install binary / 安装二进制文件 |
|
|
info "Installing binary..." "正在安装二进制文件..." |
|
|
info "Installing binary..." "正在安装二进制文件..." |
|
|
if ! cp "$DOWNLOAD_PATH" "$INSTALL_DIR/cursor-id-modifier"; then |
|
|
if ! cp "$DOWNLOAD_PATH" "$INSTALL_DIR/cursor-id-modifier"; then |
|
|
error "Failed to install binary" "安装二进制文件失败" |
|
|
error "Failed to install binary" "安装二进制文件失败" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
# 根据设置决定是否保留下载的文件 |
|
|
|
|
|
if [ "$KEEP_BINARY" = false ]; then |
|
|
|
|
|
info "Binary file will be cleaned up after installation" \ |
|
|
|
|
|
"二进制文件将在安装后被清理" |
|
|
|
|
|
info "Use --keep-binary flag to keep the downloaded file" \ |
|
|
|
|
|
"使用 --keep-binary 参数可以保留下载的文件" |
|
|
|
|
|
info "Cleaning up downloaded file..." "正在清理下载的文件..." |
|
|
|
|
|
rm -f "$DOWNLOAD_PATH" |
|
|
|
|
|
else |
|
|
|
|
|
info "Binary file is kept at: $DOWNLOAD_PATH" \ |
|
|
|
|
|
"二进制文件保留在:$DOWNLOAD_PATH" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
success "Installation successful! You can now run 'cursor-id-modifier' from anywhere." \ |
|
|
|
|
|
"安装成功!现在可以在任何位置运行 'cursor-id-modifier'。" |
|
|
|
|
|
success "For help, run 'cursor-id-modifier --help'" \ |
|
|
|
|
|
"如需帮助,请运行 'cursor-id-modifier --help'" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
# 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'。" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# 在主程序开始前解析参数 |
|
|
|
|
|
parse_args "$@" |
|
|
|
|
|
|
|
|
|
|
|
# Start installation / 开始安装 |
|
|
# Start installation / 开始安装 |
|
|
main |
|
|
|
|
|
|
|
|
parse_args "$@" |
|
|
|
|
|
main "$@" |