
Y]1                 @   s   d  d l  Z  d  d l Z d  d l Z d  d l Z 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
 Gd d   d e  Z Gd d   d e  Z d S)    N)gettextc               @   s   e  Z d  Z d Z d S)AptCdromErrorz% base exception for apt cdrom errors N)__name__
__module____qualname____doc__ r   r   A/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeAptCdrom.pyr   "   s   r   c               @   s   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	 d d   Z
 d d   Z d d d  Z d d d  Z d d   Z d d d  Z d d   Z d d d  Z d d    Z e j d! k  r e Z d S)"AptCdromz represents a apt cdrom object c             C   s:   | |  _  | |  _ t   |  _ t   |  _ t   |  _ d  S)N)view	cdrompathsetpackages
signaturesi18n)selfr   pathr   r   r	   __init__*   s
    		zAptCdrom.__init__c             C   s[   t  j j t j j d  t j j d   } t  j j | |  rW t j	 | | |  d S)z\ restore the backup copy of the cdroms.list file 
           (*not* sources.list)! 
        z
Dir::StatezDir::State::cdromsN)
osr   joinapt_pkgconfigfind_dirfindexistsshutilcopy)r   
backup_ext
cdromstater   r   r	   restore_backup2   s    zAptCdrom.restore_backupc             C   s   |  j    } |  j | |  j  } t j j d  } t |   } | j   } Wd QRX| j | d |  } t | d   } | j	 |  Wd QRXd S)z comment out the cdrom entry zDir::Etc::sourcelistNz# %sw)
_readDiskName_generateSourcesListLiner   r   r   	find_fileopenreadreplacewrite)r   disknamepentrysourceslistfcontentr   r   r	   comment_out_cdrom_entry=   s    z AptCdrom.comment_out_cdrom_entryc             C   s  t    } t    } t    } xt j |  j d d D]\ } } } | j d  sa | j d  rt | d d  =q4 q4 d | k r q4 q4 d | k r | j t j j | d   q4 d | k r | j t j j | d   q4 d	 | k s d
 | k rt j	 d |  q4 d | k r3| j t j j | d   q4 d | k rxq t j
 t j j | d   D]% } | j t j j | d |   q^Wq4 t j j |  d d k r4 | d d  =q4 W| | | f S)z| 
        scan the CD for interessting files and return them as:
        (packagesfiles, signaturefiles, i18nfiles)
        topdownTzdebian-installerzdist-upgraderNz.aptignrZPackageszPackages.gzZSourcesz
Sources.gzz+Sources entry found in %s but not supportedzRelease.gpgr      Zpool)r   r   walkr   endswithaddr   r   loggingerrorlistdirsplit)r   r   r   r   rootdirsfilesr+   r   r   r	   _scanCDH   s2    			(%&zAptCdrom._scanCDc             C   s   t  j j d  } t  j   } | j t j j j    } |  j	   } t
 | d  5 } | j d | | f  | j d | | f  Wd QRXd S)z update apts cdrom.list zDir::State::cdromsazCD::%s "%s";
zCD::%s::Label "%s";
N)r   r   r#   ZCdromZidentaptZprogressbaseZCdromProgressr!   r$   r'   )r   ZdbfileZcdromidZlabeloutr   r   r	   _writeDatabasei   s    zAptCdrom._writeDatabasec             C   s^   t  |  } t j j d  } x9 t  |  D]+ } d | k r+ | | k r+ | j |  q+ W| S)z& drop architectures that are not ours zAPT::Architecturez/binary-)r   r   r   r   remove)r   r   Zarchdr   r   r	   	_dropArchs   s    zAptCdrom._dropArchc             C   s   |  j  } t j j |  j  d d  } t j j |  r{ t |   } | j   } Wd  QRXx  d D] } | j | d  } q_ W| S)Nz.diskinfo"][_)rE   rF   rG   rH   )r   r   r   r   r   r$   r%   r&   )r   r(   rD   r+   Zspecialr   r   r	   r!      s    	zAptCdrom._readDiskNamec       	      C   s   d } d } g  } xl | D]d } t  j d |  } | sI t t d    | j d  } | j d  } | j | j d   q W| s | r d  S| j   d | | d j |  f } | S)	N z (.*)/dists/([^/]*)/(.*)/binary-*z&Could not calculate sources.list entryr/         zdeb cdrom:[%s]/ %s %s )rematchr   rH   groupappendsortr   )	r   r(   r   r   ZdistcompsrB   mr)   r   r   r	   r"      s     
z!AptCdrom._generateSourcesListLineNc       
      C   s  | s t  j j d  } |  j   } x | D] } t  j d | | | j d  d   f  } t j j | t j j	 |  d  } | j
 d  r t j |  P } t | d  7 } x- | j d  }	 | j |	  |	 d k r Pq WWd  QRXWd  QRXq+ t j | |  q+ Wd	 S)
NzDir::State::listszcdrom:[%s]/%sdistsr   z.gzwbi       T)r   r   r   r!   uri_to_filenamer   r   r   r   splitextr1   gzipr$   r%   r'   r   r   )
r   Ztranslations	targetdirr(   r+   fnameoutfgr?   sr   r   r	   _copyTranslations   s     &%$zAptCdrom._copyTranslationsc       
      C   s  | s t  j j d  } |  j   } x | D] } t  j d | | | j d  d   f  } t j j | t j j	 |  d  } | j
 d  r t j |  P } t | d  7 } x- | j d  }	 | j |	  |	 d k r Pq WWd  QRXWd  QRXq+ t j | |  q+ Wd	 S)
NzDir::State::listszcdrom:[%s]/%srT   r   z.gzrU   i   rV   T)r   r   r   r!   rW   r   r   r   r   rX   r1   rY   r$   r%   r'   r   r   )
r   r   rZ   r(   r+   r[   r\   r]   r?   r^   r   r   r	   _copyPackages   s     &%$zAptCdrom._copyPackagesc             C   s  t  j j d d  } t  j j d d  } xc| D][} t j j |  d } t j j |  d } | d | d | | g } t j |  } | d k s d St	 |  - }	 t  j
 |	  }
 |
 j   |
 j d	 } Wd
 QRXx | j d  D] } | j   \ } } } t j j | |  }	 t j j |	  s<t j d |	  q t	 |	   } t  j |  } Wd
 QRX| | k s t j d | | f  d Sq Wq1 Wd S)z! verify the signatues and hashes zDir::Bin::gpgz/usr/bin/gpgvzApt::GPGV::TrustedKeyringz/etc/apt/trusted.gpgr   z	--keyringz--ignore-time-conflictFZSHA256N
zignoring missing '%s'z(hash sum mismatch expected %s but got %sT)r   r   r   r   r   r6   rX   
subprocesscallr$   ZTagFilestepZsectionr   r   r3   rD   Z	sha256sumr4   )r   r   ZgpgvZkeyringsigZbasepathreleasefcmdZretr+   tZsha256_sectionentryhashsizenamefpsumr   r   r	   _verifyRelease   s<    		
zAptCdrom._verifyReleasec             C   s   | s t  j j d  } |  j   } x | D]~ } t j j |  d } x_ | | f D]Q } t  j d | | | j d  d  f  } t	 j
 | t j j | |   qT Wq+ Wd S)z copy the release file zDir::State::listsr   zcdrom:[%s]/%srT   NT)r   r   r   r!   r   r   rX   rW   r   r   r   r   )r   r   rZ   r(   re   rf   r+   r[   r   r   r	   _copyRelease   s    &'zAptCdrom._copyReleasec             C   sS  |  j    \ |  _ |  _ |  _ |  j |  j  |  _ t |  j  d k rg t j d  t t	 d    |  j
 |  j  r |  j |  j  |  j |  j  |  j |  j  |  j   } | s t j d  d S|  j | |  j  } t j j d  } t |   } | j   } Wd QRXt | d   } | j d	 | | f  Wd QRX|  j   d
 S)z' reimplement pkgCdrom::Add() in python r   z+no useable indexes found on CD, wrong ARCH?z`Unable to locate any package files, perhaps this is not a Ubuntu Disc or the wrong architecture?zno .disk/ directory foundFzDir::Etc::sourcelistNr    z%# added by the release upgrader
%s
%sT)r:   r   r   r   rC   lenr3   r4   r   rH   ro   rp   r`   r_   r!   r"   r   r   r#   r$   r%   r'   r@   )r   r(   Zdebliner*   r+   r,   r   r   r	   _doAdd   s0    
zAptCdrom._doAddc             C   s   t  j d |  j  | rl t j j t j j d  t j j	 d   } t j j
 |  rl t j | | |  t j j d |  j  t j j d d  y |  j   } Wnc t t f k
 r
} z= t  j d |  |  j j t d  t d	  |  d
 SWYd d } ~ Xn Xt  j d |  | S)z add a cdrom to apt's database zAptCdrom.add() called with '%s'z
Dir::StatezDir::State::cdromszAcquire::cdrom::mountzAPT::CDROM::NoMounttruezcan't add cdrom: %szFailed to add the CDzThere was a error adding the CD, the upgrade will abort. Please report this as a bug if this is a valid Ubuntu CD.

The error message was:
'%s'FNzAptCdrom.add() returned: %s)r3   debugr   r   r   r   r   r   r   r   r   r   r   r   rr   SystemErrorr   r4   r   rH   )r   r   r   reser   r   r	   r2   "  s&    		zAptCdrom.addc             C   s   |  j  d k	 S)z# helper to use this as 'if cdrom:' N)r   )r   r   r   r	   __bool__>  s    zAptCdrom.__bool__3)r   r   r   r   r   r   r-   r:   r@   rC   r!   r"   r_   r`   ro   rp   rr   r2   rx   sysversionZ__nonzero__r   r   r   r	   r
   '   s$   !
#)r
   )rM   r   r<   r   r3   rY   r   rb   rz   r   rH   	Exceptionr   objectr
   r   r   r   r	   <module>   s   