From 509382328711aa7848dd3877902c301897a62a32 Mon Sep 17 00:00:00 2001 From: TheNetworkGuy Date: Wed, 30 Oct 2024 20:52:28 +0100 Subject: [PATCH] Added some logging and fixed role assignment for VM's --- modules/hostgroups.py | 27 ++++++++++++++++++--------- modules/virtual_machine.py | 6 ++++-- netbox_zabbix_sync.py | 2 ++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/modules/hostgroups.py b/modules/hostgroups.py index c1d66ce..a2c7954 100644 --- a/modules/hostgroups.py +++ b/modules/hostgroups.py @@ -1,13 +1,17 @@ """Module for all hostgroup related code""" +from logging import getLogger from modules.exceptions import HostgroupError from modules.tools import build_path class Hostgroup(): """Hostgroup class for devices and VM's Takes type (vm or dev) and NB object""" - def __init__(self, obj_type, nb_obj, version): + def __init__(self, obj_type, nb_obj, version, logger=None): + self.logger = logger if logger else getLogger(__name__) if obj_type not in ("vm", "dev"): - raise HostgroupError(f"Unable to create hostgroup with type {type}") + msg = f"Unable to create hostgroup with type {type}" + self.logger.error() + raise HostgroupError(msg) self.type = str(obj_type) self.nb = nb_obj self.name = self.nb.name @@ -33,9 +37,9 @@ class Hostgroup(): # Role fix for Netbox <=3 role = None if self.nb_version.startswith(("2", "3")) and self.type == "dev": - role = self.nb.device_role.name + role = self.nb.device_role.name if self.nb.device_role else None else: - role = self.nb.role.name + role = self.nb.role.name if self.nb.role else None # Add default formatting options # Check if a site is configured. A site is optional for VMs format_options["region"] = None @@ -86,8 +90,10 @@ class Hostgroup(): cf_data = self.custom_field_lookup(hg_item) # CF does not exist if not cf_data["result"]: - raise HostgroupError(f"Unable to generate hostgroup for host {self.name}. " - f"Item type {hg_item} not supported.") + msg = (f"Unable to generate hostgroup for host {self.name}. " + f"Item type {hg_item} not supported.") + self.logger.error(msg) + raise HostgroupError(msg) # CF data is populated if cf_data["cf"]: hg_output.append(cf_data["cf"]) @@ -100,9 +106,12 @@ class Hostgroup(): # Check if the hostgroup is populated with at least one item. if bool(hg_output): return "/".join(hg_output) - raise HostgroupError(f"Unable to generate hostgroup for host {self.name}." - "Not enough valid items. This is most likely" - "due to the use of custom fields that are empty.") + msg = (f"Unable to generate hostgroup for host {self.name}." + " Not enough valid items. This is most likely" + " due to the use of custom fields that are empty" + " or an invalid hostgroup format.") + self.logger.error(msg) + raise HostgroupError(msg) def list_formatoptions(self): """ diff --git a/modules/virtual_machine.py b/modules/virtual_machine.py index 87ba1f3..a77a813 100644 --- a/modules/virtual_machine.py +++ b/modules/virtual_machine.py @@ -3,6 +3,7 @@ """Module that hosts all functions for virtual machine processing""" from os import sys +from logging import getLogger from modules.device import PhysicalDevice from modules.hostgroups import Hostgroup from modules.interface import ZabbixInterface @@ -23,11 +24,13 @@ class VirtualMachine(PhysicalDevice): super().__init__(*args, **kwargs) self.hostgroup = None self.zbx_template_names = None + if "logger" not in kwargs: + self.logger = getLogger(__name__) def set_hostgroup(self, hg_format, nb_site_groups, nb_regions): """Set the hostgroup for this device""" # Create new Hostgroup instance - hg = Hostgroup("vm", self.nb, self.nb_api_version) + hg = Hostgroup("vm", self.nb, self.nb_api_version, logger=self.logger) hg.set_nesting(traverse_site_groups, traverse_regions, nb_site_groups, nb_regions) # Generate hostgroup based on hostgroup format self.hostgroup = hg.generate(hg_format) @@ -35,7 +38,6 @@ class VirtualMachine(PhysicalDevice): def set_vm_template(self): """ Set Template for VMs. Overwrites default class to skip a lookup of custom fields.""" - self.zbx_template_names = None # Gather templates ONLY from the device specific context try: self.zbx_template_names = self.get_templates_context() diff --git a/netbox_zabbix_sync.py b/netbox_zabbix_sync.py index 9431525..b6c2b80 100755 --- a/netbox_zabbix_sync.py +++ b/netbox_zabbix_sync.py @@ -135,6 +135,7 @@ def main(arguments): try: vm = VirtualMachine(nb_vm, zabbix, netbox_journals, nb_version, create_journal, logger) + logger.debug(f"Host {vm.name}: started operations on VM.") vm.set_hostgroup(vm_hostgroup_format,netbox_site_groups,netbox_regions) vm.set_vm_template() vm.set_inventory(nb_vm) @@ -180,6 +181,7 @@ def main(arguments): # Set device instance set data such as hostgroup and template information. device = PhysicalDevice(nb_device, zabbix, netbox_journals, nb_version, create_journal, logger) + logger.debug(f"Host {device.name}: started operations on device.") device.set_hostgroup(hostgroup_format,netbox_site_groups,netbox_regions) device.set_template(templates_config_context, templates_config_context_overrule) device.set_inventory(nb_device)