
Ke_              
   @   s(  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 j   Z e j e j 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 d 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 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  j   k S)z(Returns whether or not snap is installedsnapd)r   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   s   t    s t j d  d S|  s& | rB t j t j j d d   |  rp t j	 d d d d j |   g d | | r t j	 d d d d	 j |  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servicer   setr	   zproxy.http={}r   zproxy.https={})
r   LOGdebugeventinfor   SETTING_SERVICE_PROXYformatr	   subp)r   r   r   r   r   r   configure_snap_proxy+   s    	r)   )protocol_typer   r   c             C   sF   t    s t j d  d St j d d d d j |   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   sO   y/ t  j d d d |  g  \ } } | j   SWn t j k
 rJ d SYn Xd 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   s   t  j d d d d d d g  \ }  } |  j   } | d d   } g  } x1 | D]) } | j   d } | j t |   qP W| S)Nr   listz--colorZneverz	--unicode   r   )r	   r(   
splitlinessplitappendget_snap_info)r0   r1   appsZsnapsliner   r   r   r   r   r   s    !r   c              C   s   t  j t j j d d   y t j d  Wn> t j k
 rm }  z t	 j
 d t |    WYd  d  }  ~  Xn Xy& t j d d d d g d	 t j Wn! t j k
 r t j    Yn Xd  S)
Nr   zstandard Ubuntuz/etc/apt/sources.listz<Trying to install snapd. Ignoring apt-get update failure: %szapt-getinstallz--assume-yesr   r   )r$   r%   r   APT_UPDATING_LISTr'   r   update_sources_listr   UbuntuProErrorr"   r#   strr	   r(   APT_RETRIESr/   CannotInstallSnapdError)er   r   r   install_snapd   s     rC   c              C   s   y# t  j t d d d g d d Wni t j k
 r }  zF t j d t |   j    ry t	 j
 d  t j t j  n   WYd  d  }  ~  Xn Xd  S)Nwaitr	   zseed.loadedcaptureTzunknown command .*waitz9Detected version of snapd that does not have wait command)r	   r(   SNAP_CMDr   r/   researchr?   lowerr"   warningr$   r%   r   SNAPD_DOES_NOT_HAVE_WAIT_CMD)rB   r   r   r   run_snapd_wait_cmd   s    #rL   F)r   r   classic_confinement_supportc             C   s[   t  d |  g } | r" | d g 7} | r> | d j |  g 7} t j | d d d t d  S)Nr;   z	--classicz--channel={}rE   Tr   )rF   r'   r	   r(   SNAP_INSTALL_RETRIES)r   r   rM   cmdr   r   r   install_snap   s    rP   )r   r   c       
   '   C   sB  t  j  t  j t  j  } | j t  t j j d  } | | _ t	 j
 |   } z\y7| j d t	 j
 |    | j   } | j   j d  } y t j |  } Wnb t j k
 r} z? t j d | | d | t j d d j
 |  d |   WYd  d  } ~ Xn X| j d	 k r| j d
 k r[| j d i   j d  d k r[t j d |    n- | j d i   j d  } t j d |   Wn t k
 rt j    Yn XWd  | j   | j   X| j d i   }	 t d |	 j d d  d |	 j d d  d |	 j d d  d |	 j d d  d |	 j d i   j d d   S)N	localhostGETzutf-8z]JSONDecodeError while parsing result of snap api call to %s, returning None. output was: "%s"exc_infosourcezSNAPD API {}r0      i  resultkindzsnap-not-foundr   messageerrorr    r   r   r   r   username)socketAF_UNIXSOCK_STREAMconnectSNAPD_SOCKET_PATHhttpclientHTTPConnectionsockSNAPD_SNAPS_APIr'   requestgetresponsereaddecodejsonloadsJSONDecodeErrorr"   rJ   r   InvalidJsonstatusr-   SnapNotInstalledErrorUnexpectedSnapdAPIErrorConnectionRefusedErrorSnapdAPIConnectionRefusedcloser   )
r   Z	snap_sockconnurlresponser0   datarB   	error_msgZ	snap_infor   r   r   r8      sH    		+!
r8   )+http.clientra   rj   loggingrG   r\   typingr   r   r   uaclientr   r   r   r   r	   r
   rF   rN   HTTP_PROXY_OPTIONHTTPS_PROXY_OPTIONr`   re   get_event_loggerr$   	getLoggerreplace_top_level_logger_name__name__r"   r?   r   boolr   r   floatr)   r+   r2   r   rC   rL   rP   r8   r   r   r   r   <module>   sH   .				""