直接上代码
import subprocess
import tkinter as tk
from tkinter import messagebox
import libvirt
import re
host_ip = '172.27.243.60'
# 获取VLAN标签
def get_vlan_port(vm_name):
num = re.sub('\D', '', vm_name)
if num <= 2 :
cmd = f'ovs-vsctl get port tap{num} tag'
else:
cmd = f'ssh root@172.27.137.200 "ovs-vsctl get port tap{num-3} tag"'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
output, err = p.communicate()
if err:
print(f"获取VLAN标签失败: {err}")
return None
vlan_tag = output.strip().decode()
return vlan_tag
# 设置VLAN标签
def set_vlan_port(vm_name, vlan_tag):
num = re.sub('\D', '', vm_name)
if num <= 2 :
cmd = f'ovs-vsctl set port tap{num} tag={vlan_tag}'
else:
cmd = f'ssh root@172.27.137.200 "ovs-vsctl set port tap{num-3} tag={vlan_tag}"'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
output, err = p.communicate()
if err:
print(f"设置VLAN标签失败: {err}")
else:
print("设置VLAN标签成功")
# 获取KVM虚拟机列表
def get_vm_list():
vm_names = []
conn = libvirt.open()
vm_list = conn.listDomainsID()
vm_names += [conn.lookupByID(vm_id).name() for vm_id in vm_list]
conn = libvirt.open('qemu+ssh://root@172.27.137.200/system')
vm_list = conn.listDomainsID()
vm_names += [conn.lookupByID(vm_id).name() for vm_id in vm_list]
conn.close()
return vm_names
# 鲁棒性测试
def test():
content = []
cmd = f'ping -c 1 -q {host_ip}'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
content += p.communicate()
print(content)
cmd = f'ssh root@172.27.137.200 ping -c 1 -q {host_ip}'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
content += p.communicate()
print(content)
messagebox.showinfo(title="测试", message=content)
# 创建GUI
def create_gui():
# 初始化GUI窗口
root = tk.Tk()
root.title("KVM虚拟机VLAN标签管理")
# 获取虚拟机列表
vm_list = get_vm_list()
# 创建标签和下拉框
vm_name_label = tk.Label(root, text="虚拟机名称:")
vm_name_label.pack()
vm_name_var = tk.StringVar(root)
vm_name_var.set(vm_list[0])
vm_name_dropdown = tk.OptionMenu(root, vm_name_var, *vm_list)
vm_name_dropdown.pack()
vlan_tag_label = tk.Label(root, text="VLAN标签:")
vlan_tag_label.pack()
vlan_tag_entry = tk.Entry(root)
vlan_tag_entry.pack()
# 创建按钮
get_vlan_button = tk.Button(
root, text="获取VLAN标签", command=lambda: get_vlan(vm_name_var.get()))
get_vlan_button.pack()
set_vlan_button = tk.Button(root, text="设置VLAN标签", command=lambda: set_vlan(
vm_name_var.get(), vlan_tag_entry.get()))
set_vlan_button.pack()
test_button = tk.Button(
root,text="进行测试",command=lambda: test()
)
test_button.pack()
# 运行GUI
root.mainloop()
# 获取VLAN标签按钮的回调函数
def get_vlan(vm_name):
vlan_tag = get_vlan_port(vm_name)
if vlan_tag:
messagebox.showinfo(
title="VLAN标签", message=f"虚拟机 {vm_name} 的VLAN标签为: {vlan_tag}")
else:
messagebox.showerror(title="错误", message="获取VLAN标签失败")
# 设置VLAN标签按钮的回调函数
def set_vlan(vm_name, vlan_tag):
set_vlan_port(vm_name, vlan_tag)
messagebox.showinfo(title="成功", message="设置VLAN标签成功")
# 运行程序
if __name__ == "__main__":
create_gui()