Init libvirt-xml2netbox-csv.py v2

Signed-off-by: Georg <georg@lysergic.dev>
This commit is contained in:
Georg Pfuetzenreuter 2022-01-02 12:04:43 +01:00
parent 935b8c642f
commit ff1ea4dad3

View File

@ -1,21 +1,27 @@
#!/usr/bin/python3
"""
Takes a directory with libvirt XML domain dumps and creates a NetBox importable CSV. Since the role and platform fields cannot be fed from the XML files, the user is given the option to pick those for each VM.
Created and Last modified: 02/01/2022 by Georg Pfuetzenreuter <georg@lysergic.dev>
"""
import os
import xml.etree.ElementTree as xmlet
import pandas
import math
outfile = 'xxx.csv'
cluster = 'xxx'
tenant = 'xxx'
outfile = cluster + '.csv'
columns = [ "name", "status", "role", "cluster", "tenant", "platform", "vcpus", "memory", "disk", "comments" ]
rows = []
domaindir = 'xmls/domains'
diskdir = 'xmls/disks'
domaindir = 'xmls/' + cluster + '/domains'
diskdir = 'xmls/' + cluster + '/disks'
status = 'Active'
cluster = 'xxx'
tenant = 'xxx'
comment = 'Imported from libvirt. Manual verification pending.'
status = 'active'
comment = 'Imported from libvirt.'
for domainxml in os.listdir(domaindir):
domainparse = xmlet.parse(domaindir + "/" + domainxml)
@ -26,13 +32,19 @@ for domainxml in os.listdir(domaindir):
memory = int(domainroot.find("memory").text)
memorysize = round(memory*0.001024)
diskxml = diskdir + "/" + name + ".disk.export.xml"
diskparse = xmlet.parse(diskxml)
diskroot = diskparse.getroot()
diskcapacity = int(diskroot.find("capacity").text)
disksize = round(diskcapacity / (math.pow(1024, (int(math.floor(math.log(diskcapacity, 1024)))))))
if os.path.exists(diskxml):
diskparse = xmlet.parse(diskxml)
diskroot = diskparse.getroot()
diskcapacity = int(diskroot.find("capacity").text)
disksize = round(diskcapacity / (math.pow(1024, (int(math.floor(math.log(diskcapacity, 1024)))))))
if not os.path.exists(diskxml):
print("No disk XML for " + name + ", assuming there is no VHD.")
disksize = ""
while True:
role_choice = input ("Assign a role for " + name + ":\n1) Internal Client\n2) Internal Server\n3) ???\n4) ???\n> ")
role_choice = input ("Assign role for " + name + ":\n1) Internal Client\n2) Internal Server\n3) Public Client\n4) Public Server\n5) Customer\n6) Router\n7) Null\n> ")
if role_choice not in ["1", "2", "3", "4", "5", "6", "7"]:
print("Invalid choice.")
if role_choice == "1":
role = "Virtual Machine (Internal, Client)"
break
@ -40,15 +52,27 @@ for domainxml in os.listdir(domaindir):
role = "Virtual Machine (Internal, Server)"
break
if role_choice == "3":
role = "Virtual Machine (Public, Client)"
break
if role_choice == "4":
role = "Virtual Machine (Public, Server)"
break
if role_choice == "5":
role = "Virtual Machine (Customer)"
break
if role_choice not in ["1", "2", "3"]:
print("Invalid choice.")
if role_choice == "6":
role = "Virtual Machine (Router)"
break
if role_choice == "7":
role = ""
break
while True:
platform_choice = input ("Assign platform for " + name + ":\n 1) openSUSE-x86_64\n2)OpenBSD-x86_64\n3)FreeBSD-x86_64\n> ")
platform_choice = input ("Assign platform for " + name + ":\n1) openSUSE Leap x86_64\n2) OpenBSD x86_64\n3) FreeBSD x86_64\n4) OPNsense x86_64\n5) Arch Linux x86_64\n7) Null\n> ")
if platform_choice not in ["1", "2", "3", "4", "5", "7"]:
print("Invalid choice.")
if platform_choice == "1":
platform = "openSUSE-x86_64"
platform = "openSUSE-Leap-x86_64"
break
if platform_choice == "2":
platform = "OpenBSD-x86_64"
@ -56,8 +80,15 @@ for domainxml in os.listdir(domaindir):
if platform_choice == "3":
platform = "FreeBSD-x86_64"
break
if platform_choice not in ["1", "2", "3"]:
print("Invalid choice.")
if platform_choice == "4":
platform = "OPNsense-x86_64"
break
if platform_choice == "5":
platform = "ArchLinux-x86_64"
break
if platform_choice == "7":
platform = ""
break
rows.append(
{
@ -76,4 +107,3 @@ for domainxml in os.listdir(domaindir):
convert = pandas.DataFrame(rows, columns=columns)
convert.to_csv(outfile, index=False)