+
    h,  c                   s    ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^RIHt  ! R R4      t	 ! R R4      t
 ! R R]
4      t ! R	 R
]
4      t ! R R]
4      t ! R R]
4      t ! R R]
4      tRR ltR# )i    N)logc                   s8   a  ] tR t^t o R tR tR tR tRtV t	R# )_XorrisoReaderc                s<    Wn         V P                  4       V n        R # N)	_location_make_file_list_cache_file_list)selflocation   &&6/usr/share/virt-manager/virtinst/install/urlfetcher.py__init__Z_XorrisoReader.__init__   s    ! $ 4 4 6    c                s   R pRRV P                   RVR.p\        P                  ! RV4       \        P                  ! V\        P
                  RR7      pVP                  V^4      ^,          P                  4       P                  4       # )ZVIRTINST_BEGINLISTxorriso-indevz-printz-findzGenerating iso filelist: %sT)stderrZuniversal_newlines)	r   r    debug
subprocesscheck_outputDEVNULLZsplitZstripZ
splitlines)r   Zdelimcmdoutputs   &   r	   r   Z_XorrisoReader._make_file_list   so    $(DNNHeWM		/5((Z5G5G\`a||E1%a(..0;;==r   c                sx   \         P                  ! R R\        P                  P	                  V4      ,           VR7      pRRRRV P
                  RWP                  .p\        P                  ! RV4       \        P                  ! V\        P                  R	7       \        VP                  R
4      P                  4       # )zvirtinst-iso-)prefixsuffixdirr   z-osirroxZonr   z-extractzExtracting iso file: %s)r   rb)tempfileNamedTemporaryFileospathbasenamer   namer    r   r   r   r   openread)r   url
scratchdirZtmpr      &&&  r	   grabFileZ_XorrisoReader.grabFile'   s    ))!#0@0@0E*E:
 *dHdnnjRUW_W_`		+S1J,>,>?CHHd#((**r   c                s.    R V,          V P                   9   # )z'.%s')r   r   r"   r   r	   hasFileZ_XorrisoReader.hasFile1   s    #$"7"777r   )r   r   N)
__name__
__module____qualname____firstlineno__r
   r   r%   r'   __static_attributes____classdictcell__Z__classdict__   @r	   r   r      s     7>+8 8r   r   c                   s   a  ] tR t^:t o RtRtRtR tR tRR lt	R t
R	 tR
 tR tR tR tR tR tR tRR ltR tRtV tR# )_URLFetcherzz
This is a generic base class for fetching/extracting files from
a media source, such as CD ISO, or HTTP/HTTPS/FTP server
i @  Fc                sx    Wn         W n        W0n        \        P                  ! R V4       V P                  4        R# )zUsing scratchdir=%sN)r   r#   meterr    r   _prepare)r   r   r#   r1   s   &&&&r	   r
   Z_URLFetcher.__init__C   s)     $
		'4r   c                s~    V'       g   V P                   # \        P                  P                  V P                   V4      # )z`
Generate a full fetchable URL from the passed filename, which
is relative to the self.location
)r   r   r   joinr   filenamer   r	   _make_full_urlZ_URLFetcher._make_full_urlO   s*    
 == ww||DMM844r   Nc                s   V'       d   TpMV P                  V4      p V P                  V4      w  rV\        P                  ! RT4       \        R4      R\        P                  P                  T4      /,          pT P                  P                  Y4       T P                  YR4       T P                  P                  4        R#   \         d1   p\        R4      RTR\	        T4      /,          p\        T4      RhRp?ii ; i)zI
Download the filename from self.location, and write contents to
fileobj
z(Couldn't acquire file %(url)s: %(error)sr"   errorNzFetching URI: %szRetrieving '%(filename)s'r5   )r6   _grabber	Exception_str
ValueErrorr    r   r   r   r   r1   Zstart_writeZend)	r   r5   fileobjfullurlr"   urlobjsizeemsgs	   &&&&     r	   _grabURLZ_URLFetcher._grabURLX   s    
 C%%h/C	,==-LF
 			$c*+,
BGG<L<LX<V/WW

#F$

  	,>?5#wX[\]X^B__CS/t+	,s   C C<+C77C<c                s    ^ p VP                  V P                  4      pV'       g   M@VP                  V4       V\        V4      ,          pV P                  P                  V4       Ke  VP                  4        V# )zA
Write the contents of urlobj to python file like object fileobj
)r!   _block_sizewritelenr1   updateflush)r   r@   r>   totalZbuffr$   r	   r=   Z_URLFetcher._writeo   s`     ;;t//0DMM$SYEJJe$r   c                s    \        R4      h)zh
Returns the urlobj, size for the passed URL. urlobj is whatever
data needs to be passed to self._write
zmust be implemented in subclassZNotImplementedErrorr&   r   r	   r8   Z_URLFetcher._grabber~   s    
 ""CDDr   c                s    V P                   # )z*
If this is a fetcher for local CDROM/ISO
)_is_isor      &r	   is_isoZ_URLFetcher.is_iso   s     ||r   c                    R# )z
Perform any necessary setup
N rM   rN   r	   r2   Z_URLFetcher._prepare       r   c                rP   )z
Perform any necessary cleanup
NrQ   rM   rN   r	   _cleanupZ_URLFetcher._cleanup   rR   r   c                s&    V P                  4        R # r   )rS   rM   rN   r	   __del__Z_URLFetcher.__del__   s    r   c                rP   )z3
Return True if the location URL seems to be valid
TrQ   rM   rN   r	   
can_accessZ_URLFetcher.can_access   s     r   c                    \        R 4      h)zMust be implemented in subclassrK   r&   r   r	   _hasFileZ_URLFetcher._hasFile   s    !"CDDr   c                sx    V P                  V4      pV P                  V4      p\        P                  ! RW#4       V# )z6
Return True if self.location has the passed filename
zhasFile(%s) returning %s)r6   rW   r    r   )r   r5   r"   Zret   &&  r	   r'   Z_URLFetcher.hasFile   s6     !!(+mmC 		,c7
r   c                s   Rp \         P                  ! RR\        P                  P	                  V4      ,           V P
                  RR7      pVP                  pV P                  WVR7       \        P                  ! RV4       V#   \         dF    T'       d<   \        P                  P                  T4      '       d   \        P                  ! T4       h i ; i)zj
Grab the passed filename from self.location and save it to
a temporary file, returning the temp filename
Nz	virtinst-r   F)r   r   r   Zdelete)r?   zSaved file to %s)r   r   r   r   r   r#   r   rD   r    r   ZBaseExceptionexistsZunlink)r   r5   r?   Zfnr>   r$   r	   acquireFileZ_URLFetcher.acquireFile   s    
 	11"RWW--h77OO	G BMM(WM=II("-I 	bggnnR((		"	s   A?B C$C<Cc                s    \         P                  ! 4       pV P                  W4       VP                  4       P	                  R4      # )zG
Grab the passed filename from self.location and return it as a string
zutf-8)ioBytesIOrD   ZgetvalueZdecode)r   r5   r>      && r	   acquireFileContentZ_URLFetcher.acquireFileContent   s5     **,h(!((11r   )r   r1   r#   r   )r(   r)   r*   r+   __doc__rE   rL   r
   r6   rD   r=   r8   rO   r2   rS   rT   rU   rW   r'   rZ   r^   r,   r-   r.   r/   r	   r0   r0   :   sc     
 KG5.E

E.2 2r   r0   c                   sH   a  ] tR t^t o RtR tR tR tR tR t	R t
RtV tR# )	_HTTPURLFetcherNc                s:    \         P                  ! 4       V n        R # r   )requestsZSession_sessionrM   rN   r	   r2   Z_HTTPURLFetcher._prepare   s     ((*r   c                s    V P                   '       d    V P                   P                  4        RV n         R#   \         d    \        P                  ! R RR7        L.i ; i)zError closing requests.sessionTZexc_infoN)rb   Zcloser9   r    r   rM   rN   r	   rS   Z_HTTPURLFetcher._cleanup   sL    ===K##%   K		:TJKs   7 #AAc                s$    V P                  R 4      # ) )r'   rM   rN   r	   rU   Z_HTTPURLFetcher.can_access   s    ||Br   c                s     V P                   P                  VRR7      pVP                  4        R#   \         d,   p\        P
                  ! R\        T4      4        Rp?R# Rp?ii ; i)z5
We just do a HEAD request to see if the file exists
T)Zallow_redirectszHTTP hasFile request failed: %sNF)rb   Zheadraise_for_statusr9   r    r   r;   )r   r"   responserB   rX   r	   rW   Z_HTTPURLFetcher._hasFile   sY    	}}))#t)DH%%'   	II7Q@	s   -1 A' A""A'c                s    V P                   P                  VRR7      pVP                  4         \        VP                  P                  R4      4      pW#3#   \
         d    Rp Y#3# i ; i)z
Use requests for this
T)Zstreamzcontent-lengthN)rb   Zgetre   ZintZheadersr9   )r   r"   rf   rA   rX   r	   r8   Z_HTTPURLFetcher._grabber   sr     ==$$S$6!!#	x''++,<=>D ~  	D~	s   $A A('A(c                s    ^ pVP                  V P                  R7       FA  pVP                  V4       V\        V4      ,          pV P                  P                  V4       KC  	  VP                  4        V# )zb
The requests object doesn't have a file-like read() option, so
we need to implement it ourselves
)Z
chunk_size)Ziter_contentrE   rF   rG   r1   rH   rI   )r   r@   r>   rJ   Zdatar$   r	   r=   Z_HTTPURLFetcher._write   sd    
 ''43C3C'DDMM$SYEJJe$ E 	r   )rb   )r(   r)   r*   r+   rb   r2   rS   rU   rW   r8   r=   r,   r-   r.   r/   r	   r`   r`      s-     H+ 

 r   r`   c                   s<   a  ] tR tRt o RtR tR tR tR tRt	V t
R# )_FTPURLFetcheri  Nc                s   V P                   '       d   R #  \        P                  P                  V P                  4      p\
        P                  ! 4       V n         \        P                  P                  VP                  ;'       g    R4      p\        P                  P                  VP                  ;'       g    R4      pV P                   P                  VP                  VP                  ;'       g    ^ 4       V P                   P                  W#4       V P                   P                  R4       R #   \         d;   p\!        R4      RT P                  R\#        T4      /,          p\%        T4      R hR p?ii ; i)Nrd   zTYPE Iz%Opening URL %(url)s failed: %(error)sr"   r7   )_ftpurllibparseurlparser   ftplibZFTPZunquoteusernamepasswordZconnectZhostnameZportZloginZvoidcmdr9   r:   r;   r<   )r   parsedrm   rn   rB   rC   s   &     r	   r2   Z_FTPURLFetcher._prepare  s   999	,\\**4==9F

DI||++FOO,A,ArBH||++FOO,A,ArBHIIfoov{{/?/?a@IIOOH/IIh' 	,;<t}}Q@ C S/t+	,s*   A.D1 2D1 89D1 2=D1 1E6<5E11E6c                s   \         P                  P                  V4      p\         P                  P                  V4      pV P                  P                  \         P                  P                  V4      ^,          4      pW43# )z(
Use urllib and ftplib to grab the file
)ri   requestZRequestZurlopenrh   rA   rj   rk   )r   r"   rp   r@   rA      &&   r	   r8   Z_FTPURLFetcher._grabber  sZ     ..((-''0yy~~fll33C8;<|r   c                s    V P                   '       g   R #  V P                   P                  4        R V n         R #   \         d    \        P                  ! RRR7        L.i ; i)NzError quitting ftp connectionTrc   )rh   Zquitr9   r    r   rM   rN   r	   rS   Z_FTPURLFetcher._cleanup%  sM    yyy	FIINN 	  	FII5E	Fs   9 #AAc                s   \         P                  P                  V4      ^,          p  V P                  P	                  V4       R#   \
        P                   d     T P                  P                  T4        R# i ; i  \
        P                   d-   p\        P                  ! RT\        T4      4        Rp?R# Rp?ii ; i)i   z#FTP hasFile: couldn't access %s: %sNFT)ri   rj   rk   rh   rA   rl   Z
all_errorsZcwdr    r   r;   )r   r"   r   rB   rX   r	   rW   Z_FTPURLFetcher._hasFile0  s    ||$$S)!,		$		t$  $$ $		d#
 $    	II;S#a&I	s/   A 0A:6A= 9A::A= =B>!B99B>)rh   )r(   r)   r*   r+   rh   r2   r8   rS   rW   r,   r-   r.   r/   r	   rg   rg     s#     D,(	 r   rg   c                   s0   a  ] tR tRt o RtR tR tRtV tR# )_LocalURLFetcheriA  z+
For grabbing files from a local directory
c                s    \         P                  P                  V4      p\        P                  P                  VP                  4      # r   )ri   rj   rk   r   r   rY   )r   r"   ro   r]   r	   rW   Z_LocalURLFetcher._hasFileF  s-    &&s+ww~~fkk**r   c                s    \         P                  P                  V4      p\        VP                  R 4      p\
        P                  P                  VP                  4      pW43# )r   )ri   rj   rk   r    r   r   Zgetsize)r   r"   ro   r@   rA   rq   r	   r8   Z_LocalURLFetcher._grabberJ  sD    &&s+fkk4(wwv{{+|r   rQ   N)	r(   r)   r*   r+   r_   rW   r8   r,   r-   r.   r/   r	   rr   rr   A  s     + r   rr   c                   s@   a  ] tR tRt o RtRtR tR tR tR t	Rt
V tR# )	_ISOURLFetcheriQ  NTc                sB    \         P                  P                  R V4      # )Z/)r   r   r3   r4   r   r	   r6   Z_ISOURLFetcher._make_full_urlU  s    ww||C**r   c                sr    V P                   '       g   \        V P                  4      V n         V P                   # r   )
_isoreaderr   r   rM   rN   r	   _get_isoreaderZ_ISOURLFetcher._get_isoreaderX  s%    ,T]];DOr   c                s    V P                  V4      '       g   \        R V,          4      hV P                  4       P                  WP                  4      p\
        P                  ! V4      \        V4      3# )ziso doesn't have file=%s)rW   RuntimeErrorru   r%   r#   r[   r\   rG   )r   r"   r   r]   r	   r8   Z_ISOURLFetcher._grabber]  sW    }}S!!9C?@@$$&//__Ezz&!3v;..r   c                s@    V P                  4       P                  V4      # r   )ru   r'   r&   r   r	   rW   Z_ISOURLFetcher._hasFiled  s    ""$,,S11r   )rt   )r(   r)   r*   r+   rt   rL   r6   ru   r8   rW   r,   r-   r.   r/   r	   rs   rs   Q  s(     JG+
/2 2r   rs   c                   s<   a  ] tR tRt o R tRR ltR tR tRtV t	R# )	DirectFetcherih  c                s    V# r   rQ   r4   r   r	   r6   ZDirectFetcher._make_full_urli  s    r   Nc                s    V'       g   Tp\         P                  P                  V4      p\        W P                  V P
                  R R7      pVP                  W4      # )T)direct)r   r   r   fetcherForURIr#   r1   rZ   )r   r5   r?   Zfetchers   &&& r	   rZ   ZDirectFetcher.acquireFilel  sE    G77##H-$**TR""855r   c                s    R # )TrQ   r&   r   r	   rW   ZDirectFetcher._hasFiles  s    r   c                rV   )z0DirectFetcher shouldn't be used for file access.)rv   r&   r   r	   r8   ZDirectFetcher._grabberv  s    MNNr   rQ   r   )
r(   r)   r*   r+   r6   rZ   rW   r8   r,   r-   r.   r/   r	   rw   rw   h  s      6O Or   rw   c                 s.   V P                  R 4      '       g   V P                  R4      '       d   \        pMXV P                  R4      '       d   \        pM:V'       g&   \        P                  P                  V 4      '       d   \        pM\        pV! WV4      # )zhttp://zhttps://zftp://)Z
startswithr`   rg   r   r   Zisdirrr   rs   )Zurir#   r1   rx   Zfclasss   &&&& r	   ry   ry   z  sf    
~~i  CNN:$>$> 		!	!	277==%%!  #5))r   )F)rl   r[   r   r   r   ri   ra   Zloggerr    r   r0   r`   rg   rr   rs   rw   ry   rQ   r   r	   <module>rz      s|     	 	     8 8@Q2 Q2h4k 4n9[ 9x{  2[ 2.OK O$*r   