U
    lHJe_                     @   sz  d dl Z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mZmZmZmZmZ dZdddgZdZd	Zd
ZdZe ZeeeZeddefdefdefdefdefgZedddZ edddZ!d-e	e e	e e	ee"  ddddZ#d.ee	ee"  ddddZ$ee	e dddZ%ee dd d!Z&d"d# Z'd$d% Z(d/ee	e ed'd(d)Z)eed*d+d,Z*dS )0    N)List
NamedTupleOptional)aptevent_logger
exceptionsmessagessystemutilz/usr/bin/snapg      ?g      ?g      @z
proxy.httpzproxy.httpsz/run/snapd.socketz/v2/snaps/{}SnapPackagenameversionrevisionchannel	publisher)returnc                   C   s   dt  kS )z(Returns whether or not snap is installedsnapd)r   Zget_installed_packages_names r   r   //usr/lib/python3/dist-packages/uaclient/snap.pyis_snapd_installed!   s    r   c                   C   s   t dd t D S )z3Returns whether or not snapd is installed as a snapc                 s   s   | ]}|j d kV  qdS )r   Nr   ).0snapr   r   r   	<genexpr>(   s     z/is_snapd_installed_as_a_snap.<locals>.<genexpr>)anyget_installed_snapsr   r   r   r   is_snapd_installed_as_a_snap&   s    r   )
http_proxyhttps_proxyretry_sleepsr   c                 C   st   t  std dS | s|r0ttjjdd | rPtj	dddd| g|d |rptj	dddd	|g|d dS )
a  
    Configure snap to use http and https proxies.

    :param http_proxy: http proxy to be used by snap. If None, it will
                       not be configured
    :param https_proxy: https proxy to be used by snap. If None, it will
                        not be configured
    :param retry_sleeps: Optional list of sleep lengths to apply between
        retries. Specifying a list of [0.5, 1] tells subp to retry twice
        on failure; sleeping half a second before the first retry and 1 second
        before the second retry.
    z6Skipping configure snap proxy. snapd is not installed.Nr   )servicesetr	   zproxy.http={}r   zproxy.https={})
r   LOGdebugeventinfor   ZSETTING_SERVICE_PROXYformatr	   subp)r   r   r   r   r   r   configure_snap_proxy+   s    
r)   )protocol_typer   r   c                 C   s4   t  std dS tjdddd| g|d dS )a  
    Unset snap configuration settings for http and https proxies.

    :param protocol_type: String either http or https
    :param retry_sleeps: Optional list of sleep lengths to apply between
        retries. Specifying a list of [0.5, 1] tells subp to retry twice
        on failure; sleeping half a second before the first retry and 1 second
        before the second retry.
    z8Skipping unconfigure snap proxy. snapd is not installed.Nr   Zunsetr	   zproxy.{}r"   )r   r#   r$   r	   r(   r'   )r*   r   r   r   r   unconfigure_snap_proxyP   s    
r+   )keyr   c                 C   s>   z t ddd| g\}}| W S  tjk
r8   Y dS X dS )z
    Gets the config value from snap.
    :param protocol: can be any valid snap config option
    :return: the value of the snap config option, or None if not set
    r   getr	   N)r	   r(   stripr   ProcessExecutionError)r,   out_r   r   r   get_config_option_valuee   s
    
r2   c                  C   sZ   t ddddddg\} }|  }|dd  }g }|D ]}| d }|t| q6|S )Nr   listz--colorneverz	--unicode   r   )r	   r(   
splitlinessplitappendget_snap_info)r0   r1   ZappsZsnapsliner   r   r   r   r   r   s    r   c               
   C   s   t tjjdd ztd W n4 tjk
rV }  zt	
dt|  W 5 d } ~ X Y nX ztjddddgtjd	 W n tjk
r   t Y nX d S )
Nzstandard Ubuntur   z/etc/apt/sources.listz<Trying to install snapd. Ignoring apt-get update failure: %szapt-getinstallz--assume-yesr   r"   )r%   r&   r   ZAPT_UPDATING_LISTr'   r   Zupdate_sources_listr   ZUbuntuProErrorr#   r$   strr	   r(   ZAPT_RETRIESr/   ZCannotInstallSnapdErrorer   r   r   install_snapd   s    

r?   c               
   C   sr   zt jtdddgdd W nR tjk
rl }  z2tdt|  rZt	
d ttj n W 5 d } ~ X Y nX d S )Nwaitr	   zseed.loadedT)capturezunknown command .*waitz9Detected version of snapd that does not have wait command)r	   r(   SNAP_CMDr   r/   researchr<   lowerr#   warningr%   r&   r   ZSNAPD_DOES_NOT_HAVE_WAIT_CMDr=   r   r   r   run_snapd_wait_cmd   s    rG   F)r   r   classic_confinement_supportc                 C   s@   t d| g}|r|dg7 }|r,|d|g7 }tj|dtd d S )Nr;   z	--classicz--channel={}T)rA   r   )rB   r'   r	   r(   SNAP_INSTALL_RETRIES)r   r   rH   cmdr   r   r   install_snap   s    

rK   )r   r   c           
   
   C   s  t  t jt j}|t tjd}||_t	
| }zz|dt	
|  | }| d}zt|}W nJ tjk
r } z*tjd|||d tjd
||dW 5 d }~X Y nX |jdkr|jd	kr|d
i ddkrtj| dn|d
i d}tj|dW n tk
r6   t Y nX W 5 |  |  X |d
i }	t|	dd|	dd|	dd|	dd|	di dddS )NZ	localhostZGETzutf-8z]JSONDecodeError while parsing result of snap api call to %s, returning None. output was: "%s")exc_infozSNAPD API {})sourcer0      i  resultZkindzsnap-not-found)r   message)errorr    r   r   r   r   Zusername)r   r   r   r   r   )socketZAF_UNIXZSOCK_STREAMZconnectSNAPD_SOCKET_PATHhttpZclientZHTTPConnectionZsockSNAPD_SNAPS_APIr'   closeZrequestZgetresponsereaddecodejsonloadsZJSONDecodeErrorr#   rF   r   ZInvalidJsonZstatusr-   ZSnapNotInstalledErrorZUnexpectedSnapdAPIErrorConnectionRefusedErrorZSnapdAPIConnectionRefusedr   )
r   Z	snap_sockZconnZurlZresponser0   datar>   Z	error_msgZ	snap_infor   r   r   r9      sT    

 




r9   )NNN)N)NF)+Zhttp.clientrU   rZ   ZloggingrC   rS   typingr   r   r   Zuaclientr   r   r   r   r	   r
   rB   rI   ZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONrT   rV   Zget_event_loggerr%   Z	getLoggerZreplace_top_level_logger_name__name__r#   r<   r   boolr   r   floatr)   r+   r2   r   r?   rG   rK   r9   r   r   r   r   <module>   sh    
   
&  
  