
    Vh4                         d dl mZmZmZ eZdZd dlZd dlZd dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZmZ d dlmZmZ 	 d d	lmZ d d
lmZ d dlmZ d dlmZ dZ G d de      Z"y# e e!f$ r dZY w xY w)    )absolute_importdivisionprint_functionaC  
author: Ansible Networking Team (@ansible-network)
name: iosxr
short_description: Use iosxr netconf plugin to run netconf commands on Cisco IOSXR
  platform
description:
- This iosxr plugin provides low level abstraction apis for sending and receiving
  netconf commands from Cisco iosxr network devices.
version_added: 1.0.0
options:
  ncclient_device_handler:
    type: str
    default: iosxr
    description:
    - Specifies the ncclient device handler name for Cisco iosxr network os. To identify
      the ncclient device handler name refer ncclient library documentation.
N)AnsibleConnectionFailure)	to_nativeto_text)remove_namespaces)NetconfBaseensure_ncclient)	build_xml
etree_find)manager)RPCError)SSHUnknownHostError)to_xmlTFc                   ~    e Zd Zd Zd Zeed               ZddZddZ		 	 	 	 	 	 	 ddZ
	 	 	 	 ddZdd	Zdd
Zd Zy)Netconfc                    i }d|d<   t        j                         }|j                  ddddfddddfd	d
ddfddddfddddfddddfg       t        d|dd      }	 | j	                  |      }t        t        j                  dd|            }t        |j                         d      }||j                  |d<   t        |j                         d      }||j                  |d<   g d}t        |j                         d      }	|	N|D ]I  }
t        j                  |
|	j                  t        j                        }|s5|j                  d      |d<    n 	 t        d!dd!      }| j	                  |      }t        t        j                  dd|            }t        |j                         d"      }||j                  nd |d#<   |S # t        $ rY}t        |d      j                         }d|v r| j!                         }n| j"                  j%                  dd |z         Y d }~d }~ww xY w# t        $ r*}| j"                  j%                  dd |z         Y d }~|S d }~ww xY w)$Niosxr
network_ospreparezinstall/prepareTxpathtagzprepared-boot-imagez#install/prepare/prepared-boot-imageversionzinstall/versionlabelzinstall/version/labelzhardware-infozinstall/version/hardware-infopackagezinstall/version/packageinstallfilteropcode	namespace(<\?xml version="1.0" encoding="UTF-8"\?> namenetwork_os_packagenetwork_os_version)z^[Cc]isco (.+) \(\) processorz^[Cc]isco (.+) \(revisionz&^[Cc]isco (\S+ \S+).+bytes of .*memory   network_os_modelsurrogate_or_stricterrorszbad-namespacevvvvFail to retrieve device info %sz
host-namesz	host-namenetwork_os_hostname)collectionsOrderedDictupdater   getr	   resubr   striptextsearchMgroup	Exceptionr   get_device_info_old_version_connectionqueue_message)selfdevice_infoinstall_metainstall_filterreplyrespele_package_name	ele_labelmodel_search_strsele_hardware_infoitemmatchexc	error_msghostname_filterhostname_eles                   e/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/iosxr/plugins/netconf/iosxr.pyget_device_infozNetconf.get_device_infoN   s   $+L!"..0&7EF)!F# &7EF$;DIJ#=dK &?MN	
& #	
 	HH^,E$BBND  *$**,?+4D4I4I01"4::<9I$4=NN01!
 !+4::< I ,- DIId,=,B,BBDDIE:?++a.$67		'&O
 HH_-E$BBND &djjlK@L%1%=!!4 -. 9  	,ABHHJI)+">>@  ..5;	.  	**1C7  	s9   !CG ?G A,H* 	H'AH""H'*	I3IIc                 ~   t               }| j                         |d<   d|d<   | j                         |d<   t        | j                  j
                        |d<   t        | j                  j                        |d<   | j                  j                  |d<   | j                  |d         |d<   t        j                  |      S )	Nrpcnetconfnetwork_apir@   server_capabilitiesclient_capabilities
session_iddevice_operations)dictget_base_rpcrP   listmrU   rV   rW   get_device_operationsjsondumps)r?   results     rO   get_capabilitieszNetconf.get_capabilities   s    ))+u )} $ 4 4 6}(,TVV-G-G(H$%(,TVV-G-G(H$%#vv00|&*&@&@()'
"# zz&!!    c                 \   	 t        j                  | j                  j                  | j                  j                  xs d| j                  j
                  | j                  j                  | j                  | j                  d      | j                  d      | j                  j                  | j                  d      | j                  
      }d}|j                  D ]  }t        j                   d|      sd} n |j#                          |S # t        $ r}t        t        |            d}~ww xY w)	z
        Guess the remote network os name
        :param obj: Netconf connection class object
        :return: Network OS name
        i>  host_key_checkinglook_for_keyspersistent_connect_timeout)
hostportusernamepasswordkey_filenamehostkey_verifyre   allow_agenttimeout
ssh_configNzIOS-XRr   )r   connect_play_contextremote_addrrh   remote_userrj   rk   
get_optionrm   _ssh_configr   r   r   rU   r4   r8   close_session)objr\   rK   
guessed_oscs        rO   guess_network_oszNetconf.guess_network_os   s   	;&&22&&++2s**66**33 --"~~.AB!nn_=--99'CD ??A" 
&& 	Ayy1%$
	
 	
 # 	;*9S>::	;s   CD	 		D+D&&D+Nc                 <   t        |t              rt        |      }	 | j                  j	                  ||      }|rt        |      }|S t        |d      r|j                  n|j                  }|S # t        $ r#}t        t        |j                              d }~ww xY w)N)r   with_defaultsdata_xml)
isinstancer[   tupler\   r3   r	   hasattrr}   xmlr   r;   r   )r?   r   r|   	remove_nsrD   responserK   s          rO   r3   zNetconf.get   s    fd#6]F	-66::V=:ID,T2 O -4D*,E4==488O 	-F377O,,	-   +A/ 	%A/ /	B8BBc                 <   t        |t              rt        |      }	 | j                  j	                  ||      }|rt        |      }|S t        |d      r|j                  n|j                  }|S # t        $ r#}t        t        |j                              d }~ww xY w)N)sourcer   r}   )r~   r[   r   r\   
get_configr	   r   r}   r   r   r;   r   )r?   r   r   r   rD   r   rK   s          rO   r   zNetconf.get_config   s    fd#6]F	-66$$F6$BD,T2 O -4D*,E4==488O 	-F377O,,	-r   c                 (   |t        d      	 | j                  j                  ||||||      }|rt        |      }	|	S t	        |d      r|j
                  n|j                  }	|	S # t        $ r#}
t        t        |
j                              d }
~
ww xY w)Nzconfig value must be provided)formattargetdefault_operationtest_optionerror_optionr}   )

ValueErrorr\   edit_configr	   r   r}   r   r   r;   r   )r?   configr   r   r   r   r   r   rD   r   rK   s              rO   r   zNetconf.edit_config   s     ><==	-66%%"3') & D ,T2 O -4D*,E4==488O 	-F377O,,	-s   /A% %A% %	B.BBc                 "   t        |d      }	 | j                  j                  |||      }|rt        |      }|S t	        |d      r|j
                  n|j                  }|S # t        $ r#}t        t        |j                              d }~ww xY w)Nr*   r+   )	confirmedrn   persistr}   )
r   r\   commitr	   r   r}   r   r   r;   r   )r?   r   rn   r   r   rD   r   rK   s           rO   r   zNetconf.commit	  s     '*?@	-66==# ! D
 ,T2 O -4D*,E4==488O 	-F377O,,	-s   ,A" %A" "	B+B		Bc                    	 | j                   j                  |      }|rt        |      }|S t        |d      r|j                  n|j
                  }|S # t        $ r#}t        t        |j
                              d }~ww xY w)N)r   r}   )	r\   validater	   r   r}   r   r   r;   r   )r?   r   r   rD   r   rK   s         rO   r   zNetconf.validate  sq    	-66??&?1D,T2 O -4D*,E4==488O 	-F377O,,	-s   *A %A 	A?A::A?c                     	 | j                   j                         }|rt        |      }|S t        |d      r|j                  n|j
                  }|S # t        $ r#}t        t        |j
                              d }~ww xY w)Nr}   )	r\   discard_changesr	   r   r}   r   r   r;   r   )r?   r   rD   r   rK   s        rO   r   zNetconf.discard_changes*  so    	-66))+D,T2 O -4D*,E4==488O 	-F377O,,	-s   (A %A 	A=A88A=c                    i }d|d<   t        j                         }|j                  ddddfddddd	fd
dddfddddfddddfddddfg       t        d|dd      }	 | j	                  |      }t        t        j                  dd|            }t        |d      }|&t        j                  d|j                        d   |d<   t        |d      }|5|j                  |d<   t        j                  d |j                        d!   |d"<   |S # t        $ r*}| j                  j                  d#d$|z         Y d }~|S d }~ww xY w)%Nr   r   zboot-variableszinstall/boot-variablesTr   zboot-variablez$install/boot-variables/boot-variable)r   r   leadsoftwarezinstall/softwarezalias-deviceszinstall/software/alias-deviceszalias-devicez+install/software/alias-devices/alias-devicezm:device-namez7install/software/alias-devices/alias-device/device-namezdisk0:)r   valuer   r   install_oldr    r#   r$   zboot-variable/boot-variablez[:|,]r(   network_os_imagezpackage-namer&   -r'   r-   r.   )r0   r1   r2   r   r3   r	   r4   r5   r   splitr7   r;   r=   r>   )	r?   r@   rA   rB   rC   rD   ele_boot_variablerE   rK   s	            rO   r<   z#Netconf.get_device_info_old_version5  s   $+L!"..0 %6tD
 $!G# $ '9$GH#>tL
 #!N# $!Z!)3 "	
H ##	
	HH^,E$BBND !+41N O ,24((%**3 3./  *%@+4D4I4I0146HH$))5 501   	**1C7  	s   "B(D 	D?D::D?)NNF)Nr   	candidateNNNF)FNNF)r   F)F)__name__
__module____qualname__rP   ra   staticmethodr   rz   r3   r   r   r   r   r   r<    rb   rO   r   r   M   st    Qf"   D-- -> -,	-	-Erb   r   )#
__future__r   r   r   type__metaclass__DOCUMENTATIONr0   r^   r4   ansible.errorsr   ansible.module_utils._textr   r   Qansible_collections.ansible.netcommon.plugins.module_utils.network.common.netconfr	   Gansible_collections.ansible.netcommon.plugins.plugin_utils.netconf_baser
   r   Hansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.iosxrr   r   ncclientr   ncclient.operationsr   ncclient.transport.errorsr   ncclient.xml_r   HAS_NCCLIENTImportErrorAttributeErrorr   r   rb   rO   <module>r      s   ( A @ $   	 3 9
 ,=$Lmk m   L	s    A& &	A21A2