o
    th                  
   @   s  U d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ e eZdZd	Zd
ZdddddZdZdZddgeegdZe
ed< deddfddZdefddZdeeef dededdfdd Zd!ededdfd"d#Zd$ededed%eddf
d&d'Z dS )(    N)Union)subp)Cloud)Config)
MetaSchema)PER_INSTANCErpi
interfacesenable_rpi_connectdo_spido_i2c	do_serial
do_onewire)spii2cserialonewiredo_serial_consdo_serial_hwcc_raspberry_pizraspberry-pi-os)iddistros	frequencyactivate_by_schema_keysmetaenablereturnc              
   C   sh   t d|  | r
dnd}ztddt|g W d S  tjy3 } zt d| W Y d }~d S d }~ww )NzConfiguring rpi-connect: %sr      /usr/bin/raspi-configdo_rpi_connectz#Failed to configure rpi-connect: %s)LOGdebugr   strProcessExecutionErrorerror)r   nume r'   B/usr/lib/python3/dist-packages/cloudinit/config/cc_raspberry_pi.pyconfigure_rpi_connect%   s   r)   c                   C   s,   z
t  g d W dS  t jy   Y dS w )N)r   nonint	is_pifiveTF)r   r#   r'   r'   r'   r(   r+   0   s   r+   cfginstCfgcloudc              
   C   s$  ddt dtfdd}d}d}t| t r|| d}|| d}nt| tr%| }t s,|r,d}zKtd	d
tt|r7dndg ztd	d
tt|rGdndg W n tjyf } zt	
d| W Y d }~nd }~ww |jjdddd}t| W d S  tjy } zt	
d| W Y d }~d S d }~ww )NFcfg_dictnamec                 S   s.   |  ||}t|tstdt|| |S |S )Nz"Invalid value for %s.serial.%s: %s)get
isinstanceboolr    warningRPI_INTERFACES_KEY)r/   r0   defaultvalr'   r'   r(   get_bool_field;   s   
z2configure_serial_interface.<locals>.get_bool_fieldconsolehardwareTr   r*   r   r   z'Failed to configure serial hardware: %srebootnowz)Rebooting to apply serial console changes)modedelaymessagez&Failed to configure serial console: %s)F)dictr"   r2   r3   r+   r   RASPI_CONFIG_SERIAL_CONS_FNRASPI_CONFIG_SERIAL_HW_FNr#   r    r$   distroshutdown_command)r,   r-   r.   r8   enable_console	enable_hwr&   cmdr'   r'   r(   configure_serial_interface8   sP   



	rH   ifacec              
   C   s   | t  v r
| dksJ d|  ztddt |  t|rdndg W d S  tjy@ } ztd| | W Y d }~d S d }~ww )Nr   zUnsupported interface: r   r*   r   r   zFailed to configure %s: %s)SUPPORTED_INTERFACESkeysr   r"   r#   r    r$   )rI   r   r&   r'   r'   r(   configure_interfacez   s   
rL   r0   argsc                 C   s  t |vrd S t|t  tstdt |t   d S |t  s$tdt  d S |t  D ]}|tkrF|t  | }t|tr>t| ntdt| q(|t	krt|t  | tsatdt |t  |   d S |t  | sptd|  d S t
|t  |  }d|v r|||d |D ]F}|t vrtdt	| q|t  | | }|dkrt|ttfstdt	|| nt||| qt|trt|| qtdt	|| qq(td| q(d S )NzInvalid value for %s: %szEmpty value for %s. Skipping...r   zInvalid key for %s: %szInvalid value for %s.%s: %szUnsupported key: %s)RPI_BASE_KEYr2   r@   r    r4   r!   ENABLE_RPI_CONNECT_KEYr3   r)   r5   listrK   appendpopindexrJ   rH   rL   )r0   r,   r.   rM   keyr   subkeyssubkeyr'   r'   r(   handle   s   



rW   )!loggingtypingr   	cloudinitr   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.settingsr   	getLogger__name__r    rN   r5   rO   rJ   rA   rB   r   __annotations__r3   r)   r+   r@   rH   r"   rL   rP   rW   r'   r'   r'   r(   <module>   sH   



B"