U
    2d                     @   sl  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 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 ).    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   )
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.Nsnap)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_proxyK   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_value`   s
    
r,   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)r*   r+   ZappsZsnapsliner   r   r   r   get_installed_snapsm   s    r5   c               
   C   s   t tj zt  W n4 tjk
rL }  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<Trying to install snapd. Ignoring apt-get update failure: %szapt-getinstallz--assume-yesr   r   )r   r    r   ZAPT_UPDATING_LISTSr   Zrun_apt_update_commandr   ZUserFacingErrorr   r   strr	   r"   ZAPT_RETRIESr)   ZCannotInstallSnapdErrorer   r   r   install_snapd{   s    

r:   c               
   C   sh   zt jtdddgdd W nH tjk
rb }  z(tdt|  rPt	
tj n W 5 d } ~ X Y nX d S )Nwaitr	   zseed.loadedT)capturezunknown command .*wait)r	   r"   SNAP_CMDr   r)   researchr7   lowerr   warningr   ZSNAPD_DOES_NOT_HAVE_WAIT_CMDr8   r   r   r   run_snapd_wait_cmd   s    rB   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 )Nr6   z	--classicz--channel={}T)r<   r   )r=   r!   r	   r"   SNAP_INSTALL_RETRIES)r   r   rC   cmdr   r   r   install_snap   s    

rF   )r   r   c           	      C   s  t  t jt j}|t tjd}||_t	
| }zz|dt	
|  | }| d}zt|}W nV tjk
r   t $ ttjj
d
||dj W 5 Q R X tj||dY nX |jdkr"|jdkr|d	i d
dkrt| n|d	i d}t|W n t k
rB   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SNAPD API {})sourcer*   )urlr*      i  resultZkindzsnap-not-foundmessager    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
   Zdisable_log_to_consoler   rA   r   ZJSON_PARSER_ERRORmsgr   ZSnapdInvalidJsonZstatusr'   ZSnapNotInstalledErrorZUnexpectedSnapdAPIErrorConnectionRefusedErrorZSnapdAPIConnectionRefusedr   )	r   Z	snap_sockZconnrH   Zresponser*   dataZ	error_msgZ	snap_infor   r   r   r3      sP    







r3   )NNN)N)NF)*Zhttp.clientrO   rT   Zloggingr>   rM   typingr   r   r   Zuaclientr   r   r   r   r	   r
   r=   rD   ZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONrN   rP   Zget_event_loggerr   Z	getLoggerZreplace_top_level_logger_name__name__r   r7   r   boolr   floatr#   r%   r,   r5   r:   rB   rF   r3   r   r   r   r   <module>   sf    
   
&  
  