使用Python-Libvirt +GUI实现虚拟机界面化管理

Posted 润青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python-Libvirt +GUI实现虚拟机界面化管理相关的知识,希望对你有一定的参考价值。

代码:

#encoding=utf-8

import libvirt
import tkinter as tk


def close_connection():#关闭连接
    try:
        conn.close()
    except:
        print("--关闭连接失败--")
        return 1
    print(--成功关闭连接--)

def list_connection():#主机信息
    print("---------主机信息---------")
    nodeinfo = conn.getInfo()  # 获取虚拟化主机信息
    print(模型:  + str(nodeinfo[0]))  # cpu模型
    print(内存大小:  + str(nodeinfo[1]) + MB)  # 内存
    print(CPU数量:  + str(nodeinfo[2]))  # cpu数量
    print(虚拟类型:  + conn.getType())  # 虚拟化类型
    uri = conn.getURI()  # 目前链接的uri
    print(连接URI: :  + uri)
    mem = conn.getFreeMemory()
    print("空闲内存: " + str(mem) + " bytes.")
    print("-------------------------")

    lableInit.config(text="--------主机信息--------
"
                          "模型:{}
"
                          "内存大小:{}MB
"
                          "CPU数量:{}个
"
                          "虚拟类型:{}
"
                          "连接URI:{}
"
                          "内存空间:{}bytes
"
                     .format(str(nodeinfo[0]),str(nodeinfo[1]),str(nodeinfo[2]),conn.getType(),uri,str(mem)))


def show_machine():#显示虚拟机状态
#开启的域
    vms_dict={}
    domain_list=conn.listDomainsID()
    for vm in domain_list:
        vms_dict[str(vm)]=conn.lookupByID(vm).name()
    print("""
处于开启状态的虚拟机
----------------
ID	Name
----------------""")
    if vms_dict:
        for id_part,name_part in vms_dict.items():
            print("{}	{}".format(id_part,name_part))
        #lableInit.config(text="开启状态:".format(vms_dict))
    else:
        print("None")
    print("----------------")

#关闭的域
    global vmd_list
    vmd_list=[]
    for i in conn.listDefinedDomains():
        vmd_list.append(i)
    print("""
处于关闭状态的虚拟机
----------------
Name
----------------""")
    if vmd_list:
        for name_part in vmd_list:
            print("{}".format(name_part))
        lableInit.config(text="开启状态:{}
"
                              "关机状态:{}
".format(vms_dict,vmd_list))
    else:
        print("None")
    print("----------------")
    #lableInit.config(text="虚拟机信息已在终端显示")

#--------对虚拟机域进行操作---------

def temp():
    name = entryName.get()
    f = open(/etc/libvirt/qemu/{}.xml.format(name))  # xml文件需要事先准备好
    xml = f.read()
    conn.createXML(xml)
    f.close()
    lableInit.config(text="临时虚拟机 {} 创建完成".format(name))
def define():
    name=entryName.get()
    f=open(/etc/libvirt/qemu/{}.xml.format(name))#xml文件需要事先准备好
    xml=f.read()
    dom = conn.defineXML(xml)
    f.close()
    lableInit.config(text="虚拟机 {} 创建成功".format(name))

def undefine():
    dom = conn.lookupByName(entryName.get())
    dom.undefine()
    print("虚拟机 {} 已取消定义".format(entryName.get()))
    lableInit.config(text="虚拟机 {} 已取消定义".format(entryName.get()))

def suspand():
    dom = conn.lookupByName(entryName.get())
    dom.suspend()
    print("虚拟机 {} 暂停成功".format(entryName.get()))

    lableInit.config(text="虚拟机 {} 已暂停".format(entryName.get()))

def resume():
    dom = conn.lookupByName(entryName.get())
    dom.resume()
    print("虚拟机 {} 运行成功".format(entryName.get()))

    lableInit.config(text="虚拟机 {} 继续运行".format(entryName.get()))

def destroy():
    dom = conn.lookupByName(entryName.get())
    dom.destroy()
    print("虚拟机 {} 销毁成功".format(entryName.get()))

    lableInit.config(text="虚拟机 {} 已销毁".format(entryName.get()))

def start():
    dom = conn.lookupByName(entryName.get())
    dom.create()
    print("虚拟机 {} 启动成功".format(entryName.get()))

    lableInit.config(text="虚拟机 {} 已启动".format(entryName.get()))

def shutdown():

    dom = conn.lookupByName(entryName.get())
    dom.shutdown()
    print("虚拟机 {} 关闭成功".format(entryName.get()))

    lableInit.config(text="虚拟机 {} 已关闭".format(entryName.get()))


#------------菜单控制-------------
def test():
    name=str(entryName.get())
    print(name)

#--------------------------------
conn = libvirt.open("qemu:///system")#链接

top=tk.Tk()
top.title("虚拟机管理平台")

#top.geometry(‘602x‘)#窗体大小
lableTitle = tk.Label(top,bg=#00BFFF,fg="#EEE8AA",font = Helvetica -24 bold,text="虚   拟   机   管   理   平   台",width=46)
lableTitle.grid(row=0,column=0,columnspan=2,ipady=10)


#-------------------------------

labelHello = tk.Label(top,fg=#c71585,font = Helvetica -18 bold, text = "请输入虚拟机的名称:")
labelHello.grid(row=1,column=0,padx=2,pady=6,sticky=E)

entryName=tk.Entry(top,width=24)
entryName.grid(row=1,column=1,padx=2,sticky=W)

#test
#btn=tk.Button(top,text="显示",command=test)
#btn.pack()

#-------操作------


showHost =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="显示主机信息",command=list_connection)
showHost.grid(row=2,column=0,padx=4,pady=4,sticky=E)

showVM =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="显示虚拟机状态",command=show_machine)
showVM.grid(row=2,column=1,padx=4,pady=4,sticky=W)

tempVM =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold,text="创建虚拟机",command=temp)
tempVM.grid(row=3,column=0,padx=4,pady=4,sticky=E)

destroyVM = tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="销毁虚拟机", command=destroy)
destroyVM.grid(row=3,column=1,padx=4,pady=4,sticky=W)

suspandVM =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold,text="暂停虚拟机",command=suspand)
suspandVM.grid(row=4,column=0,padx=4,pady=4,sticky=E)

resumeVM = tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="运行虚拟机", command=resume)
resumeVM.grid(row=4,column=1,padx=4,pady=4,sticky=W)

startVM = tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="开启虚拟机", command=start)
startVM.grid(row=5,column=0,padx=4,pady=4,sticky=E)

shutdownVM = tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold, text="关闭虚拟机", command=shutdown)
shutdownVM.grid(row=5,column=1,padx=4,pady=4,sticky=W)

defineVM =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold,text="创建虚拟机"
                                                                     "(永久创建)",command=define)
defineVM.grid(row=6,column=0,padx=4,pady=4,sticky=E)

undefineVM =tk.Button(top,bg=#00BFFF,fg=white,width=18,height=2,font = Helvetica -15 bold,text="删除虚拟机"
                                                                       "(取消定义)",command=undefine)
undefineVM.grid(row=6,column=1,padx=4,pady=4,sticky=W)


lableInitTitle = tk.Label(top,bg=black,font = Helvetica -13 bold,text="* * * 系 统 反 馈 信 息 * * *",width=85,fg="blue")
lableInitTitle.grid(row=7,column=0,columnspan=2,ipady=10)


lableInit = tk.Label(top,bg=black,font = Helvetica -13 bold,text="NULL",width=85,fg="white")
lableInit.grid(row=8,column=0,columnspan=2,ipady=10)

photo=tk.PhotoImage(file="/home/ldw/kvmtest/copyright.png")
labelphoto=tk.Label(image=photo)
labelphoto.image=photo
labelphoto.grid(row=9,column=0,columnspan=2)
#quitVM = tk.Button(top,text="退出管理系统",command=close_connection())
#quitVM.pack()

top.mainloop()

 

以上是关于使用Python-Libvirt +GUI实现虚拟机界面化管理的主要内容,如果未能解决你的问题,请参考以下文章

运维基础--虚拟机的使用

运维基础--虚拟机的使用

如何使用PySimpleGUI通过有效的python脚本构建GUI

Java实验使用GUI实现文本文件读写显示

使用 GUI 制作 COM 服务器的最佳实践是啥?

ncurses 库使用介绍: 实现终端 GUI