>f ddlZddlZddlZddlZddlZddlmZmZm Z ddl m Z m Z m Z mZmZmZmZdZgdZdZdZdZd Ze j0Zej4ej6eZed d efd efd efdefdefgZde fdZ!de fdZ" d$de ede ede ee#ddfdZ$ d%dede ee#ddfdZ%dede efdZ&deefdZ'dZ(de jRfdZ* d&dede ed e fd!Z+defd"Z,dedefd#Z-y)'N)List NamedTupleOptional)apiapt event_logger exceptionsmessagessystemutilz /usr/bin/snap)g?g?g@z proxy.httpz proxy.httpsz/run/snapd.socketz /v2/snaps/{} SnapPackagenameversionrevisionchannel publisherreturnc.dtjvS)z(Returns whether or not snap is installedsnapd)rget_installed_packages_names//usr/lib/python3/dist-packages/uaclient/snap.pyis_snapd_installedr!s c668 88rc6tdtDS)z3Returns whether or not snapd is installed as a snapc3:K|]}|jdk(yw)rNr).0snaps r z/is_snapd_installed_as_a_snap..(sG W$Gs)anyget_installed_snapsrrris_snapd_installed_as_a_snapr#&s G1D1FG HHr http_proxy https_proxy retry_sleepscdtstjdy|s|r3tj t j jd|r*tjddddj|g||r+tjdddd j|g|yy) 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)servicesetr z proxy.http={}r&zproxy.https={}) rLOGdebugeventinfor SETTING_SERVICE_PROXYformatr subp)r$r%r&s rconfigure_snap_proxyr2+s"   JK[ 811888HI UHo&<&esF feXs;<Qyy{  + +s+.AActjgd\}}|j}|dd}g}|D]/}|jd}|j t |1|S)N)rlistz--colorneverz --unicoderAr)r r1 splitlinessplitappend get_snap_info)r<r=appssnapsliners rr"r"rsk [[BFC >> D 8D E*zz|A ]4()* Lrctjtjj d t j t j tjgdt jy#tj$r)}tjdt|Yd}~`d}~wwxYw#tj $rtj"wxYw)Nzstandard Ubunturz 3 ;  $ $  J F     + +300223s#'B'CCB<<C(C,progresscL tjtdddgdy#tj$rn}t j dt|jr6tjd|jdtjnYd}~yd}~wwxYw) Nwaitr z seed.loadedTcapturezunknown command .*waitz9Detected version of snapd that does not have wait commandr.)r r1SNAP_CMDr r;researchrPlowerr+warningemitr SNAPD_DOES_NOT_HAVE_WAIT_CMD)rUrSs rrun_snapd_wait_cmdras{  Xvx?N  + + 99.A  ? KKK  MM&("G"G H  I s"B#A$BB#rclassic_confinement_supportctd|g}|r|dgz }|r|dj|gz }tj|dty)NrKz --classicz --channel={}T)rYr&)rZr0r r1SNAP_INSTALL_RETRIES)rrrbcmds r install_snaprfsO Y %C" } %%g.// KK )rc@tjtd|gdy)NrefreshTrX)r r1rZrs r refresh_snaprjs KK9d+T:rc tjtjtj}|jtt j jd}||_tj|} |jdtj||j}|jjd} tj |}|j,dk7r|j,d k(r:|j/d ij/d d k(rt)j0| |j/d ij/d}t)j2| |j9|j9|j/d i} t;| j/dd| j/dd| j/dd| j/dd| j/dij/ddS#tj"$rD}t$j'd|||t)j*dj||d}~wwxYw#t4$rt)j6wxYw#|j9|j9wxYw)N localhostGETzutf-8z]JSONDecodeError while parsing result of snap api call to %s, returning None. output was: "%s")exc_infoz SNAPD API {})sourcer<iresultkindzsnap-not-foundrimessage)errorrrrrrusername)rrrrr)socketAF_UNIX SOCK_STREAMconnectSNAPD_SOCKET_PATHhttpclientHTTPConnectionsockSNAPD_SNAPS_APIr0request getresponsereaddecodejsonloadsJSONDecodeErrorr+r^r InvalidJsonstatusr9SnapNotInstalledErrorUnexpectedSnapdAPIErrorConnectionRefusedErrorSnapdAPIConnectionRefusedcloser ) r snap_sockconnurlresponser<datarS error_msg snap_infos rrFrFs; fnnf.@.@AI '( ;; % %k 2DDI   &C" UO22489##%mmo$$W- ::c?D ??c !3&HHXr*..v6:JJ 66DAA HHXr266yA  88yII " 2&I  ]]62 & i,z2. i,-- R044ZD  =##  KK3  ((%,,S1s  . "522445 s>AI:H .BI: I73?I22I77I::JJ"J=)NNN)N)NF). http.clientr|rloggingr[rwtypingrrruaclientrrrr r r r rZrdHTTP_PROXY_OPTIONHTTPS_PROXY_OPTIONr{rget_event_loggerr- getLoggerreplace_top_level_logger_name__name__r+rPr boolrr#floatr2r6r>r"rTProgressWrapperrarfrjrFrrrrs  --OOO & "' % %%'g:::8DE  C S C c   9D9 IdI !%!%*."  " #" 4;'"  " L?C&.tE{&; *  #  T+. 3$ !4!4 "(-  c]"&(;s;33 3r