178 lines
5.1 KiB
Python
178 lines
5.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import glob
|
|
from zabbix_utils import ZabbixAPI
|
|
|
|
# Configuration from environment variables
|
|
ZABBIX_URL = os.environ.get("ZABBIX_URL", "http://localhost/api_jsonrpc.php")
|
|
BEARER_TOKEN = os.environ.get("BEARER_TOKEN")
|
|
IMPORT_DIR = os.environ.get("IMPORT_DIR", "/opt/python/export")
|
|
|
|
|
|
def get_import_rules():
|
|
"""Define import rules based on requirements."""
|
|
return {
|
|
# Host/Template level - only create/update, never delete
|
|
"hosts": {
|
|
"createMissing": True,
|
|
"updateExisting": True
|
|
},
|
|
"templates": {
|
|
"createMissing": True,
|
|
"updateExisting": True
|
|
},
|
|
"host_groups": {
|
|
"createMissing": True,
|
|
"updateExisting": True
|
|
},
|
|
"template_groups": {
|
|
"createMissing": True,
|
|
"updateExisting": True
|
|
},
|
|
# Inside host/template - allow all changes including deletion
|
|
"items": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"triggers": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"discoveryRules": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"graphs": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"httptests": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"valueMaps": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"templateDashboards": {
|
|
"createMissing": True,
|
|
"updateExisting": True,
|
|
"deleteMissing": True
|
|
},
|
|
"templateLinkage": {
|
|
"createMissing": True,
|
|
"deleteMissing": False # Don't unlink templates
|
|
}
|
|
}
|
|
|
|
|
|
def import_file(zapi, file_path, file_type):
|
|
"""Import a single XML file."""
|
|
try:
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
xml_content = f.read()
|
|
|
|
print(f" Importing {file_type}: {os.path.basename(file_path)}")
|
|
|
|
result = zapi.configuration.import_(
|
|
format='xml',
|
|
source=xml_content,
|
|
rules=get_import_rules()
|
|
)
|
|
|
|
if result:
|
|
print(f" Success: {os.path.basename(file_path)}")
|
|
else:
|
|
print(f" Failed: {os.path.basename(file_path)}")
|
|
|
|
return result
|
|
|
|
except Exception as e:
|
|
print(f" Error importing {file_path}: {e}")
|
|
return False
|
|
|
|
|
|
def import_host_directory(zapi, host_dir):
|
|
"""Import all files from a single host directory."""
|
|
host_id = os.path.basename(host_dir)
|
|
print(f"Importing configuration for host directory: {host_id}")
|
|
|
|
# Get all template and host files
|
|
template_files = glob.glob(os.path.join(host_dir, "template_*.xml"))
|
|
host_files = glob.glob(os.path.join(host_dir, "host_*.xml"))
|
|
|
|
if not template_files and not host_files:
|
|
print(f" No XML files found in {host_dir}")
|
|
return False
|
|
|
|
success_count = 0
|
|
total_count = 0
|
|
|
|
# Import templates first
|
|
for template_file in sorted(template_files):
|
|
total_count += 1
|
|
if import_file(zapi, template_file, "template"):
|
|
success_count += 1
|
|
|
|
# Import hosts after templates
|
|
for host_file in sorted(host_files):
|
|
total_count += 1
|
|
if import_file(zapi, host_file, "host"):
|
|
success_count += 1
|
|
|
|
print(f" Host {host_id}: {success_count}/{total_count} files imported successfully")
|
|
return success_count == total_count
|
|
|
|
|
|
def main():
|
|
if not BEARER_TOKEN:
|
|
print("Error: BEARER_TOKEN not set")
|
|
return
|
|
|
|
if not os.path.exists(IMPORT_DIR):
|
|
print(f"Error: Import directory does not exist: {IMPORT_DIR}")
|
|
return
|
|
|
|
# Connect to Zabbix
|
|
try:
|
|
zapi = ZabbixAPI(url=ZABBIX_URL)
|
|
zapi.login(token=BEARER_TOKEN)
|
|
print(f"Connected to Zabbix at {ZABBIX_URL}")
|
|
except Exception as e:
|
|
print(f"Failed to connect to Zabbix: {e}")
|
|
return
|
|
|
|
# Find all host directories
|
|
host_dirs = [
|
|
d for d in glob.glob(os.path.join(IMPORT_DIR, "*"))
|
|
if os.path.isdir(d) and os.path.basename(d).isdigit()
|
|
]
|
|
|
|
if not host_dirs:
|
|
print(f"No host directories found in {IMPORT_DIR}")
|
|
return
|
|
|
|
host_dirs.sort(key=lambda x: int(os.path.basename(x)))
|
|
print(f"Found {len(host_dirs)} host directories to import")
|
|
|
|
# Import each host directory
|
|
successful_hosts = 0
|
|
for host_dir in host_dirs:
|
|
try:
|
|
if import_host_directory(zapi, host_dir):
|
|
successful_hosts += 1
|
|
except Exception as e:
|
|
print(f"Error processing {host_dir}: {e}")
|
|
|
|
print(f"\nImport completed! Successfully processed {successful_hosts}/{len(host_dirs)} host directories.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |