diff --git a/v2raya/v2raya.sh b/v2raya/v2raya.sh index 9de260d..ba2462b 100644 --- a/v2raya/v2raya.sh +++ b/v2raya/v2raya.sh @@ -78,6 +78,11 @@ download_file() { print_info "正在下载: $url" + # 如果存在旧的不完整文件,先删除 + if [[ -f "$output" ]]; then + rm -f "$output" + fi + if command -v wget &> /dev/null; then wget -q --show-progress "$url" -O "$output" elif command -v curl &> /dev/null; then @@ -87,11 +92,13 @@ download_file() { exit 1 fi - if [[ $? -eq 0 ]]; then + # 检查下载是否成功 + if [[ $? -eq 0 ]] && [[ -f "$output" ]] && [[ -s "$output" ]]; then print_success "下载完成: $output" return 0 else print_error "下载失败: $url" + rm -f "$output" return 1 fi } @@ -105,20 +112,63 @@ download_packages() { local xray_file="xray_${XRAY_VERSION}_${arch}.deb" local v2raya_file="v2raya_${V2RAYA_VERSION}_${arch}.deb" + local download_failed=0 # 下载 Xray if [[ ! -f "$INSTALL_DIR/$xray_file" ]]; then - download_file "$BASE_URL/$xray_file" "$INSTALL_DIR/$xray_file" + if ! download_file "$BASE_URL/$xray_file" "$INSTALL_DIR/$xray_file"; then + download_failed=1 + fi else print_warning "文件已存在,跳过下载: $xray_file" fi # 下载 V2rayA if [[ ! -f "$INSTALL_DIR/$v2raya_file" ]]; then - download_file "$BASE_URL/$v2raya_file" "$INSTALL_DIR/$v2raya_file" + if ! download_file "$BASE_URL/$v2raya_file" "$INSTALL_DIR/$v2raya_file"; then + download_failed=1 + fi else print_warning "文件已存在,跳过下载: $v2raya_file" fi + + return $download_failed +} + +# 验证文件是否有效 +verify_deb_file() { + local file=$1 + + if [[ ! -f "$file" ]]; then + return 1 + fi + + if [[ ! -s "$file" ]]; then + print_warning "文件为空: $file" + return 1 + fi + + # 检查 file 命令是否存在 + if command -v file &> /dev/null; then + if ! file "$file" | grep -q "Debian"; then + print_warning "文件不是有效的 deb 包: $file" + return 1 + fi + else + # 如果没有 file 命令,简单检查文件扩展名和大小 + if [[ ! "$file" =~ \.deb$ ]]; then + print_warning "文件扩展名不正确: $file" + return 1 + fi + # 检查文件大小是否合理(至少 1KB) + local size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null) + if [[ $size -lt 1024 ]]; then + print_warning "文件大小异常: $file (${size} bytes)" + return 1 + fi + fi + + return 0 } # 安装 V2rayA @@ -130,30 +180,49 @@ install_v2raya() { # 检查文件是否存在 if [[ ! -f "$xray_file" ]] || [[ ! -f "$v2raya_file" ]]; then print_warning "安装包不存在,开始下载..." - download_packages + if ! download_packages; then + print_error "下载失败,无法继续安装" + print_info "请检查网络连接或下载地址是否正确" + return 1 + fi fi + # 验证文件完整性 + print_info "验证安装包完整性..." + if ! verify_deb_file "$xray_file"; then + print_error "Xray 安装包验证失败,请重新下载" + rm -f "$xray_file" + return 1 + fi + + if ! verify_deb_file "$v2raya_file"; then + print_error "V2rayA 安装包验证失败,请重新下载" + rm -f "$v2raya_file" + return 1 + fi + print_success "安装包验证通过" + print_info "开始安装 Xray..." chmod 644 "$xray_file" - dpkg -i "$xray_file" - apt --fix-broken install -y - - if [[ $? -ne 0 ]]; then + if dpkg -i "$xray_file" 2>&1 | tee /tmp/xray_install.log; then + apt --fix-broken install -y + print_success "Xray 安装成功" + else print_error "Xray 安装失败" - exit 1 + print_info "错误日志已保存到: /tmp/xray_install.log" + return 1 fi - print_success "Xray 安装成功" print_info "开始安装 V2rayA..." chmod 644 "$v2raya_file" - dpkg -i "$v2raya_file" - apt --fix-broken install -y - - if [[ $? -ne 0 ]]; then + if dpkg -i "$v2raya_file" 2>&1 | tee /tmp/v2raya_install.log; then + apt --fix-broken install -y + print_success "V2rayA 安装成功" + else print_error "V2rayA 安装失败" - exit 1 + print_info "错误日志已保存到: /tmp/v2raya_install.log" + return 1 fi - print_success "V2rayA 安装成功" # 启动服务 print_info "启动 V2rayA 服务..." @@ -163,6 +232,8 @@ install_v2raya() { print_success "V2rayA 服务启动成功" else print_error "V2rayA 服务启动失败" + print_info "请运行 'systemctl status v2raya.service' 查看详情" + return 1 fi # 设置开机自启 @@ -301,7 +372,11 @@ main() { read -p "按任意键继续..." -n 1 ;; 3) - download_packages + if download_packages; then + print_success "所有安装包下载完成" + else + print_error "部分安装包下载失败" + fi read -p "按任意键继续..." -n 1 ;; 4)