ó
    x[h];  ã                   ó’  • S SK r S SKrS SKrS SKrS SKJrJrJr  S SKJ	r	  S SK
Jr  \R                  " \5      rSr/ SQr " S S\R"                  5      r " S	 S
\5      rS rS rS rSS\SS4S jrS r " S S\5      r " S S\5      r\\R8                  44\\R8                  \R:                  44/rS r\S:X  a  S r \ " 5         gg)é    N)ÚsourcesÚ
url_helperÚutil)ÚKlibcNetworkConfigSource)ÚNetworkConfigSourcez
2012-03-01))úmeta-data/instance-idr   FF)úmeta-data/local-hostnamer	   FF)úmeta-data/public-keysr
   FT)zmeta-data/vendor-dataúvendor-dataTT)ú	user-datar   TTc                   óf   • \ rS rSrSrSrSrSrSrSr	S r
\S 5       rS	 rS
 rS rS rS rS rSrg)ÚDataSourceMAASé   zÇ
DataSourceMAAS reads instance information from MAAS.
Given a config metadata_url, and oauth tokens, it expects to find
files under the root named:
  instance-id
  user-data
  hostname
  vendor-data
ÚMAASNéx   é2   c                 óä   • [         R                  R                  XX#5        S U l        [        R
                  R                  UR                  S5      U l        [        U R                  5      U l
        g )NÚmaas)r   Ú
DataSourceÚ__init__Úbase_urlÚosÚpathÚjoinÚseed_dirÚget_id_from_ds_cfgÚds_cfgÚid_hash)ÚselfÚsys_cfgÚdistroÚpathss       ÚB/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyr   ÚDataSourceMAAS.__init__2   sI   € Ü×Ñ×#Ñ# D°6ÔAØˆŒÜŸ™Ÿ™ U§^¡^°VÓ<ˆŒÜ)¨$¯+©+Ó6ˆ�ó    c                 óp   • U R                   (       d  [        U R                  5      U l         U R                   $ ©N)Ú_oauth_helperÚget_oauth_helperr   ©r   s    r#   Úoauth_helperÚDataSourceMAAS.oauth_helper8   s(   € à×!×!Ü!1°$·+±+Ó!>ˆDÔØ×!Ñ!Ð!r%   c                 óh   • [         R                  R                  U 5      nU< SU R                  < S3$ )Nz [Ú])r   r   Ú__str__r   )r   Úroots     r#   r/   ÚDataSourceMAAS.__str__>   s'   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÛ  $§-¤-Ð0Ð0r%   c           
      ó,  • U R                   n U R                  U R                  [        U R                  5      5        g! [         a     O3[
         a'  n[        R                  SU R                  U5        e S nAff = fUR                  SS 5      nU(       d  g U R                  U5      (       d  gU R                  U[        UU R                  R                  U R                  SS95        g! [         a    [        R                   " [        SU5         gf = f)NTz%s was malformed: %sÚmetadata_urlFé   )Úread_file_or_urlr"   Úretriesz$Failed fetching metadata from url %s)r   Ú	_set_datar   Úread_maas_seed_dirÚMAASSeedDirNoneÚMAASSeedDirMalformedÚLOGÚwarningÚgetÚwait_for_metadata_serviceÚread_maas_seed_urlr+   Úreadurlr"   Ú	Exceptionr   Úlogexc)r   ÚmcfgÚexcÚurls       r#   Ú	_get_dataÚDataSourceMAAS._get_dataB   sð   € Ø�{‰{ˆð	Ø�N‰N˜4Ÿ=™=Ô*<¸T¿]¹]Ó*KÔLØøÜó 	ÙÜ#ó 	Ü�K‰KÐ.°·±¸sÔCØûð	úð
 �h‰h�~ tÓ,ˆÞØð	ð
 ×1Ñ1°#×6Ñ6Øà�N‰NØÜ"ØØ%)×%6Ñ%6×%>Ñ%>ØŸ*™*Øñ	ôð øÜó 	Ü�KŠKœÐCÀSÔIÙð	ús3   Ž/> ¾
A:Á
	A:Á"A5Á5A:ÂC* Â/:C* Ã*&DÄDc                 óâ   • Xl         Uu  p4nX0l        X@l        U(       a   [        R                  " U5      U l        g g ! [         a'  n[        R                  SU5        S U l         S nAg S nAff = f)Nz"Invalid content in vendor-data: %s)	r   Úuserdata_rawÚmetadatar   Úconvert_vendordataÚvendordata_rawÚ
ValueErrorr;   r<   )r   rE   ÚdataÚudÚmdÚvdÚes          r#   r7   ÚDataSourceMAAS._set_datai   sg   € àŒØ‰
ˆ�ØÔØŒÞð+Ü&-×&@Ò&@ÀÓ&D�Õ#ð øô ó +Ü—‘Ð@À!ÔDØ&*�×#Ñ#ûð+ús    = ½
A.ÁA)Á)A.c                 ó    • SU R                   -  $ )z/Return the subplatform metadata source details.zseed-dir (%s))r   r*   s    r#   Ú_get_subplatformÚDataSourceMAAS._get_subplatformv   s   € à §¡Ñ.Ð.r%   c                 óÒ  • U R                  5       nUR                  S:X  a  g[        R                  " 5       nUR	                  S5      nU< S[
        < S3nU/nU R                  R                  UUR                  UR                  S9u  pU(       a  [        R                  SU5        O6[        R                  SU[        [        R                  " 5       U-
  5      5        [        U5      $ )Nr   FÚ/z/meta-data/instance-id)ÚurlsÚmax_waitÚtimeoutzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)Úget_url_paramsÚmax_wait_secondsÚtimeÚ	monotonicÚrstripÚ
MD_VERSIONr+   Úwait_for_urlÚtimeout_secondsr;   ÚdebugÚcriticalÚintÚbool)r   rE   Ú
url_paramsÚ	starttimeÚ	check_urlrY   Ú	_responses          r#   r>   Ú(DataSourceMAAS.wait_for_metadata_servicez   sÃ   € Ø×(Ñ(Ó*ˆ
Ø×&Ñ&¨!Ó+Øä—N’NÓ$ˆ	Ø�j‰j˜‹oˆÛ58¿*ÐEˆ	Øˆ{ˆØ×*Ñ*×7Ñ7ØØ×0Ñ0Ø×.Ñ.ð 8ð 
‰ˆö Ü�I‰IÐ3°SÕ9ä�L‰LØ:ØÜ”D—N’NÓ$ yÑ0Ó1ôô �C‹yÐr%   c                 ó–   • U R                   c  g[        R                  " USU R                  40 5      nU R                   [	        U5      :H  $ )zúlocally check if the current system is the same instance.

MAAS doesn't provide a real instance-id, and if it did, it is
still only available over the network.  We need to check based
only on local resources.  So compute a hash based on Oauth tokens.FÚ
datasource)r   r   Úget_cfg_by_pathÚdsnamer   )r   r    Úncfgs      r#   Úcheck_instance_idÚ DataSourceMAAS.check_instance_id”   sC   € ð �<‰<ÑØÜ×#Ò# G¨l¸D¿K¹KÐ-HÈ"ÓMˆØ�|‰|Ô1°$Ó7Ñ7Ð7r%   )r(   r   r   rJ   r   rI   rL   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rp   r   r(   Úurl_max_waitÚurl_timeoutr   Úpropertyr+   r/   rF   r7   rU   r>   rr   Ú__static_attributes__© r%   r#   r   r      s\   † ñð €FØ€GØ€Mð €LØ€Kò7ð ñ"ó ð"ò
1ò%òN+ò/òõ4	8r%   r   c                   ó„   ^ • \ rS rSr\R
                  \R                  \R                  \R                  4r	U 4S jr
SrU =r$ )ÚDataSourceMAASLocalé    c                 ó°   >• [        5       R                  5       (       d  [        R                  S5        g[        R                  S5        [        TU ]  5       $ )NzNo initramfs applicable configFz!Found initramfs applicable config)r   Úis_applicabler;   rd   ÚsuperrF   )r   Ú	__class__s    €r#   rF   ÚDataSourceMAASLocal._get_data¨   sB   ø€ Ü'Ó)×7Ñ7×9Ñ9ô �I‰IÐ6Ô7ØÜ�	‰	Ð5Ô6Ü‰wÑ Ó"Ð"r%   r}   )rt   ru   rv   rw   r   ÚCMD_LINEÚ
SYSTEM_CFGÚDSÚ	INITRAMFSÚnetwork_config_sourcesrF   r|   Ú__classcell__)r„   s   @r#   r   r       s9   ø† à×$Ñ$Ø×&Ñ&Ø×ÑØ×%Ñ%ð	Ð÷#ó #r%   r   c           	      ó”   • Sn[        U Vs/ s H  o"U R                  U5      4PM     sn5      n[        R                  " S0 UD6$ s  snf )zšReturn an oauth helper instance for values in cfg.

@raises ValueError from OauthUrlHelper if some required fields have
true-ish values but others do not.)Úconsumer_keyÚconsumer_secretÚ	token_keyÚtoken_secretr}   )Údictr=   r   ÚOauthUrlHelper)ÚcfgÚkeysÚrÚkwargss       r#   r)   r)   ²   sF   € ð
 L€DÜ©DÓ1ªD q�s—w‘w˜q“z“?©DÑ1Ó2€FÜ×$Ò$Ñ. vÑ.Ð.ùò 2s   ŒAc           	      óÞ   • SnSR                  U Vs/ s H  o R                  US5      PM     sn5      nS[        R                  " UR	                  S5      5      R                  5       -   $ s  snf )z;Given a config, generate a unique identifier for this node.)r�   r�   r�   Ú Ú zv1:zutf-8)r   r=   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r   ÚfieldsÚfÚidstrs       r#   r   r   ¼   sZ   € à:€FØ�I‰I±&Ó9²&¨Q—z‘z ! RÖ(±&Ñ9Ó:€Eð ”7—>’> %§,¡,¨wÓ"7Ó8×BÑBÓDÑDÐDùò :s   ’A*c                 óæ   • U R                  S5      (       a  U SS  n [        R                  R                  U 5      (       a  [        R                  " U 5      (       d  [        S5      e[        SU -  S S9$ )Núfile://é   z%s: not a directoryz	file://%s)Úversion)Ú
startswithr   r   ÚisdirÚlistdirr9   r?   )Úseed_ds    r#   r8   r8   Å   s_   € Ø×Ñ˜×#Ñ#Ø˜˜�ˆÜ�7‰7�=‰=˜× Ñ ¬¯
ª
°6×(:Ñ(:ÜÐ3Ó4Ð4ô ˜k¨FÑ2¸DÑAÐAr%   c                 óª  • Uc  [         R                  nU R                  S5      (       a  U SS n 0 n[         H¯  u  pxpšUc
  U < SU< 3nOU < SU< SU< 3n [        R
                  " U5      nU" XµX,S9nUR                  5       (       a;  U	(       a  UR                  Xg'   Mj  [        R                  " UR                  5      Xg'   MŽ  [        R                  SUUR                  5        M±     [        X`5      $ ! [         R                   aI  nUR                  S:X  a  U
(       d  [        SU< SU< 35      UeUR                  S:w  a  Ue SnAGM  SnAff = f)	aw  
Read the maas datasource at seed_url.
  read_file_or_url is a method that should provide an interface
  like util.read_file_or_url

Expected format of seed_url is are the following files:
  * <seed_url>/<version>/meta-data/instance-id
  * <seed_url>/<version>/meta-data/local-hostname
  * <seed_url>/<version>/user-data
If version is None, then <version>/ will not be used.
NrX   éÿÿÿÿ)r6   r[   Ússl_detailsz4Fetching from %s resulted in an invalid http code %si”  zMissing required z: )r   r5   ÚendswithÚ	DS_FIELDSr   Úfetch_ssl_detailsÚokÚcontentsÚdecode_binaryr;   r<   ÚcodeÚUrlErrorr:   Úcheck_seed_contents)Úseed_urlr5   r[   r¤   r"   r6   rP   r   Ú	_dictnameÚbinaryÚoptionalrE   r«   ÚresprR   s                  r#   r?   r?   Ï   s0  € ð& ÑÜ%×6Ñ6Ðà×Ñ˜×ÑØ˜C˜R�=ˆà	€Bß-6Ñ)ˆ˜Ø‰?Û%¢tÐ,‰Cã («'²4Ð8ˆCð	Ü×0Ò0°Ó7ˆKÙ#Ø¨gñˆDð �w‰w�y‰yÞØ#Ÿ}™}�B“Hä#×1Ò1°$·-±-Ó@�B“Hä—‘ØJØØ—I‘Iöñ! .7ô: ˜rÓ,Ð,øô ×"Ñ"ó 	Ø�v‰v˜‹}¦XÝ*Û15²qÐ9óàðð —‘˜3“Ø�ö ûð	ús%   ÁAC5Â!"C5Ã!C5Ã5EÄ	=EÅEc                 ó&  • 0 n/ n[          HY  u  pEpgX@;  a  U(       d  UR                  U5        M%  SU;   a(  UR                  S5      u  p‰n
X‚;  a  0 X('   X   X(   U
'   MS  X   X%'   M[     U(       d  [        SU-  5      eU(       a  [	        U< SU< 35      eSnUR                  S5      (       aB  [        5       n[        R                  " UR                  S5      U[        S9nX¼L a  [	        S5      eUR                  S5      UR                  S	5      U4$ )
z«Validate if dictionary content valid as a return for a datasource.
Either return a (userdata, metadata, vendordata) tuple or
Raise MAASSeedDirMalformed or MAASSeedDirNone
rX   z%s: no data files foundz: missing files Nr   )ÚdefaultÚallowedz%vendor-data was not loadable as yaml.r   ú	meta-data)	r­   ÚappendÚ	partitionr9   r:   r=   Úobjectr   Ú	load_yaml)ÚcontentÚseedÚretÚmissingÚspathÚdpathÚ_binaryr¸   ÚtopÚ_ÚpÚvd_dataÚerrs                r#   r´   r´   	  s  € ð
 €CØ€Gß+4Ñ'ˆ�gØÓÞØ—‘˜uÔ%Ùà�%‹<ØŸ™¨Ó,‰IˆC�AØ‹~Ø�‘Ø!™.ˆC‰H�Q‹Kà ™ˆC‹Jñ ,5ö ÜÐ7¸$Ñ>Ó?Ð?æÜ"»TÂ7Ð#KÓLÐLà€GØ
‡w�wˆ}×ÑÜ‹hˆÜ—.’.Ø�G‰G�MÓ"¨C¼&ñ
ˆð Š>Ü&Ð'NÓOÐOà�7‰7�;Ó §¡¨Ó!5°wÐ>Ð>r%   c                   ó   • \ rS rSrSrg)r9   i0  r}   N©rt   ru   rv   rw   r|   r}   r%   r#   r9   r9   0  ó   † Úr%   r9   c                   ó   • \ rS rSrSrg)r:   i4  r}   NrÏ   r}   r%   r#   r:   r:   4  rÐ   r%   r:   c                 ó8   • [         R                  " U [        5      $ r'   )r   Úlist_from_dependsÚdatasources)Údependss    r#   Úget_datasource_listrÖ   @  s   € Ü×$Ò$ W¬kÓ:Ð:r%   Ú__main__c                  ó,  ^^^^• SSK n SSKnSSKnU R                  SS9nUR	                  SSSSS9  UR	                  S	S
SSS9  UR	                  SS
SSS9  UR	                  SSSSS9  UR	                  SSSSS9  UR	                  SSS[
        S9  UR                  SSS9nS H&  u  pVUR                  XVS9nUR	                  SSSSS9  M(     UR                  5       nUR                  UR                  UR                  UR                  S .n	UR                  c‡  S! H�  n
S"U
-   S#-   n[        R                  R!                  U5      (       d  M1  [        R"                  " U[        R$                  5      (       d  M]  UR&                  R)                  S$U-  5        X¸l        Mƒ     UR                  (       av  [*        R,                  " UR                  5      nS%U;   a  US%   S&   nU	R/                  5        H  nXÜ;   d  M
  X�   b  M  XÍ   X�'   M     UR0                  c  S'U;   a
  US'   Ul        UR0                  c,  UR&                  R)                  S(5        UR3                  S)5        [5        U	5      mU4S* jmU4S+ jmUUU4S, jmUR6                  S-:X  Ga  UR&                  R)                  S.UR0                  -  5        TR8                  nUR0                  S   S/:X  d   UR0                  R;                  S05      (       a  [=        UR0                  5      u  nnnO$[?        UR0                  UR@                  US1S29u  nnn[C        S35        [C        Uc  S4OURE                  5       5        [C        S55        UR                  U5        [C        S65        UR                  Uc  S4OU5        gUR6                  S7:X  a  T" UR0                  5        gUR6                  S8:X  aG  UR0                  RG                  S/5      (       d  S9UR0                  -  Ul        T" UR0                  5        gg):zÄ
Call with single argument of directory or http or https url.
If url is given additional arguments are allowed, which will be
interpreted as consumer_key, token_key, token_secret, consumer_secret
r   NzInteract with MAAS DS)Údescriptionz--configÚfilezspecify DS config file)ÚmetavarÚhelpr»   z--ckeyÚkeyzthe consumer key to auth withz--tkeyzthe token key to auth withz--csecÚsecretzthe consumer secret (likely '')r™   z--tseczthe token secret to auth withz--apiverr¤   z the apiver to use ( can be used)ÚsubcommandsÚsubcmd)ÚtitleÚdest))Úcrawlzcrawl the datasource)r=   zdo a single GET of provided url)ú
check-seedzread and verify seed at url)rÜ   rE   zthe datasource urlÚ?)rÜ   Únargsr»   )r�   r�   r�   rŽ   )Ú91_kernel_cmdline_urlÚ90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s.
rn   r   r3   z)Must provide a url or a config with url.
r4   c                 ó8   >• TR                  U SS9R                  $ )Nr4   )r6   )r@   r°   )rE   r+   s    €r#   ÚgeturlÚmain.<locals>.geturl¡  s   ø€ à×'Ñ'¨°QÐ'Ð7×@Ñ@Ð@r%   c                 óV   >• [        SU < ST" U 5      R                  5       < S35        g )Nz== z ==
Ú
)ÚprintÚdecode)rE   rê   s    €r#   ÚprinturlÚmain.<locals>.printurl¥  s   ø€ Ý£c©6°#«;×+=Ñ+=Ö+?Ð@ÕAr%   c                 ó.  >• U R                  S5      (       av  T" U 5      R                  5       R                  5        HM  nUR                  S5      (       a  T" U < U< 35        M)  US:X  a  T" U < S< 35        M?  T" U < U< 35        MO     g T" U 5        g )NrX   r½   z
meta-data/)r¬   rï   Ú
splitlines)rE   Úlinerã   rê   rð   s     €€€r#   rã   Úmain.<locals>.crawl¨  sy   ø€ Ø�|‰|˜C× Ñ Ù" 3›K×.Ñ.Ó0×;Ñ;Ö=�DØ—}‘} S×)Ñ)ÙªªTÐ2Ö3Ø Ó,áªª\Ð:Ö;á ª3²Ð!5Ö6ò >ñ ˜•r%   rä   zChecking seed at %s
rX   r¢   é   )r¤   r5   r6   z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r=   rã   z%s/)$ÚargparseÚpprintÚsysÚArgumentParserÚadd_argumentra   Úadd_subparsersÚ
add_parserÚ
parse_argsÚckeyÚtkeyÚtsecÚcsecÚconfigr   r   ÚexistsÚaccessÚR_OKÚstderrÚwriter   Ú	read_confr”   rE   Úexitr)   rà   r@   r¥   r8   r?   Úapiverrî   rï   r¬   )r÷   rø   rù   ÚparserÚsubcmdsÚnamerÜ   rË   ÚargsÚcredsÚfnameÚfpathr“   rÝ   r@   ÚuserdatarJ   rQ   rã   rê   r+   rð   s                     @@@@r#   Úmainr  F  sÐ  û€ ó 	ÛÛà×(Ñ(Ð5LÐ(ÐMˆØ×ÑØØØ)Øð	 	ñ 	
ð 	×ÑØØØ0Øð	 	ñ 	
ð 	×ÑØØØ-Øð	 	ñ 	
ð 	×ÑØØØ2Øð	 	ñ 	
ð 	×ÑØØØ0Øð	 	ñ 	
ð 	×ÑØØØ3Üð	 	ñ 	
ð ×'Ñ'¨mÀ(Ð'ÐKˆó
‰JˆDð
 ×"Ñ" 4Ð"Ð3ˆAØ�N‰NØÐ0¸ÀTð ó ñ
ð × Ñ Ó"ˆð !ŸI™IØŸ™Ø ŸI™IØ#Ÿy™yñ	
ˆð �;‰;ÑÛB�Ø1°EÑ9¸FÑB�Ü—7‘7—>‘> %×(Ó(¬R¯YªY°u¼b¿g¹g×-FÓ-FØ—J‘J×$Ñ$Ð%;¸eÑ%CÔDØ"'–Kñ	 Cð �;�;Ü—.’. §¡Ó-ˆCØ˜sÓ"Ø˜,Ñ'¨Ñ/�Ø—z‘z–|�Ø•: %¡*Ó"4Ø!$¡�E“Jñ $ð �x‰xÑ N°cÓ$9Ø˜~Ñ.�”à�8‰8ÑØ�J‰J×ÑÐIÔJØ�H‰H�QŒKä'¨Ó.ˆõ	Aõ	B÷	ð �;‰;˜,Ô&Ø�J‰J×ÑÐ4°t·x±xÑ?Ô@Ø"×*Ñ*ˆGØ�x‰x˜‰{˜cÓ! T§X¡X×%8Ñ%8¸×%CÑ%CÜ+=¸d¿h¹hÓ+GÑ(�˜8¡Rä+=Ø—H‘HØ ŸK™KØ%,Øñ	,Ñ(�˜8 Rô Ð%Ô&Ü˜8Ñ+‘%°·±Ó1BÔCÜÐ%Ô&Ø�M‰M˜(Ô#ÜÐ'Ô(Ø�M‰M 2¡:™%°2Õ6à�[‰[˜EÓ!Ù�T—X‘XÕà�[‰[˜GÓ#Ø—8‘8×$Ñ$ S×)Ñ)Ø  4§8¡8Ñ+�”Ù�$—(‘(�Oð $r%   )!rš   Úloggingr   r^   Ú	cloudinitr   r   r   Úcloudinit.net.cmdliner   Úcloudinit.sourcesr   Ú	getLoggerrt   r;   ra   r­   r   r   r   r)   r   r8   r?   r´   rA   r9   r:   ÚDEP_FILESYSTEMÚDEP_NETWORKrÔ   rÖ   r  r}   r%   r#   Ú<module>r     sø   ðó Û Û 	Û ç /Ñ /Ý :Ý 1à×Ò˜Ó!€Ø€
ò€	ô~8�W×'Ñ'ô ~8ôB#˜.ô #ò$/òEòBð ØØØ
Øô7-òt$?ôN	�iô 	ô	˜9ô 	ð ˜7×1Ñ1Ð3Ð4Ø�g×,Ñ,¨g×.AÑ.AÐBÐCð€ò;ð ˆzÓòHñT 	…FðY r%   