
    Vhv=                         d dl mZmZmZ eZdZd dlZd dlZd dl	m
Z
 d dlm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  G d de      Zy)    )absolute_importdivisionprint_functiona  
author: Ansible Networking Team (@ansible-network)
name: eos
short_description: Use eos cliconf to run command on Arista EOS platform
description:
- This eos plugin provides low level abstraction apis for sending and receiving CLI
  commands from Arista EOS network devices.
version_added: 1.0.0
options:
  eos_use_sessions:
    type: boolean
    default: true
    description:
    - Specifies if sessions should be used on remote host or not
    env:
    - name: ANSIBLE_EOS_USE_SESSIONS
    vars:
    - name: ansible_eos_use_sessions
  config_commands:
    description:
    - Specifies a list of commands that can make configuration changes
      to the target device.
    - When `ansible_network_single_user_mode` is enabled, if a command sent
      to the device is present in this list, the existing cache is invalidated.
    version_added: 2.0.0
    type: list
    elements: str
    default: []
    vars:
    - name: ansible_eos_config_commands
N)AnsibleConnectionFailure)to_text)Mapping)NetworkConfigdumps)to_list)CliconfBaseenable_mode)session_namec                        e Zd Zej                  g dz   Z fdZedd       Ze	 	 	 	 dd       Ze	 	 	 	 dd       Z		 	 	 	 	 	 	 ddZ
d ZddZdd	Zdd
Z	 	 	 	 	 	 ddZd Zd Zd Zd Z fdZd Zd Z xZS )Cliconf)commitdiscard_changesget_diffrun_commandssupports_sessionsc                 H    t        t        | 
  |i | i | _        d | _        y N)superr   __init___device_info_session_support)selfargskwargs	__class__s      b/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/arista/eos/plugins/cliconf/eos.pyr   zCliconf.__init__U   s'    gt%t6v6 $    c           	      N   | j                         }||d   vr#t        d|ddj                  |d               ddd}||vrt        d|z        d	||   z  }|r|d
k7  r|d|z  z  }|dj                  t        |            z  }|j	                         }| j                  |      S )Nformatz'format' value  is invalid. Valid values are ,zrunning-configzstartup-config)runningstartupz/fetching configuration from %s is not supportedzshow %s textz| %s  )get_option_values
ValueErrorjoinr   stripsend_command)r   sourceflagsr#   options_valueslookupcmds          r    
get_configzCliconf.get_configZ   s    //111388N8$<=? 
 .:JKAFJ  6&>)f&7V##Csxx''iik  %%r!   c                 4   | j                         }| j                  |||||       |du r| j                         st        d      i }d }| j                         rEt	               }|j                  d|i       | j                  d|z         |r#| j                  d       n| j                  d       g }g }	d}
t        |      D ]  }t        |t              sd|i}|d   }|dk(  r"|j                  d	      s|
rd
}
n	|dk(  r|
rd}
|
rd
|d<   |dk7  sN|j                  d      r`	 |j                   | j                  di |       |	j                  |        |	|d<   ||d<   | j                         rK| j                  d      }|r|j                         |d<   |r| j!                          n#| j                  |       n| j                  d       |j#                  d      r|d   S |S # t        $ r+}| j                  |       t        |j                        d }~ww xY w)NF9check mode is not supported without configuration sessionsessionconfigure session %srollback clean-config	configurecommandendbannerTEOFsendonly!requestresponsezshow session-configdiff )get_device_operationscheck_edit_config_capabilityr   r+   r   updater.   r   
isinstancer   
startswithappendr   r   messager-   r   getr   	candidater   replacecomment
operationsrespr7   resultsrequests	multilineliner3   eouts                  r    get_session_configzCliconf.get_session_configq   s%    //1
))	
 eOd&<&<&>K  !!#"nGKKG,-4w>?!!"9:k*	I& 	>DdG,!4(y/Ce|~~h'9 	)!	#'Z e|CNN3$7>NN#44#4#4#<t#<=OOC(%	>. #Y"Z!!###$9:C"yy{V$$W-e$88F<' 0 >((12199==>s   !2G##	H,&HHc                    | j                         }| j                  |||||       |du r| j                         st        d      i }d }| j                         rEt	               }|j                  d|i       | j                  d|z         |r#| j                  d       n| j                  d       g }g }	d}
t        |      D ]  }t        |t              sd|i}|d   }|dk(  r"|j                  d	      s|
rd
}
n	|dk(  r|
rd}
|
rd
|d<   |dk7  sN|j                  d      r`	 |j                   | j                  di |       |	j                  |        |	|d<   ||d<   | j                         rM| j                  d      }|r|j                         |d<   |r| j!                          |S | j                  |       |S | j                  d       |S # t        $ r+}| j                  |       t        |j                        d }~ww xY w)NFr6   r7   r8   r9   r:   r;   r<   r=   Tr>   r?   r@   rA   rB   zshow session-config diffsrC   rD   )rE   rF   r   r+   r   rG   r.   r   rH   r   rI   rJ   r   r   rK   r-   r   rM   s                  r    edit_configzCliconf.edit_config   s!    //1
))	
 eOd&<&<&>K  !!#"nGKKG,-4w>?!!"9:k*	I& 	>DdG,!4(y/Ce|~~h'9 	)!	#'Z e|CNN3$7>NN#44#4#4#<t#<=OOC(%	>. #Y"Z!!###$?@C"yy{V
  $$W-  e$# 0 >((12199==>s   !2G	H&G>>Hc	                 Z    |r| j                  |||      }| j                  ||||||      S )N)r;   promptanswerr?   newline	check_all)_get_command_with_outputr.   )	r   r;   r]   r^   r?   r_   outputr`   versions	            r    rL   zCliconf.get  sE     33GVWMG   ! 
 	
r!   c                 &    | j                  d       y )Nr   )r.   r   s    r    r   zCliconf.commit  s    (#r!   c                     dg}| j                         r|j                  d|z  dg       |D ]  }| j                  |        y )Nr<   r8   abort)r   extendr.   )r   r7   commandsr3   s       r    r   zCliconf.discard_changes   sI    7!!#OO3g=wGH 	#Cc"	#r!   c                    |t        d      t               }t        |      D ]  }t        |t              sd|i}|j                  dd       }|j                  dd       }|r| j                  |d   ||      |d<   	  | j                  di |}t        |d      }|y	 t        j                  |      }|j                  |        |S # t        $ r}|r t        |d|      }Y d }~Yd }~ww xY w# t         $ r |j                         }Y Vw xY w)	Nz'commands' value is requiredr;   rb   rc   errsurrogate_or_strict)errorsrD   )r+   listr   rH   r   popra   r.   r   getattrr   jsonloadsr-   rJ   )	r   ri   check_rc	responsesr3   rb   rc   rX   rW   s	            r    r   zCliconf.run_commands)  s    ;<<F	8$ 	&Cc7+ #&WWXt,Fggi.G!%!>!>	N"I+'d''.#.
 #&;<C&**S/C   %7	&8  , +a*+ " &))+C&s*   :CC-	C*C%%C*-D	D	c                 N    |st        d      d| | d}| j                  |      S )Nz)'file_name' value is required for restorezconfigure replace z best-effort)r+   r.   )r   filenamepathr3   s       r    restorezCliconf.restoreK  s4    HII"4&
,?  %%r!   c           	         i }| j                         }| j                         }	||d   rt        d      ||	d   vr#t        d|ddj                  |	d               ||	d   vr#t        d|ddj                  |	d               t	        d	
      }
|
j                  |       |r.|dk7  r)|dk7  r$t	        d	||      }|
j                  ||||      }n|
j                  }|rt        |d      nd|d<   |S )Nsupports_generate_diffz4candidate configuration is required to generate diff
diff_matchz'match' value z in invalid, valid values are z, diff_replacez'replace' value    )indentnoneconfig)r~   contentsignore_lines)rw   matchrO   ri    config_diff)	rE   r*   r+   r,   r	   load
differenceitemsr
   )r   rN   r&   r{   diff_ignore_linesrw   r|   rC   device_operationsoption_valuescandidate_objrunning_objconfigdiffobjss                r    r   zCliconf.get_diffQ  s8     668..0!23K!LF  ]<88tyy|)DEG 
 }^<<=+H!IK  &Q/9%zV+0H' .K
 +55 $	 6 N +00NCQeNJ?WY]r!   c                    | j                  d      sd| _        | j                  S | j                  r| j                  S 	 | j                  d       d| _        | j                  S # t        $ r d| _        Y | j                  S w xY w)Neos_use_sessionsFzshow configuration sessionsT)
get_optionr   rL   r   re   s    r    r   zCliconf.supports_sessions  s    12$)D! $$$ $$,,,.67(,% $$$ , .(-%$$$.s   A" "B ?B c                    | j                   si }d|d<   | j                  d      }t        j                  |      }|d   |d<   |d   |d<   | j                  d      }t        j                  |      }|d	   |d
<   	 | j                  d      }t	        j
                  d|t        j                        }|r|j                  d      |d<   || _         | j                   S # t        $ r | j                  j                  dd       Y :w xY w)Neos
network_oszshow version | jsonrc   network_os_version	modelNamenetwork_os_modelzshow hostname | jsonhostnamenetwork_os_hostnamez)bash timeout 5 cat /mnt/flash/boot-configz	SWI=(.+)$   network_os_imagevvvz5Unable to gather network_os_image without enable mode)r   rL   rq   rr   researchMgroupr   _connectionqueue_message)r   device_inforeplydatar   s        r    get_device_infozCliconf.get_device_info  s     K(-K%HH23E::e$D04YK,-.2;.?K*+HH34E::e$D15j1AK-.!LM		,rtt<6;kk!nK 23 !,D    ,   ..Ks   9AC %D ?D c                     dt        | j                               ddt        | j                               ddddt        | j                                t        | j                               dS )NTF)supports_diff_replacesupports_commitsupports_rollbacksupports_defaultssupports_onbox_diffsupports_commit_commentsupports_multiline_delimitersupports_diff_matchsupports_diff_ignore_linesrz   supports_replace)boolr   re   s    r    rE   zCliconf.get_device_operations  sh    %)#D$:$:$<=!&!&#'(>(>(@#A',,1#'*.*.t/E/E/G*H&H $T%;%;%= >
 	
r!   c                      ddgg dg dddgdS )Nr(   rq   )rV   strictexactr   )rV   blockr   )r#   r{   r|   rb   rD   re   s    r    r*   zCliconf.get_option_values  s"    v&=7v&	
 	
r!   c                     t         t        |          }| j                         |d<   |j	                  | j                                t        j                  |      S )Nr   )r   r   get_capabilitiesrE   rG   r*   rq   r
   )r   resultr   s     r    r   zCliconf.get_capabilities  sJ    w68&*&@&@&B"#d,,./zz&!!r!   c                 X    | j                   j                  r| j                  dd       yy)zT
        Make sure we are in the operational cli mode
        :return: None
        z(configrg   )config_contextexit_commandN)r   	connected_update_cli_prompt_contextre   s    r    set_cli_prompt_contextzCliconf.set_cli_prompt_context  s1    
 %%++($ ,  &r!   c           	          | j                         }||d   vr#t        d|ddj                  |d               |dk(  r|j                  d      sd|z  }n|}|dk7  rd|v r|d	|}|S )
Nrb   z'output' value r$   r%   rq   z| jsonz	%s | jsonlatestz	 version )r*   r+   r,   endswith)r   r;   rb   rc   r1   r3   s         r    ra   z Cliconf._get_command_with_output  s    //111388N8$<=? 
 VG$4$4X$>'CCh8s?%('2C
r!   )r&   Nr(   )NTNN)NNFTNFNr   )NT)Nr   )NNrV   NNrV   )__name__
__module____qualname__r   __rpc__r   r   r4   rY   r[   rL   r   r   r   rx   r   r   r   rE   r*   r   r   ra   __classcell__)r   s   @r    r   r   L   s    !! % G%
 & &,  I IV  G GX 
,$# D& 4l%!B

"	r!   r   )
__future__r   r   r   type__metaclass__DOCUMENTATIONrq   r   ansible.errorsr   ansible.module_utils._textr   /ansible.module_utils.common._collections_compatr   Pansible_collections.ansible.netcommon.plugins.module_utils.network.common.configr	   r
   Oansible_collections.ansible.netcommon.plugins.module_utils.network.common.utilsr   Gansible_collections.ansible.netcommon.plugins.plugin_utils.cliconf_baser   r   Cansible_collections.arista.eos.plugins.module_utils.network.eos.eosr   r   rD   r!   r    <module>r      sR   ( A @ @  	 3 . C d
 ]bk br!   