From 9fd8824ddd9b3dfeac23f20ee14529eae8073427 Mon Sep 17 00:00:00 2001 From: Maksym Buz Date: Mon, 6 Oct 2025 15:02:40 +0300 Subject: [PATCH] change: added legacy scripts for working with 5.0 and lower --- config-mover/config_exporter_legacy.py | 127 +++++++++++++++++++++++++ config-mover/get_host_ids_legacy.py | 72 ++++++++++++++ config-mover/run_export_legacy.sh | 16 ++++ config-mover/run_get_ids_legacy.sh | 14 +++ 4 files changed, 229 insertions(+) create mode 100644 config-mover/config_exporter_legacy.py create mode 100644 config-mover/get_host_ids_legacy.py create mode 100755 config-mover/run_export_legacy.sh create mode 100755 config-mover/run_get_ids_legacy.sh diff --git a/config-mover/config_exporter_legacy.py b/config-mover/config_exporter_legacy.py new file mode 100644 index 0000000..3e1dffa --- /dev/null +++ b/config-mover/config_exporter_legacy.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +Legacy Zabbix Configuration Exporter +==================================== +Uses username/password authentication instead of Bearer tokens. +Note: This script is designed for Zabbix 5.0 and older versions! +Please do not use with Zabbix 6.0 and newer! Use token-based method instead. +""" + +import os +import xml.etree.ElementTree as ET +from zabbix_utils import ZabbixAPI + +# Configuration from environment variables +ZABBIX_URL = os.environ.get("ZABBIX_URL") +ZABBIX_USER = os.environ.get("ZABBIX_USER") +ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD") +HOST_IDS = os.environ.get("HOST_IDS") +OUTPUT_DIR = os.environ.get("OUTPUT_DIR", "/opt/python/export") + + +def get_template_names(xml_data): + """Extract template names from host XML.""" + try: + root = ET.fromstring(xml_data) + return [name.text for name in root.findall('.//hosts/host/templates/template/name')] + except ET.ParseError: + return [] + + +def export_templates(zapi, template_names, output_dir): + """Export templates to XML files.""" + if not template_names: + return + + templates = zapi.template.get(output=['templateid', 'host'], filter={'host': template_names}) + + for template in templates: + name = template['host'] + template_id = template['templateid'] + + xml_data = zapi.configuration.export(options={'templates': [template_id]}, format='xml') + + if xml_data: + safe_name = "".join(c for c in name if c.isalnum() or c in (' ', '_', '-')).strip() + filename = f"template_{safe_name}.xml" + filepath = os.path.join(output_dir, filename) + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(xml_data) + + +def export_host(zapi, host_id, base_dir): + """Export single host and its templates.""" + host_dir = os.path.join(base_dir, str(host_id)) + os.makedirs(host_dir, exist_ok=True) + + # Export host + host_xml = zapi.configuration.export(options={'hosts': [host_id]}, format='xml') + if not host_xml: + return False + + # Save host XML + host_file = os.path.join(host_dir, f"host_{host_id}.xml") + with open(host_file, 'w', encoding='utf-8') as f: + f.write(host_xml) + + # Export templates + template_names = get_template_names(host_xml) + if template_names: + export_templates(zapi, template_names, host_dir) + + return True + + +def main(): + # Check required environment variables + if not ZABBIX_USER or not ZABBIX_PASSWORD or not HOST_IDS: + print("Error: ZABBIX_USER, ZABBIX_PASSWORD, and HOST_IDS must be set") + return + + host_ids = [h.strip() for h in HOST_IDS.split(',') if h.strip()] + if not host_ids: + print("Error: No valid HOST_IDS provided") + return + + # Connect to Zabbix + try: + zapi = ZabbixAPI(url=ZABBIX_URL) + zapi.login(user=ZABBIX_USER, password=ZABBIX_PASSWORD) + print(f"Connected to Zabbix. Processing {len(host_ids)} hosts...") + except Exception as e: + print(f"Failed to connect: {e}") + return + + # Create output directory + os.makedirs(OUTPUT_DIR, exist_ok=True) + + # Export hosts + successful = 0 + failed = 0 + + for i, host_id in enumerate(host_ids, 1): + try: + if export_host(zapi, host_id, OUTPUT_DIR): + successful += 1 + else: + failed += 1 + except Exception: + failed += 1 + + # Progress indicator for large batches + if i % 50 == 0 or i == len(host_ids): + print(f"Progress: {i}/{len(host_ids)} ({successful} ok, {failed} failed)") + + print(f"Export complete: {successful} successful, {failed} failed") + print(f"Results in: {OUTPUT_DIR}") + + # Logout + try: + zapi.logout() + except: + pass + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/config-mover/get_host_ids_legacy.py b/config-mover/get_host_ids_legacy.py new file mode 100644 index 0000000..d3e2f0c --- /dev/null +++ b/config-mover/get_host_ids_legacy.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +Legacy ID Retriever +=============================== +Uses username/password authentication instead of tokens. +Note: This script is designed for Zabbix 5.0 and older versions! +Please do not use with Zabbix 6.0 and newer! Use token-based get_host_ids.py instead. +""" + +import os +from datetime import datetime +from zabbix_utils import ZabbixAPI + +# Configuration from environment variables +ZABBIX_URL = os.environ.get("ZABBIX_URL", "http://localhost/api_jsonrpc.php") +ZABBIX_USER = os.environ.get("ZABBIX_USER") +ZABBIX_PASSWORD = os.environ.get("ZABBIX_PASSWORD") + + +def main(): + # Check required environment variables + if not ZABBIX_USER or not ZABBIX_PASSWORD: + print("Error: ZABBIX_USER and ZABBIX_PASSWORD environment variables must be set") + return + + # Connect to Zabbix using username/password + try: + zapi = ZabbixAPI(url=ZABBIX_URL) + zapi.login(user=ZABBIX_USER, password=ZABBIX_PASSWORD) + print(f"Connected to Zabbix at {ZABBIX_URL}") + print(f"Authenticated as user: {ZABBIX_USER}") + except Exception as e: + print(f"Failed to connect to Zabbix: {e}") + return + + # Get all host IDs + try: + hosts = zapi.host.get(output=['hostid', 'host']) + + if not hosts: + print("No hosts found") + return + + # Extract host IDs + host_ids = [host['hostid'] for host in hosts] + host_ids.sort(key=int) # Sort numerically + + print(f"Found {len(host_ids)} hosts") + + # Generate filename with current date + current_date = datetime.now().strftime("%Y%m%d") + filename = f"{current_date}_host_ids_legacy.txt" + + # Write host IDs to file (comma-separated on single line) + with open(filename, 'w') as f: + f.write(','.join(host_ids)) + + print(f"Host IDs saved to: {filename}") + + except Exception as e: + print(f"Error retrieving host IDs: {e}") + + finally: + # Logout from Zabbix + try: + zapi.logout() + print("Logged out from Zabbix") + except: + pass # Ignore logout errors + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/config-mover/run_export_legacy.sh b/config-mover/run_export_legacy.sh new file mode 100755 index 0000000..c1889ad --- /dev/null +++ b/config-mover/run_export_legacy.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Legacy script to run the Zabbix configuration exporter for older Zabbix versions +# Replace the values below with your actual Zabbix configuration + +# Set environment variables +export ZABBIX_URL="https://your.zabbix/api_jsonrpc.php" +export HOST_IDS="10084,10584,10591,10595" # Comma-separated list of host IDs +export OUTPUT_DIR="/opt/python/export" +export ZABBIX_USER="your_username" +export ZABBIX_PASSWORD="your_password" + +# Activate virtual environment and run the script +cd /opt/python +source venv/bin/activate +python3 config_exporter_legacy.py \ No newline at end of file diff --git a/config-mover/run_get_ids_legacy.sh b/config-mover/run_get_ids_legacy.sh new file mode 100755 index 0000000..9e48104 --- /dev/null +++ b/config-mover/run_get_ids_legacy.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Example script to run the Zabbix host IDs retriever for older Zabbix versions +# Replace the values below with your actual Zabbix configuration + +# Set environment variables +export ZABBIX_URL="https://your.zabbix/api_jsonrpc.php" +export ZABBIX_USER="your_username" +export ZABBIX_PASSWORD="your_password" + +# Activate virtual environment and run the script +cd /opt/python +source venv/bin/activate +python3 get_host_ids_legacy.py \ No newline at end of file