U
    Jh                     @   s  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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d1ee ee eee   ddddZ!d2eeee   ddddZ"eee dddZ#ee dd d!Z$d"d# Z%ej&d$d%d&Z'd3eee ed(d)d*Z(ed+d,d-Z)eed.d/d0Z*dS )4    N)List
NamedTupleOptional)apiaptevent_logger
exceptionshttp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_proxy1   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_proxyV   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_valuek   s
    
r4   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)r2   r3   ZappsZsnapsliner   r   r   r   r   x   s    r   c               
   C   s   t tjjdd ztt  W n4 tj	k
rZ }  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<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_listZget_system_sources_filer   ZUbuntuProErrorr%   r&   strr   r*   ZAPT_RETRIESr1   ZCannotInstallSnapdError)er   r   r   install_snapd   s    

r@   )progressc              
   C   st   zt jtdddgdd W nT tjk
rn } z4tdt| r\t	
d | d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 commandr(   )r   r*   SNAP_CMDr   r1   researchr>   lowerr%   Zwarningemitr
   ZSNAPD_DOES_NOT_HAVE_WAIT_CMD)rA   r?   r   r   r   run_snapd_wait_cmd   s    rJ   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)rD   r!   )rE   r)   r   r*   SNAP_INSTALL_RETRIES)r   r   rK   cmdr   r   r   install_snap   s    

rN   r   c                 C   s   t jtd| gdd d S )NZrefreshTrC   )r   r*   rE   rO   r   r   r   refresh_snap   s    rP   )r   r   c              	   C   s   t | }zlttd|}|jdkrt|jdkrT|jdi ddkrTtj	| dn |jdi d}tj
|d	W n tk
r   t Y nX |jdi }t|d
d|dd|dd|dd|di dddS )NZGET   i  resultZkindzsnap-not-foundrO   message)errorr    r   r   r   r   Zusername)r   r   r   r   r   )SNAPD_SNAPS_APIr)   r	   Zunix_socket_requestSNAPD_SOCKET_PATHcodeZ	json_dictr/   r   ZSnapNotInstalledErrorZUnexpectedSnapdAPIErrorConnectionRefusedErrorZSnapdAPIConnectionRefusedr   )r   ZurlZrespZ	error_msgZ	snap_infor   r   r   r;      s.    





r;   )NNN)N)NF)+ZloggingrF   typingr   r   r   Zuaclientr   r   r   r   r	   r
   r   r   rE   rL   ZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONrW   rV   Zget_event_loggerr'   Z	getLoggerZreplace_top_level_logger_name__name__r%   r>   r   boolr   r   floatr+   r-   r4   r   r@   ZProgressWrapperrJ   rN   rP   r;   r   r   r   r   <module>   sd   (
   
&  
  