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

#!/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()