
    i9                        S SK r S SKrS SKrS SKrS SKJrJr  S SKJrJ	r	J
r
JrJr  S SKJr  S SKJrJr  \R$                  " S\R&                  \R(                  -  5      r/ / SSS4S jr/ / SS4S	 jr/ / SS4S
 jr/ / SS4S jr/ / SS4S jrSS jrSS jrSS jrS rS rS r / S4S jr!/ SS4S jr"/ SS4S jr#/ / SS4S jr$SS jr%SS jr&S r'S S jr(g)!    N)connect_servicehandle_truncated_response)
printDebug	printInfo
printErrorprintExceptionprompt_4_yes_no)	read_file)snake_to_camelsnake_to_wordsz.*?AWS::IAM.*?Fc	                 Z   [        U SU-  5      n	[        U5      n
UR                  S[        [        R                  " 5       5      S.5        [        X#XJU5      nU(       d  [        SU< SU< S35        U	" S
0 UD6nSU
-  nX;   a  X   OSnS	U;   a  US	   OSnU(       a  [        XX/5        U$ )i

:param callback:
:param name:
:param template_path:
:param template_parameters:
:param quiet:
:return:
z	create_%sOpinelTimestampKeyValuezCreating the  z..z%sIdNOperationId )getattrr   appendstrtimeprepare_cloudformation_paramsr   cloudformation_wait)
api_clientresource_typenametemplate_pathtemplate_parameterstagsquietwait_for_completionneed_on_failurecreateapi_resource_typeparamsresponseresource_id_attributeresource_idoperation_ids                   [/home/kali/Scout2/scout2-env/lib/python3.13/site-packages/opinel/services/cloudformation.py,create_cloudformation_resource_from_templater-      s     Z}!<=F&}5KK)C		4DEF*4@ShlmFM4@AH"%665J5V(1\`K.;x.G8M*TLJtJ    c                     [        U SXX4XVSS9	$ )

:param api_client:
:param stack_name:
:param template_path:
:param template_parameters:         List of parameter keys and values
:param quiet:
:return:
stackT)r$   r-   )r   
stack_namer   r    r!   r"   r#   s          r,   create_stackr4   )   s*     8
GZh{  DI  pt  u  ur.   c           
      n    U R                  US9n[        SSS9  [        XX#XV5      nU$ ! [         a  n	[	        U	S5      (       aW  [        U	R                  5      [        :X  a:  SU	R                  ;   a*  U	R                  S   S   S:X  a  [        XX#XEU5      n S	n	A	U$ S	n[        U	5         S	n	A	U$ S	n	A	ff = f)
r0   )	StackNamezStack already exists... FnewLiner(   ErrorCodeValidationErrorN)
describe_stacksr   update_stack	Exceptionhasattrtyper(   dictr4   r   )
r   r3   r   r    r!   r"   r#   r1   stack_ides
             r,   create_or_update_stackrD   6   s    	**z*B,>
\aw O  1j!!d1::&6$&>7YZYcYcCchihrhrszh{  }C  iD  HY  iY#JM`d  nA  BH O H1Os   &* 
B4A"B/B//B4c           
           [        U SXX4XV5      $ zu

:param api_client:
:param stack_set_name:
:param template_path:
:param template_parameters:
:param quiet:
:return:
	stack_setr2   )r   stack_set_namer   r    r!   r"   r#   s          r,   create_stack_setrI   N   s(     8
KQ_  qD  LQ  g  gr.   c           
      v   S=px U R                  US9n	[        SSS9  [        XX#XV5      nX4$ ! [         a  n
[	        U
S5      (       aX  [        U
R                  5      [        :X  a;  SU
R                  ;   a+  U
R                  S   S   S	:X  a  [        XX#XEU5      n Sn
A
X4$ [        U
5         Sn
A
X4$ Sn
A
ff = f)
r0   NStackSetNamezStack set already exists... Fr7   r(   r9   r:   StackSetNotFoundException)
describe_stack_setr   update_stack_setr>   r?   r@   r(   rA   rI   r   )r   rH   r   r    r!   r"   r#   r+   stack_set_idrG   rC   s              r,   create_or_update_stack_setrQ   [   s     #'&L111P	0EB'
Mhm  D ''  1j!!d1::&6$&>7ajjCX]^]g]gho]pqw]x  }X  ^X+Jlp  zM  NL '' 1''s   &. 
B8A"B3!B33B8c                     SSS.nU(       d?  [        S[        U5      [        U5      4-  5        [        SSR                  U5      -  5        U R	                  XX5S9nU(       d  [        SUS   -  5        US   $ )	zY

:param api_client:
:param stack_set_name:
:param account_ids:
:param regions:
:return:
d   )FailureTolerancePercentageMaxConcurrentPercentagez9Creating stack instances in %d regions and %d accounts...z %sz, )rL   AccountsRegionsOperationPreferencesz$Successfully started operation Id %sr   )r   lenr   joincreate_stack_instances)r   rH   account_idsregionsr"   operation_preferencesr(   s          r,   r[   r[   r   s     <?"%	 MQTU\Q]_bcn_oPppq5499W--.00nls0  aH88M;RRSM""r.   c                 h   [        SU-  5        [        U R                  SU0S/5      S   n/ n/ n[        U5      S:  ae  U H?  nUS   U;  a  UR	                  US   5        US   U;  d  M+  UR	                  US   5        MA     U R                  XUSS9S	   n[        XU5        U R                  US
9  g)z
    zDeleting stack set %srL   	Summariesr   AccountRegionF)rL   rV   rW   RetainStacksr   rK   N)r   r   list_stack_instancesrY   r   delete_stack_instanceswait_for_operationdelete_stack_set)r   rH   timeoutstack_instancesr\   r]   sir+   s           r,   rg   rg      s     &78/
0O0OR`bpQqt  tA  B  CN  OOKG
?a!B)}K/""2i=1(|7*r(|,	 "
 "88  {B  SX8  Y  Zg  h:|D~>r.   c                 D   [        SU SS9n/ nU H*  n SU-  nUR                  USS9  UR                  U5        M,     [	        U5      [	        U5      :w  a2  U(       d+  [        S[	        U5      -  5        [        [        U5      5        U$ ! [         a  n SnAM  SnAff = f)	a  
Verify which AWS accounts have been configured for CloudFormation stack set by attempting to assume the stack set execution role

:param credentials:                 AWS credentials to use when calling sts:assumerole
:param org_account_ids:             List of AWS accounts to check for Stackset configuration

:return:                            List of account IDs in which assuming the stackset execution role worked
stsT)silentz;arn:aws:iam::%s:role/AWSCloudFormationStackSetExecutionRolez"opinel-get_stackset_ready_accounts)RoleArnRoleSessionNameNzFOnly %d of these accounts have the necessary stack set execution role:)r   assume_roler   r>   rY   r   r   r   )credentialsr\   r"   r   configured_account_ids
account_idrole_arnrC   s           r,   get_stackset_ready_accountsru      s     !DAJ!
	TWaaH""8Ei"j"))*5	 " !"c+&66uZ]`aw]xxy3-./!!  		s   &B


BBc                     [        SU 5      $ )z!

:param template_path:
:return:

AWSRecipesmake_prefixed_stack_namer   s    r,   make_awsrecipes_stack_namer{      s     $L-@@r.   c                     [        SU 5      $ )z"

:param template_path:"
:return:
Opinelrx   rz   s    r,   make_opinel_stack_namer~      s     $Hm<<r.   c                     [         R                  R                  U5      R                  S5      n[	        U5      S:X  a  UOUSS nU < SSR                  U5      < 3R                  S5      S   $ )z'

:param prefix:
:param template_path:
-   N.r   )ospathbasenamesplitrY   rZ   )prefixr   partss      r,   ry   ry      s]     GG]+11#6EZ1_E%*Esxx/66s;A>>r.   c                    [        SU-  5        [        U5      n0 nXSU-  '   XgS'   [        U5      (       aG  / US'   [        U5      nU H1  n	[	        SU	-  5        US   R                  U	[        U5      S.5        M3     [        U5      (       a  XGS'   [        R                  U5      (       a  S/US	'   U(       a  S
US'   U$ )r0   z'Reading CloudFormation template from %sz%sNameTemplateBody
Parametersz
Param:: %s)ParameterKeyParameterValueTagsCAPABILITY_NAMED_IAMCapabilitiesROLLBACK	OnFailure)	r   r
   rY   iterr   r   nextre_iam_capabilitymatch)
r3   r   r    r   r!   r$   template_bodyr'   itparams
             r,   r   r      s     8=HIm,MF'18m#$*>
!|%&E|e+,< ''QUVXQY(Z[  4yyv}--	"!~({Mr.   c           
          [        U SXX4US9  g)r0   r1   )r"   r#   N,update_cloudformation_resource_from_template)r   r3   r   r    r"   r#   s         r,   r=   r=      s     1Wjat  \o  pr.   c           
      "    [        U SXU/ XE5      $ rF   r   )r   rH   r   r    r"   r#   s         r,   rO   rO      s/     8
KQ_  qD  FH  JO  e  er.   c                 p    [        U SU-  5      n[        U5      n	UR                  S[        [        R                  " 5       5      S.5        [        X#XIU5      n
U(       d  [        SU-  SS9  U" S0 U
D6nUS:X  a  US   OS	nU(       a  [        XX,5        g	g	! [         a  nW	S
:X  an  [        US5      (       a]  [        UR                  [        :H  5      (       a<  UR                  S   S   S:X  a&  UR                  S   S   S:X  a  [        S5         S	nAg	[        U5        [        S5         S	nAg	S	nAff = f)r   z	update_%sr   r   zUpdating the %s...Fr7   rG   r   NStackr(   r9   r:   r;   MessagezNo updates are to be performed.z Already up to date.z Failed.r   )r   r   r   r   r   r   r   r   r>   r?   r@   r(   rA   r   r   )r   r   r   r   r    r!   r"   r#   updater&   r'   r(   r+   rC   s                 r,   r   r   
  sQ   #[=%@A*=9-DIIK8HIJ.tDWlpq*]:EJ#F#2?;2Nx.TX
4N   #'GAz,B,BtAJJZ^L^G_G_dedndnovdwx~d  DU  eU  Z[  Zd  Zd  el  Zm  nw  Zx  |]  Z],--1z""#s   BB 
D5!A/D0D00D5c                     [        SU< SU< S35        SnSn XS:  a  [        S5        OIU R                  XS9nUS   S	   nUS
;  a  O+[        SXd4-  5        [        R                  " U5        XT-  nMZ  SU< SU< 3$ )NzWaiting for operation z on stack set z...r    
Timed out.)rL   r   StackSetOperationStatus)RUNNINGSTOPPINGzBOperation status is '%s'... waiting %d seconds until next check...z
Operation z is )r   r   describe_stack_set_operationr   sleep)r   rH   r+   rh   	incrementtimerstatusinfos           r,   rf   rf   )  s    n]^EF
|$66n6q)*8400Y]c\oop

9  $088r.   c                     [        SU-  5        Sn XB:  a  [        S5        g [        S5        [        R                  " U5        XC-  nU R	                  US9nUS   S   S:X  a  g MT  )	Nz'Waiting for stack set %s to be ready...r   r   z"Checking the stack set's status...rK   StackSetr   ACTIVE)r   r   r   r   rN   )r   rH   rh   r   r   r   s         r,   wait_for_stack_setr   ;  ss    8>IJE
|$89

9,,N,K
H%1 r.   c                     SnU " S0 UD6nUS:X  a<  US   S   S   nUR                  S5      (       d  UR                  S5      (       a  SnX54$ US	:X  a  US
   S   nUS:X  a  SnX54$ US:X  a  US   S   nUS:w  a  SnUW4$ )NTr1   Stacksr   StackStatus	_COMPLETE_FAILEDFrG   r   r   r   	operationr   r   r   )endswith)callbackr'   r   rcr(   r   s         r,   still_runningr   J  s    	B!&!H(#A&}5??;''6??9+E+EB < 
+	%*%h/XB
 <	 
+	%-.x8YB<r.   c                 t   US:X  a  U R                   nSU0nO@US:X  a+  SU0nU(       a  U R                  nX7S'   SnOU R                  nO[        SU-  5        g Sn X:  a  [        S	5        g [	        XgU5      u  pU	S
:X  a  [        SU
-  5        g [        SX4-  5        X-  n[        R                  " U5        M_  )Nr1   r6   rG   rL   r   r   zUnknown resource type: %sr   r   Fz
Status: %sz4Status: %s... waiting %d seconds until next check...)r<   r   rN   r   r   r   r   r   )r   r   resource_namer+   rh   r   r   r'   r   r   r   s              r,   r   r   \  s    --}-	+	% -0!>>H$0=!'M!44H.>?E
|$"8]C
;lV+,HFK^^_

9 r.   )F),  )T)r      )<   r   )Nr   r   ))jsonr   rer   opinel.utils.awsr   r   opinel.utils.consoler   r   r   r   r	   opinel.utils.fsr
   opinel.utils.globalsr   r   compileDOTALL	MULTILINEr   r-   r4   rD   rI   rQ   r[   rg   ru   r{   r~   ry   r   r=   rO   r   rf   r   r   r   r   r.   r,   <module>r      sY    	 	  G c c % ?JJ/R\\1IJ uw  A  IN  fk  }B 4 MOUW_d  }B 
u WY_ain  GL 0 UW]_gl  EJ 
g _agiqv  OT (.#*?&"2A=? giz @ OQZ_w| 
p UW^c  |A 
e vx  A  IN  fk #>9$$r.   