#!/opt/saltstack/salt/bin/python3

# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
# https://securityonion.net/license; you may not use this file except in compliance with the
# Elastic License 2.0.
#
# Note: Per the Elastic License 2.0, the second limitation states:
#
#   "You may not move, change, disable, or circumvent the license key functionality
#    in the software, and you may not remove or obscure any functionality in the
#    software that is protected by the license key."

{%   if 'vrt' in salt['pillar.get']('features', []) -%}

"""
Script for emitting VM deployment status events to the Salt event bus.

This script provides functionality to emit status events for VM deployment operations,
used by various Security Onion VM management tools.

Usage:
    so-salt-emit-vm-deployment-status-event -v <vm_name> -H <hypervisor> -s <status>

Arguments:
    -v, --vm-name     Name of the VM (hostname_role)
    -H, --hypervisor  Name of the hypervisor
    -s, --status      Current deployment status of the VM

Example:
    so-salt-emit-vm-deployment-status-event -v sensor1_sensor -H hypervisor1 -s "Creating"
"""

import sys
import argparse
import logging
import salt.client
from typing import Dict, Any

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
log = logging.getLogger(__name__)

def emit_event(vm_name: str, hypervisor: str, status: str) -> bool:
    """
    Emit a VM deployment status event to the salt event bus.
    
    Args:
        vm_name: Name of the VM (hostname_role)
        hypervisor: Name of the hypervisor
        status: Current deployment status of the VM
        
    Returns:
        bool: True if event was sent successfully, False otherwise
    
    Raises:
        ValueError: If status is not a valid deployment status
    """
    log.info("Attempting to emit deployment event...")
    
    try:
        caller = salt.client.Caller()
        event_data = {
            'vm_name': vm_name,
            'hypervisor': hypervisor,
            'status': status
        }
        
        # Use consistent event tag structure
        event_tag = f'soc/dyanno/hypervisor/{status.lower()}'
        
        ret = caller.cmd(
            'event.send',
            event_tag,
            event_data
        )
        
        if not ret:
            log.error("Failed to emit VM deployment status event: %s", event_data)
            return False
            
        log.info("Successfully emitted VM deployment status event: %s", event_data)
        return True
        
    except Exception as e:
        log.error("Error emitting VM deployment status event: %s", str(e))
        return False

def parse_args():
    """Parse command line arguments."""
    parser = argparse.ArgumentParser(
        description='Emit VM deployment status events to the Salt event bus.'
    )
    parser.add_argument('-v', '--vm-name', required=True,
                        help='Name of the VM (hostname_role)')
    parser.add_argument('-H', '--hypervisor', required=True,
                        help='Name of the hypervisor')
    parser.add_argument('-s', '--status', required=True,
                        help='Current deployment status of the VM')
    return parser.parse_args()

def main():
    """Main entry point for the script."""
    try:
        args = parse_args()
        
        success = emit_event(
            vm_name=args.vm_name,
            hypervisor=args.hypervisor,
            status=args.status
        )
        
        if not success:
            sys.exit(1)
            
    except Exception as e:
        log.error("Failed to emit status event: %s", str(e))
        sys.exit(1)

if __name__ == '__main__':
    main()

{%- else -%}

echo "Hypervisor nodes are a feature supported only for customers with a valid license. \
      Contact Security Onion Solutions, LLC via our website at https://securityonionsolutions.com \
      for more information about purchasing a license to enable this feature."

{% endif -%}
