mirror of
https://github.com/TheNetworkGuy/netbox-zabbix-sync.git
synced 2025-07-13 07:24:47 -06:00
122 lines
3.8 KiB
Python
122 lines
3.8 KiB
Python
"""
|
|
Module for parsing configuration from the top level config.py file
|
|
"""
|
|
from pathlib import Path
|
|
from importlib import util
|
|
from os import environ
|
|
from logging import getLogger
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
# PLEASE NOTE: This is a sample config file. Please do NOT make any edits in this file!
|
|
# You should create your own config.py and it will overwrite the default config.
|
|
|
|
DEFAULT_CONFIG = {
|
|
"templates_config_context": False,
|
|
"templates_config_context_overrule": False,
|
|
"template_cf": "zabbix_template",
|
|
"device_cf": "zabbix_hostid",
|
|
"clustering": False,
|
|
"create_hostgroups": True,
|
|
"create_journal": False,
|
|
"sync_vms": False,
|
|
"vm_hostgroup_format": "cluster_type/cluster/role",
|
|
"full_proxy_sync": False,
|
|
"zabbix_device_removal": ["Decommissioning", "Inventory"],
|
|
"zabbix_device_disable": ["Offline", "Planned", "Staged", "Failed"],
|
|
"hostgroup_format": "site/manufacturer/role",
|
|
"traverse_regions": False,
|
|
"traverse_site_groups": False,
|
|
"nb_device_filter": {"name__n": "null"},
|
|
"nb_vm_filter": {"name__n": "null"},
|
|
"inventory_mode": "disabled",
|
|
"inventory_sync": False,
|
|
"device_inventory_map": {
|
|
"asset_tag": "asset_tag",
|
|
"virtual_chassis/name": "chassis",
|
|
"status/label": "deployment_status",
|
|
"location/name": "location",
|
|
"latitude": "location_lat",
|
|
"longitude": "location_lon",
|
|
"comments": "notes",
|
|
"name": "name",
|
|
"rack/name": "site_rack",
|
|
"serial": "serialno_a",
|
|
"device_type/model": "type",
|
|
"device_type/manufacturer/name": "vendor",
|
|
"oob_ip/address": "oob_ip"
|
|
},
|
|
"vm_inventory_map": {
|
|
"status/label": "deployment_status",
|
|
"comments": "notes",
|
|
"name": "name"
|
|
},
|
|
"usermacro_sync": False,
|
|
"device_usermacro_map": {
|
|
"serial": "{$HW_SERIAL}",
|
|
"role/name": "{$DEV_ROLE}",
|
|
"url": "{$NB_URL}",
|
|
"id": "{$NB_ID}"
|
|
},
|
|
"vm_usermacro_map": {
|
|
"memory": "{$TOTAL_MEMORY}",
|
|
"role/name": "{$DEV_ROLE}",
|
|
"url": "{$NB_URL}",
|
|
"id": "{$NB_ID}"
|
|
},
|
|
"tag_sync": False,
|
|
"tag_lower": True,
|
|
"tag_name": 'NetBox',
|
|
"tag_value": "name",
|
|
"device_tag_map": {
|
|
"site/name": "site",
|
|
"rack/name": "rack",
|
|
"platform/name": "target"
|
|
},
|
|
"vm_tag_map": {
|
|
"site/name": "site",
|
|
"cluster/name": "cluster",
|
|
"platform/name": "target"
|
|
}
|
|
}
|
|
|
|
|
|
def load_config():
|
|
"""Returns combined config from all sources"""
|
|
# Overwrite default config with config.py
|
|
conf = load_config_file(config_default=DEFAULT_CONFIG)
|
|
# Overwrite default config and config.py with environment variables
|
|
for key in conf:
|
|
value_setting = load_env_variable(key)
|
|
if value_setting is not None:
|
|
conf[key] = value_setting
|
|
return conf
|
|
|
|
|
|
def load_env_variable(config_environvar):
|
|
"""Returns config from environment variable"""
|
|
prefix = "NBZX_"
|
|
config_environvar = prefix + config_environvar.upper()
|
|
if config_environvar in environ:
|
|
return environ[config_environvar]
|
|
return None
|
|
|
|
|
|
def load_config_file(config_default, config_file="config.py"):
|
|
"""Returns config from config.py file"""
|
|
# Check if config.py exists and load it
|
|
# If it does not exist, return the default config
|
|
config_path = Path(config_file)
|
|
if config_path.exists():
|
|
dconf = config_default.copy()
|
|
# Dynamically import the config module
|
|
spec = util.spec_from_file_location("config", config_path)
|
|
config_module = util.module_from_spec(spec)
|
|
spec.loader.exec_module(config_module)
|
|
# Update DEFAULT_CONFIG with variables from the config module
|
|
for key in dconf:
|
|
if hasattr(config_module, key):
|
|
dconf[key] = getattr(config_module, key)
|
|
return dconf
|
|
return config_default
|