EVE-NG 镜像导入脚本

作者:waMoYu 发布时间: 2026-01-07 阅读量:24 评论数:0

自动将当前路径下tar.gz解压并且将里面的内容移动到对应位置

将脚本当前目录(包括子目录)类的压缩包解压,将qcow2及父目录传输到qemu目录,将yml传输到模板目录,将png传输到图标目录,将py传输到scripts目录,将bin传输到iol/l2或l3目录。

由于iol/l2以及iol/l3目录未正式使用,所以如果自动移动到这2个目录,需要手动移动回去。

#!/bin/bash

# 颜色定义
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 目标路径定义
QCOW2_PATH="/opt/unetlab/addons/qemu"
YML_INTEL_PATH="/opt/unetlab/html/templates/intel"
YML_AMD_PATH="/opt/unetlab/html/templates/amd"
PNG_PATH="/opt/unetlab/html/images/icons"
BIN_BASE_PATH="/opt/unetlab/addons/iol/bin"
BIN_L2_PATH="/opt/unetlab/addons/iol/bin/l2"
BIN_L3_PATH="/opt/unetlab/addons/iol/bin/l3"
PY_PATH="/opt/unetlab/config_scripts"

# 日志函数
log_info() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M')] [信息] $1${NC}"
}

log_warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M')] [警告] $1${NC}"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M')] [错误] $1${NC}"
}

# 创建目标目录函数
create_target_dirs() {
    local dirs=("$QCOW2_PATH" "$YML_INTEL_PATH" "$YML_AMD_PATH" "$PNG_PATH" "$BIN_BASE_PATH" "$BIN_L2_PATH" "$BIN_L3_PATH" "$PY_PATH")
    
    for dir in "${dirs[@]}"; do
        if [ ! -d "$dir" ]; then
            mkdir -p "$dir"
            if [ $? -eq 0 ]; then
                log_info "创建目录: $dir"
            else
                log_error "无法创建目录: $dir"
            fi
        fi
    done
}

# 解压函数
extract_archives() {
    local script_dir=$(dirname "$(realpath "$0")")
    local extracted_count=0
    
    # 查找所有压缩文件
    while IFS= read -r -d '' file; do
        local filename=$(basename "$file")
        local dirname=$(dirname "$file")
        
        case "$filename" in
            *.zip)
                unzip -q -o "$file" -d "$dirname"
                if [ $? -eq 0 ]; then
                    log_info "解压 $filename 完成"
                    ((extracted_count++))
                else
                    log_error "解压 $filename 失败"
                fi
                ;;
            *.tar.gz|*.tgz)
                tar -xzf "$file" -C "$dirname"
                if [ $? -eq 0 ]; then
                    log_info "解压 $filename 完成"
                    ((extracted_count++))
                else
                    log_error "解压 $filename 失败"
                fi
                ;;
            *.tar.bz2|*.tbz2)
                tar -xjf "$file" -C "$dirname"
                if [ $? -eq 0 ]; then
                    log_info "解压 $filename 完成"
                    ((extracted_count++))
                else
                    log_error "解压 $filename 失败"
                fi
                ;;
            *.tar.xz|*.txz)
                tar -xJf "$file" -C "$dirname"
                if [ $? -eq 0 ]; then
                    log_info "解压 $filename 完成"
                    ((extracted_count++))
                else
                    log_error "解压 $filename 失败"
                fi
                ;;
            *.tar)
                tar -xf "$file" -C "$dirname"
                if [ $? -eq 0 ]; then
                    log_info "解压 $filename 完成"
                    ((extracted_count++))
                else
                    log_error "解压 $filename 失败"
                fi
                ;;
            *.gz)
                if [[ "$filename" != *.tar.gz ]]; then
                    gunzip -f "$file"
                    if [ $? -eq 0 ]; then
                        log_info "解压 $filename 完成"
                        ((extracted_count++))
                    else
                        log_error "解压 $filename 失败"
                    fi
                fi
                ;;
        esac
    done < <(find "$script_dir" -type f \( -name "*.zip" -o -name "*.tar.gz" -o -name "*.tgz" -o -name "*.tar.bz2" -o -name "*.tbz2" -o -name "*.tar.xz" -o -name "*.txz" -o -name "*.tar" -o -name "*.gz" \) -print0)
    
    if [ $extracted_count -gt 0 ]; then
        log_info "总共解压了 $extracted_count 个压缩文件"
    fi
}

# 文件统计和移动函数
process_files() {
    local script_dir=$(dirname "$(realpath "$0")")
    local qcow2_count=0 yml_count=0 png_count=0 bin_count=0 py_count=0
    
    # 统计文件数量
    while IFS= read -r -d '' file; do
        local ext="${file##*.}"
        case "$ext" in
            qcow2) ((qcow2_count++)) ;;
            yml|yaml) ((yml_count++)) ;;
            png) ((png_count++)) ;;
            bin) ((bin_count++)) ;;
            py) ((py_count++)) ;;
        esac
    done < <(find "$script_dir" -type f \( -name "*.qcow2" -o -name "*.yml" -o -name "*.yaml" -o -name "*.png" -o -name "*.bin" -o -name "*.py" \) -print0)
    
    log_info "检测到 $qcow2_count 个qcow2、$yml_count 个yml、$png_count 个png、$bin_count 个bin、$py_count 个py文件"
    
    # 处理qcow2文件 - 修复后的逻辑
    while IFS= read -r -d '' file; do
        local dirname=$(dirname "$file")
        local parent_dir=$(basename "$dirname")
        local filename=$(basename "$file")
        
        # 修复:检查是否在脚本所在目录的直接子文件夹中
        if [ "$dirname" != "$script_dir" ]; then
            # 移动整个包含qcow2文件的文件夹
            local target_dir="$QCOW2_PATH/$parent_dir"
            mkdir -p "$target_dir"
            # 移动整个目录,而不仅仅是单个文件
            if [ -d "$dirname" ]; then
                cp -r "$dirname" "$QCOW2_PATH/"
                if [ $? -eq 0 ]; then
                    log_info "移动 $parent_dir 镜像目录到 $QCOW2_PATH 成功!"
                    # 可选:删除原目录
                    # rm -rf "$dirname"
                else
                    log_error "移动 $parent_dir 镜像目录失败"
                fi
            else
                # 如果目录不存在,只移动文件
                mv "$file" "$target_dir/"
                if [ $? -eq 0 ]; then
                    log_info "移动 $filename 镜像到 $target_dir 成功!"
                else
                    log_error "移动 $filename 镜像失败"
                fi
            fi
        else
            log_warn "检测到 $filename 文件没有上一级目录,该文件忽略。"
        fi
    done < <(find "$script_dir" -type f -name "*.qcow2" -print0)
    
    # 处理yml文件
    while IFS= read -r -d '' file; do
        local dirname=$(dirname "$file")
        local parent_dir=$(basename "$dirname")
        local filename=$(basename "$file")
        
        case "$parent_dir" in
            intel|amd)
                # 有明确的父目录
                if [ "$parent_dir" = "intel" ]; then
                    mv "$file" "$YML_INTEL_PATH/"
                    log_info "移动 $filename 模板到 $YML_INTEL_PATH 成功!"
                else
                    mv "$file" "$YML_AMD_PATH/"
                    log_info "移动 $filename 模板到 $YML_AMD_PATH 成功!"
                fi
                ;;
            *)
                # 没有明确的父目录,复制到两个路径
                cp "$file" "$YML_INTEL_PATH/"
                cp "$file" "$YML_AMD_PATH/"
                log_info "复制 $filename 模板到 Intel 和 AMD 模板目录成功!"
                ;;
        esac
    done < <(find "$script_dir" -type f \( -name "*.yml" -o -name "*.yaml" \) -print0)
    
    # 处理png文件
    while IFS= read -r -d '' file; do
        local filename=$(basename "$file")
        mv "$file" "$PNG_PATH/"
        if [ $? -eq 0 ]; then
            log_info "移动 $filename 图标到 $PNG_PATH 成功!"
        else
            log_error "移动 $filename 图标失败"
        fi
    done < <(find "$script_dir" -type f -name "*.png" -print0)
    
    # 处理bin文件
    while IFS= read -r -d '' file; do
        local dirname=$(dirname "$file")
        local parent_dir=$(basename "$dirname")
        local filename=$(basename "$file")
        
        case "$parent_dir" in
            l2|l3)
                # 有明确的父目录
                if [ "$parent_dir" = "l2" ]; then
                    mkdir -p "$BIN_L2_PATH"
                    mv "$file" "$BIN_L2_PATH/"
                    log_info "移动 $filename 镜像到 $BIN_L2_PATH 成功!"
                else
                    mkdir -p "$BIN_L3_PATH"
                    mv "$file" "$BIN_L3_PATH/"
                    log_info "移动 $filename 镜像到 $BIN_L3_PATH 成功!"
                fi
                ;;
            *)
                # 检查文件名包含l2或l3关键字
                if [[ "$filename" == *l2* ]]; then
                    if [ -d "$BIN_L2_PATH" ]; then
                        mv "$file" "$BIN_L2_PATH/"
                        log_info "移动 $filename 镜像到 $BIN_L2_PATH 成功!"
                    else
                        mv "$file" "$BIN_BASE_PATH/"
                        log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
                    fi
                elif [[ "$filename" == *l3* ]]; then
                    if [ -d "$BIN_L3_PATH" ]; then
                        mv "$file" "$BIN_L3_PATH/"
                        log_info "移动 $filename 镜像到 $BIN_L3_PATH 成功!"
                    else
                        mv "$file" "$BIN_BASE_PATH/"
                        log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
                    fi
                else
                    mv "$file" "$BIN_BASE_PATH/"
                    log_info "移动 $filename 镜像到 $BIN_BASE_PATH 成功!"
                fi
                ;;
        esac
    done < <(find "$script_dir" -type f -name "*.bin" -print0)
    
    # 处理py文件
    while IFS= read -r -d '' file; do
        local filename=$(basename "$file")
        mv "$file" "$PY_PATH/"
        if [ $? -eq 0 ]; then
            log_info "移动 $filename 脚本到 $PY_PATH 成功!"
        else
            log_error "移动 $filename 脚本失败"
        fi
    done < <(find "$script_dir" -type f -name "*.py" -print0)
}

# 主函数
main() {
    log_info "开始执行文件处理脚本"
    
    # 创建目标目录
    create_target_dirs
    
    # 解压压缩包
    extract_archives
    
    # 处理各类文件
    process_files
    
    log_info "文件处理完成"
}

# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
    log_warn "建议以root权限运行此脚本,否则可能无法访问目标目录"
    read -p "是否继续? (y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

# 执行主函数
main

评论