
    W'FgH,                         S SK r S SKrS SKrS SKrS SKrS SKrS SKrSSKJr   " S S5      r	 " S S\
5      r " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      rSS jrg)    N   )logc                   ,    \ rS rSrS rS rS rS rSrg)_XorrisoReader   c                 :    Xl         U R                  5       U l        g N)	_location_make_file_list_cache_file_list)selflocations     6/usr/share/virt-manager/virtinst/install/urlfetcher.py__init___XorrisoReader.__init__   s    ! $ 4 4 6    c                    SnSSU R                   SUS/n[        R                  " SU5        [        R                  " U[        R
                  SS9nUR                  US	5      S	   R                  5       R                  5       $ )
NVIRTINST_BEGINLISTxorriso-indevz-printz-findzGenerating iso filelist: %sT)stderruniversal_newlines   )	r
   r   debug
subprocesscheck_outputDEVNULLsplitstrip
splitlines)r   delimcmdoutputs       r   r   _XorrisoReader._make_file_list   sr    $(DNNHeWM		/5((!))dD||E1%a(..0;;==r   c                 d   [         R                  " SS[        R                  R	                  U5      -   US9nSSSSU R
                  SXR                  /n[        R                  " S	U5        [        R                  " U[        R                  S
9  [        UR                  S5      R                  5       $ )Nzvirtinst-iso-)prefixsuffixdirr   z-osirroxonr   z-extractzExtracting iso file: %s)r   rb)tempfileNamedTemporaryFileospathbasenamer
   namer   r   r   r   r   openread)r   url
scratchdirtmpr"   s        r   grabFile_XorrisoReader.grabFile'   s    ))%cBGG4D4DS4I.I  *dHdnn3*		+S1J,>,>?CHHd#((**r   c                 &    SU-  U R                   ;   $ )Nz'.%s')r   r   r4   s     r   hasFile_XorrisoReader.hasFile2   s    #$"7"777r   )r   r
   N)	__name__
__module____qualname____firstlineno__r   r   r7   r;   __static_attributes__ r   r   r   r      s    7>	+8r   r   c                   |    \ rS rSrSrSrSrS rS rSS jr	S	 r
S
 rS rS rS rS rS rS rS rSS jrS rSrg)_URLFetcher:   zz
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                 v    Xl         X l        X0l        [        R                  " SU5        U R                  5         g )NzUsing scratchdir=%s)r   r5   meterr   r   _prepare)r   r   r5   rG   s       r   r   _URLFetcher.__init__B   s)     $
		'4r   c                 |    U(       d  U R                   $ [        R                  R                  U R                   U5      $ )z`
Generate a full fetchable URL from the passed filename, which
is relative to the self.location
)r   r.   r/   joinr   filenames     r   _make_full_url_URLFetcher._make_full_urlO   s*    
 == ww||DMM844r   Nc                    U(       a  UnOU R                  U5      n U R                  U5      u  pV[        R                  " SU5        [        S5      S[        R                  R                  U5      0-  nU R                  R                  X5        U R                  XR5        U R                  R                  5         g! [         a+  n[        S5      U[	        U5      S.-  n[        U5      SeSnAff = f)zI
Download the filename from self.location, and write contents to
fileobj
z(Couldn't acquire file %(url)s: %(error)sr4   errorNzFetching URI: %szRetrieving '%(filename)s'rM   )rN   _grabber	Exception_str
ValueErrorr   r   r.   r/   r0   rG   start_writeend)	r   rM   fileobjfullurlr4   urlobjsizeemsgs	            r   _grabURL_URLFetcher._grabURLX   s    
 C%%h/C	,==-LF 			$c*+,BGG,,X608 8

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

  	,?@QD1 1CS/t+	,s   B; ;
C0&C++C0c                     Sn UR                  U R                  5      nU(       d  O<UR                  U5        U[        U5      -  nU R                  R                  U5        M_  UR                  5         U$ )zA
Write the contents of urlobj to python file like object fileobj
r   )r3   _block_sizewritelenrG   updateflush)r   r]   r[   totalbuffs        r   rY   _URLFetcher._writeq   sg     ;;t//0DMM$SYEJJe$  	r   c                     [        S5      e)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NotImplementedErrorr:   s     r   rS   _URLFetcher._grabber   s    
 ""CDDr   c                     U R                   $ )z*
If this is a fetcher for local CDROM/ISO
)_is_isor   s    r   is_iso_URLFetcher.is_iso   s     ||r   c                     g)z
Perform any necessary setup
NrB   rr   s    r   rH   _URLFetcher._prepare       r   c                     g)z
Perform any necessary cleanup
NrB   rr   s    r   _cleanup_URLFetcher._cleanup   rw   r   c                 $    U R                  5         g r	   )ry   rr   s    r   __del___URLFetcher.__del__   s    r   c                     g)z3
Return True if the location URL seems to be valid
TrB   rr   s    r   
can_access_URLFetcher.can_access   s     r   c                     [        S5      e)NzMust be implemented in subclassrm   r:   s     r   _hasFile_URLFetcher._hasFile   s    !"CDDr   c                 x    U R                  U5      nU R                  U5      n[        R                  " SX#5        U$ )z6
Return True if self.location has the passed filename
zhasFile(%s) returning %s)rN   r   r   r   )r   rM   r4   rets       r   r;   _URLFetcher.hasFile   s6     !!(+mmC 		,c7
r   c                    Sn [         R                  " SS[        R                  R	                  U5      -   U R
                  SS9nUR                  nU R                  XUS9  [        R                  " SU5        U$ ! [         aC    U(       a:  [        R                  R                  U5      (       a  [        R                  " U5        e f = f)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)   delete)r\   zSaved file to %s)r,   r-   r.   r/   r0   r5   r1   ra   r   r   BaseExceptionexistsunlink)r   rM   r\   fnr[   s        r   acquireFile_URLFetcher.acquireFile   s    
 	11"31A1A(1K+KOOE3G BMM(WM=II("-I 	bggnnR((		"	s   A5A: :ACc                     [         R                  " 5       nU R                  X5        UR                  5       R	                  S5      $ )zG
Grab the passed filename from self.location and return it as a string
zutf-8)ioBytesIOra   getvaluedecode)r   rM   r[   s      r   acquireFileContent_URLFetcher.acquireFileContent   s5     **,h(!((11r   )r   rG   r5   r	   )r=   r>   r?   r@   __doc__rd   rq   r   rN   ra   rY   rS   rs   rH   ry   r|   r   r   r;   r   r   rA   rB   r   r   rD   rD   :   s[     KG52E

E(2r   rD   c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg)
_HTTPURLFetcher   Nc                 8    [         R                  " 5       U l        g r	   )requestsSession_sessionrr   s    r   rH   _HTTPURLFetcher._prepare   s     ((*r   c                     U R                   (       a   U R                   R                  5         S U l         g ! [         a    [        R                  " SSS9   N)f = f)NzError closing requests.sessionTexc_info)r   closerT   r   r   rr   s    r   ry   _HTTPURLFetcher._cleanup   sJ    ==K##%   K		:TJKs   5 AAc                 $    U R                  S5      $ )N )r;   rr   s    r   r   _HTTPURLFetcher.can_access   s    ||Br   c                      U R                   R                  USS9nUR                  5         g! [         a*  n[        R
                  " S[        U5      5         SnAgSnAff = f)z5
We just do a HEAD request to see if the file exists
T)allow_redirectszHTTP hasFile request failed: %sNF)r   headraise_for_statusrT   r   r   rV   )r   r4   responser_   s       r   r   _HTTPURLFetcher._hasFile   sY    	}}))#t)DH%%'   	II7Q@	s   *- 
A! AA!c                     U R                   R                  USS9nUR                  5          [        UR                  R                  S5      5      nX#4$ ! [
         a    Sn X#4$ f = f)z
Use requests for this
T)streamzcontent-lengthN)r   getr   intheadersrT   )r   r4   r   r^   s       r   rS   _HTTPURLFetcher._grabber   sr     ==$$S$6!!#	x''++,<=>D ~  	D~	s   $A A$#A$c                     SnUR                  U R                  S9 H=  nUR                  U5        U[        U5      -  nU R                  R                  U5        M?     UR                  5         U$ )zb
The requests object doesn't have a file-like read() option, so
we need to implement it ourselves
r   )
chunk_size)iter_contentrd   re   rf   rG   rg   rh   )r   r]   r[   ri   datas        r   rY   _HTTPURLFetcher._write   sd    
 ''43C3C'DDMM$SYEJJe$ E 	r   )r   )r=   r>   r?   r@   r   rH   ry   r   r   rS   rY   rA   rB   r   r   r   r      s%    H+ 

r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)_FTPURLFetcheri  Nc                    U R                   (       a  g  [        R                  R                  U R                  5      n[
        R                  " 5       U l         [        R                  R                  UR                  =(       d    S5      n[        R                  R                  UR                  =(       d    S5      nU R                   R                  UR                  UR                  =(       d    S5        U R                   R                  X#5        U R                   R                  S5        g ! [         a5  n[!        S5      U R                  [#        U5      S.-  n[%        U5      S eS nAff = f)Nr   r   zTYPE Iz%Opening URL %(url)s failed: %(error)srQ   )_ftpurllibparseurlparser   ftplibFTPunquoteusernamepasswordconnecthostnameportloginvoidcmdrT   rU   rV   rW   )r   parsedr   r   r_   r`   s         r   rH   _FTPURLFetcher._prepare  s    99	,\\**4==9F

DI||++FOO,ArBH||++FOO,ArBHIIfoov{{/?a@IIOOH/IIh' 	,<===3q6A; ;CS/t+	,s   DD+ +
E*50E%%E*c                     [         R                  R                  U5      n[         R                  R                  U5      nU R                  R                  [         R                  R                  U5      S   5      nX44$ )z(
Use urllib and ftplib to grab the file
r   )r   requestRequesturlopenr   r^   r   r   )r   r4   r   r]   r^   s        r   rS   _FTPURLFetcher._grabber  sZ     ..((-''0yy~~fll33C8;<|r   c                     U R                   (       d  g  U R                   R                  5         S U l         g ! [         a    [        R                  " SSS9   N)f = f)NzError quitting ftp connectionTr   )r   quitrT   r   r   rr   s    r   ry   _FTPURLFetcher._cleanup$  sK    yy	FIINN 	  	FII5E	Fs   6 AAc                 p   [         R                  R                  U5      S   n  U R                  R	                  U5        g! [
        R                   a    U R                  R                  U5         gf = f! [
        R                   a+  n[        R                  " SU[        U5      5         S nAgS nAff = f)Nr   z#FTP hasFile: couldn't access %s: %sFT)r   r   r   r   r^   r   
all_errorscwdr   r   rV   )r   r4   r/   r_   s       r   r   _FTPURLFetcher._hasFile/  s    ||$$S)!,
	$		t$  $$ $		d# $    	II;s1v'	s/   A /A30A6 2A33A6 6B5
!B00B5)r   )
r=   r>   r?   r@   r   rH   rS   ry   r   rA   rB   r   r   r   r     s    D,$	r   r   c                   $    \ rS rSrSrS rS rSrg)_LocalURLFetcheriA  z+
For grabbing files from a local directory
c                     [         R                  R                  U5      n[        R                  R                  UR                  5      $ r	   )r   r   r   r.   r/   r   )r   r4   r   s      r   r   _LocalURLFetcher._hasFileE  s-    &&s+ww~~fkk**r   c                     [         R                  R                  U5      n[        UR                  S5      n[
        R                  R                  UR                  5      nX44$ )Nr+   )r   r   r   r2   r/   r.   getsize)r   r4   r   r]   r^   s        r   rS   _LocalURLFetcher._grabberI  sD    &&s+fkk4(wwv{{+|r   rB   N)r=   r>   r?   r@   r   r   rS   rA   rB   r   r   r   r   A  s    +r   r   c                   4    \ rS rSrSrSrS rS rS rS r	Sr
g)	_ISOURLFetcheriP  NTc                 B    [         R                  R                  SU5      $ )N/)r.   r/   rK   rL   s     r   rN   _ISOURLFetcher._make_full_urlT  s    ww||C**r   c                 p    U R                   (       d  [        U R                  5      U l         U R                   $ r	   )
_isoreaderr   r   rr   s    r   _get_isoreader_ISOURLFetcher._get_isoreaderW  s#    ,T]];DOr   c                     U R                  U5      (       d  [        SU-  5      eU R                  5       R                  XR                  5      n[
        R                  " U5      [        U5      4$ )Nziso doesn't have file=%s)r   RuntimeErrorr   r7   r5   r   r   rf   )r   r4   r#   s      r   rS   _ISOURLFetcher._grabber\  sW    }}S!!9C?@@$$&//__Ezz&!3v;..r   c                 @    U R                  5       R                  U5      $ r	   )r   r;   r:   s     r   r   _ISOURLFetcher._hasFilec  s    ""$,,S11r   )r   )r=   r>   r?   r@   r   rq   rN   r   rS   r   rA   rB   r   r   r   r   P  s     JG+
/2r   r   c                   0    \ rS rSrS rSS jrS rS rSrg)	DirectFetcherig  c                     U$ r	   rB   rL   s     r   rN   DirectFetcher._make_full_urlh  s    r   Nc                     U(       d  Un[         R                  R                  U5      n[        X R                  U R
                  SS9nUR                  X5      $ )NT)direct)r.   r/   r0   fetcherForURIr5   rG   r   )r   rM   r\   fetchers       r   r   DirectFetcher.acquireFilek  sE    G77##H-$**TR""855r   c                     g)NTrB   r:   s     r   r   DirectFetcher._hasFiler  s    r   c                     [        S5      e)Nz0DirectFetcher shouldn't be used for file access.)r   r:   s     r   rS   DirectFetcher._grabberu  s    BD 	Dr   rB   r	   )	r=   r>   r?   r@   rN   r   r   rS   rA   rB   r   r   r   r   g  s    6Dr   r   c                 $   U R                  S5      (       d  U R                  S5      (       a  [        nOUU R                  S5      (       a  [        nO8U(       d$  [        R                  R                  U 5      (       a  [        nO[        nU" XU5      $ )Nzhttp://zhttps://zftp://)
startswithr   r   r.   r/   isdirr   r   )urir5   rG   r   fclasss        r   r   r   z  sf    
~~i  CNN:$>$> 		!	!	277==%%!  #5))r   )F)r   r   r.   r   r,   r   r   loggerr   r   objectrD   r   r   r   r   r   r   rB   r   r   <module>r      s~     	 	     8 8BQ2& Q2h4k 4n9[ 9x{ 2[ 2.DK D&*r   