EVE-NG 模板描述信息批量替换

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

替换后的描述信息更加友好

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import glob
import re
from datetime import datetime

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

# 关键字映射
KEYWORD_MAP = {
    "panabit.yml": "[北京派网] Panabit 虚拟化设备",
    "docker.yml": "[Docker] Docker 容器",
    "bigip.yml": "[F5] BIG-IP LTM VE",
    "fortinet.yml": "[飞塔] Fortinet 云安全设备",
    "jumpserver.yml": "[飞致云] JumpServer 开源堡垒机",
    "huaweiar1k.yml": "[华为] Huawei NetEngine AR1000v 虚拟路由器(NFV)",
    "huaweiar6700v.yml": "[华为] Huawei NetEngine AR6700v 虚拟路由器(NFV)",
    "huaweice12800.yml": "[华为] Huawei CloudEngine 12800 模拟交换机(ENSP)",
    "huaweice6800.yml": "[华为] Huawei CloudEngine 6800 模拟交换机(ENSP)",
    "huaweicx.yml": "[华为] Huawei CloudExchange 模拟路由器(ENSP)",
    "huaweiensppro.yml": "[华为] Huawei eNSP Pro 华为数通仿真模拟器",
    "huaweine40e.yml": "[华为] Huawei NetEngine 40E 模拟路由器(ENSP)",
	"huaweine5ke.yml": "[华为] Huawei NetEngine 5000E(ENSP)",
	"huaweine9k.yml": "[华为] Huawei NetEngine 9000(ENSP)",
    "huaweiuma1500v.yml": "[华为] Huawei UMA1000 统一运维审计(NFV)",
    "huaweiusg6kv.yml": "[华为] Huawei USG6000v 虚拟综合业务网关(NFV)",
    "huaweiwaf5k.yml": "[华为] Huawei WAF5000-V 虚拟WEB防火墙(NFV)",
    "linux.yml": "[Linux] Linux系统",
    "mikrotik.yml": "[MikroTik] RouterOS 路由操作系统",
    "opnsense.yml": "OPNsense Firewall",
    "qaxvfw.yml": "[奇安信] QAX 网神新一代智慧防火墙",
    "venus_adc.yml": "[启明星辰] Venus ADC天清应用交付控制系统(NFV)",
    "venus_fw.yml": "[启明星辰] Venus FW 天清汉马USG(NFV)",
    "Ruijiefirewall.yml": "[锐捷] Ruijie vFirewall 模拟通用防火墙",
    "Ruijieroute.yml": "[锐捷] Ruijie vRoute 模拟通用路由器",
    "Ruijieswitch.yml": "[锐捷] Ruijie vSwitch 模拟通用交换机",
    "hillstone.yml": "[山石网科] Hillstone 山石云安全设备",
    "sxf.yml": "[深信服] SXF 云安全设备",
    "iol.yml": "[思科] Cisco IOL Router/SWitch 路由器/交换机",
    "iol_l3.yml": "[思科] Cisco IOL Router 路由器",
    "iol_l2.yml": "[思科] Cisco IOL Switch 交换机",
	"ise.yml": "[思科] ISE 身份服务引擎",
	"nxosv9k.yml": "[思科] Nexus 9000v 交换机",
	"vios.yml": "[思科] vlOS Router 路由器",
	"viosl2.yml": "[思科] vlOS Switch 交换机",
	"xrv.yml": "[思科] XRv 路由器",
	"asav.yml": "[思科] ASAv 防火墙",
	"c8000v.yml": "[思科] Catalyst 8000v 路由器",
	"csr1000vng.yml": "[思科] Cisco CSR 1000V(XE 16.x) 路由器",
	"firepower6.yml": "[思科] FirePower 6 防火墙",
	"fmc7.yml": "[思科] Firepower FMC 7 管理中心",
	"ftd7.yml": "[思科] Firepower FTD 7 威胁防御",
	"vtbond.yml": "[思科] Viptela vBond 编排平面",
	"vtedge.yml": "[思科] Viptela vEdge 数据平面",
	"vtmgmt.yml": "[思科] Viptela vManage 管理平面",
	"vtsmart.yml": "[思科] Viptela vSmart 控制平面",
    "topsec.yml": "[天融信] Topsec vFW 防火墙",
    "vyos.yml": "[VyOS] VyOS 开源路由操作系统",
    "win.yml": "[微软] Microsoft Windows",
    "winserver.yml": "[微软] Microsoft WinServer",
	"h3cserver.yml": "[新华三] H3C Cloud Lab Server",
    "h3cimc.yml": "[新华三] H3C iMC 智能管理中心",
    "h3cvac1k.yml": "[新华三] H3C vAC 虚拟无线控制器(NFV)",
    "h3cvacg1k.yml": "[新华三] H3C vACG 应用控制网关",
    "h3cvbras1k.yml": "[新华三] H3C vBRAS 虚拟宽带远程接入服务器",
    "h3cvfw1k.yml": "[新华三] H3C SecPath vFW-E-Cloud 虚拟防火墙(NFV)",
    "h3cvlb1k.yml": "[新华三] H3C vLB1000 虚拟应用交付安全网关",
    "h3cvsr1k.yml": "[新华三] H3C vSR 虚拟路由器(NFV)",
    "h3cvswitch_S6850.yml": "[新华三] H3C vSwitch S6850 模拟交换机",
    "h3cvswitch_S6890.yml": "[新华三] H3C vSwitch S6890 虚拟交换机(NFV)",
    "h3cvswitch_S9850.yml": "[新华三] H3C vSwitch S9850 虚拟交换机",
    "vjunosswitch.yml": "[瞻博网络] Juniper vEX Switch 虚拟交换机",
	"128T.yml": "[瞻博] Juniper 128T 路由器",
	"vmxvcp.yml": "[瞻博] Juniper vMX VCP 路由器 虚拟控制平面",
	"vmxvfp.yml": "[瞻博] Juniper vMX VFP 路由器 虚拟转发平面",
	"vsrxng.yml": "[瞻博] Juniper vSRX NextGen 防火墙",
	"veos.yml": "[Arista] 网络操作系统",
	"versaana.yml": "[Versa] Versa Analytics",
	"versadir.yml": "[Versa] Versa Director",
	"versafvnf.yml": "[Versa] Versa FlexVNF",
	"veloedge.yml": "[VMware] Velocloud Edge 企业级设备或虚拟化云实例",
	"velogw.yml": "[VMware] Velocloud Gateway 云交付网关",
	"veloorch.yml": "[VMware] Velocloud Orchestrator 多租户配置和监控门户",
	"zabbix.yml": "[zabbix] Zabbix monitoring",
	"vpcs.yml": "[vPC] Virtual PC (VPCS)",
	"newvpc.yml": "[vPC] New VPC"
}

def log_info(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
    print(f"{Colors.GREEN}[{timestamp}] [信息] {message}{Colors.NC}")

def log_warning(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
    print(f"{Colors.YELLOW}[{timestamp}] [警告] {message}{Colors.NC}")

def log_error(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
    print(f"{Colors.RED}[{timestamp}] [错误] {message}{Colors.NC}")

def process_yml_file(file_path):
    filename = os.path.basename(file_path)
    
    # 检查是否在关键字映射中
    if filename in KEYWORD_MAP:
        new_description = KEYWORD_MAP[filename]
        
        try:
            # 读取整个文件内容
            with open(file_path, 'r', encoding='utf-8') as file:
                content = file.read()
            
            # 备份原文件
            backup_path = f"{file_path}.bak"
            with open(backup_path, 'w', encoding='utf-8') as backup_file:
                backup_file.write(content)
            
            # 使用正则表达式替换description行
            # 匹配格式: description: 任意内容
            pattern = r'^(.*description:\s*).*$'
            replacement = r'\1"{}"'.format(new_description)
            
            new_content = re.sub(pattern, replacement, content, flags=re.MULTILINE)
            
            # 如果替换没有生效,尝试另一种格式(不带引号)
            if new_content == content:
                pattern = r'^(.*description:\s*)[^\n]*$'
                new_content = re.sub(pattern, replacement, content, flags=re.MULTILINE)
            
            # 写入新内容
            with open(file_path, 'w', encoding='utf-8') as file:
                file.write(new_content)
            
            # 验证修改是否成功
            with open(file_path, 'r', encoding='utf-8') as file:
                new_content_check = file.read()
            
            # 检查是否包含新的description
            if f'description: "{new_description}"' in new_content_check or f"description: '{new_description}'" in new_content_check:
                log_info(f"检测{filename} 匹配到关键字,修改成功")
                # 删除备份文件
                if os.path.exists(backup_path):
                    os.remove(backup_path)
                return "modified", filename
            else:
                log_error(f"检测{filename} 匹配到关键字,修改失败!!!")
                # 恢复备份
                if os.path.exists(backup_path):
                    os.rename(backup_path, file_path)
                return "failed", filename
                
        except Exception as e:
            log_error(f"检测{filename} 匹配到关键字,修改失败!!!错误: {str(e)}")
            # 如果备份文件存在,恢复它
            backup_path = f"{file_path}.bak"
            if os.path.exists(backup_path):
                os.rename(backup_path, file_path)
            return "failed", filename
    else:
        log_warning(f"检测{filename} 未匹配到关键字,忽略。")
        return "ignored", filename

def main():
    log_info("开始检测yml文件...")
    
    # 获取当前目录下所有yml文件
    yml_files = glob.glob("*.yml")
    
    if not yml_files:
        log_warning("当前目录下未找到任何yml文件")
        return
    
    # 初始化计数器
    modified_count = 0
    ignored_count = 0
    failed_count = 0
    modified_files = []  # 存储修改成功的文件及其关键字
    failed_files = []    # 存储修改失败的文件名
    
    # 处理每个yml文件
    for yml_file in yml_files:
        result, filename = process_yml_file(yml_file)
        
        if result == "modified":
            modified_count += 1
            modified_files.append((filename, KEYWORD_MAP[filename]))
        elif result == "failed":
            failed_count += 1
            failed_files.append(filename)
        else:  # "ignored"表示忽略
            ignored_count += 1
    
    # 计算未命中的关键字
    processed_files = [os.path.basename(f) for f in yml_files]
    unmatched_keywords = []
    for keyword, description in KEYWORD_MAP.items():
        if keyword not in processed_files:
            unmatched_keywords.append((keyword, description))
    
    # 输出统计信息
    print()
    log_info(f"修改完成!关键字数量:{len(KEYWORD_MAP)}个,共计修改{modified_count}个文件关键字,修改文件及关键字如下:")
    for i, (filename, description) in enumerate(modified_files, 1):
        print(f'{i}、"{filename}": "{description}"')
    
    print()
    log_info(f"修改完成!关键字数量:{len(KEYWORD_MAP)}个,共计修改{modified_count}个文件关键字,未命中关键字如下:")
    for i, (keyword, description) in enumerate(unmatched_keywords, 1):
        print(f'{i}、"{keyword}": "{description}"')
    
    print()
    log_info(f"修改完成!关键字数量:{len(KEYWORD_MAP)}个,共计修改{modified_count}个文件关键字,未修改文件如下:")
    for i, filename in enumerate(failed_files, 1):
        print(f'{i}、{filename}')
    
    # 输出总结
    print()
    log_info(f"总结:成功修改: {modified_count}, 未命中关键字: {len(unmatched_keywords)}, 修改失败: {failed_count}")
    
    # 添加分隔线
    print()
    print("=" * 70)
    print("脚本执行完毕")
    print("=" * 70)

if __name__ == "__main__":
    main()

评论