Ë
    x[h];  ã                   óŽ  — d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZ  ej                  e«      ZdZg d¢Z G d„ dej"                  «      Z G d	„ d
e«      Zd„ Zd„ Zd„ Zddeddfd„Zd„ Z G d„ de«      Z G d„ de«      Zeej8                  ffeej8                  ej:                  ffgZd„ Zedk(  rd„ Z  e «        yy)é    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                   ó^   — e Zd ZdZdZdZdZdZdZd„ Z	e
d„ «       Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zy)ÚDataSourceMAASzç
    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                 óè   — t         j                  j                  | |||«       d | _        t        j
                  j                  |j                  d«      | _        t        | j                  «      | _
        y )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   zDataSourceMAAS.__init__2   sM   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAØˆŒÜŸ™Ÿ™ U§^¡^°VÓ<ˆŒÜ)¨$¯+©+Ó6ˆ�ó    c                 óf   — | j                   st        | j                  «      | _         | j                   S ©N)Ú_oauth_helperÚget_oauth_helperr   ©r   s    r"   Úoauth_helperzDataSourceMAAS.oauth_helper8   s(   € à×!Ò!Ü!1°$·+±+Ó!>ˆDÔØ×!Ñ!Ð!r#   c                 ód   — t         j                  j                  | «      }|›d| j                  ›d�S )Nz [ú])r   r   Ú__str__r   )r   Úroots     r"   r,   zDataSourceMAAS.__str__>   s'   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ  $§-£-Ð0Ð0r#   c           	      ó  — | j                   }	 | j                  | j                  t        | j                  «      «       y# t        $ r Y n2t
        $ r'}t        j                  d| j                  |«       ‚ d }~ww xY w|j                  dd «      }|sy	 | j                  |«      sy| j                  |t        || j                  j                  | j                  d¬«      «       y# t        $ r t        j                   t        d|«       Y yw xY w)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_datazDataSourceMAAS._get_dataB   sí   € Ø�{‰{ˆð	Ø�N‰N˜4Ÿ=™=Ô*<¸T¿]¹]Ó*KÔLØøÜò 	ÙÜ#ò 	Ü�K‰KÐ.°·±¸sÔCØûð	úð
 �h‰h�~ tÓ,ˆÙØð	ð
 ×1Ñ1°#Ô6Øà�N‰NØÜ"ØØ%)×%6Ñ%6×%>Ñ%>ØŸ*™*Øô	ôð øÜò 	Ü�K‰KœÐCÀSÔIÙð	ús3   Ž/> ¾	A8Á	A8Á"A3Á3A8ÂC! Â#=C! Ã!$DÄDc                 óÜ   — || _         |\  }}}|| _        || _        |r	 t        j                  |«      | _        y y # t        $ r'}t        j                  d|«       d | _        Y d }~y d }~ww xY w)Nz"Invalid content in vendor-data: %s)	r   Úuserdata_rawÚmetadatar   Úconvert_vendordataÚvendordata_rawÚ
ValueErrorr7   r8   )r   rA   ÚdataÚudÚmdÚvdÚes          r"   r3   zDataSourceMAAS._set_datai   so   € àˆŒØ‰
ˆˆB�ØˆÔØˆŒÙð+Ü&-×&@Ñ&@ÀÓ&D�Õ#ð øô ò +Ü—‘Ð@À!ÔDØ&*�×#Ñ#ûð+ús   Ÿ; »	A+ÁA&Á&A+c                 ó    — d| j                   z  S )z/Return the subplatform metadata source details.zseed-dir (%s))r   r(   s    r"   Ú_get_subplatformzDataSourceMAAS._get_subplatformv   s   € à §¡Ñ.Ð.r#   c                 óÚ  — | j                  «       }|j                  dk(  ryt        j                  «       }|j	                  d«      }|›dt
        ›d�}|g}| j                  j                  ||j                  |j                  ¬«      \  }}|r!t        j                  d|«       t        |«      S t        j                  d|t        t        j                  «       |z
  «      «       t        |«      S )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_secondsr7   ÚdebugÚcriticalÚintÚbool)r   rA   Ú
url_paramsÚ	starttimeÚ	check_urlrR   Ú	_responses          r"   r:   z(DataSourceMAAS.wait_for_metadata_servicez   sÓ   € Ø×(Ñ(Ó*ˆ
Ø×&Ñ&¨!Ò+Øä—N‘NÓ$ˆ	Ø�j‰j˜‹oˆÚ58¾*ÐEˆ	Øˆ{ˆØ×*Ñ*×7Ñ7ØØ×0Ñ0Ø×.Ñ.ð 8ó 
‰ˆˆYñ Ü�I‰IÐ3°SÔ9ô �C‹yÐô �L‰LØ:ØÜ”D—N‘NÓ$ yÑ0Ó1ôô �C‹yÐr#   c                 ó’   — | j                   €yt        j                  |d| j                  fi «      }| j                   t	        |«      k(  S )a  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_idz DataSourceMAAS.check_instance_id”   sC   € ð �<‰<ÐØÜ×#Ñ# G¨l¸D¿K¹KÐ-HÈ"ÓMˆØ�|‰|Ô1°$Ó7Ñ7Ð7r#   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rh   r   r&   Úurl_max_waitÚurl_timeoutr   Úpropertyr)   r,   rB   r3   rO   r:   rj   © r#   r"   r   r      s\   „ ñð €FØ€GØ€Mð €LØ€Kò7ð ñ"ó ð"ò
1ò%òN+ò/òó4	8r#   r   c                   óz   ‡ — e Zd Zej                  ej
                  ej                  ej                  fZˆ fd„Z	ˆ xZ
S )ÚDataSourceMAASLocalc                 ó¦   •— t        «       j                  «       st        j                  d«       yt        j                  d«       t        ‰| �  «       S )NzNo initramfs applicable configFz!Found initramfs applicable config)r   Úis_applicabler7   r]   ÚsuperrB   )r   Ú	__class__s    €r"   rB   zDataSourceMAASLocal._get_data¨   s?   ø€ Ü'Ó)×7Ñ7Ô9ô �I‰IÐ6Ô7ØÜ�	‰	Ð5Ô6Ü‰wÑ Ó"Ð"r#   )rk   rl   rm   r   ÚCMD_LINEÚ
SYSTEM_CFGÚDSÚ	INITRAMFSÚnetwork_config_sourcesrB   Ú__classcell__)rx   s   @r"   rt   rt       s9   ø„ à×$Ñ$Ø×&Ñ&Ø×ÑØ×%Ñ%ð	Ð÷#ð #r#   rt   c           	      óŽ   — d}t        |D �cg c]  }|| j                  |«      f‘Œ c}«      }t        j                  di |¤ŽS c c}w )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_secretrr   )Údictr9   r   ÚOauthUrlHelper)ÚcfgÚkeysÚrÚkwargss       r"   r'   r'   ²   sD   € ð
 L€DÜ¨DÖ1 q�A�s—w‘w˜q“z’?Ò1Ó2€FÜ×$Ñ$Ñ. vÑ.Ð.ùò 2s   ŒAc           	      óØ   — d}dj                  |D �cg c]  }| j                  |d«      ‘Œ c}«      }dt        j                  |j	                  d«      «      j                  «       z   S c c}w )z;Given a config, generate a unique identifier for this node.)r€   r‚   rƒ   ú Ú zv1:zutf-8)r   r9   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r   ÚfieldsÚfÚidstrs       r"   r   r   ¼   sX   € à:€FØ�I‰I°&Ö9¨Q�v—z‘z ! RÕ(Ò9Ó:€Eð ”7—>‘> %§,¡,¨wÓ"7Ó8×BÑBÓDÑDÐDùò :s   ’A'c                 óÌ   — | j                  d«      r| dd  } t        j                  j                  | «      rt        j                  | «      st        d«      ‚t        d| z  d ¬«      S )Núfile://é   z%s: not a directoryz	file://%s)Úversion)Ú
startswithr   r   ÚisdirÚlistdirr5   r;   )Úseed_ds    r"   r4   r4   Å   sV   € Ø×Ñ˜Ô#Ø˜˜�ˆÜ�7‰7�=‰=˜Ô ¬¯
©
°6Ô(:ÜÐ3Ó4Ð4ô ˜k¨FÑ2¸DÔAÐAr#   c                 ón  — |€t         j                  }| j                  d«      r| dd } i }t        D ]£  \  }}}	}
|€| ›d|›�}n
| ›d|›d|›�}	 t	        j
                  |«      } |||||¬«      }|j                  «       r5|	r|j                  ||<   nDt	        j                  |j                  «      ||<   n!t        j                  d||j                  «       Œ¥ t        || «      S # t         j                  $ r>}|j                  dk(  r|
st        d|›d|›�«      |‚|j                  dk7  r|‚Y d}~Œþd}~ww xY w)	a›  
    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.
    NrQ   éÿÿÿÿ)r2   rT   Ússl_detailsz4Fetching from %s resulted in an invalid http code %si”  zMissing required z: )r   r1   ÚendswithÚ	DS_FIELDSr   Úfetch_ssl_detailsÚokÚcontentsÚdecode_binaryr7   r8   ÚcodeÚUrlErrorr6   Úcheck_seed_contents)Úseed_urlr1   rT   r—   r!   r2   rK   r   Ú	_dictnameÚbinaryÚoptionalrA   rž   ÚresprM   s                  r"   r;   r;   Ï   s?  € ð& ÐÜ%×6Ñ6Ðà×Ñ˜ÔØ˜C˜R�=ˆà	€BÜ-6ò Ñ)ˆˆi˜ Øˆ?Ú%¡tÐ,‰Câ (ª'±4Ð8ˆCð	Ü×0Ñ0°Ó7ˆKÙ#Ø˜W¨gÀ;ôˆDð �w‰wŒyÙØ#Ÿ}™}�B�t’Hä#×1Ñ1°$·-±-Ó@�B�t’Hä—‘ØJØØ—I‘Iôøð!ô: ˜r 8Ó,Ð,øô ×"Ñ"ò 	Ø�v‰v˜Š}¡XÝ*Ú15±qÐ9óàðð —‘˜3’Ø�ô ûð	ús   ÁBC#Ã#D4Ã64D/Ä/D4c                 óþ  — i }g }t         D ]U  \  }}}}|| vr|s|j                  |«       Œ d|v r*|j                  d«      \  }}	}
||vri ||<   | |   ||   |
<   ŒN| |   ||<   ŒW |st        d|z  «      ‚|rt	        |›d|›�«      ‚d}|j                  d«      rDt        «       }t        j                  |j                  d«      |t        ¬«      }||u rt	        d«      ‚|j                  d«      |j                  d	«      |fS )
z·Validate if dictionary content valid as a return for a datasource.
    Either return a (userdata, metadata, vendordata) tuple or
    Raise MAASSeedDirMalformed or MAASSeedDirNone
    rQ   z%s: no data files foundz: missing files Nr   )ÚdefaultÚallowedz%vendor-data was not loadable as yaml.r   ú	meta-data)	r    ÚappendÚ	partitionr5   r6   r9   Úobjectr   Ú	load_yaml)ÚcontentÚseedÚretÚmissingÚspathÚdpathÚ_binaryr«   ÚtopÚ_ÚpÚvd_dataÚerrs                r"   r§   r§   	  s  € ð
 €CØ€GÜ+4ò (Ñ'ˆˆu�g˜xØ˜ÑÙØ—‘˜uÔ%Øà�%‰<ØŸ™¨Ó,‰IˆC��AØ˜#‰~Ø��C‘Ø! %™.ˆC�‰H�QŠKà  ™ˆC�ŠJð(ñ ÜÐ7¸$Ñ>Ó?Ð?áÜ"ºTÁ7Ð#KÓLÐLà€GØ
‡w�wˆ}ÔÜ‹hˆÜ—.‘.Ø�G‰G�MÓ"¨C¼&ô
ˆð �c‰>Ü&Ð'NÓOÐOà�7‰7�;Ó §¡¨Ó!5°wÐ>Ð>r#   c                   ó   — e Zd Zy)r5   N©rk   rl   rm   rr   r#   r"   r5   r5   0  ó   „ Ør#   r5   c                   ó   — e Zd Zy)r6   NrÂ   rr   r#   r"   r6   r6   4  rÃ   r#   r6   c                 ó6   — t        j                  | t        «      S r%   )r   Úlist_from_dependsÚdatasources)Údependss    r"   Úget_datasource_listrÉ   @  s   € Ü×$Ñ$ W¬kÓ:Ð:r#   Ú__main__c                  ó  ‡‡‡‡— ddl } ddl}ddl}| j                  d¬«      }|j	                  dddd¬«       |j	                  d	d
dd¬«       |j	                  dd
dd¬«       |j	                  dddd¬«       |j	                  dddd¬«       |j	                  dddt
        ¬«       |j                  dd¬«      }dD ]-  \  }}|j                  ||¬«      }|j	                  dddd¬«       Œ/ |j                  «       }|j                  |j                  |j                  |j                  d œ}	|j                  €yd!D ]t  }
d"|
z   d#z   }t        j                  j!                  |«      sŒ+t        j"                  |t        j$                  «      sŒP|j&                  j)                  d$|z  «       ||_        Œv |j                  rmt+        j,                  |j                  «      }d%|v r|d%   d&   }|	j/                  «       D ]  }||v sŒ|	|   �Œ||   |	|<   Œ |j0                  €d'|v r
|d'   |_        |j0                  €,|j&                  j)                  d(«       |j3                  d)«       t5        |	«      Šˆfd*„Šˆfd+„Šˆˆˆfd,„Š|j6                  d-k(  �r|j&                  j)                  d.|j0                  z  «       ‰j8                  }|j0                  d   d/k(  s|j0                  j;                  d0«      rt=        |j0                  «      \  }}}n't?        |j0                  |j@                  |d1¬2«      \  }}}tC        d3«       tC        |€d4n|jE                  «       «       tC        d5«       |j                  |«       tC        d6«       |j                  |€d4«       y|«       y|j6                  d7k(  r ‰|j0                  «       y|j6                  d8k(  rB|j0                  jG                  d/«      sd9|j0                  z  |_         ‰|j0                  «       yy):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)r9   zdo a single GET of provided url)ú
check-seedzread and verify seed at url)rÏ   rA   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.
rf   r   r/   z)Must provide a url or a config with url.
r0   c                 ó>   •— ‰j                  | d¬«      j                  S )Nr0   )r2   )r<   r£   )rA   r)   s    €r"   Úgeturlzmain.<locals>.geturl¡  s   ø€ à×'Ñ'¨°QÐ'Ó7×@Ñ@Ð@r#   c                 óR   •— t        d| ›d ‰| «      j                  «       ›d�«       y )Nz== z ==
ú
)ÚprintÚdecode)rA   rÝ   s    €r"   Úprinturlzmain.<locals>.printurl¥  s   ø€ Ý¢c©6°#«;×+=Ñ+=Õ+?Ð@ÕAr#   c                 ó  •— | j                  d«      rf ‰| «      j                  «       j                  «       D ]>  }|j                  d«      r ‰| ›|›�«       Œ!|dk(  r ‰| ›d›�«       Œ3 ‰| ›|›�«       Œ@ y  ‰| «       y )NrQ   r°   z
meta-data/)rŸ   rá   Ú
splitlines)rA   ÚlinerÖ   rÝ   râ   s     €€€r"   rÖ   zmain.<locals>.crawl¨  sx   ø€ Ø�|‰|˜CÔ Ù" 3›K×.Ñ.Ó0×;Ñ;Ó=ò 7�DØ—}‘} SÔ)Ù©©TÐ2Õ3Ø Ò,á©©\Ð:Õ;á ©3±Ð!5Õ6ñ7ñ ˜•r#   r×   zChecking seed at %s
rQ   r•   é   )r—   r1   r2   z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r9   rÖ   z%s/)$ÚargparseÚpprintÚsysÚArgumentParserÚadd_argumentrZ   Úadd_subparsersÚ
add_parserÚ
parse_argsÚckeyÚtkeyÚtsecÚcsecÚconfigr   r   ÚexistsÚaccessÚR_OKÚstderrÚwriter   Ú	read_confr‡   rA   Úexitr'   rÓ   r<   r˜   r4   r;   Úapiverrà   rá   rŸ   )rç   rè   ré   ÚparserÚsubcmdsÚnamerÏ   r¾   ÚargsÚcredsÚfnameÚfpathr†   rÐ   r<   ÚuserdatarE   rL   rÖ   rÝ   r)   râ   s                     @@@@r"   Úmainr  F  sã  û€ ó 	ÛÛà×(Ñ(Ð5LÐ(ÓMˆØ×ÑØØØ)Øð	 	ô 	
ð 	×ÑØØØ0Øð	 	ô 	
ð 	×ÑØØØ-Øð	 	ô 	
ð 	×ÑØØØ2Øð	 	ô 	
ð 	×ÑØØØ0Øð	 	ô 	
ð 	×ÑØØØ3Üð	 	ô 	
ð ×'Ñ'¨mÀ(Ð'ÓKˆð
ò 	‰JˆD�$ð
 ×"Ñ" 4¨dÐ"Ó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Ø—J‘J×$Ñ$Ð%;¸eÑ%CÔDØ"'�D•Kð	(ð �;Š;Ü—.‘. §¡Ó-ˆCØ˜sÑ"Ø˜,Ñ'¨Ñ/�Ø—z‘z“|ò *�Ø˜#’: %¨¡*Ñ"4Ø!$ S¡�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Ü+=¸d¿h¹hÓ+GÑ(�˜8¡Rä+=Ø—H‘HØ ŸK™KØ%,Øô	,Ñ(�˜8 Rô Ð%Ô&Ü˜8Ð+‘%°·±Ó1BÔCÜÐ%Ô&Ø�M‰M˜(Ô#ÜÐ'Ô(Ø�M‰M 2 :˜%Õ6°2Õ6à�[‰[˜EÒ!Ù�T—X‘XÕà�[‰[˜GÒ#Ø—8‘8×$Ñ$ SÔ)Ø  4§8¡8Ñ+�”Ù�$—(‘(�Oð $r#   )!r�   Úloggingr   rW   Ú	cloudinitr   r   r   Úcloudinit.net.cmdliner   Úcloudinit.sourcesr   Ú	getLoggerrk   r7   rZ   r    r   r   rt   r'   r   r4   r;   r§   r=   r5   r6   ÚDEP_FILESYSTEMÚDEP_NETWORKrÇ   rÉ   r  rr   r#   r"   ú<module>r     sú   ðó Û Û 	Û ç /Ñ /Ý :Ý 1à€g×Ñ˜Ó!€Ø€
ò€	ô~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#   