| #!/bin/bash |
|
|
| |
| export DEBIAN_FRONTEND=noninteractive |
|
|
| if [ "$(whoami)" = "root" ]; then |
| echo "检测到root用户,正在退出..." |
| exit |
| fi |
|
|
| echo "检查Termux镜像源配置..." |
|
|
| |
| target_mirror="https://packages-cf.termux.dev/apt/termux-main" |
| fallback_mirror="https://packages.termux.dev/apt/termux-main" |
| if [ -f "$PREFIX/etc/apt/sources.list" ] && grep -q "$target_mirror" "$PREFIX/etc/apt/sources.list"; then |
| echo "✅ 镜像源已经配置为Cloudflare镜像,跳过修改" |
| else |
| echo "正在设置Termux镜像为Cloudflare镜像..." |
| |
| |
| if [ -f "$PREFIX/etc/apt/sources.list" ]; then |
| echo "备份原始sources.list文件..." |
| cp "$PREFIX/etc/apt/sources.list" "$PREFIX/etc/apt/sources.list.backup.$(date +%s)" |
| fi |
| |
| |
| echo "写入新的镜像源配置..." |
| cat > "$PREFIX/etc/apt/sources.list" << 'EOF' |
| |
| deb https://packages-cf.termux.dev/apt/termux-main stable main |
| EOF |
| |
| echo "✅ 镜像源已更新为: $target_mirror" |
| fi |
|
|
| ensure_dpkg_ready() { |
| echo "检查并修复 dpkg/apt 状态..." |
| |
| if pgrep -f "apt|dpkg" >/dev/null 2>&1; then |
| echo "检测到 apt/dpkg 正在运行,等待其结束..." |
| while pgrep -f "apt|dpkg" >/dev/null 2>&1; do sleep 1; done |
| fi |
| |
| for f in "$PREFIX/var/lib/dpkg/lock" \ |
| "$PREFIX/var/lib/apt/lists/lock" \ |
| "$PREFIX/var/cache/apt/archives/lock"; do |
| [ -e "$f" ] && rm -f "$f" |
| done |
| |
| dpkg --configure -a || true |
| } |
|
|
|
|
| |
| echo "正在更新包列表..." |
| ensure_dpkg_ready |
| apt_output=$(apt update 2>&1) |
| if [ $? -ne 0 ]; then |
| if echo "$apt_output" | grep -qi "is not signed"; then |
| echo "⚠️ 检测到仓库未签名,尝试切换到官方镜像并修复 keyring..." |
| |
| sed -i "s#${target_mirror}#${fallback_mirror}#g" "$PREFIX/etc/apt/sources.list" || true |
| |
| rm -rf "$PREFIX/var/lib/apt/lists/"* || true |
| rm -f "$PREFIX/var/lib/dpkg/lock" "$PREFIX/var/lib/apt/lists/lock" "$PREFIX/var/cache/apt/archives/lock" || true |
| |
| apt-get install --reinstall -y termux-keyring || true |
| |
| ensure_dpkg_ready |
| apt update |
| else |
| echo "apt update 失败,错误信息:" |
| echo "$apt_output" | head -20 |
| exit 1 |
| fi |
| else |
| echo "$apt_output" |
| fi |
|
|
| echo "✅ Termux镜像设置完成!" |
| echo "📁 原始配置已备份到: $PREFIX/etc/apt/sources.list.backup.*" |
| echo "🔄 如需恢复原始镜像,可以运行:" |
| echo " cp \$PREFIX/etc/apt/sources.list.backup.* \$PREFIX/etc/apt/sources.list && apt update" |
|
|
| |
| need_update=false |
| packages_to_install="" |
|
|
| |
| if ! command -v uv &> /dev/null; then |
| need_update=true |
| packages_to_install="$packages_to_install uv" |
| fi |
|
|
| |
| if ! command -v python &> /dev/null; then |
| need_update=true |
| packages_to_install="$packages_to_install python" |
| fi |
|
|
| |
| if ! command -v node &> /dev/null; then |
| need_update=true |
| packages_to_install="$packages_to_install nodejs" |
| fi |
|
|
| |
| if ! command -v git &> /dev/null; then |
| need_update=true |
| packages_to_install="$packages_to_install git" |
| fi |
|
|
| |
| if [ "$need_update" = true ]; then |
| echo "正在更新包管理器..." |
| ensure_dpkg_ready |
| echo "正在安装缺失的软件包: $packages_to_install" |
| pkg install $packages_to_install -y |
| else |
| echo "所需软件包已全部安装,跳过更新和安装步骤" |
| fi |
|
|
| |
| if ! command -v pm2 &> /dev/null; then |
| echo "正在安装 pm2..." |
| npm install pm2 -g |
| else |
| echo "pm2 已安装,跳过安装" |
| fi |
|
|
| |
| if [ -f "./web.py" ]; then |
| |
| echo "已在目标目录中,跳过克隆操作" |
| elif [ -f "./gcli2api/web.py" ]; then |
| echo "进入已存在的 gcli2api 目录" |
| cd ./gcli2api |
| else |
| echo "克隆项目仓库..." |
| git clone https://github.com/su-kaka/gcli2api.git |
| cd ./gcli2api |
| fi |
|
|
| echo "强制同步项目代码,忽略本地修改..." |
| git fetch --all |
| git reset --hard origin/$(git rev-parse --abbrev-ref HEAD) |
|
|
| echo "初始化 uv 环境..." |
| uv init |
|
|
| echo "安装 Python 依赖..." |
| uv add -r requirements-termux.txt |
|
|
| echo "激活虚拟环境并启动服务..." |
| source .venv/bin/activate |
| pm2 start .venv/bin/python --name web -- web.py |
| cd .. |
|
|
| echo "✅ 安装完成!服务已启动。" |