
    Vhy                        d dl mZmZmZ eZdZdZdZd dl	Z		 d dl
Z
d dl
mZ dZ	 d d	lmZ dZd d
lmZ d dlmZ dZd ZdZg Zg dZg dZej7                  e       ej7                  e       ddddddddZdddddddZg dZg Zej7                  ejA                                 G d de!      Z" G d de#      Z$ G d d e#      Z%d!d"d#dd$Z&d% Z'd& Z(d' Z)e*d(k(  r e)        yy# e$ r dZY w xY w# e$ r dZY w xY w))    )absolute_importdivisionprint_functiona  
---
module: virt
short_description: Manages virtual machines supported by libvirt
description:
     - Manages virtual machines supported by I(libvirt).
options:
    flags:
        choices: [ 'managed_save', 'snapshots_metadata', 'nvram', 'keep_nvram', 'checkpoints_metadata', 'delete_volumes']
        description:
            - Pass additional parameters.
            - Currently only implemented with command C(undefine).
              Specify which metadata should be removed with C(undefine).
              Useful option to be able to C(undefine) guests with UEFI nvram.
              C(nvram) and C(keep_nvram) are conflicting and mutually exclusive.
              Consider option C(force) if all related metadata should be removed.
        type: list
        elements: str
    force:
        description:
            - Enforce an action.
            - Currently only implemented with command C(undefine).
              This option can be used instead of providing all C(flags).
              If C(true), C(undefine) removes also any related nvram or other metadata, if existing.
              If C(false) or not set, C(undefine) executes only if there is no nvram or other metadata existing.
              Otherwise the task fails and the guest is kept defined without change.
              C(true) and option C(flags) should not be provided together. In this case
              C(undefine) ignores C(true), considers only C(flags) and issues a warning.
        type: bool
extends_documentation_fragment:
    - community.libvirt.virt.options_uri
    - community.libvirt.virt.options_xml
    - community.libvirt.virt.options_guest
    - community.libvirt.virt.options_autostart
    - community.libvirt.virt.options_state
    - community.libvirt.virt.options_command
    - community.libvirt.virt.options_mutate_flags
    - community.libvirt.requirements
attributes:
    check_mode:
        description: Supports check_mode.
        support: full
author:
    - Ansible Core Team
    - Michael DeHaan
    - Seth Vidal (@skvidal)
a  
# a playbook task line:
- name: Start a VM
  community.libvirt.virt:
    name: alpha
    state: running

# /usr/bin/ansible invocations
# ansible host -m virt -a "name=alpha command=status"
# ansible host -m virt -a "name=alpha command=get_xml"
# ansible host -m virt -a "name=alpha command=create uri=lxc:///"

# defining and launching an LXC guest
- name: Define a VM
  community.libvirt.virt:
    command: define
    xml: "{{ lookup('template', 'container-template.xml.j2') }}"
    uri: 'lxc:///'
- name: start vm
  community.libvirt.virt:
    name: foo
    state: running
    uri: 'lxc:///'

# setting autostart on a qemu VM (default uri)
- name: Set autostart for a VM
  community.libvirt.virt:
    name: foo
    autostart: true

# Defining a VM and making is autostart with host. VM will be off after this task
- name: Define vm from xml and set autostart
  community.libvirt.virt:
    command: define
    xml: "{{ lookup('template', 'vm_template.xml.j2') }}"
    autostart: true

# Undefine VM only, if it has no existing nvram or other metadata
- name: Undefine qemu VM
  community.libvirt.virt:
    command: undefine
    name: foo

# Undefine VM and force remove all of its related metadata (nvram, snapshots, etc.)
- name: "Undefine qemu VM with force"
  community.libvirt.virt:
    command: undefine
    name: foo
    force: true

# Undefine VM and remove all of its specified metadata specified
# Result would the same as with force=true
- name: Undefine qemu VM with list of flags
  community.libvirt.virt:
    command: undefine
    name: foo
    flags: managed_save, snapshots_metadata, nvram, checkpoints_metadata

# Undefine VM, but keep its nvram
- name: Undefine qemu VM and keep its nvram
  community.libvirt.virt:
    command: undefine
    name: foo
    flags: keep_nvram

# Listing VMs
- name: List all VMs
  community.libvirt.virt:
    command: list_vms
  register: all_vms

- name: List only running VMs
  community.libvirt.virt:
    command: list_vms
    state: running
  register: running_vms
a|  
# for list_vms command
list_vms:
    description: The list of vms defined on the remote system.
    type: list
    returned: success
    sample: [
        "build.example.org",
        "dev.example.org"
    ]
# for status command
status:
    description: The status of the VM, among running, crashed, paused and shutdown.
    type: str
    sample: "success"
    returned: success
N)libvirtErrorTF)etree)AnsibleModule)	to_native      )createdefinedestroyget_xmlget_interfacespauseshutdownstatusstartstopundefineunpauseuuid)freememinfolist_vmsnodeinfovirttyperunningpausedr   crashed)r   r
   r               r"             )managed_savesnapshots_metadatanvram
keep_nvramcheckpoints_metadatadelete_volumes)ADD_UUIDADD_MAC_ADDRESSESADD_MAC_ADDRESSES_FUZZYc                       e Zd Zy)
VMNotFoundN)__name__
__module____qualname__     j/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/libvirt/plugins/modules/virt.pyr2   r2      s    r7   r2   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)LibvirtConnectionc                 V   || _         d}| j                   j                  |      \  }}}d|v rt        j                  d       }nSd|v r:t        j                  t        j
                  gg d g}t        j                  ||      }nt        j                  |      }|st        d      || _        y )Nzuname -rxenesxzhypervisor connection failure)	modulerun_commandlibvirtopenVIR_CRED_AUTHNAMEVIR_CRED_NOECHOPROMPTopenAuth	Exceptionconn)	selfurir>   cmdrcstdoutstderrrF   auths	            r8   __init__zLibvirtConnection.__init__   s    ![[44S9FFF?<<%Dc\..0M0MNPRTXYD##C.D<<$D;<<	r7   c                     | j                   j                         }|dk(  r|S |D ]  }|j                         |k(  s|c S  t        d|z        )zM
        Extra bonus feature: vmid = -1 returns a list of everything
        zvirtual machine %s not found)rF   listAllDomainsnamer2   )rG   vmidvmsvms       r8   find_vmzLibvirtConnection.find_vm   sW    
 ii&&(2:J 	BwwyD 		 7$>??r7   c                 @    | j                  |      j                         S N)rV   r   rG   rS   s     r8   r   zLibvirtConnection.shutdown   s    ||D!**,,r7   c                 $    | j                  |      S rX   )suspendrY   s     r8   r   zLibvirtConnection.pause  s    ||D!!r7   c                 $    | j                  |      S rX   )resumerY   s     r8   r   zLibvirtConnection.unpause  s    {{4  r7   c                 @    | j                  |      j                         S rX   )rV   r[   rY   s     r8   r[   zLibvirtConnection.suspend      ||D!))++r7   c                 @    | j                  |      j                         S rX   )rV   r]   rY   s     r8   r]   zLibvirtConnection.resume      ||D!((**r7   c                 @    | j                  |      j                         S rX   )rV   r   rY   s     r8   r   zLibvirtConnection.create  ra   r7   c                 @    | j                  |      j                         S rX   )rV   r   rY   s     r8   r   zLibvirtConnection.destroy  r_   r7   c                 r    | j                  |      }|dz  r| j                  |       |j                  |      S )Nr'   )rV   delete_domain_volumesundefineFlags)rG   rS   flagrU   s       r8   r   zLibvirtConnection.undefine  s6    \\$"9&&t,%%r7   c                 T    |j                         d   }t        j                  |d      S Nr   unknown)r   VIRT_STATE_NAME_MAPget)rG   rU   states      r8   get_status2zLibvirtConnection.get_status2  s$    	!"&&ui88r7   c                 r    | j                  |      j                         d   }t        j                  |d      S ri   )rV   r   rk   rl   )rG   rS   rm   s      r8   
get_statuszLibvirtConnection.get_status  s1    T"'')!,"&&ui88r7   c                 6    | j                   j                         S rX   )rF   getInforG   s    r8   r   zLibvirtConnection.nodeinfo"      yy  ""r7   c                 6    | j                   j                         S rX   )rF   getTypers   s    r8   get_typezLibvirtConnection.get_type%  rt   r7   c                 Z    | j                   j                  |      }|j                  d      S )Nr   )rF   lookupByNameXMLDescrG   rS   rU   s      r8   r   zLibvirtConnection.get_xml(  s$    YY##D)zz!}r7   c                 X    | j                   j                  |      }|j                         S rX   )rF   ry   maxVcpusr{   s      r8   get_maxVcpuszLibvirtConnection.get_maxVcpus,  s"    YY##D){{}r7   c                 X    | j                   j                  |      }|j                         S rX   )rF   ry   	maxMemoryr{   s      r8   get_maxMemoryzLibvirtConnection.get_maxMemory0  "    YY##D)||~r7   c                 6    | j                   j                         S rX   )rF   getFreeMemoryrs   s    r8   r   zLibvirtConnection.getFreeMemory4  s    yy&&((r7   c                 X    | j                   j                  |      }|j                         S rX   )rF   ry   	autostartr{   s      r8   get_autostartzLibvirtConnection.get_autostart7  r   r7   c                 Z    | j                   j                  |      }|j                  |      S rX   )rF   ry   setAutostart)rG   rS   valrU   s       r8   set_autostartzLibvirtConnection.set_autostart;  s%    YY##D)s##r7   c                 8    | j                   j                  |      S rX   )rF   	defineXMLrG   xmls     r8   define_from_xmlz!LibvirtConnection.define_from_xml?  s    yy""3''r7   c                 X    | j                   j                  |      }|j                         S rX   )rF   ry   
UUIDStringr{   s      r8   get_uuidzLibvirtConnection.get_uuidB  s"    YY##D)}}r7   c                 *   | j                  |      }t        j                  |      }|j                  d      }dddd}d}i }i |d<   |D ]  }|dz  }|j	                  d	      }	|j                  d
      j	                  ddddj	                  |	            }
|j                  d      j	                  d      }|j                  d      j	                  d      }|j	                  |	|	      |||
d}|d   j                  dj                  |      |i        |S )N./devices/interfaceNATmacvtapbridge)networkdirectr   r   network_interfacesr
   typesourcedevr   )r   r   r   macaddressbus)r   r   pci_busr   zinterface_{0})r   r   
fromstringfindallrl   findupdateformat)rG   rS   dom_xmlroot
interfacesinterface_type_mapinterface_counterinterfaces_dict	interfaceinterface_typer   mac_addressr   interface_infos                 r8   r   z LibvirtConnection.get_interfacesF  s9   ,,t$(\\"78


 02,-# 	vI"&]]62N^^H-11"$3 c.!	#F
 $../33I>KnnY/33E:G*..~~N"" 	N 0188/:P:PQb:ces9tu!	v" r7   c                     | j                  |      }t        j                  |      }|j                  d      }|D ]A  }|j	                  d      }| j
                  j                  |      }|s2|j                          C y )Nz.//disk[@type='file']/sourcefile)r   r   r   r   rl   rF   storageVolLookupByPathdelete)rG   rS   r   r   disk_objectsdisk	disk_pathdisk_volumess           r8   re   z'LibvirtConnection.delete_domain_volumese  so    ,,t$(||$BC  	&D(I99;;IFL##%		&r7   N)r3   r4   r5   rN   rV   r   r   r   r[   r]   r   r   r   rn   rp   r   rw   r   r~   r   r   r   r   r   r   r   re   r6   r7   r8   r:   r:      s{    (@ -"!,++,&99##)$(>&r7   r:   c                       e Zd Zd Zd Zd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Virtc                      || _         || _        y rX   )r>   rH   )rG   rH   r>   s      r8   rN   zVirt.__init__r  s    r7   c                 d    t        | j                  | j                        | _        | j                  S rX   )r:   rH   r>   rF   rs   s    r8   
__get_connzVirt.__get_connv  s"    %dhh<	yyr7   c                 X    | j                          | j                  j                  |      S rX   )_Virt__get_connrF   rV   rY   s     r8   get_vmzVirt.get_vmz  s!    yy  &&r7   c                     | j                         }g }|D ]3  }| j                  j                  |      }|j                  |d|       5 |S )N )r   rF   rp   append)rG   rT   rm   rU   state_blurbs        r8   rm   z
Virt.state~  sM    mmo 	6B))..r2KLLB45	6 r7   c                 p   | j                         }t               }|D ]  }| j                  j                  |      j	                         }t        t
        j                  |d   d      t        |d         t        |d         |d   t        |d         | j                  j                  |            ||<    |S )Nr   rj   r
   r   r!   r"   )rm   maxMemmemory	nrVirtCpucpuTimer   )	r   dictrF   rV   r   rk   rl   strr   )rG   rT   r   rU   datas        r8   r   z	Virt.info  s    mmov 	B99$$R(--/D )--d1gyA47|47|q'DG))11"5DH	  r7   c                 @   | j                          | j                  j                         }t        t	        |d         t	        |d         t	        |d         t	        |d         t	        |d         t	        |d         t	        |d         t	        |d         	      }|S )
Nr   r
   r   r!   r"   r#   r$      )cpumodel	phymemorycpuscpumhz	numanodessocketscpucores
cputhreads)r   rF   r   r   r   )rG   r   r   s      r8   r   zVirt.nodeinfo  s    yy!!#a\$q'lT!WtAw<$q'lQLa\47|	
 r7   Nc                 Z   | j                         | _        | j                  j                  d      }g }|D ]d  }	 |r@| j                  j                  |      }||k(  r?|j	                  |j                                n|j	                  |j                                f |S # t        $ r Y tw xY w)NrP   )r   rF   rV   rn   r   rR   rE   )rG   rm   rT   resultsxvmstates         r8   r   zVirt.list_vms  s    OO%	ii# 		A"ii33A6G%'qvvx0NN1668,		   s   A!B	B*)B*c                 >    | j                         j                         S rX   )r   rw   rs   s    r8   r   zVirt.virttype  s     ))++r7   c                    | j                         | _        | j                  j                  r| j                  j	                  |      |k7  S | j                  j	                  |      |k7  r| j                  j                  ||       yy)NTF)r   rF   r>   
check_moder   r   )rG   rS   as_flags      r8   r   zVirt.autostart  sj    OO%	;;!!99**40G;; 99""4(G3II##D'2r7   c                 `    | j                         | _        | j                  j                         S rX   )r   rF   r   rs   s    r8   r   zVirt.freemem  s#    OO%	yy&&((r7   c                     | j                   j                  ry| j                          | j                  j	                  |       y)zK Make the machine with the given vmid stop running.  Whatever that takes.  r   )r>   r   r   rF   r   rY   s     r8   r   zVirt.shutdown  s1    ;;!!		4 r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )z) Pause the machine with the given vmid.  r   )r>   r   r   rF   r[   rY   s     r8   r   z
Virt.pause  1    ;;!!yy  &&r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )z+ Unpause the machine with the given vmid.  r   )r>   r   r   rF   r]   rY   s     r8   r   zVirt.unpause  1    ;;!!yy%%r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )z& Start the machine via the given vmid r   r>   r   r   rF   r   rY   s     r8   r   zVirt.create  r   r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )z) Start the machine via the given id/name r   r   rY   s     r8   r   z
Virt.start  r   r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )zf Pull the virtual power from the virtual domain, giving it virtually no time to virtually shut down.  r   )r>   r   r   rF   r   rY   s     r8   r   zVirt.destroy  r   r7   c                     | j                   j                  r|| j                         v ddS | j                          | j                  j                  ||      }|dk(  |dS )zX Stop a domain, and then wipe it from the face of the earth.  (delete disk/config file) r   )changedcommand)r>   r   r   r   rF   r   )rG   rS   rg   ress       r8   r   zVirt.undefine  s`    ;;!!4==?2  	ii  t,ax
 	
r7   c                 X    | j                          | j                  j                  |      S )zg
        Return a state suitable for server consumption.  Aka, codes.py values, not XM output.
        )r   rF   rp   rY   s     r8   r   zVirt.status  s#     	yy##D))r7   c                 X    | j                          | j                  j                  |      S )zp
        Receive a Vm id as input
        Return an xml describing vm config returned by a libvirt call
        )r   rF   r   rY   s     r8   r   zVirt.get_xml  s#     	yy  &&r7   c                 X    | j                          | j                  j                  |      S )z9
        Gets the max number of VCPUs on a guest
        )r   rF   r~   rY   s     r8   r~   zVirt.get_maxVcpus  s#    
 	yy%%d++r7   c                 X    | j                          | j                  j                  |      S )z0
        Gets the max memory on a guest
        )r   rF   get_MaxMemoryrY   s     r8   get_max_memoryzVirt.get_max_memory  s#    
 	yy&&t,,r7   c                     | j                   j                  ry| j                          | j                  j	                  |      S )z3
        Define a guest with the given xml
        r   )r>   r   r   rF   r   r   s     r8   r   zVirt.define&  s3     ;;!!yy((--r7   c                 X    | j                          | j                  j                  |      S rX   )r   rF   r   rY   s     r8   r   zVirt.get_uuid/  s!    yy!!$''r7   c                 X    | j                          | j                  j                  |      S )z=
        Get Interface Name and Mac Address from xml
        )r   rF   r   rY   s     r8   r   zVirt.get_interfaces3  s#     	yy''--r7   c                 X    | j                          | j                  j                  |      S rX   )r   rF   re   rY   s     r8   re   zVirt.delete_domain_volumes:  s!    yy..t44r7   rX   )r3   r4   r5   rN   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   re   r6   r7   r8   r   r   p  s    '* ,
)'&&&'
*',-.(.5r7   r   r   r   r   )r   r   r   userc           	      $   | j                   j                  dd      }| j                   j                  dd      }| j                   j                  dd      }| j                   j                  dg       }t        j                  d      }|s| j	                  d	       	 t        j
                  ||      }j                  d      }||G||k7  rB| j	                  d       n0|| j	                  d       |}|t        j                  |d      _	        |dk(  r| j	                  d	       t               }		 |j                  |      }
|
j                  t        j                        }t        j
                  ||      }|
X|j                  d      }|
j!                         }|"||k7  r| j	                  d|d|d|	       nd|v r||t        j                  |d      _	        |j#                  d      }d|v r|j%                  d      D ]  }|j#                  d      j                  d      }d|z  }	 |j%                  |      d   }|j'                  |       t        j                  |dd|j#                  d      j                  d      i        d |v r@i d6fd!	}|j%                  d"      D ]#  }|j                  d#      }|j#                  d      |j#                  d      8|t0        vr7| j+                  d$|j-                         j/                  |      dz   |fz         wt0        |   }|r |j#                  d%      j                  |      nd} |||      }|j#                  d      |rd&|d'|d(|d)}nd*|z  }|j%                  |      }	 ||dz
     }t        j                  |dd|j#                  d+      j                  d      i       & 	 t        j2                  |d-      j5                         }| j6                  rE|r%t        j2                  |d-      j5                         nd}|	j9                  ||k7  ||d.d/       |	S |j;                  |      }|
=|j                  t        j                        }||k7  r;|	j9                  dd0||d.d1       n"|	j9                  d|j=                         d2       |&|jE                  ||      r|	j9                  ddd5       |	S # t        j                  $ r | j	                  d
	       Y Zw xY w# t        $ r
 d}
d}d}Y w xY w# t(        $ r: | j+                  d|j-                         j/                  |      dz   |fz         Y cw xY w# t(        $ r8 | j+                  d,|j-                         j/                  |      dz   z         Y w xY w# t>        $ r.}| j	                  d3|jA                         z  	       Y d}~(d}~wtB        $ r }| j	                  d4|z  	       Y d}~Od}~ww xY w)7z handle `command: define` r   NrR   r   mutate_flagsT)remove_blank_textzdefine requires 'xml' argumentmsgzgiven XML is invalidz./namez1given 'name' parameter does not match name in XMLz4missing 'name' parameter and no name provided in XML z%domain name cannot be an empty stringz./uuidzattempting to re-define domain /z with a different UUID: r.   r   z	./devicesr/   z'./devices/interface[not(mac) and alias]aliasz./interface[alias[@name='%s']]r   r   r   z9Could not match interface %i of incoming XML by alias %s.r
   r0   c                 Z    | | dk7  r|nd f}|vr
d|<   |   S |xx   dz  cc<   |   S )Nr   r
   r6   )_typer   keysimilar_interface_countss      r8   get_interface_countz*handle_define.<locals>.get_interface_count  sS     EVO&FC"::8905 4C88 15:53C88r7   r   r   z^Skipping fuzzy MAC matching for interface %i of incoming XML: unsupported interface type '%s'.r   z./interface[@type='z' and source[@z='z']]z./interface[@type = '%s']z./macz3Could not fuzzy match interface %i of incoming XML.)pretty_print)beforeafter)r   diffzdomain definition changed)r   change_reasonr	  )r   createdzlibvirtError: %szan unknown error occured: %s)r   r
  rX   )#paramsrl   r   	XMLParser	fail_jsonr   XMLSyntaxErrorfindtext
SubElementtextr   r   rz   r@   VIR_DOMAIN_XML_INACTIVEr2   r   r   xpathremove
IndexErrorwarn	getparentindexINTERFACE_SOURCE_ATTRStostringdecoder   r   r   rR   r   get_error_messagerE   r   ) r>   vr   guestr   r   parserincoming_xmldomain_namer   existing_domainexisting_xml_rawexisting_xmlincoming_uuidexisting_uuidexisting_devicesr   search_aliasr  matched_interfacer  r  source_attrr   similar_countmatching_interfaces
domain_xmlr  domainnew_xmler  s                                   @r8   handle_definer2  M  s&   
--

E4
(CMMfd+E!!+t4I==$$^R8L__t4F=>5''V4 ''1K!5PQ=ST6Av.3bDE
&C"((;/*2273R3RS''(8&A " %--h7'224$-)G ]M"  \)m.C ?L  v6;+00="l2!-!3!34]!^ I#,>>'#:#>#>v#FL<|KE	,<,B,B5,I!,L)(//0AB((E%'8'='=e'D'H'H'S<  )L8 ,.(9 ".!3!34I!J #I%MM&1E ~~e,8Y^^G=T=` $::  %E%//177	BQFH %  !"8"?KJUY^^H599+F[_F$7v$FM ~~e,8 !;!8 !<k I*:*@*@*G',?PQ@Q,R)((E%'8'='=g'F'J'J9'U< ;#J&A^^LtDKKM
Q]U^^LtDKKMceFJJ!Z/$'  J*%&
 nnW%D%DEG7*

#%@"2!(  JJ4FKKMBC [)!D

tkBCJc  5345T  H & $_%//177	BQFc % f & $Y%//177	BQF% P  I/!2E2E2GGHH A;a?@@Asv   S% 1AT /AT'?U-A5V1 	A2V1 %%TTT$#T$'?U*)U*-=V.-V.1	X:#W##X/X

Xc                 Z   | j                   j                  dd       }| j                   j                  dd       }| j                   j                  dd       }| j                   j                  dd       | j                   j                  dd       }| j                   j                  dd       }| j                   j                  dd       }t        ||       t               }|r3dk(  r.j	                  |	      }t        |t              s|i}t        |fS |Ld
k7  rG|s| j                  d       	 j                  |       j                  ||      |d<   s
|st        |fS |rK|s| j                  d       |dk(  rjj                  |      dk(  r!d|d<   j                  |      |d<   t        |fS j                  |      dk7  rd|d<   j                  |      |d<   t        |fS |dk(  r5j                  |      dk7  rd|d<   j                  |      |d<   t        |fS |dk(  r5j                  |      dk7  rd|d<   j                  |      |d<   t        |fS |dk(  r5j                  |      dk(  rd|d<   j!                  |      |d<   t        |fS | j                  d       t        |fS rDfd}t"        v rd
k(  r#|j%                  t'        |              t        |fS |s| j                  dz         t        |fS dk(  rd}	|n|du r| j)                  d       ddg}
t+        |
      t+        |      k  rt-        ddj/                  |
      z        |D ]  }|	t0        j                  |d      z  }	 n|du rd }	 |||	      }t        |fS d!k(  rd!j3                  |      i}t        |fS  ||      }t        |fS t5              r |       }t        |fS | j                  d"z         | j                  d#       y # t        $ r | j                  d|z         Y w xY w)$Nrm   r   rR   r   forceflagsrH   r   )rm   r   z#autostart requires 1 argument: namer   zdomain %s not foundr   z'state change requires a guest specifiedr   r   Tr   r   	destroyedzunexpected statec                  N     t              |  }t        |t              s|i}|S rX   )getattr
isinstancer   )argsr   r   r  s     r8   	exec_virtzcore.<locals>.exec_virtH  s.    %'!W%t,Cc4(nJr7   z%s requires 1 argument: guestr   r   z/Ignoring 'force', because 'flags' are provided.r*   r+   z!Flags '%s' are mutually exclusivez' and '7   r   zCommand %s not recognizedz3expected state or command parameter to be specified)r  rl   r   r   r   r9  VIRT_SUCCESSr  r   r2   r   r   r   r   r   r   r   VM_COMMANDSr   r2  r  set
ValueErrorjoinENTRY_UNDEFINE_FLAGS_MAPr   hasattr)r>   rm   r   r  r4  r5  rH   r   r;  rg   nvitemr   r  s               @@r8   corerF    s}   MMgt,E!!+t4IMMfd+Emm	40GMMgt,EMMgt,E
--

E4
(CS&A
&CJ&jjuj%#t$C.CS  H!4!FG	@HHUO UI6Iu$$!JKIxx(*!%IYYu-E
& S  % %I-!%IWWU^E
  S   j xx*,!%IZZ.E
 S   k!xx*,!%IYYu-E
 S   hxx)+!%IWWU^E
 S   !34S  	 k!("

=34@  $$=   %Dw%N O:  $$7 J&
 $}$UV!<0B2w#e*,()Ly~~^`Oa)abb % F 8 < <T1 EEF d]Dt,  $$ F"qzz%01
  $$  &$$Q +C$$ !<w!FG
NOi  	@!6!>?	@s   .P P*)P*c                     t        t        t        ddg      t        dg d      t        d      t        dt              t        ddt        	      t        d      t        dd
      t        d      t        ddt        dg      	      d      } t
        s| j                  d       t        s| j                  d       t        }	 t        |       \  }}|dk7  r| j                  |       y  | j                  di  y # t        $ r8}| j                  t        |      t        j                                Y d }~hd }~ww xY w)Nr   r  )r   aliases)r6  r   r   r   )r   choicesbool)r   list)r   elementsrI  zqemu:///system)r   defaultr.   )r   rL  rI  rM  )	rR   rm   r   r   r5  r4  rH   r   r   T)argument_specsupports_check_modez?The `libvirt` module is not importable. Check the requirements.r   z<The `lxml` module is not importable. Check the requirements.)r   	exceptionr   )rJ   r   r6   )r   r   ALL_COMMANDS	ALL_FLAGSMUTATE_FLAGSHAS_VIRTr  HAS_XMLr=  rF  rE   r	   	traceback
format_exc	exit_json)r>   rJ   resultr1  s       r8   mainrZ  |  s1   57)4E+YZ'e\:FUIFF#%)9:% 6E<ZdYef

 !F Q 	 	
 N 	 	
 
BM&\
F 
QwBF+"6"  MYq\Y5I5I5KLLMs   
D 	E.E  E__main__)+
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNrV  r@   r   rT  ImportErrorlxmlr   rU  ansible.module_utils.basicr   ansible.module_utils._textr	   VIRT_FAILEDr=  VIRT_UNAVAILABLErQ  r>  HOST_COMMANDSextendrk   rB  rS  rR  keysrE   r2   objectr:   r   r  r2  rF  rZ  r3   r6   r7   r8   <module>rk     s   A @.`L\
$ $ H G 4 0   ZG   K     M "     L	 	  )..0 1	 	T& T&nL56 L5l 	 }@lP^##L zF A  H  Gs"   
C" C/ "C,+C,/C98C9