diff --git a/common/demo_usage.sh b/common/demo_usage.sh index f4256bc..95e82a2 100755 --- a/common/demo_usage.sh +++ b/common/demo_usage.sh @@ -3,17 +3,75 @@ # 文件名: demo_usage.sh # 描述: 公共函数库功能演示和使用示例 # 作者: Cloud Tools Project -# 版本: 1.0.0 +# 版本: 2.1.0(支持远程库加载) # ============================================================================ -set -euo pipefail # 启用严格模式 +set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} # 加载公共库 -source "${SCRIPT_DIR}/logging.sh" -source "${SCRIPT_DIR}/error_handler.sh" +load_common_libs # # 示例 1: 基本日志使用 diff --git a/common/remote_loader.sh b/common/remote_loader.sh new file mode 100755 index 0000000..98a1552 --- /dev/null +++ b/common/remote_loader.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# ============================================================================ +# 文件名: remote_loader.sh +# 描述: 远程公共库加载器 - 从 Gitea 仓库下载并加载公共库 +# 作者: Cloud Tools Project +# 版本: 1.0.0 +# ============================================================================ + +# 远程仓库 URL 配置 +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 临时目录用于存储下载的文件 +readonly REMOTE_TMP_DIR="$(mktemp -d)" + +# 清理函数 - 在脚本退出时删除临时文件 +cleanup_remote_libs() { + if [[ -d "$REMOTE_TMP_DIR" ]]; then + rm -rf "$REMOTE_TMP_DIR" + fi +} + +# 注册退出时的清理函数 +trap cleanup_remote_libs EXIT INT TERM + +# +# 从远程下载单个文件 +# +# 参数: +# $1 - 相对路径(例如:common/logging.sh) +# +# 返回: +# 下载文件的本地路径 +# +download_remote_file() { + local relative_path="$1" + local remote_url="${REMOTE_BASE_URL}/${relative_path}" + local local_file="${REMOTE_TMP_DIR}/$(basename "$relative_path")" + + # 尝试使用 curl 下载 + if command -v curl &>/dev/null; then + if curl -fsSL "$remote_url" -o "$local_file" 2>/dev/null; then + echo "$local_file" + return 0 + fi + # 尝试使用 wget 下载 + elif command -v wget &>/dev/null; then + if wget -q "$remote_url" -O "$local_file" 2>/dev/null; then + echo "$local_file" + return 0 + fi + else + echo "[ERROR] 未找到 curl 或 wget 命令,无法下载远程库" >&2 + return 1 + fi + + echo "[ERROR] 无法下载远程库: $remote_url" >&2 + return 1 +} + +# +# 加载远程公共库 +# +# 此函数会下载并 source 所有必需的公共库 +# +load_remote_libs() { + echo "[INFO] 正在从远程仓库加载公共库..." + echo "[INFO] 仓库地址: $REMOTE_BASE_URL" + + # 必需的库文件列表 + local required_libs=( + "common/logging.sh" + "common/error_handler.sh" + ) + + # 下载并加载每个库文件 + for lib in "${required_libs[@]}"; do + echo "[INFO] 下载 $lib ..." + + local local_path + if local_path=$(download_remote_file "$lib"); then + echo "[SUCCESS] 已下载: $lib" + + # 加载库文件 + # shellcheck disable=SC1090 + if source "$local_path"; then + echo "[SUCCESS] 已加载: $lib" + else + echo "[ERROR] 无法加载远程库: $lib" >&2 + echo "[ERROR] 脚本执行中止" >&2 + exit 1 + fi + else + echo "[ERROR] 无法下载远程库: $lib" >&2 + echo "[ERROR] 脚本执行中止" >&2 + echo "[ERROR] 请检查网络连接或仓库 URL: $REMOTE_BASE_URL" >&2 + exit 1 + fi + done + + echo "[SUCCESS] 所有远程库加载完成" + echo "" +} + +# 执行加载 +load_remote_libs diff --git a/examples/REMOTE_LOADER_README.md b/examples/REMOTE_LOADER_README.md new file mode 100644 index 0000000..d66bc1c --- /dev/null +++ b/examples/REMOTE_LOADER_README.md @@ -0,0 +1,289 @@ +# 远程库加载器使用指南 + +## 概述 + +远程库加载器允许脚本从 Gitea 仓库动态下载并加载公共库,使得脚本可以独立运行而不依赖本地的 `common/` 目录。 + +## 仓库 URL + +``` +https://gitea.bcde.io/wangdefa/tools/raw/branch/main +``` + +## 使用方式 + +### 方式 1: 纯远程模式(推荐用于独立脚本) + +适用于需要独立分发的脚本,每次运行都下载最新版本的公共库。 + +```bash +#!/bin/bash +set -euo pipefail + +# 直接从远程加载 +if command -v curl &>/dev/null; then + source <(curl -fsSL https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) +elif command -v wget &>/dev/null; then + source <(wget -qO- https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) +else + echo "[ERROR] 需要 curl 或 wget" >&2 + exit 1 +fi + +# 现在可以使用公共库函数 +log_info "Hello World" +``` + +### 方式 2: 混合模式(推荐用于仓库内脚本) + +优先使用本地库,本地不存在时自动使用远程库。 + +```bash +#!/bin/bash +set -euo pipefail + +readonly REMOTE_BASE_URL="https://gitea.bcde.io/wangdefa/tools/raw/branch/main" +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# 智能加载函数 +load_common_libs() { + # 尝试本地 + if [[ -f "${PROJECT_ROOT}/common/logging.sh" ]]; then + source "${PROJECT_ROOT}/common/logging.sh" + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + fi + + # 回退到远程 + if command -v curl &>/dev/null; then + source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh") + elif command -v wget &>/dev/null; then + source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh") + else + echo "[ERROR] 无法加载库" >&2 + exit 1 + fi +} + +load_common_libs + +# 使用公共库 +log_info "使用混合模式" +``` + +### 方式 3: 环境变量控制 + +通过环境变量灵活切换本地/远程模式。 + +```bash +#!/bin/bash +set -euo pipefail + +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# 检查是否强制使用远程 +if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + # 使用远程 + source <(curl -fsSL https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) +else + # 使用本地 + source "${PROJECT_ROOT}/common/logging.sh" + source "${PROJECT_ROOT}/common/error_handler.sh" +fi +``` + +使用方法: +```bash +# 使用本地库 +./script.sh + +# 强制使用远程库 +FORCE_REMOTE=1 ./script.sh +``` + +## 完整示例 + +### 示例 1: 纯远程脚本 + +参见 [remote_example.sh](./remote_example.sh) + +运行: +```bash +chmod +x examples/remote_example.sh +./examples/remote_example.sh +``` + +### 示例 2: 混合模式脚本 + +参见 [hybrid_loader_template.sh](./hybrid_loader_template.sh) + +运行: +```bash +chmod +x examples/hybrid_loader_template.sh + +# 使用本地库(如果存在) +./examples/hybrid_loader_template.sh + +# 强制使用远程库 +FORCE_REMOTE=1 ./examples/hybrid_loader_template.sh +``` + +## 更新现有脚本 + +### 步骤 1: 备份原脚本 + +```bash +cp linux/create_raid0_array.sh linux/create_raid0_array.sh.bak +``` + +### 步骤 2: 替换加载部分 + +**原代码:** +```bash +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +source "${PROJECT_ROOT}/common/logging.sh" +source "${PROJECT_ROOT}/common/error_handler.sh" +``` + +**新代码(纯远程):** +```bash +# 远程加载 +if command -v curl &>/dev/null; then + source <(curl -fsSL https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) +elif command -v wget &>/dev/null; then + source <(wget -qO- https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) +else + echo "[ERROR] 需要 curl 或 wget" >&2 + exit 1 +fi +``` + +**新代码(混合模式):** +```bash +readonly REMOTE_BASE_URL="https://gitea.bcde.io/wangdefa/tools/raw/branch/main" +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# 智能加载 +if [[ "${FORCE_REMOTE:-0}" == "1" ]] || [[ ! -f "${PROJECT_ROOT}/common/logging.sh" ]]; then + if command -v curl &>/dev/null; then + source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh") + elif command -v wget &>/dev/null; then + source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh") + else + echo "[ERROR] 无法加载库" >&2 + exit 1 + fi +else + source "${PROJECT_ROOT}/common/logging.sh" + source "${PROJECT_ROOT}/common/error_handler.sh" +fi +``` + +## 环境变量 + +| 变量 | 说明 | 默认值 | +|------|------|--------| +| `REMOTE_LIB_URL` | 远程仓库 URL | `https://gitea.bcde.io/wangdefa/tools/raw/branch/main` | +| `FORCE_REMOTE` | 强制使用远程库 | `0` | + +示例: +```bash +# 使用自定义仓库 URL +REMOTE_LIB_URL=https://example.com/repo ./script.sh + +# 强制远程模式 +FORCE_REMOTE=1 ./script.sh +``` + +## 优缺点对比 + +### 纯远程模式 + +**优点:** +- ✅ 脚本完全独立,可单文件分发 +- ✅ 始终使用最新版本的公共库 +- ✅ 无需本地依赖 + +**缺点:** +- ❌ 需要网络连接 +- ❌ 每次运行都需要下载(约 1-2 秒延迟) +- ❌ 依赖 curl 或 wget + +### 混合模式 + +**优点:** +- ✅ 本地运行快速(无网络延迟) +- ✅ 离线时仍可工作(如果有本地库) +- ✅ 远程作为备用方案 + +**缺点:** +- ❌ 代码稍复杂 +- ❌ 可能使用旧版本的本地库 + +### 本地模式(原方式) + +**优点:** +- ✅ 最快速(无下载) +- ✅ 完全离线 +- ✅ 代码最简单 + +**缺点:** +- ❌ 必须有完整的项目结构 +- ❌ 无法独立分发脚本 +- ❌ 需要手动更新库 + +## 最佳实践 + +1. **仓库内脚本**:使用混合模式 +2. **独立分发脚本**:使用纯远程模式 +3. **测试环境**:使用 `FORCE_REMOTE=1` 测试远程加载 +4. **生产环境**:建议使用本地库(性能更好) + +## 故障排除 + +### 错误:无法下载远程库 + +**可能原因:** +1. 网络连接问题 +2. Gitea 服务器不可达 +3. URL 错误 + +**解决方案:** +```bash +# 测试连接 +curl -I https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh + +# 使用自定义 URL +REMOTE_LIB_URL=https://your-mirror.com/tools ./script.sh +``` + +### 错误:curl/wget 未找到 + +**解决方案:** +```bash +# Ubuntu/Debian +sudo apt-get install curl + +# CentOS/RHEL +sudo yum install curl + +# macOS +brew install curl +``` + +## 安全考虑 + +1. **HTTPS**:始终使用 HTTPS URL +2. **验证**:建议验证下载文件的哈希值 +3. **审计**:定期审查远程库的变更 +4. **备份**:保留本地备份以防远程不可用 + +## 更多信息 + +- 公共库文档:[common/README.md](../common/README.md) +- 编码规范:[llmdoc/reference/coding-conventions.md](../llmdoc/reference/coding-conventions.md) diff --git a/examples/hybrid_loader_template.sh b/examples/hybrid_loader_template.sh new file mode 100755 index 0000000..62259b1 --- /dev/null +++ b/examples/hybrid_loader_template.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# ============================================================================ +# 文件名: hybrid_loader_template.sh +# 描述: 混合模式加载器模板 - 自动选择本地或远程库 +# 作者: Cloud Tools Project +# 版本: 1.0.0 +# ============================================================================ + +set -euo pipefail + +# 远程仓库 URL +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录 +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# +# 智能加载公共库 +# +# 尝试顺序: +# 1. 如果设置了 FORCE_REMOTE=1,强制使用远程 +# 2. 尝试加载本地库 +# 3. 如果本地库不存在,自动使用远程 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制使用远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + echo "[INFO] 使用本地公共库" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库(本地不存在且远程下载失败)" >&2 + echo "[ERROR] 请检查网络连接或安装 curl/wget" >&2 + exit 1 + fi +} + +# 加载公共库 +load_common_libs + +# +# 主函数 +# +main() { + log_info "============ 混合加载器示例 ============" + log_info "使用混合模式的公共库" + + # 显示加载信息 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + log_warning "当前使用远程库(强制模式)" + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]]; then + log_success "当前使用本地库" + else + log_warning "当前使用远程库(自动回退)" + fi + + # 测试功能 + log_info "测试日志功能..." + log_success "日志功能正常" + + log_info "测试错误处理..." + if check_command "bash"; then + log_success "命令检查功能正常" + fi + + log_success "所有测试通过!" +} + +# 执行主函数 +main "$@" diff --git a/examples/remote_example.sh b/examples/remote_example.sh new file mode 100755 index 0000000..a5a6c38 --- /dev/null +++ b/examples/remote_example.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# ============================================================================ +# 文件名: remote_example.sh +# 描述: 使用远程库的示例脚本 +# 作者: Cloud Tools Project +# 版本: 1.0.0 +# ============================================================================ + +set -euo pipefail + +# +# 远程库加载方式(二选一) +# + +# 方式 1: 直接使用远程加载器(推荐) +# 这会从远程仓库下载最新的公共库 +if command -v curl &>/dev/null || command -v wget &>/dev/null; then + # 下载并执行远程加载器 + if command -v curl &>/dev/null; then + # shellcheck disable=SC1090 + source <(curl -fsSL https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) + else + # shellcheck disable=SC1090 + source <(wget -qO- https://gitea.bcde.io/wangdefa/tools/raw/branch/main/common/remote_loader.sh) + fi +else + echo "[ERROR] 需要 curl 或 wget 来下载远程库" >&2 + exit 1 +fi + +# 方式 2: 使用本地的远程加载器(如果已经克隆了仓库) +# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# source "${PROJECT_ROOT}/common/remote_loader.sh" + +# +# 主函数 - 使用远程加载的公共库 +# +main() { + log_info "============ 远程库使用示例 ============" + + # 使用日志函数 + log_info "这是一条普通信息" + log_success "这是一条成功信息" + log_warning "这是一条警告信息" + log_error "这是一条错误信息(但不会退出)" + + # 使用错误处理函数 + log_info "检查命令是否存在..." + if check_command "bash"; then + log_success "bash 命令存在" + fi + + # 使用 run_command 执行命令 + log_info "执行示例命令..." + run_command "列出当前目录" ls -lah + + log_success "所有功能正常!" +} + +# 执行主函数 +main "$@" diff --git a/gcp/create_ai_projects.sh b/gcp/create_ai_projects.sh index a140977..a2f278e 100644 --- a/gcp/create_ai_projects.sh +++ b/gcp/create_ai_projects.sh @@ -3,18 +3,75 @@ # 文件名: create_ai_projects.sh # 描述: 批量创建 Google Cloud Platform AI 项目并配置相关服务 # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(支持远程库加载) # ============================================================================ set -euo pipefail # 启用严格模式 -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs # 默认配置 readonly DEFAULT_PROJECT_ID_PREFIX="project" diff --git a/gcp/delete_all_projects.sh b/gcp/delete_all_projects.sh index 7bfbfa6..4c6214f 100644 --- a/gcp/delete_all_projects.sh +++ b/gcp/delete_all_projects.sh @@ -3,19 +3,76 @@ # 文件名: delete_all_projects.sh # 描述: 删除 GCP 账户下的所有项目(危险操作) # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(支持远程库加载) # 警告: 此操作不可逆,所有项目数据将永久丢失 # ============================================================================ set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs # 创建日志文件 readonly LOG_FILE="deleted_projects_$(date +%Y%m%d_%H%M%S).log" diff --git a/linux/create_raid0_array.sh b/linux/create_raid0_array.sh old mode 100644 new mode 100755 index 0b98cb8..195622a --- a/linux/create_raid0_array.sh +++ b/linux/create_raid0_array.sh @@ -1,21 +1,82 @@ #!/bin/bash # ============================================================================ -# 文件名: create_raid0_array.sh -# 描述: 创建并配置 RAID 0 存储阵列 +# 文件名: create_raid0_array_remote.sh +# 描述: 创建并配置 RAID 0 存储阵列(支持远程库加载) # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(远程加载版) # 警告: 此操作将删除目标磁盘上的所有数据 # ============================================================================ set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs + +# ============================================================================ +# 脚本配置 +# ============================================================================ # 配置 readonly MOUNT_POINT="/mnt/raid0" @@ -23,6 +84,10 @@ readonly MOUNT_POINT="/mnt/raid0" # 检查 root 权限 check_root +# ============================================================================ +# 函数定义 +# ============================================================================ + # # 检查并安装依赖工具 # @@ -49,6 +114,7 @@ check_and_install() { # main() { log_info "============ RAID 0 创建程序 ============" + log_info "版本: 2.1.0 (支持远程库加载)" # 检查依赖 check_and_install mdadm @@ -139,4 +205,4 @@ main() { } # 执行主函数 -main "$@" \ No newline at end of file +main "$@" diff --git a/linux/install_oh_my_zsh.sh b/linux/install_oh_my_zsh.sh index 13dcff0..fb6d60b 100644 --- a/linux/install_oh_my_zsh.sh +++ b/linux/install_oh_my_zsh.sh @@ -3,18 +3,75 @@ # 文件名: install_oh_my_zsh.sh # 描述: 安装和配置 Oh My Zsh 及常用插件 # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(支持远程库加载) # ============================================================================ set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs # 配置路径 readonly INSTALL_DIR="${HOME}/.oh-my-zsh" @@ -65,6 +122,7 @@ install_zsh() { # main() { log_info "============ Oh My Zsh 安装程序 ============" + log_info "版本: 2.1.0 (支持远程库加载)" check_and_install_packages "sudo" "git" "curl" "zsh" diff --git a/linux/repartition_disks.sh b/linux/repartition_disks.sh index 4342c54..f024795 100644 --- a/linux/repartition_disks.sh +++ b/linux/repartition_disks.sh @@ -3,19 +3,76 @@ # 文件名: repartition_disks.sh # 描述: 删除所有现有分区并创建新的 GPT 分区表(除了系统盘) # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(支持远程库加载) # 警告: 此操作将删除目标磁盘上的所有数据 # ============================================================================ set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs # 检查 root 权限 check_root @@ -46,6 +103,7 @@ check_and_install() { # main() { log_info "============ 磁盘重新分区程序 ============" + log_info "版本: 2.1.0 (支持远程库加载)" # 检查依赖 check_and_install lsblk diff --git a/oci/create_instance.sh b/oci/create_instance.sh index cce90b3..ad2d3bc 100644 --- a/oci/create_instance.sh +++ b/oci/create_instance.sh @@ -3,18 +3,75 @@ # 文件名: create_instance.sh # 描述: Oracle Cloud Infrastructure 虚拟机批量部署工具 # 作者: Cloud Tools Project -# 版本: 2.0.0 +# 版本: 2.1.0(支持远程库加载) # ============================================================================ set -euo pipefail -# 获取脚本目录 +# ============================================================================ +# 远程库加载配置 +# ============================================================================ + +# 远程仓库 URL(可通过环境变量覆盖) +readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" + +# 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +# +# 智能加载公共库 +# +# 加载策略: +# 1. 如果 FORCE_REMOTE=1,强制使用远程库 +# 2. 否则尝试使用本地库 +# 3. 本地库不存在时自动回退到远程库 +# +load_common_libs() { + local use_remote=false + + # 检查是否强制远程 + if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then + echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 + use_remote=true + # 检查本地库是否存在 + elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/logging.sh" + # shellcheck disable=SC1091 + source "${PROJECT_ROOT}/common/error_handler.sh" + return 0 + else + echo "[WARN] 本地库不存在,使用远程库" >&2 + use_remote=true + fi + + # 使用远程库 + if [[ "$use_remote" == "true" ]]; then + if command -v curl &>/dev/null; then + echo "[INFO] 使用 curl 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + elif command -v wget &>/dev/null; then + echo "[INFO] 使用 wget 下载远程库..." >&2 + # shellcheck disable=SC1090 + if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then + return 0 + fi + fi + + echo "[ERROR] 无法加载公共库" >&2 + echo "[ERROR] - 本地库不存在" >&2 + echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 + echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 + exit 1 + fi +} + # 加载公共库 -source "${PROJECT_ROOT}/common/logging.sh" -source "${PROJECT_ROOT}/common/error_handler.sh" +load_common_libs # 默认配置参数 readonly DEFAULT_NUMBER=1