
    [h?                        d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
mZ  ej                  e      Z G d dej                        ZddZddZdd	Zd
 Z G d de      Zeej,                  ffeej,                  ej.                  ffgZd Zedk(  rld dlmZ  ej8                  ej:                         ed   Z e	j>                  e      \  Z Z!Z"Z# e$de          e$de!         e$de"         e$de#        yy)    N)partial)dmi	lifecyclesourcesutil)enic                   r     e Zd ZdZd Z fdZd Zd Zed        Z	de
fdZd	 Zd
 Zd Zed        Z xZS )DataSourceNoCloudNoCloudc                 @   t         j                  j                  | |||       d | _        t        j
                  j                  |j                  d      t        j
                  j                  |j                  d      g| _        d | _        d| _	        d | _
        d | _        y )Nnocloudnocloud-net)/file://)r   
DataSource__init__seedospathjoinseed_dir	seed_dirssupported_seed_starts_network_config_network_eniselfsys_cfgdistropathss       E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceNoCloud.pyr   zDataSourceNoCloud.__init__   sy    ##D'65A	GGLL3GGLL7
 %5"#     c                     t         |          dz   | j                  rd| j                   dndz   | j                  t        j
                  k7  rd| j                   dz   S dz   S )z@append seed and dsmode info when they contain non-default values z[seed=] z[dsmode=)super__str__r   dsmoder   DSMODE_NETWORK)r   	__class__s    r!   r(   zDataSourceNoCloud.__str__&   ss     GO(,				{!$r;
 ;;'"8"88 4;;-q)			
 		
r"   c                    t        j                  d      }|j                  t        j                  d             t        j                  d|j                         z        }|j                  t        j                  d|j	                         z               |j                  t        j                  d|z               t        t        |      t        |      z        }|j                  d       |S )Nz	TYPE=vfatzTYPE=iso9660zLABEL=%szLABEL_FATBOOT=%sT)reverse)r   find_devs_withextendupperlowerlistsetsort)r   labelfslist
label_listdevlists        r!   _get_deviceszDataSourceNoCloud._get_devices3   s    $$[1d)).9:((ekkm)CD
$--j5;;=.HIJ$--.@5.HIJs6{S_45T"r"   c                 	   d| j                   d}g }i ddd d}	 i }t        j                  d      }|r+t        ||      r|j	                  d       t        |d|i      }	 i }t        |      r|j	                  d
       t        |d|i      }ddgddgd}| j                  D ]M  }	 t        j                  |fi |}|j	                  |       t        j                  d|       t        ||      } n | j                  j                  d      r&|j	                  d       | j                  d   |d   d<   d| j                  v r5d| j                  v r't        || j                        }|j	                  d       d }	| j                  j                  dd      }
|
|
j!                         dk7  rt#        j$                  ddd       | j'                  |
      D ]e  }	 t        j                  d|       	 t        j(                  ||	|      }t        ||      }t        j                  d|       |j	                  |        n |sy	d|d   v r|d   d   }d	}| j4                  D ]  }|j7                  |      s|} n |s| j9                  |       y	t        j:                  |      }t        j<                  |d       \  }}}}t        j                  d |       t        j>                  |d   |g      |d<   ||d<   ||d<   |j	                  |       t        j>                  |d   |g      |d<   | jA                  |d   j                  d!      g      | _         | j                   tB        jD                  k(  r"t        j                  d"| | j                          y	d#jG                  |      | _$        |d   | _%        |d   | _&        |d   | _'        |d   | _(        |d   j                  d$      | _)        y%# t        $ r t        j                  t        d       Y y	w xY w# t        $ r t        j                  t        d       Y y	w xY w# t        $ r Y w xY w# t        $ r t        j+                  d||
       Y w xY w# t,        $ r)}|j.                  t.        j0                  k7  r Y d }~d }~wt        j2                  $ r t        j                  t        d|       Y w xY w)&Nr   )instance-idr)   r&   )	meta-data	user-datavendor-datanetwork-configsystem-serial-numberr   r<   zUnable to parse dmi dataFcmdlinez!Unable to parse command line datar=   r>   r?   )requiredoptionalzUsing seeded data from %sseedfromds_config_seedfrom	ds_configc                 .    t        j                  | fi |S N)r   pathprefix2dict)mpdatas     r!   _pp2d_callbackz3DataSourceNoCloud._get_data.<locals>._pp2d_callback   s    ''3d33r"   fs_labelcidatazCustom fs_label keys24.3z(This key isn't supported by ds-identify.
deprecateddeprecated_versionextra_messagezAttempting to use data from %sz)device %s with label=%s not a valid seed.zUsing data from %sz(Failed to mount %s when looking for data)timeoutzUsing seeded cache data from %sr)   z&%s: not claiming datasource, dsmode=%s,znetwork-interfacesT)*r)   r   read_dmi_dataload_cmdline_dataappend_merge_new_seed	Exceptionr   logexcLOGr   rI   debug
ValueErrords_cfggetr1   r   	deprecater9   mount_cbwarningOSErrorerrnoENOENTMountFailedErrorr   
startswith_log_unusable_seedfromsub_dmi_varsread_seededmergemanydict_determine_dsmoder   DSMODE_DISABLEDr   r   metadatauserdata_rawvendordata_rawr   r   )r   defaultsfoundmydatamdserialpp2d_kwargsr   seededrL   r5   deverD   	seedfoundprotomd_seedudvd_s                       r!   	_get_datazDataSourceNoCloud._get_data?   s   $kk

 "	

	 B&&'=>F+B7U#(+r1BC
	B $Y'(+r1BC %k2&(89

 NN 	D--dBkBT"		5t<(8	 ;;??:&LL-..2kk*.EF;
+ $++%+*D$VT[[9FLL%	4 
H5{{}(##5'-"L
 ((/ II>D
!!%" -VV<FII2C8LL%)>  ,,k*:6HI33 &&u- %I ++H5 ''1H "&!1!1(D!IGRQII7B #'"4"4$g.#F; #%F;$&F=!LL" #00K (+
{ ,,K $$X./
 ;;'111II8$ HHUO	{+";/$]3%&67";/334HIY  	KK78	  	KK@A	"  F & !G!
 !!  ww%,,. /,, KKGsy   AO# ,P $A	P5Q,,Q3Q,##P	P	#P21P25	QQ Q)%Q,(Q))Q,,	S5R1SSc                 l    | j                   st        j                         rdnd| _         | j                   S )Nlxdr   )_platform_typer   is_lxdr   s    r!   platform_typezDataSourceNoCloud.platform_type   s)    ""+/;;=%iD"""r"   rD   c                 H    t         j                  d| | j                  |       y)!Stage-specific level and message.zN%s only uses seeds starting with %s - will try to use %s in the network stage.N)r\   infor   r   rD   s     r!   ri   z(DataSourceNoCloud._log_unusable_seedfrom   s"    $&&	
r"   c                 "    t         j                  S )z=Return unknown when 'cloud-name' key is absent from metadata.)r   METADATA_UNKNOWNr   s    r!   _get_cloud_namez!DataSourceNoCloud._get_cloud_name   s    '''r"   c                 f    | j                   j                  d      rd}nd}|d| j                   dS )z/Return the subplatform metadata source details.z/devzconfig-diskzseed-dirz ())r   rh   )r   subplatform_types     r!   _get_subplatformz"DataSourceNoCloud._get_subplatform   s/    99',),dii88r"   c                     | j                         }|sy t        | d| j                  g      }t        |      }|sy ||k(  S )Nr   )dirs)get_instance_idgetattrr   _quick_read_instance_id)r   r   currentr   quick_ids        r!   check_instance_idz#DataSourceNoCloud.check_instance_id   sI     &&( t[4==/:*57""r"   c                     | j                   H| j                  <t        j                  ddd       t	        j
                  | j                        | _         | j                   S )Nz$Eni network configuration in NoCloudrO   z,You can use network v1 or network v2 insteadrP   )r   r   r   ra   r   convert_eni_datar   s    r!   network_configz DataSourceNoCloud.network_config  sX    '  ,##E'-F	 (+';';D<M<M'N$###r"   )__name__
__module____qualname__dsnamer   r(   r9   r   propertyr   strri   r   r   r   r   __classcell__)r+   s   @r!   r
   r
      sa    F
!

bH # #

s 
(9# $ $r"   r
   c                     | g } d}i }t        |      r	||v r||   S | D ]C  }|	 t        j                  |dg      }t        j                  |d         }|r||v r||   c S E y # t        $ r Y Rw xY w)Nr;   r<   )rB   )rW   r   rI   	load_yamlr^   )r   iid_keyfilldrK   ru   s         r!   r   r     s    |GD7d?G} 	9	''[MBD[ 12Bgm'{"	   		s   :A&&	A21A2c                 R   dt         j                  fdt         j                  fg}|D ]~  \  }}t        || |      sd| v r y| j	                  d      }|rL|j                  d      rt         j                  | d<    y|j                  d      rt         j                  | d<    y|| d<    y y)	Nz
ds=nocloudzds=nocloud-netr)   TrD   zhttp://zhttps://zftp://zftps://)r   r   F)r   DSMODE_LOCALr*   parse_cmdline_datar`   rh   )r   rA   pairsidstrr)   rD   s         r!   rW   rW   4  s    	w++,	7112E  v!%w7t 88J'""< ")!7!7X  $$%56!(!5!5X  $DN'( r"   c                    |t        j                         }d|z  }d| z  |v sd| z  |v syd}|j                         D ]&  }|j                  |       s|j                  dd      }( |d   j                  d      }t	        |      dkD  r|dd  }nd}d	d
dd}|D ],  }|dk(  r		 |j                  dd      \  }	}
|	|v r||	   }	|
||	<   . y# t
        $ r |}	d }
Y  w xY w)Nz %s z %s;Fr&   =   ; zlocal-hostnamer;   rD   )hisT)r   get_cmdlinesplitrh   lenrZ   )ds_idr   rA   arglinetoktmpkvpairss2litemkvs              r!   r   r   U  s   ""$wGUNg%%7)BG }} (>>% iiQ'G( !*

3
C
3x!|ab' !}:
FC 
2:	ZZQ'FQ 8AAQ
   	AA	s   "CCCc                 z   | j                         }|j                  di       }t        |d   t              st	        j
                  |d         }t	        j                  | d   |g      |d<   |j                  d      r't	        j
                  |j                  d            |d<   d|v r|d   |d<   d|v r|d   |d<   |S )Nr<   r?   r=   r>   )copyr`   
isinstancedictr   r   rl   )currx   retnewmds       r!   rY   rY   }  s    
((*CJJ{B'Ef[)40vk23))3{+;U*CDCzz"# $vzz:J/K Lf!+.K#M2MJr"   c                   $    e Zd Zd ZdefdZd Zy)DataSourceNoCloudNetc                 B    t         j                  | |||       d| _        y )Nr   )r
   r   r   r   s       r!   r   zDataSourceNoCloudNet.__init__  s     ""4&%@&
"r"   rD   c                 H    t         j                  d| | j                  |       y)r   z6%s only uses seeds starting with %s - %s is not valid.N)r\   rc   r   r   s     r!   ri   z+DataSourceNoCloudNet._log_unusable_seedfrom  s     D&&		
r"   c                    t        t        j                  ddd      }dt        j                         k(  r |        yt        j
                  t        j                  d      xs d      j                         }|| j                  j                         dfv r#t        j                  d	|        |dk(  r |        y| j                  j                  d
i       j                  di       j                  d      rt        j                  d|        yy)zCheck dmi and kernel command line for dsname

        NoCloud historically used "nocloud-net" as its dsname
        for network timeframe (DEP_NETWORK), which supports http(s) urls.
        For backwards compatiblity, check for that dsname.
        z!The 'nocloud-net' datasource namez24.1zgUse 'nocloud' instead, which uses the seedfrom protocolscheme (http// or file://) to decide how to run.rP   r   Tr@   r&   zJMachine is configured by dmi serial number to run on single datasource %s.
datasourcer   rD   zMMachine is configured by system configuration to run on single datasource %s.F)r   r   ra   r   parse_cmdlineparse_cmdline_or_dmir   rV   r1   r   r\   r]   r   r`   )r   log_deprecatedrv   s      r!   	ds_detectzDataSourceNoCloudNet.ds_detect  s     !:%C
 G1133--45;

%' 	 dkk'')=99II(
 & LL\2.SBS_ II(
 r"   N)r   r   r   r   r   ri   r   r   r"   r!   r   r     s    

s 
-r"   r   c                 6    t        j                  | t              S rH   )r   list_from_dependsdatasources)dependss    r!   get_datasource_listr     s    $$Wk::r"   __main__)argv)levelr   zseeded: zud: zvd: z	network: rH   )%re   loggingr   	functoolsr   	cloudinitr   r   r   r   cloudinit.netr   	getLoggerr   r\   r   r
   r   rW   r   rY   r   DEP_FILESYSTEMDEP_NETWORKr   r   sysr   basicConfigDEBUGrD   rk   r}   r~   r   networkprintr   r"   r!   <module>r      s%     	  3 3 g!D$** D$N.B%P$@, @J //12G22G4G4GHI; zGgmm,AwH/t//9GRW	HWI
	D+	D+	IgY
  r"   