libvirt-back/snap-pg.py

85 lines
2.3 KiB
Python
Raw Permalink Normal View History

2021-03-24 23:27:57 +03:00
#!/usr/bin/python3
import time
import argparse
import libvirt
from lxml import etree
from lxml.builder import E
def parse_args():
parser = argparse.ArgumentParser(description='Create snapshot for libvirt machine')
2021-03-25 10:29:11 +03:00
parser.add_argument('action', help='Machine name')
# parser.add_argument('--name', required=True, help='Machine name')
# parser.add_argument('--device', required=True, help='Device path (like vda)')
2021-03-24 23:27:57 +03:00
return parser.parse_args()
def create_snapshot_node(disk_node):
device = disk_node.xpath('/domain/devices/disk/target/@dev')[0]
disk_path = disk_node.xpath('/domain/devices/disk/source/@file')[0]
now = int(time.time())
snap_path = disk_path.rsplit('.', 1)[0]
snap_path = f'{snap_path}-{now}.snap'
snap_name = snap_path.rsplit('/', 1)[1]
snap = E.domainsnapshot()
snap.append(E.name(snap_name))
disks = E.disks()
disk = E.disk(name=device)
disk.append(E.source(file=snap_path))
disks.append(disk)
snap.append(disks)
return snap
def get_disk_by_name(vm, name):
raw_xml = vm.XMLDesc(0)
xml = etree.XML(raw_xml)
disks = xml.xpath(f'/domain/devices/disk/target[@dev="{name}"]/..')
return disks[0]
def main():
2021-03-25 10:29:11 +03:00
args = parse_args()
2021-03-24 23:27:57 +03:00
session = libvirt.open('qemu:///system')
2021-03-25 10:29:11 +03:00
print(args.action)
2021-03-24 23:27:57 +03:00
from time import sleep
2021-03-25 10:29:11 +03:00
# for i in session.listDefinedDomains():
# print(i)
# dom = session.lookupByName(i)
2021-03-24 23:27:57 +03:00
2021-03-25 10:29:11 +03:00
# print("Is active? "+ str(dom.isActive()))
# dom.create()
# sleep(15)
2021-03-24 23:27:57 +03:00
2021-03-25 10:29:11 +03:00
# print(session.listDomainsID())
# print("Active? "+str(dom.isActive()))
# sleep(15)
# dom.shutdown()
2021-03-24 23:27:57 +03:00
2021-03-25 10:29:11 +03:00
# sleep(15)
# print("Active? "+str(dom.isActive()))
2021-03-24 23:27:57 +03:00
# print(session.getHostname())
# try:
# vm = session.lookupByName(args.name)
# except libvirt.libvirtError:
# print(f'Machine with name {args.name} not found!')
# session.close()
# return
# disk = get_disk_by_name(vm, args.device)
# snapshot = create_snapshot_node(disk)
# vm.snapshotCreateXML(etree.tostring(snapshot, encoding='unicode'),
# libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY | libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC)
session.close()
if __name__ == '__main__':
main()