From ff1ea4dad33baad041a044be71a00ae47b5c348a Mon Sep 17 00:00:00 2001 From: Georg Date: Sun, 2 Jan 2022 12:04:43 +0100 Subject: Init libvirt-xml2netbox-csv.py v2 Signed-off-by: Georg --- scripts/python/libvirt-xml2netbox-csv.py | 70 +++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/scripts/python/libvirt-xml2netbox-csv.py b/scripts/python/libvirt-xml2netbox-csv.py index f9ba866..bbdb101 100755 --- a/scripts/python/libvirt-xml2netbox-csv.py +++ b/scripts/python/libvirt-xml2netbox-csv.py @@ -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 +""" 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,9 +80,16 @@ 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( { "name": name, @@ -76,4 +107,3 @@ for domainxml in os.listdir(domaindir): convert = pandas.DataFrame(rows, columns=columns) convert.to_csv(outfile, index=False) - -- cgit v1.2.3