
    Vhm                       d dl mZ d dlZd dlZd dlZej
                  dk  r2 eddj                  ej                  j                               z        d Z
 e
        d Z e        d dlmZ d d	lmZ  ed
      Ze ed      k  r edez        d dlZd dlZd dlZd dlZd dlmZmZ d dlmZ 	 d dlmZ d dlmZ  e       Zd dlm$Z$ d dl%m&Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z; d dl<m=Z=m>Z> d dl?m@Z@ d d lAmBZB d d!lCmDZD d d"lEmFZF d d#lGmHZH d d$lImJZJ 	 d dlKZKd%ZL G d' d(e      ZNy# e$ r3Z  e!de z  ejD                          ejF                  d       Y dZ [ dZ [ ww xY w# eM$ r d&ZLY Pw xY w))    )annotationsN)      zSERROR: Ansible requires Python 3.11 or newer on the controller. Current version: %s c                 n   g } t         j                  t         j                  t         j                  fD ]L  }	 |j	                         }t        j                  |      r*| j                  t        |dd      xs d|z         N | r$t        ddj                  d | D              z        y# t
        $ r Y w xY w)zBCheck stdin/stdout/stderr to make sure they are using blocking IO.nameNz#%szbERROR: Ansible requires blocking IO on stdin/stdout/stderr. Non-blocking file handles detected: %sz, c              3      K   | ]  }|  y wN ).0_ios     D/home/dcms/DCMS/lib/python3.12/site-packages/ansible/cli/__init__.py	<genexpr>z$check_blocking_io.<locals>.<genexpr>%   s     MeVYcMes   )sysstdinstdoutstderrfileno	Exceptionosget_blockingappendgetattr
SystemExitjoin)handleshandlefds      r   check_blocking_ior      s    G99cjj#**5 H	B r"NN76648FEBJGH  BDHIIMe]dMeDef g 	g   		s   B((	B43B4c                    	 t        j                  t         j                  d       t        j                         \  } }|r|j                         dvrt        d|z        t        j                         }|j                         dk7  rt        d|z        y# t         j                  t
        f$ r}t        d|z        d}~ww xY w)zmSet the locale to the users default setting and ensure
    the locale and filesystem encoding are UTF-8.
    r   z<ERROR: Ansible could not initialize the preferred locale: %sN)utf-8utf8zEERROR: Ansible requires the locale encoding to be UTF-8; Detected %s.r!   zIERROR: Ansible requires the filesystem encoding to be UTF-8; Detected %s.)
locale	setlocaleLC_ALL	getlocaleError
ValueErrorr   lowerr   getfilesystemencoding)dummyencodingefs_encs       r   initialize_localer/   +   s    
+ **,x x~~'/@@`ckkll&&(F||~ dgmmnn ! LL*% 
JQN
 	

s   ;B C.B<<C)version)LooseVersionjinja2z3.0zRERROR: Ansible requires Jinja2 3.0 or newer on the controller. Current version: %s)ABCabstractmethod)Path)	constants)Displayz	ERROR: %s)file   )context)option_helpers)AnsibleErrorAnsibleOptionsErrorAnsibleParserError)InventoryManager)string_types)to_bytesto_text)is_sequence)is_executable)
DataLoader)PromptVaultSecretget_file_vault_secret)add_all_plugin_dirsinit_plugin_loader)__version__)AnsibleCollectionConfig)_get_collection_name_from_path)unfrackpath)to_unsafe_text)VariableManagerTFc                  j   e Zd ZdZej
                  j                  d      ZdZdZ	ddZ
ed        Zed        Ze	 	 dd	       Ze	 	 	 dd
       Zed        Zed        ZddZedd       Zed        Zd Zedd       Zed        Zed        Zed        Zedd       Zed        Zedd       Zy)CLIz# code behind bin/ansible* programs PAGERFRSXFNc                    |st        d      || _        d| _        || _        t        j
                  r,t        j                  d      rt        j                  d       yyy)z@
        Base init method for all command line programs
        z%A non-empty list for args is requiredNdev0zYou are running the development version of Ansible. You should only run Ansible from "devel" if you are modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and can become unstable at any point.)
r(   argsparsercallbackCDEVEL_WARNINGrJ   endswithdisplaywarning)selfrV   rX   s      r   __init__zCLI.__init__   sU    
 DEE	 ??{33F;OOP  <?    c                   | j                          t        j                  j                  d      xs g }t	        |      s|g}t        |       t        j                  t        t        j                  | j                  j                                     t        j                  r0t        j                  dt        t        j                        z         nt        j                  d       t        j                   t               y)zRun the ansible command

        Subclasses must implement this method.  It does the actual work of
        running an Ansible command.
        collections_pathzUsing %s as config filez$No config file found; using defaultsN)parser:   CLIARGSgetrC   rI   r\   vvrB   opt_helpr0   rW   progrY   CONFIG_FILEvhandle_config_noise)r^   cli_collections_paths     r   runzCLI.run   s     	

  '223EFL"/0$8#9 /0

78++DKK,<,<=>?==II071==3IIJII=>	g&r`   c                P    d| vrd | fS | j                  dd      }t        |      }|S )N@   )splittuple)vault_idpartsrets      r   split_vault_idzCLI.split_vault_id   s5     h(##sA&El
r`   c                    |xs g }| xs g } |D ](  }t         j                  d|}| j                  |       * |s| s(|r&t         j                  dd}| j                  |       | S )Nro   prompt_ask_vault_pass)rY   DEFAULT_VAULT_IDENTITYr   )	vault_idsvault_password_filesask_vault_passauto_promptpassword_fileid_slugs         r   build_vault_idszCLI.build_vault_ids   sw      49rO	 2 	&M"#":":MJG
 W%	& )"#":":<TUGW%r`   c           
     H   g }i }|xs g }t         j                  r|j                  t         j                         |rddg|d<   ddg|d<   ndg|d<   dg|d<   t        j	                  ||||	      }d x}}	|D ]  }
t        j                  |
      \  }}|d
v r\|xs t         j                  }t        ||   |      }	 |j                          d}	|j                  ||f       | j                  |       {t        j                  d|z         	 t        |||       }	 |j                          d}	|r|j                  ||f       n!|j                  t         j                  |f       | j                  |        |r|	s||S # t        $ r!}t        j                  d|d|        d }~ww xY w# t        $ r1}t        j                  d|dt        |             |}Y d }~id }~ww xY w# t        $ r1}t        j                  d|dt        |             |}Y d }~d }~ww xY w)Nz#New vault password (%(vault_id)s): z+Confirm new vault password (%(vault_id)s): promptzNew Vault password: zConfirm New Vault password: rx   zVault password (%(vault_id)s): zVault password: )r}   )r   rx   )prompt_formatsrs   z Error in vault password prompt (): TzReading vault password file: %s)filenamers   loaderz#Error getting vault password file (z&Error in vault password file loading ()rY   DEFAULT_VAULT_PASSWORD_FILEr   rQ   r   rv   ry   rF   loadr<   r\   r]   set_vault_secretsvvvvvrG   rB   )r   rz   r{   r|   create_new_passwordr}   vault_secretsr   last_exceptionfound_vault_secretvault_id_slugvault_id_namevault_id_valuebuilt_vault_idprompted_vault_secretexcfile_vault_secrets                    r   setup_vault_secretszCLI.setup_vault_secrets   su   
 
 
  49r(( ''(E(EF(M(U(WN8$ 8N7U7WN23 )J'JN8$7I6JN23''	(<(64? ( A	
 /32+& 9	4M,/,>,>},M)M>!DD "/!J!2J2J ):XfIgCQ)S%
)..0
 &*"$$n6K%LM ((7 MM;nLM$9>CPAG%I!!&&( "&$$m5F%GH$$a&>&>@Q%RS $$]3s9	4z "4  [ $ OOQ^`c$de&   P]_fgj_k lm!$   S`bijmbn op!$sH   :E=
F*G'=	F'F""F'*	G$3&GG$'	H!0&HH!c                L    t        j                   |       }|rt        |      }|S )N)r   )getpassrN   )r   secrets     r   _get_secretzCLI._get_secret6  s$     /#F+Fr`   c                    t         j                  } d}d}d}t        j                  rdn| d   j	                         }	 d|z  }| d   rt
        j                  d      }d|z  }n| d	   rt
        j                  | d	         }| d
   r"t
        j                  |      }| d   r%|dk(  r |}n| d   rt
        j                  | d         }||fS # t        $ r Y ||fS w xY w)z6 prompt for connection and become passwords if needed Nr   BECOMEbecome_methodz%s password: ask_passzSSH password: z'%s password[defaults to SSH password]: connection_password_filebecome_ask_passbecome_password_file)	r:   rd   rY   AGNOSTIC_BECOME_PROMPTupperrQ   r   get_password_from_fileEOFError)opsshpass
becomepassbecome_promptbecome_prompt_methods        r   ask_passwordszCLI.ask_passwords>  s     __
+,+C+CxOI\IbIbId	+.BBM*~//*:; IL` `./44R8R5ST#$ __];
j>jB&6!(J*+ 77;Q8RS

 $$  	$$	s   BC 	CCc                ^    |r*|j                   dk  r| j                  j                  d       |S )z check for conflicting options rp   z.The number of processes (--forks) must be >= 1)forksrW   error)r^   r   
runas_opts	fork_optss       r   validate_conflictszCLI.validate_conflicts]  s*     xx!|!!"RS	r`   c                T    t        j                  | j                  |||      | _        y)a_  
        Create an options parser for most ansible scripts

        Subclasses need to implement this method.  They will usually call the base class's
        init_parser to create a basic version and then add their own options on top of that.

        An implementation will look something like this::

            def init_parser(self):
                super(MyCLI, self).init_parser(usage="My Ansible CLI", inventory_opts=True)
                ansible.arguments.option_helpers.add_runas_options(self.parser)
                self.parser.add_option('--my-option', dest='my_option', action='store')
        )usagedescepilogN)rg   create_base_parserr   rW   )r^   r   r   r   s       r   init_parserzCLI.init_parserf  s!     11$))5t\bcr`   c                   t        |d      r|j                  sdg|_        t        |d      rl|j                  r`t               }|j                  D ]7  }|j                  d      D ]!  }|j	                  |j                                # 9 t        |      |_        t        |d      rl|j                  r`t               }|j                  D ]7  }|j                  d      D ]!  }|j	                  |j                                # 9 t        |      |_        t        |d      rH|j                  dv r:t        |d      r.|j                  D cg c]  }|j                  d       c}|_	        t        |d	      r| j                  s|j                  r^t        |j                  t              r|j                  g|_        |j                  D cg c]  }d|vrt        |d
      n| c}|_        |S t         j"                  |_        |S c c}w c c}w )a
  Process the command line args

        Subclasses need to implement this method.  This method validates and transforms the command
        line arguments.  It can be used to check whether conflicting values were given, whether filenames
        exist, etc.

        An implementation will look something like this::

            def post_process_args(self, options):
                options = super(MyCLI, self).post_process_args(options)
                if options.addition and options.subtraction:
                    raise AnsibleOptionsError('Only one of --addition and --subtraction can be specified')
                if isinstance(options.listofhosts, string_types):
                    options.listofhosts = string_types.split(',')
                return options
        tagsall,	skip_tagsaction)installdownloadrV   /	inventoryF)follow)hasattrr   setrq   addstriplistr   r   rV   rstripSKIP_INVENTORY_DEFAULTSr   
isinstancer@   rM   rY   DEFAULT_HOST_LIST)r^   optionsr   tag_settagr   pathopts           r   post_process_argszCLI.post_process_argsw  s   ( 7F#GLL
 "7GL7F#5D"<< *"==. *CHHSYY[)**  :GL 7K(W->->I",, /"==. /CMM#))+.// !%YG 7H%'..<S*SX_`gioXp9@FDKK,FGL 7K(1M1M   g//>)0):):(;G% krj{j{$|cfsRU~[U%C[^%^$|!  %&$7$7!! G %}s   G>Hc                   | j                          t        rt        j                  | j                         	 | j                  j                  | j                  dd       }| j                  |      }t        j                  |       y# t        $ rM}|j                  dk7  r8| j                  j                  dd| j                  j                         z          d}~ww xY w)a  Parse the command line args

        This method parses the command line arguments.  It uses the parser
        stored in the self.parser attribute and saves the args and options in
        context.CLIARGS.

        Subclasses need to implement two helper methods, init_parser() and post_process_args() which
        are called from this function before and after parsing the arguments.
        rp   Nr      z 
%s)statusmessage)r   HAS_ARGCOMPLETEargcompleteautocompleterW   
parse_argsrV   r   codeexitformat_helpr   r:   _init_global_context)r^   r   exs      r   rc   z	CLI.parse  s     	$$T[[1	kk,,TYYqr];G
 ((1$$W-  	ww!|  7T[[=T=T=V3V W	s   (B 	CACCc                   | rt        j                         }nt        }|j                         d   }|j                  d      }t	        t        |            D ]!  }||   dk(  rd||<   	 t        ||         ||<   # t        |      dk  r+t	        t        |      d      D ]  }|j                  d        |j                         ||d   |d   |d   dS # t        $ r Y w xY w)z" return full ansible version info r   .r   r   rp   r   )stringfullmajorminorrevision)
rg   r0   rJ   rq   rangelenintr   r   r   )gitinfoansible_version_stringansible_versionansible_versionscounters        r   version_infozCLI.version_info  s    %-%5%5%7"%0"0668;*005S!123 	G(B.,- ),/0@0I,J )		  1$ %5!6: + ''*+0668')!,)!,,Q/	1 	1  s   'C	CCc                   t         j                  j                         st        j                  | d       yt        j
                  rAt         j                  dk(  rt        j                  | d       yt        j                  |        yt        j                  ddt        j                  t        j                        }|j                          |j                  dk(  rt        j                  | d       yt        j                  | d       y)	z% find reasonable way to display text T)screen_onlywin32zless --version)shellr   r   r   lessN)r   r   isattyr\   rQ   rR   platform
pager_pipe
subprocessPopenPIPEcommunicate
returncode)textps     r   pagerz	CLI.pager  s     zz  "OODdO3YY||w&$7t$  !1joo^h^m^mnAMMO||q tV,$7r`   c                Z   dt         j                  v r!t         j                  t        j                  d<   	 t        j                  t         j                  dt
        j                  t        j                        }|j                  t        |              y# t        $ r Y yt        $ r Y yw xY w)z pipe text through a pager r   LESST)r   r   r   )inputN)rQ   rR   	LESS_OPTSr   environr   r   r   r   r   r   rA   IOErrorKeyboardInterrupt)r   cmds     r   r   zCLI.pager_pipe  s{     SYY!$BJJv	""399D
X[XbXbcCOO(4.O1 	  		s   AB 	B*B*)B*c                 n   t         j                  } t               }| j                  dd      }|rc|j	                  |       t        |       |t        _        t        |      }|r/t        j                  dj                  |             |t        _        t        | d         }t        j                  }||z   }t         j#                  ||t        | d         | d   d      }|j%                  |       t'        || d   | j                  d	       
      }t)        ||t         j+                  d            }|||fS )NbasedirFz#running with default collection {0}rz   r{   r|   )rz   r{   r|   r}   r   flush_cache)r   sourcescache)r   )r   r   r   )r:   rd   rE   re   set_basedirrH   rK   playbook_pathsrL   r\   r]   formatdefault_collectionr   rY   DEFAULT_VAULT_IDENTITY_LISTrQ   r   r   r?   rO   r   )	r   r   r  r  rz   default_vault_idsr   r   variable_managers	            r   _play_prereqszCLI._play_prereqs  s6    // ++i/w'(5<#2!?!H! F M MN` ab=O':-.	99%	1	//:CEI'RhJiEj?FGW?X<A	 0 C
 	  / %FGK<P]d]h]hiv]wYwy	 +&I\_\l\luz\l\{|y"222r`   c                   d}t        | j                               dk(  r9t        j                  r'|t        j                  vrt
        j                  d       d}| j                  |       | j                  |      }|s|du rt        d      |S )NFr   zpprovided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'TzSSpecified inventory, host pattern and/or --limit leaves us with no hosts to target.)	r   
list_hostsrY   LOCALHOST_WARNING	LOCALHOSTr\   r]   subsetr<   )r   r  patternno_hostshostss        r   get_host_listzCLI.get_host_list/  s     y##%&!+""wakk'A  !S  TH $$W-U*tuur`   c                   t        |       }d }|dk(  r*t        j                  j                  j	                         }nt
        j                  j                  |      st        d| z        t        |      rt        j                  dt        |       z         |g}	 t        j                  |t        j                  t        j                        }|j#                         \  }}|j$                  dk7  rt        d	| d
|j$                  d|      |}n;	 t'        |d      }|j	                         j)                         }|j+                          |j)                  d      }|st        d| z        t/        |      S # t         $ r}t        d| d|d      d }~ww xY w# t         t,        f$ r}t        d| d|      d }~ww xY w)N   -z"The password file %s was not foundz!The password file %s is a script.)r   r   z8Problem occurred when trying to run the password script z (zD). If this is not a script, remove the executable bit from the file.r   zThe password script z returned an error (rc=r   rbzCould not read password file z: s   
z*Empty password was provided from file (%s))rA   r   r   bufferreadr   r   existsr<   rD   r\   vvvvrB   r   r   r   OSErrorr   r   openr   closer  rN   )	pwd_file
b_pwd_filer   r  r   r-   r   r   fs	            r   r   zCLI.get_password_from_fileA  s    h'
YY%%**,F
+ChNOO:&LL=@QQR,Cy$$SY
 ]]_NFF||q "]eghgsgsu{#|}}FZT*)	 g&KhVWWf%%-  y"ksuv$x y yy W% Z"HVW#XYYZs0   4E8 :F 8	FFFG *F;;G c           
     <   |t         j                  }	 t        j                  d       t	        t
        j                        j                         }	 |j                  d       t        j                  d|z         	 |D cg c]  }t        |d	       }} | |      }|j                         }t        jD                  |       y # t        $ rM}|j                  t        j                  k7  r&t        j                  d|dt        |d             Y d }~d }~ww xY wc c}w # t        $ rM t        j!                  d
       t        j                  dt        t#        j$                               z         d}Y w xY w# t&        $ rG}j(                  j+                          t        j!                  t        |      d       d}Y d }~d }~wt,        $ r-}t        j!                  t        |      d       d}Y d }~Ld }~wt.        $ r-}t        j!                  t        |      d       d}Y d }~d }~wt0        $ r t        j!                  d       d}Y t2        $ r>}t
        j4                  r t7        t8        j:                        }t        j!                  dt        |      z  d       |r|rt8        j:                  d   dkD  r~d}	t=        |d      rt        j?                  dt        tA        |jB                              z         t        |jB                        }
t        |      |
k7  r0t        j?                  d|
z         nt        j                  d       d}	t        j                  dt        t#        j$                               z  |	       d}Y d }~d }~ww xY w)Nzstarting runi  )modezCreated the '%s' directoryz Failed to create the directory 'z': surrogate_or_replace)errorssurrogate_or_strictzaCommand line args are not in utf-8, unable to continue.  Ansible currently only understands utf-8zThe full traceback was:

%s   F)	wrap_textr9      rp   zUser interrupted executionc   z0Unexpected Exception, this is probably a bug: %s	verbosityr   orig_excz
exception type: %sz
original msg: %sz#to see the full traceback, use -vvvTzthe full traceback was:

%s)log_only   )#r   argvr\   debugr5   rY   ANSIBLE_HOME
expandusermkdirr$  errnoEEXISTr]   rB   rm   UnicodeErrorr   	traceback
format_excr=   rW   
print_helpr>   r<   r  r   DEFAULT_DEBUGboolr:   rd   r   vvvtyper4  r   )clsrV   ansible_dirr   acli	exit_coder-   have_cli_optionsr5  whys              r   cli_executorzCLI.cli_executork  s   <88D>	MM.)q~~.99;KJ!!u!- :[HI&JNOQ*?@OO $iGGI	T 	u  99,OOEPRYZ]f|R}~ P   B  C @79K_K_KaCb bc	 # 	JJ!!#MM'!*M6I! 	MM'!*M6I  	MM'!*M6I  	MM67I 	 #GOO4MMLwWXzYejMk#'7GOOK<X[\<\ 1j)KK 6ajjAQ9R RS!!**-CqzS($83$>? EFOO<wyG[G[G]?^^iqOrI%	s   <E; C #E; <D"  DD" E; 	DADE; DE; D" "AE85E; 7E88E; ;	N<GN"G::N"H..#N	ND3NNr
   )NNT)NNFT)FF)r   NN)F)r   )__name__
__module____qualname____doc__rY   configget_config_valuerR   r  r   r_   r4   rm   staticmethodrv   r   r   r   r   r   r   r   rc   r   r   r   r  r  r   classmethodrM  r   r`   r   rQ   rQ   v   sz   -HH%%g.E I#& ' '0   8<9= 0 DHEJ(,c cJ   % %< d d  : :x.0 1 12 8 8$ 
 
 &3 &3P  " '& '&R D Dr`   rQ   )O
__future__r   r#   r   r   r   r   r   r0   
splitlinesr   r/   importlib.metadata#ansible.module_utils.compat.versionr1   jinja2_versionr<  r   r   r?  abcr3   r4   pathlibr5   ansibler6   rY   ansible.utils.displayr7   r\   r   r-   printr   r   r:   ansible.cli.argumentsr;   rg   ansible.errorsr<   r=   r>   ansible.inventory.managerr?   ansible.module_utils.sixr@   +ansible.module_utils.common.text.convertersrA   rB   'ansible.module_utils.common.collectionsrC    ansible.module_utils.common.filerD   ansible.parsing.dataloaderrE   ansible.parsing.vaultrF   rG   ansible.plugins.loaderrH   rI   ansible.releaserJ   ansible.utils.collection_loaderrK   2ansible.utils.collection_loader._collection_finderrL   ansible.utils.pathrM   ansible.utils.unsafe_proxyrN   ansible.vars.managerrO   r   r   ImportErrorrQ   r   r`   r   <module>rq     sl   #  	 
 g
	 "(>(>(@ A	B g&  o(   ' < "L''
	 .	/ 
     # &-iG
  < P P 6 1 I ? : 1 J J ' C ] * 5 0O
z# z;  	+/

+CHHQKK2  Os*   1E 5F E?)E::E?FF