diff --git a/netbox_agent/config.py b/netbox_agent/config.py index 4cd4d586..c01f5f60 100644 --- a/netbox_agent/config.py +++ b/netbox_agent/config.py @@ -28,6 +28,8 @@ def get_config(): p.add_argument('--update-inventory', action='store_true', help='Update inventory') p.add_argument('--update-location', action='store_true', help='Update location') p.add_argument('--update-psu', action='store_true', help='Update PSU') + p.add_argument('--update-old-devices', action='store_true', + help='Update serial number of existing (old ?) devices having same name but different serial') p.add_argument('--purge-old-devices', action='store_true', help='Purge existing (old ?) devices having same name but different serial') p.add_argument('--expansion-as-device', action='store_true', diff --git a/netbox_agent/server.py b/netbox_agent/server.py index 1f8991b7..745d8b71 100644 --- a/netbox_agent/server.py +++ b/netbox_agent/server.py @@ -253,12 +253,16 @@ def _netbox_create_blade_expansion(self, chassis, datacenter, tenant, rack): ) return new_blade - def _netbox_deduplicate_server(self): + def _netbox_deduplicate_server(self, purge): serial = self.get_service_tag() hostname = self.get_hostname() server = nb.dcim.devices.get(name=hostname) if server and server.serial != serial: - server.delete() + if purge: + server.delete() + else: + server.serial = serial + server.save() def _netbox_create_server(self, datacenter, tenant, rack): device_role = get_device_role(config.device.server_role) @@ -384,8 +388,11 @@ def netbox_create_or_update(self, config): rack = self.get_netbox_rack() tenant = self.get_netbox_tenant() + if config.update_old_devices: + self._netbox_deduplicate_server(purge=False) + if config.purge_old_devices: - self._netbox_deduplicate_server() + self._netbox_deduplicate_server(purge=True) if self.is_blade(): chassis = nb.dcim.devices.get( diff --git a/netbox_agent/vendors/supermicro.py b/netbox_agent/vendors/supermicro.py index d27b3431..5f9e2ab0 100644 --- a/netbox_agent/vendors/supermicro.py +++ b/netbox_agent/vendors/supermicro.py @@ -46,9 +46,13 @@ def get_blade_slot(self): return None def get_service_tag(self): - if self.is_blade(): - return self.baseboard[0]['Serial Number'].strip() - return self.system[0]['Serial Number'].strip() + default_serial = "0123456789" + baseboard_serial = self.baseboard[0]['Serial Number'].strip() + system_serial = str(self.system[0]['Serial Number']).strip() + + if self.is_blade() or system_serial == default_serial: + return baseboard_serial + return system_serial def get_product_name(self): if self.is_blade(): diff --git a/setup.py b/setup.py index b9b777e6..969c39f8 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def get_requirements(): setup( name='netbox_agent', - version='1.0.0', + version='1.0.1-rc1', description='NetBox agent for server', long_description=open('README.md', encoding="utf-8").read(), long_description_content_type='text/markdown',