
    x[h              
       6   % S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	/\S
/S.r\\S'   \R                   " \5      r\" / SQ5      rSrSrSrS\4S jrS\4S jrS\S\4S jrS\4S jrS\4S jrS\4S jrS r S\!S\	S\S\SS4
S jr"g) 	Wireguard    N)subputil)Cloud)Config)
MetaSchema)PER_INSTANCEcc_wireguardubuntu	wireguard)iddistros	frequencyactivate_by_schema_keysmeta)nameconfig_pathcontenti  
)      wg_intc                    / n[         R                  [        U R                  5       5      5      nU(       a.  SR	                  [        U5      5      nUR                  SU 35        [        U R                  5       5       HG  u  pEUS:X  d  US:X  d  US:X  d  M  [        U[        5      (       a  M0  UR                  SU SU 35        MI     U(       a'  [        S[         [        R	                  U5       35      eg	)
a>  Validate user-provided wg:interfaces option values.

This function supplements flexible jsonschema validation with specific
value checks to aid in triage of invalid user-provided configuration.

@param wg_int: Dict of configuration value under 'wg:interfaces'.

@raises: ValueError describing invalid values provided.
z, z%Missing required wg:interfaces keys: r   r   r   z$Expected a string for wg:interfaces:. Found z*Invalid wireguard interface configuration:N)REQUIRED_WG_INT_KEYS
differencesetkeysjoinsortedappenditems
isinstancestr
ValueErrorNL)r   errorsmissingr   keyvalues         ?/usr/lib/python3/dist-packages/cloudinit/config/cc_wireguard.pysupplemental_schema_validationr,      s     F"--c&++-.@AGyy)=dVDEV\\^,
&=C=0C94DeS)):3%xwO - 8RWWV_<MN
 	
     c           
         [         R                  SU S   5         [         R                  SU S   5        [        R                  " U S   U S   [        S9  g	! [
         a)  n[        SU S    S[         [        U5       35      UeS	nAff = f)
zWriting user-provided configuration into Wireguard
interface configuration file.

@param wg_int: Dict of configuration value under 'wg:interfaces'.

@raises: RuntimeError for issues writing of configuration file.
z"Configuring Wireguard interface %sr   z#Writing wireguard config to file %sr   r   )modez-Failure writing Wireguard configuration file :N)	LOGdebugr   
write_fileWG_CONFIG_FILE_MODE	ExceptionRuntimeErrorr&   r$   )r   es     r+   write_configr8   ;   s     II2F6NC			79NO=!6)#4;N	
  }%&atCF85
 	s   9A 
B$BBcloudc                 f    [         R                  SU S   5        UR                  R                  SSU S    35        [         R                  SU S   5        UR                  R                  SSU S    35        g! [        R
                   a#  n[        S[         [        U5       35      UeSnAff = f)	zEnable and start Wireguard interface

@param wg_int: Dict of configuration value under 'wg:interfaces'.

@raises: RuntimeError for issues enabling WG interface.
zEnabling wg-quick@%s at bootr   enablez	wg-quick@z!Bringing up interface wg-quick@%srestartz0Failed enabling/starting Wireguard interface(s):N)	r1   r2   distromanage_servicer   ProcessExecutionErrorr6   r&   r$   )r   r9   r7   s      r+   	enable_wgr@   P   s    		0&.A##H	&.9I.JK		5vf~F##I6&>:J/KL%% >rd3q6(K
	s   A6A9 9B0B++B0wg_readinessprobesc                     / nSnU  H6  n[        U[        5      (       a  M  UR                  SU SU 35        US-  nM8     U(       a'  [        S[         [        R                  U5       35      eg)zBasic validation of user-provided probes

@param wg_readinessprobes: List of readinessprobe probe(s).

@raises: ValueError of wrong datatype provided for probes.
r   z(Expected a string for readinessprobe at r      z Invalid readinessProbe commands:N)r#   r$   r!   r%   r&   r   )rA   r'   poscs       r+   !readinessprobe_command_validationrF   b   sz     F
C!S!!MM:3%xsK 1HC   .rd2776?2CD
 	
 r-   c                 R   / nU  H9  n [         R                  S[        U5      5        [        R                  " USSS9  M;     U(       a'  [        S[         [        R                  U5       35      eg! [        R                   a!  nUR                  U SU 35         SnAM  SnAff = f)zExecute provided readiness probe(s)

@param wg_readinessprobes: List of readinessprobe probe(s).

@raises: ProcessExecutionError for issues during execution of probes.
zRunning readinessprobe: '%s'Tcaptureshellz: Nz&Failed running readinessprobe command:)	r1   r2   r$   r   r?   r!   r6   r&   r   )rA   r'   rE   r7   s       r+   readinessproberK   x   s     F	'II4c!f=IIaT2   4RD8IJ
 	
  )) 	'MMQCr!+&&	's   5A11B&B!!B&c                    S/n[         R                  " S5      (       a  g[        R                  " 5       [        :  a  UR                  S5         U R                  R                  5          U R                  R                  U5        g! [         a    [        R                  " [        S5        e f = f! [         a    [        R                  " [        S5        e f = f)z}Install wireguard packages and tools

@param cloud: Cloud object

@raises: Exception for issues during package
installation.
zwireguard-toolswgNr   zPackage update failedz!Failed to install wireguard-tools)r   whichr   kernel_versionMIN_KERNEL_VERSIONr!   r=   update_package_sourcesr5   logexcr1   install_packages)r9   packagess     r+    maybe_install_wireguard_packagesrU      s     ""Hzz$ 11$++-%%h/	  C01
  C<=s   B *B0 'B-0'Cc            	          [         R                   " SSSS9n [        R                  " SU R                  R	                  5       5      (       d,  [
        R                  S5        [         R                   " SSSS9  gg! [         R                   a3  n[        R                  " [
        S[         [        U5       35        e SnAff = f)	zQLoad wireguard kernel module

@raises: ProcessExecutionError for issues modprobe
lsmodTrH   r   zLoading wireguard kernel modulezmodprobe wireguardz Could not load wireguard module:N)r   researchstdoutstripr1   r2   r?   r   rR   r&   r$   )outr7   s     r+   load_wireguard_kernel_moduler]      s    
iiT:yycjj&6&6&899II78II*DE : %% C;B4AxHIs   A5A9 9C .B;;C r   cfgargsreturnc                 v   S nSU;   a  [         R                  S5        US   nO[         R                  SU 5        g [        U5        [        5         US    H$  n[	        U5        [        U5        [        XR5        M&     SU;   a"  US   b  US   n[        U5        [        U5        g [         R                  S5        g )Nr   z!Found Wireguard section in configz<Skipping module named %s, no 'wireguard' configuration found
interfacesrK   z+Skipping readinessprobe - no checks defined)	r1   r2   rU   r]   r,   r8   r@   rF   rK   )r   r^   r9   r_   
wg_sectionr   rA   s          r+   handlerd      s    Jc		56%
		J	
 	 %U+ "\*&v. 	V 	&  + 	J&'(4'(89)*<=)*		?@r-   )#__doc__loggingrX   	cloudinitr   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.settingsr	   r   __annotations__	getLogger__name__r1   	frozensetr   r4   r&   rP   dictr,   r8   r@   listrF   rK   rU   r]   r$   rd    r-   r+   <module>rs      s      	   ! # . + z +}	j  ! !CD  	 
4 
: *d 5 $
$ 
,
t 
*E <$A $A6 $A% $At $A $Ar-   