U ϴf^@sddlZddlZddlZddlZddlZddlmZmZm Z ddl m Z m Z m Z mZmZmZmZdZdddgZdZd Zd Zd Ze ZeeeZed d efdefdefdefdefgZe dddZ!e dddZ"d1e ee ee ee#ddddZ$d2ee ee#ddddZ%ee edddZ&eedd d!Z'd"d#Z(e j)d$d%d&Z*d3ee ee d(d)d*Z+ed+d,d-Z,eed.d/d0Z-dS)4N)List NamedTupleOptional)apiapt event_logger exceptionsmessagessystemutilz /usr/bin/snapg?g?g@z proxy.httpz proxy.httpsz/run/snapd.socketz /v2/snaps/{} SnapPackagenameversionrevisionchannel publisher)returncCs dtkS)z(Returns whether or not snap is installedsnapd)rZget_installed_packages_namesrr//usr/lib/python3/dist-packages/uaclient/snap.pyis_snapd_installed!srcCstddtDS)z3Returns whether or not snapd is installed as a snapcss|]}|jdkVqdS)rNr ).0snaprrr (sz/is_snapd_installed_as_a_snap..)anyget_installed_snapsrrrris_snapd_installed_as_a_snap&sr) http_proxy https_proxy retry_sleepsrcCsttstddS|s|r0ttjjdd|rPtj dddd|g|d|rptj dddd |g|ddS) 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)Zservicesetr z proxy.http={}r zproxy.https={}) rLOGdebugeventinfor ZSETTING_SERVICE_PROXYformatr subp)rrr rrrconfigure_snap_proxy+s r)) protocol_typer rcCs4tstddStjdddd|g|ddS)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.NrZunsetr zproxy.{}r")rr#r$r r(r')r*r rrrunconfigure_snap_proxyPs  r+)keyrcCs>z tddd|g\}}|WStjk r8YdSXdS)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 rgetr N)r r(striprProcessExecutionError)r,out_rrrget_config_option_valuees  r2cCsZtddddddg\}}|}|dd}g}|D]}|d}|t|q6|S)Nrlistz--colorneverz --unicoder)r r( splitlinessplitappend get_snap_info)r0r1ZappsZsnapslinerrrrrrs  rc CsttjjddzttWn4tj k rZ}zt dt |W5d}~XYnXzt jddddgtjdWntjk rtYnXdS) Nzstandard Ubunturz)progressc CstztjtdddgddWnTtjk rn}z4tdt|r\t d| dt j nW5d}~XYnXdS) Nwaitr z seed.loadedTcapturezunknown command .*waitz9Detected version of snapd that does not have wait commandr&)r r(SNAP_CMDrr/researchr<lowerr#warningemitr ZSNAPD_DOES_NOT_HAVE_WAIT_CMD)r?r=rrrrun_snapd_wait_cmdsrIF)rrclassic_confinement_supportcCs@td|g}|r|dg7}|r,|d|g7}tj|dtddS)Nr;z --classicz --channel={}T)rBr )rCr'r r(SNAP_INSTALL_RETRIES)rrrJcmdrrr install_snaps  rMrcCstjtd|gdddS)NZrefreshTrA)r r(rCrNrrr refresh_snapsrO)rrc Csttjtj}|ttjd}||_t |}zz| dt || }|jddd}zt|}WnJtjk r}z*tjd|||dtjd ||d W5d}~XYnX|jd kr|jd kr|d id dkrtj|dn|d id}tj|dWntk r:tYnXW5| | X|d i} t| dd| dd| dd| dd| didddS)NZ localhostZGETzutf-8ignore)errorsz]JSONDecodeError while parsing result of snap api call to %s, returning None. output was: "%s")exc_infoz SNAPD API {})sourcer0iresultZkindzsnap-not-foundrNmessage)errorr rrrrZusername)r rrrr)socketZAF_UNIXZ SOCK_STREAMZconnectSNAPD_SOCKET_PATHhttpZclientZHTTPConnectionZsockSNAPD_SNAPS_APIr'closeZrequestZ getresponsereaddecodejsonloadsZJSONDecodeErrorr#rGrZ InvalidJsonZstatusr-ZSnapNotInstalledErrorZUnexpectedSnapdAPIErrorConnectionRefusedErrorZSnapdAPIConnectionRefusedr ) rZ snap_sockZconnZurlZresponser0datar=Z error_msgZ snap_inforrrr9sT          r9)NNN)N)NF).Z http.clientr[r`ZloggingrDrYtypingrrrZuaclientrrrrr r r rCrKZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONrZr\Zget_event_loggerr%Z getLoggerZreplace_top_level_logger_name__name__r#r<r boolrrfloatr)r+r2rr>ZProgressWrapperrIrMrOr9rrrrsj$    &