基于ovs+tk+KVM的分布式隔离网络建立

发布时间 2023-04-26 00:28:01作者: 醉语梦

直接上代码

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()