
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Ö;jÃ  ã               @   s®   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mZm	Z	m
Z
 ddlmZ d ZdZdZejjejdƒZdZG d	d
„ d
eƒZeƒ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    Né   )ÚconfigÚ	constantsÚ
http_utilsÚ	log_utilsÚserveridÚutils)Újson_loads_nstré   zipv6_preference.jsoné   é<   c               @   s,   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdS )ÚIPProtoSelectorc             C   sb  t jrtjdƒ dS t jjdƒs.tjdƒ dS t jrBtjdƒ dS tƒ }|dk	rltjdj|r`dnd	ƒƒ |S d}| j	t j
ƒsŒtjd
ƒ d}n2| j	t jƒs¨tjdƒ d}ntjƒ r¾tjdƒ d}|dk	rÒt|ƒ |S | jdd�}| jdd�}|tk�rtjdƒ d}nR|tk�rtjdƒ d}n8|tk�r8tjdƒ d}n|tk�rRtjdƒ d}nd}t|ƒ |S )ak  
        Choose ipv6 if it is more suitable.
        Checks order:
        - check config values (it is faster) - eportal setup and FORCE_IPVx
        - then check each proto availability using HEAD requests
        - then check if we have server_id, it means we don't expect an ip license
        - and finally we need to check if there is an ip license
        z,decided to use ipv4 because of config valuesFzkernelcare.comz,decided to use ipv6 because of config valuesTNz%decided to use {0} from on-disk cacheÚipv6Zipv4z1decided to use ipv4 because ipv6 is not availablez1decided to use ipv6 because ipv4 is not availablez/decided to use ipv4 because server id was found)r   z2decided to use ipv4 because ipv4 license was foundz2decided to use ipv6 because ipv6 license was foundz8decided to use ipv4 because ipv4 trial license was foundz8decided to use ipv6 because ipv6 trial license was found)r   Ú
FORCE_IPV4r   ÚlogdebugÚPATCH_SERVERÚendswithÚ
FORCE_IPV6Ú_read_cacheÚformatÚ_is_url_reachableÚPATCH_SERVER_IPV6r   Úget_serveridÚ_write_cacheÚ_get_cln_licenseÚCLN_VALID_LICENSEÚCLN_TRIAL_ACTIVE_LICENSE)ÚselfÚcachedÚresultZipv4_licenseZipv6_license© r    ú2/usr/libexec/kcare/python/kcarectl/ipv6_support.pyÚis_ipv6_preferred   sV    













z!IPProtoSelector.is_ipv6_preferredc             C   sb   t j| dd d�}yt j|dddd� dS  tk
r\ } ztjdj| t|ƒƒƒ dS d }~X nX d S )	NÚHEAD)ÚmethodÚauth_stringé
   Fé   )ÚtimeoutÚretry_on_500Úretry_countTz%error during HEAD request to {0}: {1})r   Úhttp_requestÚurlopenÚ	Exceptionr   r   r   Ústr)ÚurlÚrequestÚer    r    r!   r   `   s    z!IPProtoSelector._is_url_reachablec             C   sˆ   | r
t jnt j}|d }tjtj|dd�jƒ ƒ}tj|ƒ}| sL|j	dƒ rbt
jjdj|ƒƒ tS yt|d ƒS  tk
r‚   tS X d S )Nz/check.plainF)r)   ÚcodezUnexpected CLN response: {0})r   ÚREGISTRATION_URL_IPV6ÚREGISTRATION_URLr   Únstrr   r,   ÚreadÚdata_as_dictÚgetr   ÚkcarelogÚerrorr   ÚCLN_NO_LICENSEÚintÚ
ValueError)r   Zbase_urlr/   ÚcontentÚinfor    r    r!   r   k   s    
z IPProtoSelector._get_cln_licenseN)Ú__name__Ú
__module__Ú__qualname__r"   Ústaticmethodr   r   r    r    r    r!   r      s   Ar   c              C   s  t jtƒ} | sd S yt| ƒ}W n, ttfk
rJ   tjdj| ƒdd� d S X t	|t
ƒsntjdj|ƒdd� d S |jdƒ}t	|tƒsštjdj|ƒdd� d S |jdƒ}t	|tjƒ s¼t	|tƒrÔtjdj|ƒdd� d S tjƒ t|ƒ }|d	k pò|tk�rtjd
j|tƒƒ d S |S )Nz+ipv6 preference cache: malformed json {0!r}F)Ú	print_msgz/ipv6 preference cache: unexpected payload {0!r}Úprefer_ipv6z3ipv6 preference cache: unexpected prefer_ipv6 {0!r}Útsz)ipv6 preference cache: malformed ts {0!r}r   z;ipv6 preference cache: stale entry (age={0:.0f}s, ttl={1}s))r   Útry_to_readÚ
CACHE_FILEr	   r=   Ú	TypeErrorr   Úlogwarnr   Ú
isinstanceÚdictr8   ÚboolÚnumbersZIntegralÚtimer<   ÚCACHE_TTL_SECONDSr   )r>   ÚdatarE   Z	cached_tsZager    r    r!   r   ƒ   s0    




r   c             C   sl   | t tjƒ ƒdœ}ytjttj|ƒdd� W n: ttfk
rf } zt	j
dj|ƒdd� W Y d d }~X nX d S )N)rE   rF   T)Ú
ensure_dirz*failed to write ipv6 preference cache: {0}F)rD   )r<   rO   r   Úatomic_writerH   ÚjsonÚdumpsÚOSErrorÚIOErrorr   rJ   r   )r   rQ   r1   r    r    r!   r   ª   s    r   c               C   s(   yt jtƒ W n tk
r"   Y nX dS )z'Drop the on-disk ipv6 preference cache.N)ÚosÚunlinkrH   rV   r    r    r    r!   Úclear_cache¶   s    rZ   c               C   s   t jƒ rtjS tjS )N)Úip_proto_selectorr"   r   r   r   r    r    r    r!   Úget_patch_server¿   s    r\   c               C   s   t jƒ rtjS tjS )N)r[   r"   r   r3   r4   r    r    r    r!   Úget_registration_urlÄ   s    r]   i   i€Q )rT   rN   rX   rO   Ú r   r   r   r   r   r   Úpy23r	   r   r   r;   ÚpathÚjoinÚPATCH_CACHErH   rP   Úobjectr   r[   r   r   rZ   r\   r]   r    r    r    r!   Ú<module>   s"    b'	