
    VhQ                     z   d dl mZmZmZ eZdZdZ	 d dl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j1                  e       ej1                  e       dddZdddZdddZ G d de      Z G d de      Z G d de      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_functionah  
---
module: virt_net
author: "Maciej Delmanowski (@drybjed)"
short_description: Manage libvirt network configuration
description:
     - Manage I(libvirt) networks.
options:
    name:
        aliases: ['network']
        description:
            - Name of the network being managed. Note that network must be previously
              defined with xml.
        type: str
    state:
        choices: [ "active", "inactive", "present", "absent" ]
        description:
            - Specify which state you want a network to be in.
              If 'active', network will be started.
              If 'present', ensure that network is present but do not change its
              state; if it is missing, you need to specify xml argument.
              If 'inactive', network will be stopped.
              If 'undefined' or 'absent', network will be removed from I(libvirt) configuration.
        type: str
    command:
        choices: [ "define", "create", "start", "stop", "destroy",
                   "undefine", "get_xml", "list_nets", "facts",
                   "info", "status", "modify"]
        description:
            - In addition to state management, various non-idempotent commands are available.
              See examples.
              Modify was added in Ansible version 2.1.
        type: str
    autostart:
        type: bool
        description:
            - Specify if a given network should be started automatically on system boot.
extends_documentation_fragment:
    - community.libvirt.virt.options_uri
    - community.libvirt.virt.options_xml
    - community.libvirt.requirements
requirements:
    - "python-lxml"
a  
- name: Define a new network
  community.libvirt.virt_net:
    command: define
    name: br_nat
    xml: '{{ lookup("template", "network/bridge.xml.j2") }}'

- name: Start a network
  community.libvirt.virt_net:
    command: create
    name: br_nat

- name: List available networks
  community.libvirt.virt_net:
    command: list_nets

- name: Get XML data of a specified network
  community.libvirt.virt_net:
    command: get_xml
    name: br_nat

- name: Stop a network
  community.libvirt.virt_net:
    command: destroy
    name: br_nat

- name: Undefine a network
  community.libvirt.virt_net:
    command: undefine
    name: br_nat

# Gather facts about networks
# Facts will be available as 'ansible_libvirt_networks'
- name: Gather facts about networks
  community.libvirt.virt_net:
    command: facts

- name: Gather information about network managed by 'libvirt' remotely using uri
  community.libvirt.virt_net:
    command: info
    uri: '{{ item }}'
  with_items: '{{ libvirt_uris }}'
  register: networks

- name: Ensure that a network is active (needs to be defined and built first)
  community.libvirt.virt_net:
    state: active
    name: br_nat

- name: Ensure that a network is inactive
  community.libvirt.virt_net:
    state: inactive
    name: br_nat

- name: Ensure that a given network will be started at boot
  community.libvirt.virt_net:
    autostart: true
    name: br_nat

- name: Disable autostart for a given network
  community.libvirt.virt_net:
    autostart: false
    name: br_nat

- name: Add a new host in the dhcp pool
  community.libvirt.virt_net:
    name: br_nat
    command: modify
    xml: "<host mac='FC:C2:33:00:6c:3c' name='my_vm' ip='192.168.122.30'/>"
NTF)etree)AnsibleModule)	to_native      )	createstatusstartstopundefinedestroyget_xmldefinemodify)	list_netsfactsinfoinactiveactive)r   r	   noyesc                       e Zd Zy)EntryNotFoundN)__name__
__module____qualname__     n/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/libvirt/plugins/modules/virt_net.pyr   r      s    r!   r   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y)LibvirtConnectionc                 d    || _         t        j                  |      }|st        d      || _        y )Nzhypervisor connection failure)modulelibvirtopen	Exceptionconn)selfurir&   r*   s       r"   __init__zLibvirtConnection.__init__   s-    ||C ;<<	r!   c                    |dk(  r^| j                   j                         | j                   j                         z   }|D cg c]  }| j                   j                  |       c}S 	 | j                   j                  |      S c c}w # t        j
                  $ r5}|j                         t        j                  k(  rt        d|z         d }~ww xY w)Nznetwork %s not found)	r*   listNetworkslistDefinedNetworksnetworkLookupByNamer'   libvirtErrorget_error_codeVIR_ERR_NO_NETWORKr   )r+   entryidnamesnes        r"   
find_entryzLibvirtConnection.find_entry   s    b=II**,tyy/L/L/NNE>CDDII11!4DD	990099 E ## 	!W%?%??#$:W$DEE	s   "B %B C0CCc                 @   | j                   j                  s| j                  |      j                         S 	 | j                  |      j	                         }|s| j                   j                  d      S y # t
        $ r | j                   j                  d      cY S w xY wNTchanged)r&   
check_moder:   r   isActiver)   	exit_jsonr+   r6   states      r"   r   zLibvirtConnection.create   s    {{%%??7+2244;099; {{,,T,::   ;{{,,T,::;s   A5 5%BBc                    | j                  |      }t        j                  |      }t        j                  |j                  d            }|j                  dk(  r|j                  d      }|j                  d      }d }|D ]  }	|	j                  d      |k(  s|	} n || j                  j                  s|j                         rQ|j                  t        j                  t        j                  d|t        j                  t        j                  z        }
nB|j                  t        j                  t        j                  d|t        j                        }
nd}
|
dk(  ry|j                  d      |j                  d      k(  r$|j                  d      |j                  d      k(  ry	| j                  j                  s|j                         rQ|j                  t        j                   t        j                  d|t        j                  t        j                  z        }
nB|j                  t        j                   t        j                  d|t        j                        }
nd}
|
dk(  ry| j                  j#                  d
t%        |      z         y )Nr   hostmacz/network/ip/dhcp/hostr/   TnameipFz%updating this is not supported yet %smsg)r:   r   
fromstringXMLDesctaggetxpathr&   r?   r@   updater'   #VIR_NETWORK_UPDATE_COMMAND_ADD_LAST VIR_NETWORK_SECTION_IP_DHCP_HOSTVIR_NETWORK_UPDATE_AFFECT_LIVE VIR_NETWORK_UPDATE_AFFECT_CONFIG!VIR_NETWORK_UPDATE_COMMAND_MODIFY	fail_jsonr   )r+   r6   xmlnetworknew_dataold_datamac_addrhostsrE   hress              r"   r   zLibvirtConnection.modify   s*   //'*##C(##GOOA$67<<6!||E*HNN#:;ED 55<8+D |{{--'')%nnW-X-X-4-U-U-/g6\6\_f  `H  `H  7HI &nnW-X-X-4-U-U-/g6^6^`
 C!8 88F#x||F';;RZR^R^_cRd@d ;;11"++-")..1Z1Z181Y1Y13S':`:`cj  dL  dL  ;L#MC #*..1Z1Z181Y1Y13S':b:b#dC
  ax#"IIVYN"Z[r!   c                     | j                   j                  s| j                  |      j                         S | j                  |      j	                         r| j                   j                  d      S y r<   )r&   r?   r:   r   r@   rA   r+   r6   s     r"   r   zLibvirtConnection.destroy	  sY    {{%%??7+3355w'002{{,,T,:: 3r!   c                     d }	 | j                  |      }d}|r| j                  |      j                         S | j                  j                  r| j                  j                  |      S y # t        $ r d}Y aw xY w)NTFr=   )r:   r   r   r&   r?   rA   )r+   r6   entryfounds       r"   r   zLibvirtConnection.undefine  s|    	OOG,EE ??7+4466;;!!;;(((77 "  	E	s   A+ +A98A9c                 N    |j                         }t        j                  |d      S Nunknown)r@   ENTRY_STATE_ACTIVE_MAPrN   )r+   rb   rC   s      r"   get_status2zLibvirtConnection.get_status2  s!     %))%;;r!   c                 N   | j                   j                  s5| j                  |      j                         }t        j                  |d      S 	 | j                  |      j                         }t        j                  |d      S # t        $ r t        j                  dd      cY S w xY w)Nrf   r   )r&   r?   r:   r@   rg   rN   r)   rB   s      r"   
get_statuszLibvirtConnection.get_status"  s    {{%%OOG,557E)--eY??I099;-11%CC I-11*iHHIs   4B B$#B$c                 @    | j                  |      j                         S N)r:   
UUIDStringr`   s     r"   get_uuidzLibvirtConnection.get_uuid-      w'2244r!   c                 B    | j                  |      j                  d      S )Nr   )r:   rL   r`   s     r"   r   zLibvirtConnection.get_xml0  s    w'//22r!   c                     t        j                  | j                  |      j                  d            }	 |j	                  d      d   j                  d      }|S # t        $ r t        d      w xY w)Nr   z/network/forwardmodezForward mode not specifiedr   rK   r:   rL   rO   rN   r)   
ValueErrorr+   r6   rW   results       r"   get_forwardzLibvirtConnection.get_forward3  sn    tw7??BC	;YY121599&AF   	;9::	;   #A A/c                     t        j                  | j                  |      j                  d            }	 |j	                  d      d   j                  d      }|S # t        $ r t        d      w xY w)Nr   z/network/domainrG   zDomain not specifiedrs   ru   s       r"   
get_domainzLibvirtConnection.get_domain;  sn    tw7??BC	5YY01!488@F   	5344	5rx   c                     t        j                  | j                  |      j                  d            }	 |j	                  d      d   j                  d      }|S # t        $ r t        d      w xY w)Nr   z/network/macaddresszMAC address not specifiedrs   ru   s       r"   get_macaddressz LibvirtConnection.get_macaddressC  sm    tw7??BC	:YY~.q155i@F   	:899	:rx   c                 l    | j                  |      j                         }t        j                  |d      S re   )r:   	autostartENTRY_STATE_AUTOSTART_MAPrN   rB   s      r"   get_autostartzLibvirtConnection.get_autostartK  s,    (224(,,UI>>r!   c                    | j                   j                  s| j                  |      j                         S 	 | j                  |      j                         S # t        $ r | j                   j                  d      cY S w xY wr<   )r&   r?   r:   r   r)   rA   r`   s     r"   get_autostart2z LibvirtConnection.get_autostart2O  sk    {{%%??7+5577;w/99;; ;{{,,T,::;s   A %A>=A>c                 Z   | j                   j                  s | j                  |      j                  |      S 	 | j                  |      j	                         }t        |      |k7  r| j                   j                  d      S y # t
        $ r | j                   j                  d      cY S w xY wr<   )r&   r?   r:   setAutostartr   r)   rA   bool)r+   r6   valrC   s       r"   set_autostartzLibvirtConnection.set_autostartX  s    {{%%??7+88==;0::< E{c!{{,,T,:: "  ;{{,,T,::;s   B %B*)B*c                 @    | j                  |      j                         S rl   )r:   
bridgeNamer`   s     r"   
get_bridgezLibvirtConnection.get_bridgec  ro   r!   c                 l    | j                  |      j                         }t        j                  |d      S re   )r:   isPersistentENTRY_STATE_PERSISTENT_MAPrN   rB   s      r"   get_persistentz LibvirtConnection.get_persistentf  s,    (557)--eY??r!   c                 D    | j                  |      }|j                         S rl   )r:   
DHCPLeases)r+   r6   rX   s      r"   get_dhcp_leasesz!LibvirtConnection.get_dhcp_leasesj  s    //'*!!##r!   c                     | j                   j                  s| j                  j                  |      S 	 | j	                  |       y # t
        $ r | j                   j                  d      cY S w xY wr<   )r&   r?   r*   networkDefineXMLr:   r)   rA   r+   r6   rW   s      r"   define_from_xmlz!LibvirtConnection.define_from_xmln  s\    {{%%99--c22;( ;{{,,T,::;s   A %A-,A-N)r   r   r   r-   r:   r   r   r   r   rh   rj   rn   r   rw   rz   r}   r   r   r   r   r   r   r   r    r!   r"   r$   r$      sj    	
	;2\h;8<	I53?;	;5@$;r!   r$   c                   |    e 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dZy)VirtNetworkc                 j    || _         || _        t        | j                  | j                         | _        y rl   )r&   r,   r$   r*   )r+   r,   r&   s      r"   r-   zVirtNetwork.__init__z  s&    %dhh<	r!   c                 8    | j                   j                  |      S rl   )r*   r:   r`   s     r"   get_netzVirtNetwork.get_net      yy##G,,r!   Nc                 
   g }| j                   j                  d      D ]b  }|r?|| j                   j                  |      k(  s$|j                  |j	                                D|j                  |j	                                d |S )Nr/   )r*   r:   rh   appendrG   )r+   rC   resultsrb   s       r"   r   zVirtNetwork.list_nets  sj    YY))"- 	-EDII11%88NN5::<0uzz|,	- r!   c                     g }| j                         D ]3  }| j                  j                  |      }|j                  |d|       5 |S )N )r   r*   rj   r   )r+   r   rb   state_blurbs       r"   rC   zVirtNetwork.state  sI    ^^% 	;E))..u5KNNe[9:	; r!   c                 :    | j                   j                  |d      S )NTr*   r   r`   s     r"   r   zVirtNetwork.autostart  s    yy&&w55r!   c                 8    | j                   j                  |      S rl   )r*   r   r`   s     r"   r   zVirtNetwork.get_autostart  s    yy''00r!   c                 :    | j                   j                  ||      S rl   r   rB   s      r"   r   zVirtNetwork.set_autostart  s    yy&&w66r!   c                     | j                   j                  |      dk(  ry 	 | j                   j                  |      S # t        j                  $ r,}|j                         t        j                  k(  rY d }~y  d }~ww xY wNr   )r*   rj   r   r'   r3   r4   VIR_ERR_NETWORK_EXIST)r+   r6   r9   s      r"   r   zVirtNetwork.create  si    99(H4	99##G,,## 	!W%B%BB	s   < A;!A65A66A;c                 :    | j                   j                  ||      S rl   )r*   r   r   s      r"   r   zVirtNetwork.modify  s    yy--r!   c                 $    | j                  |      S rl   )r   r`   s     r"   r   zVirtNetwork.start  s    {{7##r!   c                 v    | j                   j                  |      dk(  r| j                   j                  |      S y r   )r*   rj   r   r`   s     r"   r   zVirtNetwork.stop  s3    99(H499$$W-- 5r!   c                 $    | j                  |      S rl   )r   r`   s     r"   r   zVirtNetwork.destroy  s    yy!!r!   c                 8    | j                   j                  |      S rl   )r*   r   r`   s     r"   r   zVirtNetwork.undefine  s    yy!!'**r!   c                 8    | j                   j                  |      S rl   )r*   rj   r`   s     r"   r   zVirtNetwork.status  r   r!   c                 8    | j                   j                  |      S rl   )r*   r   r`   s     r"   r   zVirtNetwork.get_xml  s    yy  ))r!   c                 :    | j                   j                  ||      S rl   )r*   r   r   s      r"   r   zVirtNetwork.define  s    yy((#66r!   c                 &    | j                  d      S )Nr   )
facts_mode)r   )r+   s    r"   r   zVirtNetwork.info  s    zzVz,,r!   c                    t               }|r|g}n| j                         }|D ]=  }t               ||<   | j                  j                  |      ||   d<   | j                  j	                  |      ||   d<   | j                  j                  |      ||   d<   | j                  j                  |      ||   d<   | j                  j                  |      ||   d<   	 | j                  j                  |      ||   d<   	 | j                  j                  |      ||   d<   	 | j                  j                  |      ||   d<   	 | j                  j                  |      ||   d	<   @ t               }|d
k(  rt               |d<   ||d   d<   |S |dk(  r||d<   |S # t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w)Nr   
persistentrC   bridgeuuiddhcp_leasesforward_modedomain
macaddressr   ansible_factsansible_libvirt_networksr   networks)dictr   r*   r   r   rj   r   rn   r   AttributeErrorrw   rt   rz   r}   )r+   rG   r   r   entriesrb   r   s          r"   r   zVirtNetwork.facts  s   &fGnn&G 	E!VGEN*.))*A*A%*HGEN;'+/99+C+CE+JGEN<(&*ii&:&:5&AGEN7#'+yy';';E'BGEN8$%)YY%7%7%>GEN6"04		0I0I%0P}-
151F1Fu1M~.+/99+?+?+Fx(/3yy/G/G/N|,1	8  %)VE/"AHE/"#=>  6! 'E*1 " 
  
  
  sH   !F<!F%!F4 !G	F"!F"%	F10F14	G ?G 	GGrl   )Nr   )r   r   r   r-   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r   r   x  s\    =
-617.$."+-*7-(r!   r   c                 l   | 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        ||       }i }|r3|dk(  r.|j                  |      }t	        |t
              s||i}t        |fS |r5|s| j                  d	
       d|d<   |dv r5|j                  |      dk7  rd|d<   |j                  |      |d<   t        |fS |dv r	 |j                  |       t        |fS |dv rI|j                         }	||	v r-|j                  |      dk7  rd|d<   |j                  |      |d<   t        |fS |dv rZ|j                         }	||	v r>|j                  |      dk7  r|j                  |       d|d<   |j                  |      |d<   t        |fS | j                  d
       t        |fS |r|t        v r|s| j                  d|z  
       |dv rM|s| j                  |dz   
       	 |j                  |       |dk(  r|j!                  ||      }
|
|d}t        |fS  t#        ||      |      }t	        |t
              s||i}t        |fS t%        ||      rF|dk(  r|r|j'                  |      }n t#        ||             }t	        |t
              s||i}t        |fS | j                  d|z  
       ||s| j                  d	
       d|d<   |r3|j)                  |      sd|d<   |j+                  |d      |d<   t        |fS |j)                  |      rd|d<   |j+                  |d      |d<   t        |fS | j                  d 
       y # t        $ r; |s| j                  d|z   dz   
       |j                  ||       d|d}Y t        |fS w xY w# t        $ r! |j                  ||       d|d}Y t        |fS w xY w)!NrC   rG   commandr,   rW   r   r   )rC   z&state change requires a specified namerI   Fr>   )r   r   TrJ   )presentz	network 'z$' not present, but xml not specified)r>   created)r   r   )	undefinedabsentzunexpected statez%s requires 1 argument: name)r   r   z requires xml argumentr   )r>   modifiedr   zCommand %s not recognizedz3expected state or command parameter to be specified)paramsrN   r   r   
isinstancer   VIRT_SUCCESSrV   r   r   r   r   r   r   r   ENTRY_COMMANDSr   getattrhasattrr   r   r   )r&   rC   rG   r   r,   rW   r   vr^   r   mods              r"   corer     s{   MMgt,E==VT*Dmm	40G
--

E4
(C
--

E4
(C!!+t4IC A
CK'kkk&#t$C.CS  !IJIJxx~)!%IWWT]E
2 S  1 k!9		$, S  ! l"kkmGw88D>Z/%)C	N!"4CJ S   --kkmGw88D>Z/IIdO!%IZZ-E
 S   !34S  n$  %Cg%M N..$$3K)K$LAIIdO
 (*hhtS1*-4@#S((%'!W%d+Cc4(n$$Q '!dggdm)ga)+c4(n$$ !<w!FG!IJI??4(!%I__T48E
 S  	 t$!%I__T59E
S  
NOS ! 9$$t);>d)d$es#"&48" S  +9@ % =HHT3'&*t<C
 $S((=s$   O "P	 :PP	 P32P3c                  \   t        t        t        dg      t        g d      t        t              t        d      t               t        d      	      d
dddgfdddgfdddgfdddgfdddgfdddgfdddgfdddgfdddgfg	      } t        s| j	                  d       t
        s| j	                  d       t        }	 t        |       \  }}|dk7  r| j	                  |       y  | j                  di  y # t        $ r%}| j	                  t        |             Y d }~Ud }~ww xY w)NrX   )aliases)r   r   r   r   )choiceszqemu:///system)defaultr   )type)rG   rC   r   r,   rW   r   Tr   r   rG   r   r   r   r   r   r   r   r   )argument_specsupports_check_moderequired_ifz?The `libvirt` module is not importable. Check the requirements.rI   z<The `lxml` module is not importable. Check the requirements.r   )rcrJ   r    )r   r   ALL_COMMANDSHAS_VIRTrV   HAS_XMLr   r   r)   strrA   )r&   r   rv   r9   s       r"   mainr   W  sc   yk*JK.-.'
 !6(+6(+&*)
VH-	F8,	F8,6(+6(+

F. Q 	 	
 N 	 	
 
B%&\
F 
QwBF+"6"  %SV$$%s   C= =	D+D&&D+__main__)$
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESr'   r   ImportErrorlxmlr   r   ansible.module_utils.basicr   ansible.module_utils._textr   VIRT_FAILEDr   VIRT_UNAVAILABLEr   r   HOST_COMMANDSextendrg   r   r   r)   r   objectr$   r   r   r   r   r    r!   r"   <module>r      s1   A @+ZEN H G 4 0   /   N #   M "      	I 	D; D;Nr& rjgPT,#^ zF K  H  Gs"   B# B0 #B-,B-0B:9B: