使用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="--------主机信息--------\n"
                          "模型:{}\n"
                          "内存大小:{}MB\n"
                          "CPU数量:{}个\n"
                          "虚拟类型:{}\n"
                          "连接URI:{}\n"
                          "内存空间:{}bytes\n"
                     .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\tName
----------------""")
    if vms_dict:
        for id_part,name_part in vms_dict.items():
            print("{}\t{}".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="开启状态:{}\n"
                              "关机状态:{}\n".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()

原文地址:https://www.cnblogs.com/nyist0/p/9157867.html

时间: 2024-10-31 07:27:57

使用Python-Libvirt +GUI实现虚拟机界面化管理的相关文章

Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)

课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cloudera Manager 4.1.2安装 ·Cloudera Hadoop 4.1.2 安装 ·CM下集群管理一 ·CM下集群管理二 ·Hadoop fs 命令详解 ·cloudera manager管理集群·cloudera manager下集群高级管理 第二章(约10讲) ·Hive数据表和

Docker私有仓库搭建与界面化管理

一.关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去. 但是有时候我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像.这个可以通过开源软件Registry来达成目的. Registry在github上有两份代码:老代码库和新代码库.老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发. 从2.0版本开始就到在

集中化管理平台saltstack——自动化实现apache的安装与配置

what-saltstack 1>是一个服务器基础架构集中化管理平台,具备配置管理,远程执行,监控等功能. 2>使用Python开发,部署简单,主从集中化管理,支持API和自定义模块. 3>由Master和Minion构成(基于证书验证),通过轻量级消息队列ZeroMQ进行通信. how-saltstack Saltstack的master端监听4505与4506端口,4505为salt的消息发布系统,4506为salt客户端与服务端通信的端口: salt客户端程序不监听端口,客户端启动

关于python写GUI桌面应用的一些研究结果

研究了一下python开发GUI桌面应用的解决方案,研究结果记录如下: EasyGui:控件极为简单,连个基本的grid.list组件都没有,不适合商用,甚至是普通的应用都不行,放弃! Tkinter:api文档都不全,没啥资料可查,而且最后一次更新于09年,谁敢用? 放弃! wxPython:更新到是挺勤,文档也全,不过老版本不支持py3,放弃,新版本项目名字已经改叫wxPython Phoenix了,虽然作者说已经很稳健.很多人在用了,不过它目前还是测试版本,商用的同学慎重! PyQt:是真

python在linux制作图形界面(snack)

snack是一个用于在linux制作图形界面(GUI)的模块,该模块由c编写,而且redhat的系统都自带这个模块. 1.获取模块 虽然redhat系统会自带这个模块,但是直接去import snack会提示找不到模块,一个原因是我们重装了系统的python,所以如果直接import不能找到模块,可以通过find命令查找 find / -name snack.py 找到的结果:/usr/lib64/python2.6/site-packages/snack.py 只需要在目录/usr/lib64

Python开发GUI实战:图片转换素描画工具!

奋斗没有终点 ! 好好学习72变,因为将来 没有人能替你阻挡81难 . 生如蝼蚁,当有鸿鹄之志: 命如纸薄,应有不屈之心 . ? 今天被这句话触动了,所以开篇分享给大家.鸡汤有毒,但有时大家却靠它激励自己继续前行! python开发GUI 程序员的自我救赎,使用python开发性格分析工具 这篇文章,通过Python编写了GUI的性格分析工具.一位从我公众号开始结识的朋友,询问关于如何快速编写一个exe工具的问题.由于功能简单且之前无相关GUI编程基础,为了快速完成开发,我向他推荐了easygu

java进阶10 GUI图形界面 布局管理器之FlowLayout GridLayout

先说说FlowLayout 流式布局管理器. 效果 这是当第一行显示不下,才转到第二行的. 看看代码 package Frame; import java.awt.BorderLayout; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; public class MyLayout{ JFrame frame; public MyLayout(JFrame frame) { //

java进阶09 GUI图形界面 布局管理器之BorderLayout

前面虽然实现了窗口,但是一般的应用有很多其他东西,如按钮,输入框之类的. 而这些都是建立在一个东西上面的,那就是布局管理器. 常用的布局管理器有3个 BorderLayout:边界布局管理器 FlowLayout:流式布局管理器 GridLayout:网格布局管理器 今天先说说BorderLayout 我们先修改下UI类,这次是最后一次修改,这次会将UI类与管理器和控件彻底分开,再也不用操作UI类 package Frame; import javax.swing.JFrame; public

Rattle:数据挖掘的界面化操作

R语言是一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.这里的统计计算可以是数据分析.建模或是数据挖掘等,通过无数大牛提供的软件包,可以帮我们轻松实现算法的实施. 一些读者觉得R语言零碎的东西太多了,无法记住那么多函数和功能,于是就问R语言有没有一种类似于SAS之EM或SPSS之Modeler的界面化操作.很幸运,Graham等人特地为"偷懒"的分析师写了rattle包,通过该包就可以实现界面化操作的数据分析.数据挖掘流程.下面就跟大家详细介绍一些这款免费的