cursor2api / cursor-to-openai-helper.sh
github-actions[bot]
Update from GitHub Actions
b51f54a
raw
history blame
18.5 kB
#!/bin/bash
# Colors for better UI
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Create backups directory if it doesn't exist
mkdir -p backups
# Function to display header
show_header() {
clear
echo -e "${BLUE}=======================================${NC}"
echo -e "${GREEN} Cursor-To-OpenAI 简易脚本 ${NC}"
echo -e "${BLUE}=======================================${NC}"
echo
}
# Function to check if Docker is installed
check_docker() {
if ! command -v docker &> /dev/null; then
echo -e "${RED}未安装Docker。请先安装Docker。${NC}"
exit 1
fi
}
# Function to check if Node.js is installed
check_nodejs() {
if ! command -v node &> /dev/null; then
echo -e "${RED}未安装Node.js。请先安装Node.js。${NC}"
exit 1
fi
if ! command -v npm &> /dev/null; then
echo -e "${RED}未安装npm。请先安装npm。${NC}"
exit 1
fi
}
# Function to backup configuration before update
backup_configs() {
echo -e "${YELLOW}正在备份配置文件...${NC}"
backup_dir="backups/update_backup_$(date +"%Y%m%d_%H%M%S")"
mkdir -p "$backup_dir"
# Backup important configurations
if [ -d data ]; then
cp -r data "$backup_dir/"
fi
if [ -f .env ]; then
cp .env "$backup_dir/"
fi
echo -e "${GREEN}配置文件已备份到 ${backup_dir}${NC}"
}
# Function to restore configuration after update
restore_configs() {
if [ -z "$1" ]; then
echo -e "${RED}未指定备份目录,无法恢复配置。${NC}"
return 1
fi
backup_dir="$1"
echo -e "${YELLOW}正在恢复配置文件...${NC}"
if [ -d "$backup_dir/data" ]; then
cp -r "$backup_dir/data/"* data/ 2>/dev/null
fi
if [ -f "$backup_dir/.env" ]; then
cp "$backup_dir/.env" ./ 2>/dev/null
fi
echo -e "${GREEN}配置文件已恢复${NC}"
}
# Function for installation tasks
installation_menu() {
show_header
echo -e "${YELLOW}===== 安装菜单 =====${NC}"
echo -e "1) 克隆仓库"
echo -e "2) 安装依赖"
echo -e "3) 创建配置文件"
echo -e "4) 设置管理员账户"
echo -e "5) 运行安装向导"
echo -e "6) 构建并启动Docker容器"
echo -e "7) 使用npm启动"
echo -e "8) 返回主菜单"
echo
echo -n "请输入选择 [1-8]: "
read -r choice
case $choice in
1)
show_header
echo -e "${YELLOW}正在克隆仓库...${NC}"
read -p "请输入您的GitHub用户名: " username
git clone "https://github.com/${username}/cursor-to-openai.git"
if [ $? -eq 0 ]; then
echo -e "${GREEN}仓库克隆成功!${NC}"
cd cursor-to-openai
else
echo -e "${RED}克隆仓库失败!${NC}"
fi
read -p "按回车键继续..."
installation_menu
;;
2)
show_header
echo -e "${YELLOW}正在安装依赖...${NC}"
npm install
if [ $? -eq 0 ]; then
echo -e "${GREEN}依赖安装成功!${NC}"
else
echo -e "${RED}依赖安装失败!${NC}"
fi
read -p "按回车键继续..."
installation_menu
;;
3)
show_header
echo -e "${YELLOW}正在创建配置文件...${NC}"
if [ ! -f .env ]; then
cp .env.example .env
echo -e "${GREEN}.env文件已创建。${NC}"
else
echo -e "${YELLOW}.env文件已存在。${NC}"
fi
mkdir -p data
if [ ! -f data/admin.json ]; then
cp data/admin.example.json data/admin.json
echo -e "${GREEN}admin.json文件已创建。${NC}"
else
echo -e "${YELLOW}admin.json文件已存在。${NC}"
fi
echo -e "${YELLOW}您应该编辑.env文件来配置您的环境。${NC}"
read -p "是否现在编辑.env文件?(y/n): " edit_env
if [[ $edit_env == "y" || $edit_env == "Y" ]]; then
if command -v nano &> /dev/null; then
nano .env
elif command -v vim &> /dev/null; then
vim .env
else
echo -e "${RED}未找到编辑器。请稍后手动编辑.env文件。${NC}"
fi
fi
read -p "按回车键继续..."
installation_menu
;;
4)
show_header
echo -e "${YELLOW}正在设置管理员账户...${NC}"
node scripts/create-admin.js
read -p "按回车键继续..."
installation_menu
;;
5)
show_header
echo -e "${YELLOW}正在运行安装向导...${NC}"
node setup.js
read -p "按回车键继续..."
installation_menu
;;
6)
show_header
echo -e "${YELLOW}正在构建并启动Docker容器...${NC}"
check_docker
docker compose up -d --build
if [ $? -eq 0 ]; then
echo -e "${GREEN}Docker容器启动成功!${NC}"
echo -e "${GREEN}访问管理界面: http://localhost:3010${NC}"
else
echo -e "${RED}启动Docker容器失败!${NC}"
fi
read -p "按回车键继续..."
installation_menu
;;
7)
show_header
echo -e "${YELLOW}正在使用npm启动...${NC}"
check_nodejs
npm start &
if [ $? -eq 0 ]; then
echo -e "${GREEN}服务启动成功!${NC}"
echo -e "${GREEN}访问管理界面: http://localhost:3010${NC}"
else
echo -e "${RED}启动服务失败!${NC}"
fi
read -p "按回车键继续..."
installation_menu
;;
8)
main_menu
;;
*)
echo -e "${RED}无效选项。请重试。${NC}"
read -p "按回车键继续..."
installation_menu
;;
esac
}
# Function for maintenance tasks
maintenance_menu() {
show_header
echo -e "${YELLOW}===== 维护菜单 =====${NC}"
echo -e "1) 查看服务状态"
echo -e "2) 刷新Cookie"
echo -e "3) 强制刷新Cookie"
echo -e "4) 管理邮箱"
echo -e "5) 管理无效Cookie"
echo -e "6) 查看日志"
echo -e "7) 重启服务"
echo -e "8) 停止服务"
echo -e "9) 更新项目代码"
echo -e "10) 备份项目数据"
echo -e "11) 持续刷新Cookie直到成功"
echo -e "12) 返回主菜单"
echo
echo -n "请输入选择 [1-12]: "
read -r choice
case $choice in
1)
show_header
echo -e "${YELLOW}服务状态:${NC}"
if docker ps | grep -q cursor-to-openai; then
echo -e "${GREEN}Docker容器正在运行。${NC}"
docker ps | grep cursor-to-openai
else
echo -e "${RED}Docker容器未运行。${NC}"
fi
pids=$(pgrep -f "node.*start")
if [ -n "$pids" ]; then
echo -e "${GREEN}Node.js服务正在运行,PID: $pids${NC}"
else
echo -e "${RED}Node.js服务未运行。${NC}"
fi
read -p "按回车键继续..."
maintenance_menu
;;
2)
show_header
echo -e "${YELLOW}正在刷新Cookie...${NC}"
npm run refresh-cookies
read -p "按回车键继续..."
maintenance_menu
;;
3)
show_header
echo -e "${YELLOW}正在强制刷新Cookie...${NC}"
npm run refresh-cookies -- --force
read -p "按回车键继续..."
maintenance_menu
;;
4)
show_header
echo -e "${YELLOW}正在管理邮箱...${NC}"
npm run manage-emails
read -p "按回车键继续..."
maintenance_menu
;;
5)
show_header
echo -e "${YELLOW}正在管理无效Cookie...${NC}"
node manage-invalid-cookies.js
read -p "按回车键继续..."
maintenance_menu
;;
6)
show_header
echo -e "${YELLOW}正在查看日志...${NC}"
if docker ps | grep -q cursor-to-openai; then
docker compose logs -f
else
echo -e "${RED}Docker容器未运行。${NC}"
echo -e "${YELLOW}正在检查npm日志...${NC}"
# Try to find logs in npm-debug.log or similar
if [ -f npm-debug.log ]; then
cat npm-debug.log
else
echo -e "${RED}未找到日志文件。${NC}"
fi
fi
read -p "按回车键继续..."
maintenance_menu
;;
7)
show_header
echo -e "${YELLOW}正在重启服务...${NC}"
if docker ps | grep -q cursor-to-openai; then
docker compose restart
echo -e "${GREEN}Docker容器已重启。${NC}"
else
pids=$(pgrep -f "node.*start")
if [ -n "$pids" ]; then
kill $pids
sleep 2
npm start &
echo -e "${GREEN}Node.js服务已重启。${NC}"
else
echo -e "${RED}未检测到运行中的服务。${NC}"
echo -e "${YELLOW}是否要启动服务?(y/n): ${NC}"
read -r start_service
if [[ $start_service == "y" || $start_service == "Y" ]]; then
npm start &
echo -e "${GREEN}服务已启动。${NC}"
fi
fi
fi
read -p "按回车键继续..."
maintenance_menu
;;
8)
show_header
echo -e "${YELLOW}正在停止服务...${NC}"
if docker ps | grep -q cursor-to-openai; then
docker compose down
echo -e "${GREEN}Docker容器已停止。${NC}"
else
pids=$(pgrep -f "node.*start")
if [ -n "$pids" ]; then
kill $pids
echo -e "${GREEN}Node.js服务已停止。${NC}"
else
echo -e "${RED}未检测到运行中的服务。${NC}"
fi
fi
read -p "按回车键继续..."
maintenance_menu
;;
9)
show_header
echo -e "${YELLOW}正在更新项目代码...${NC}"
# 备份配置文件
backup_configs
backup_dir=$(ls -td backups/update_backup_* | head -1)
# 检查是否存在未提交的更改
if [ -n "$(git status --porcelain)" ]; then
echo -e "${YELLOW}检测到未提交的更改。更新前请处理这些更改。${NC}"
echo -e "1) 查看更改"
echo -e "2) 备份并放弃更改"
echo -e "3) 取消更新"
echo -n "请选择操作 [1-3]: "
read -r update_choice
case $update_choice in
1)
git status
echo -e "${YELLOW}是否继续更新?(y/n): ${NC}"
read -r continue_update
if [[ $continue_update != "y" && $continue_update != "Y" ]]; then
echo -e "${YELLOW}更新已取消。${NC}"
read -p "按回车键继续..."
maintenance_menu
return
fi
;;
2)
echo -e "${YELLOW}备份更改...${NC}"
git diff > "$backup_dir/local_changes.patch"
git checkout -- .
echo -e "${GREEN}更改已备份到 $backup_dir/local_changes.patch${NC}"
;;
3)
echo -e "${YELLOW}更新已取消。${NC}"
read -p "按回车键继续..."
maintenance_menu
return
;;
*)
echo -e "${RED}无效选项。更新已取消。${NC}"
read -p "按回车键继续..."
maintenance_menu
return
;;
esac
fi
# 更新代码
git pull
update_status=$?
# 恢复配置文件
restore_configs "$backup_dir"
if [ $update_status -eq 0 ]; then
echo -e "${GREEN}项目代码更新成功!${NC}"
echo -e "${YELLOW}是否需要重新安装依赖?(y/n): ${NC}"
read -r reinstall
if [[ $reinstall == "y" || $reinstall == "Y" ]]; then
npm install
if [ $? -eq 0 ]; then
echo -e "${GREEN}依赖安装成功!${NC}"
else
echo -e "${RED}依赖安装失败!${NC}"
fi
fi
else
echo -e "${RED}项目代码更新失败!${NC}"
fi
read -p "按回车键继续..."
maintenance_menu
;;
10)
show_header
echo -e "${YELLOW}正在备份项目数据...${NC}"
# 创建备份目录
backup_dir="backups/backup_$(date +"%Y%m%d_%H%M%S")"
mkdir -p "$backup_dir"
# 备份关键文件
cp -r data "$backup_dir/" 2>/dev/null
if [ -f .env ]; then
cp .env "$backup_dir/"
fi
# 压缩备份
tar -czf "${backup_dir}.tar.gz" "$backup_dir"
rm -rf "$backup_dir"
echo -e "${GREEN}备份已创建: ${backup_dir}.tar.gz${NC}"
read -p "按回车键继续..."
maintenance_menu
;;
11)
show_header
echo -e "${YELLOW}持续刷新Cookie直到成功...${NC}"
read -p "请输入最大尝试时间(分钟, 默认60): " max_time
max_time=${max_time:-60}
max_seconds=$((max_time * 60))
echo -e "${YELLOW}将持续尝试刷新Cookie,最长 ${max_time} 分钟...${NC}"
start_time=$(date +%s)
success=false
attempt=0
while ! $success && [ $(($(date +%s) - start_time)) -lt $max_seconds ]; do
attempt=$((attempt + 1))
elapsed=$(($(date +%s) - start_time))
remaining=$((max_seconds - elapsed))
remaining_min=$((remaining / 60))
remaining_sec=$((remaining % 60))
echo -e "${YELLOW}尝试 #${attempt}...(剩余时间: ${remaining_min}${remaining_sec}秒)${NC}"
# 运行刷新命令并检查输出
output=$(npm run refresh-cookies -- --force 2>&1)
echo "$output"
if echo "$output" | grep -q "成功添加新的Cookie" || echo "$output" | grep -q "Successfully added new cookies"; then
success=true
echo -e "${GREEN}成功添加新Cookie!${NC}"
else
wait_time=$((RANDOM % 61 + 30)) # 30-90秒随机间隔
echo -e "${YELLOW}等待 ${wait_time} 秒后重试...${NC}"
sleep $wait_time
fi
done
if $success; then
echo -e "${GREEN}成功刷新Cookie!${NC}"
else
echo -e "${RED}达到最大尝试时间,未能成功刷新Cookie。${NC}"
fi
read -p "按回车键继续..."
maintenance_menu
;;
12)
main_menu
;;
*)
echo -e "${RED}无效选项。请重试。${NC}"
read -p "按回车键继续..."
maintenance_menu
;;
esac
}
# Main menu function
main_menu() {
show_header
echo -e "${YELLOW}===== 主菜单 =====${NC}"
echo -e "1) 启动服务 (npm)"
echo -e "2) 安装配置"
echo -e "3) 系统维护"
echo -e "4) 退出"
echo
echo -n "请输入选择 [1-4]: "
read -r choice
case $choice in
1)
show_header
echo -e "${YELLOW}正在使用npm启动服务...${NC}"
check_nodejs
# 检查Node.js服务是否已在运行
pids=$(pgrep -f "node.*start")
if [ -n "$pids" ]; then
echo -e "${YELLOW}服务已在运行,PID: $pids${NC}"
echo -e "${YELLOW}是否要重启服务?(y/n): ${NC}"
read -r restart
if [[ $restart == "y" || $restart == "Y" ]]; then
kill $pids
sleep 2
npm start &
echo -e "${GREEN}服务已重启${NC}"
fi
else
npm start &
echo -e "${GREEN}服务已启动${NC}"
fi
echo -e "${GREEN}访问管理界面: http://localhost:3010${NC}"
read -p "按回车键继续..."
main_menu
;;
2)
installation_menu
;;
3)
maintenance_menu
;;
4)
show_header
echo -e "${GREEN}感谢使用Cursor-To-OpenAI简易脚本!${NC}"
exit 0
;;
*)
echo -e "${RED}无效选项。请重试。${NC}"
read -p "按回车键继续..."
main_menu
;;
esac
}
# Start the script
main_menu