
    x[h9                     H   S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJrJr  \ R"                  " \5      r\R(                  r\R*                  r\R,                  rSrS	S
/rSS/rS/rS	rSrSr/ SQrSrS/r S r!S r"SS jr# " S S5      r$S r%\4S jr&g)    N)MIMEBase)MIMEMultipart)MIMENonMultipart)MIMEText)featureshandlersutil)UrlErrorread_file_or_urlzContent-Typez
text/plainztext/x-not-multipartztext/x-include-urlztext/x-include-once-urlztext/cloud-config-archiveztext/cloud-configzapplication/octet-stream)zapplication/gzipzapplication/gzip-compressedzapplication/gzippedzapplication/x-compresszapplication/x-compressedzapplication/x-gunzipzapplication/x-gzipzapplication/x-gzip-compressedzNumber-Attachmentsc                     X	 X U'   g N )msgkeyvalues      5/usr/lib/python3/dist-packages/cloudinit/user_data.py_replace_headerr   ;   s    H    c                 >    U S	 U R                  SS[        U5      S9  g )NzContent-Disposition
attachment)filename)
add_headerstr)r   r   s     r   _set_filenamer   @   s"    !"NN(,XNOr   c                 p    [         R                  (       a  [        U 5      Ue[        R	                  U 5        g r   )r   ERROR_ON_USER_DATA_FAILURERuntimeErrorLOGwarning)error_messagesource_exceptions     r   _handle_errorr"   E   s%    **=)/??M"r   c                   T    \ rS rSrS rS rS rS rS rS r	S r
S	 rSS jrS rSrg
)UserDataProcessorL   c                 F    Xl         [        R                  " U5      U l        g r   )pathsr	   fetch_ssl_detailsssl_details)selfr'   s     r   __init__UserDataProcessor.__init__M   s    
11%8r   c                     [        5       n[        U[        5      (       a&  U H  nU R                  [	        U5      U5        M      U$ U R                  [	        U5      U5        U$ r   )r   
isinstancelist_process_msgconvert_string)r*   blobaccumulating_msgbs       r   processUserDataProcessor.processQ   s]    (?dD!!!!."35EF    nT24DEr   c           
         S nUR                  5        GH  n[        U5      (       a  M  S nUR                  5       n[        R                  " U5      nSnU[
        ;   a   [        R                  " USS9nS nSnU(       d  [        nU[        S/-   ;   a  U" U5      nUc  UnU(       a  UR                  SS5      u  p[        X5      nUR                  U5        UR!                  5       (       a  [#        XR!                  5       5        S	 H!  nX;   d  M
  [%        X['        XN   5      5        M#     UnXV:w  a  [%        U[(        U5        U[*        ;   a  U R-                  Xr5        GMN  U[.        ;   a  U R1                  Xr5        GMl  [%        U[(        U5        U R3                  X$5        GM     g ! [        R                   a3  n	SR                  U[        U5      U	5      n
[        X5         S n	A	GM  S n	A	ff = f)
Nc                 .    [         R                  " U 5      $ r   )r   type_from_starts_with)payloads    r   
find_ctype2UserDataProcessor._process_msg.<locals>.find_ctype[   s    11'::r   F)quietTz<Failed decompressing payload from {} of length {} due to: {}ztext/x-shellscript/   )Launch-Index)walkis_skippableget_content_typer	   fully_decoded_payloadDECOMP_TYPESdecomp_gzipDecompressionErrorformatlenr"   
UNDEF_TYPETYPE_NEEDEDsplitr   set_payloadget_filenamer   r   r   CONTENT_TYPEINCLUDE_TYPES_do_includeARCHIVE_TYPES_explode_archive_attach_part)r*   base_msg
append_msgr;   partctype
ctype_origr:   was_compresseder    maintypesubtypen_parths                  r   r0   UserDataProcessor._process_msgZ   s   	; MMODD!!E..0J006G"N
 \)"..weDG "&J%)N '
 [,@+AAA"7+}" $)KKQ$7!)(<""7+ $$&&!&*;*;*=>*Ay'3tw<@ + "lE:%  5%%%g: HlE:j/U $& .. 006&Ga1 " "-3s   F((G/<'G**G/c                    UR                  SS 5      nS nUR                  5       [        ;   a<   [        R                  " UR                  SS95      nU(       a  UR                  S5      nUb  UnUc  UnUb&   UR                  S[        [        U5      5      5        g g ! [         a     N@f = f! [        [        4 a     g f = f)Nr@   Tdecodelaunch-index)getrC   EXAMINE_FOR_LAUNCH_INDEXr	   	load_yamlget_payload	Exceptionr   r   int
ValueError	TypeError)r*   r   
header_idxpayload_idxr:   s        r   _attach_launch_index&UserDataProcessor._attach_launch_index   s    WW^T2
!%== ..)EF")++n"=K !$K$K"~s3{3C/DE #   	* s#   ;B 7$B- 
B*)B*-C ?C c                     [         R                  " USS5      n[        R                  R	                  U R
                  R                  S5      SU5      $ )Nmd5@   dataurlcache)r	   	hash_blobospathjoinr'   get_ipath_cur)r*   entryentry_fns      r   _get_include_once_filename,UserDataProcessor._get_include_once_filename   s?    >>%3ww||JJ$$V,j(
 	
r   c                 v    UR                  5       (       d  [        U[        U-  5        U R                  U5        g r   )rN   r   PART_FN_TPLro   )r*   r   attached_ids      r   _process_before_attach(UserDataProcessor._process_before_attach   s.    !!#{k:;!!#&r   c                    SnUR                  5        GH  nUR                  5       nUR                  S5      (       a  U[        S5      S  R	                  5       nSnO4UR                  S5      (       a  U[        S5      S  R	                  5       nSnUR                  S5      (       a  M  UR                  5       nU(       d  M  S nS nU(       a  U R                  U5      nU(       a;  [        R                  R                  U5      (       a  [        R                  " U5      nO [        USSU R                  S9nU(       a4  UR                  5       (       a  [        R                  " XxR                   S	S
9  UR                  5       (       a  UR                   nO'SR#                  XhR$                  5      n	['        U	5         Uc  GM  [/        U5      nU R1                  X5        GM     g ! [(         a9  n
[+        U
5      nXk;  a  USR#                  U5      -  n['        X5         S n
A
NfS n
A
f[,         a&  nSR#                  Xl5      n	['        X5         S nANS nAff = f)NFz#include-onceTz#include#   
   )timeoutretriesr)   i  )modez6Fetching from {} resulted in a invalid http code of {}z for url: {0}zFetching from {} resulted in {})
splitlineslower
startswithrI   lstripstripr}   rw   rx   isfiler	   load_text_filer   r)   ok
write_filecontentsrH   coder"   r
   r   IOErrorr1   r0   )r*   contentrV   include_once_onlinelc_lineinclude_urlinclude_once_fnrespr    urlemessageioenew_msgs                 r   rQ   UserDataProcessor._do_include   s     &&(DjjlG!!/22C023::< #'##J//C
O-.557 #(s##**,K"OG"&"A"A+"N277>>/#B#B--o> 6+# ! "$($4$4	D '47799+]] wwyy"&--99? +YY: & &m4 "(1!!'6} )^   1!$iG #1?#9#9+#FF!'00 6$E$L$L#%M "-55	6s+    A2G"&G""
I,/H  I-IIc                    [         R                  " U/ [        [        4S9nU GH  n[	        U[
        5      (       a  SU0n[	        U[        5      (       d  M4  UR                  SS5      nUR                  S5      nU(       d7  [        n[	        U[        5      (       a  [        n[        R                  " XW5      nUR                  SS5      u  pUS:X  a/  [	        U[        5      (       a  UR                  5       n[        XYS9n
O[!        X5      n
U
R#                  U5        S	U;   a  [%        XS	   5        S
U;   a  U
R'                  S[        US
   5      5        [        UR)                  5       5       HX  nUR+                  5       SS	SS
S[,        R+                  5       [.        R+                  5       4;   a  MD  U
R'                  XU   5        MZ     U R1                  X*5        GM     g )N)defaultallowedr    typer>   r?   text)_subtyper   rd   r@   zcontent-disposition)r	   rg   r/   setr.   r   dictre   ARCHIVE_UNDEF_TYPEbytesARCHIVE_UNDEF_BINARY_TYPEr   r9   rL   rc   r   r   rM   r   r   keysr   ATTACHMENT_FIELDrO   rT   )r*   archiverV   entriesentr   mtyper   r\   r]   r   headers               r   rS   "UserDataProcessor._explode_archive  s   .."tSkJC #s## #&cD**ggi,GGGFOE,gu--7G 66wH %C 3H6!gu--%nn.Gw9x1(S cz?3$~s3~3F/GHsxxz*<<>")$**, &&(&  v6{3 + j.a r   Nc                 
   [         U;  a	  SU[         '   Ub  [        U[         [        U5      5        Sn [        UR	                  [         5      5      nU$ ! [
        [        4 a    [        U[         [        U5      5         U$ f = f)zg
Return the number of attachments to this MIMEMultipart by looking
at its 'Number-Attachments' header.
0r   )r   r   r   rj   re   rk   rl   )r*   	outer_msg	new_countfetched_counts       r   _multi_part_count#UserDataProcessor._multi_part_countF  s    
 9,*-I&' I'7YH	M	.> ?@M  I& 	MI'7]9KL	Ms   A *BBc                     U R                  U5      nU R                  X#S-   5        UR                  U5        U R                  XS-   5        g)z
Attach a message to an outer message. outermsg must be a MIMEMultipart.
Modifies a header in the outer message to keep track of number of
attachments.
r?   N)r   r   attach)r*   r   rW   
part_counts       r   rT   UserDataProcessor._attach_partX  sF     ++I6
##Dq.9yq.9r   )r'   r)   r   )__name__
__module____qualname____firstlineno__r+   r5   r0   ro   r}   r   rQ   rS   r   rT   __static_attributes__r   r   r   r$   r$   L   s9    9 N0`0
'
C7J2/h$	:r   r$   c                 `    U R                  5       =(       d    SnUR                  5       S:X  a  gg)Nr   	multipartTF)get_content_maintyper   )rW   part_maintypes     r   rB   rB   d  s,    --/52M+r   c                 &   U (       d  Sn S n[        U [        5      (       a  U R                  S5      nOU n[        R                  " USS9nSUSS R                  5       ;   a'  [        R                  " UR                  S5      5      nU$ U" X15      nU$ )	zFconvert a string (more likely bytes) or a message into
a mime message.r   c                 f    UR                  SS5      u  p#[        X#5      nUR                  U 5        U$ )Nr>   r?   )rL   r   rM   )rt   content_typer\   r]   r   s        r   create_binmsg%convert_string.<locals>.create_binmsgs  s2    (..sA6x)
r   zutf-8Frb   s   mime-version:r   i   )r.   r   encoder	   rF   r   message_from_stringrc   )raw_datar   r   bdatar   s        r   r1   r1   m  s      (C  (U51E54=..00&&u||G'<= J E0Jr   r   )'loggingrw   email.mime.baser   email.mime.multipartr   email.mime.nonmultipartr   email.mime.textr   	cloudinitr   r   r	   cloudinit.url_helperr
   r   	getLoggerr   r   NOT_MULTIPART_TYPEr   
OCTET_TYPErO   rK   rP   rR   rJ   r   r   rE   r   rf   r   r   r"   r$   rB   r1   r   r   r   <module>r      s     	 $ . 4 $ . . ;! 00 ""  
  34%'@A,-
( 6 	 (  00 
P
#U: U:p += r   