U
    XXb’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	Z	d dl
m
Z G dd„ deƒZG d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   s0   || _ || _tƒ | _tƒ | _tƒ | _t ¡  d S )N)ÚviewÚ	cdrompathÚsetÚpackagesÚ
signaturesÚi18nÚapt_pkgZinit_config)Úselfr   Úpathr   r   r	   Ú__init__+   s    zAptCdrom.__init__c                 C   sB   t j tj d¡tj d¡¡}t j || ¡r>t 	|| |¡ dS )z\ restore the backup copy of the cdroms.list file 
           (*not* sources.list)! 
        ú
Dir::StateúDir::State::cdromsN)
Úosr   Újoinr   ÚconfigÚfind_dirÚfindÚexistsÚshutilÚcopy)r   Ú
backup_extÚ
cdromstater   r   r	   Úrestore_backup4   s
    
ÿzAptCdrom.restore_backupc              	   C   sr   |   ¡ }|  || j¡}tj d¡}t|ƒ}| ¡ }W 5 Q R X | |d| ¡}t|dƒ}| 	|¡ W 5 Q R X dS )z comment out the cdrom entry úDir::Etc::sourcelistz# %sÚwN)
Ú_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 ƒ }tj| jddD ]\}}}| d¡sB| d¡rP|dd…= q"q"d|kr\q"q"d|krz| tj |d¡¡ q"d|kr˜| tj |d¡¡ q"d	|ks¨d
|kr¸t 	d| ¡ q"d|krÖ| tj |d¡¡ q"d|krt 
tj |d¡¡D ]}| tj |d|¡¡ qôq"tj |¡d dkr"|dd…= q"|||fS )z| 
        scan the CD for interessting files and return them as:
        (packagesfiles, signaturefiles, i18nfiles)
        T)Útopdownz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	   Ú_scanCDJ   s6    
ÿ
ÿ
zAptCdrom._scanCDc              	   C   sl   t j d¡}t  ¡ }| tjj ¡ ¡}|  	¡ }t
|dƒ*}| d||f ¡ | d||f ¡ W 5 Q R X dS )z update apts cdrom.list r   Ú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	   Ú_writeDatabasek   s    zAptCdrom._writeDatabasec                 C   s@   t |ƒ}tj d¡}t |ƒD ]}d|kr||kr| |¡ q|S )z& drop architectures that are not ours zAPT::Architecturez/binary-)r   r   r   r   Úremove)r   r   ZarchÚdr   r   r	   Ú	_dropArchu   s    zAptCdrom._dropArchc              	   C   sZ   | j }tj | j dd¡}tj |¡rVt|ƒ}| ¡ }W 5 Q R X dD ]}| |d¡}qD|S )Nz.diskÚinfo)ú"ú]ú[Ú_rK   )r   r   r   r   r   r'   r(   r)   )r   r+   rG   r.   Zspecialr   r   r	   r$      s    
zAptCdrom._readDiskNamec           	      C   s‚   d}d}g }|D ]D}t  d|¡}|s0ttdƒƒ‚| d¡}| d¡}| | d¡¡ q|r^|sbd S | ¡  d||d |¡f }|S )	NÚ z (.*)/dists/([^/]*)/(.*)/binary-*z&Could not calculate sources.list entryr2   é   é   zdeb cdrom:[%s]/ %s %sú )ÚreÚmatchr   rK   ÚgroupÚappendÚsortr   )	r   r+   r   r   ZdistÚcompsrE   Úmr,   r   r   r	   r%   Œ   s"    ÿ

z!AptCdrom._generateSourcesListLineNc           
      C   sÄ   |st j d¡}|  ¡ }|D ]¢}t  d||| d¡d … f ¡}tj |tj 	|¡d ¡}| 
d¡r²t |¡<}t|dƒ&}| d¡}	| |	¡ |	dkr|qœq|W 5 Q R X W 5 Q R X qt ||¡ qd	S ©
NúDir::State::listsúcdrom:[%s]/%sÚdistsr   z.gzÚwbi ú  ó    T©r   r   r   r$   Úuri_to_filenamer   r   r   r   Úsplitextr4   Úgzipr'   r(   r*   r   r   )
r   ZtranslationsÚ	targetdirr+   r.   ÚfnameÚoutfÚgrB   Úsr   r   r	   Ú_copyTranslations¡   s     ÿ


zAptCdrom._copyTranslationsc           
      C   sÄ   |st j d¡}|  ¡ }|D ]¢}t  d||| d¡d … f ¡}tj |tj 	|¡d ¡}| 
d¡r²t |¡<}t|dƒ&}| d¡}	| |	¡ |	dkr|qœq|W 5 Q R X W 5 Q R X qt ||¡ qd	S rW   r]   )
r   r   ra   r+   r.   rb   rc   rd   rB   re   r   r   r	   Ú_copyPackagesµ   s     ÿ


zAptCdrom._copyPackagesc                 C   sL  |D ]@}t j |¡d }t j |¡d }t j ¡ }ddd||g}t ¡ .}| t	j
 ¡ ¡ |j|d< tj||d}W 5 Q R X |dksŒ dS t|ƒ"}	t	 |	¡}
|
 ¡  |
jd }W 5 Q R X | d	¡D ]~}| ¡ \}}}t j ||¡}	t j |	¡st d
|	 ¡ qÆt|	ƒ}t	 |¡}W 5 Q R X ||ksÆt d||f ¡   dS qÆqdS )z! verify the signatues and hashes r   zapt-keyz--quietZverifyZ
APT_CONFIG)ÚenvFZSHA256Ú
zignoring missing '%s'z(hash sum mismatch expected %s but got %sT)r   r   r9   r_   Úenvironr   ÚtempfileZNamedTemporaryFiler*   r   r   ÚdumpÚnameÚ
subprocessÚcallr'   ZTagFileÚstepZsectionr   r   r6   rG   Z	sha256sumr7   )r   r   ÚsigZbasepathÚreleasefZ
verify_envÚcmdÚfpZretr.   ÚtZsha256_sectionÚentryÚhashÚsizerm   Úsumr   r   r	   Ú_verifyReleaseÊ   s@    






 ÿÿzAptCdrom._verifyReleasec              
   C   sz   |st j d¡}|  ¡ }|D ]X}tj |¡d }||fD ]:}t  d||| d¡d… f ¡}t	 
|tj ||¡¡ q8qdS )z copy the release file rX   r   rY   rZ   NT)r   r   r   r$   r   r   r_   r^   r   r   r   r   )r   r   ra   r+   rq   rr   r.   rb   r   r   r	   Ú_copyReleaseì   s    ÿzAptCdrom._copyReleasec              	   C   sú   |   ¡ \| _| _| _|  | j¡| _t| jƒdkrFt d¡ tt	dƒƒ‚|  
| j¡r^|  | j¡ |  | j¡ |  | j¡ |  ¡ }|st d¡ dS |  || j¡}tj d¡}t|ƒ}| ¡ }W 5 Q R X t|dƒ}| d||f ¡ W 5 Q R X |  ¡  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 foundFr"   r#   z%# added by the release upgrader
%s
%sT)r=   r   r   r   rF   Úlenr6   r7   r   rK   rz   r{   rg   rf   r$   r%   r   r   r&   r'   r(   r*   rC   )r   r+   Zdebliner-   r.   r/   r   r   r	   Ú_doAddú   s6    
ÿ

ÿÿzAptCdrom._doAddc              
   C   sÞ   t  d| j¡ |rLtj tj d¡tj 	d¡¡}tj 
|¡rLt ||| ¡ tj d| j¡ tj dd¡ z|  ¡ }W nT ttfk
rÊ } z2t  d| ¡ | j tdƒtd	ƒ| ¡ W Y ¢d
S d}~X Y nX t  d| ¡ |S )z add a cdrom to apt's database zAptCdrom.add() called with '%s'r   r   z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)r6   Údebugr   r   r   r   r   r   r   r   r   r   r   r   r}   ÚSystemErrorr   r7   r   rK   )r   r   r    ÚresÚer   r   r	   r5   #  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)N)N)N)N)r   r   r   r   r   r!   r0   r=   rC   rF   r$   r%   rf   rg   rz   r{   r}   r5   rƒ   ÚsysÚversionZ__nonzero__r   r   r   r	   r
   (   s$   	!


"
)

r
   )rP   r   r?   r   r6   r`   r   rn   r…   rk   r   rK   Ú	Exceptionr   Úobjectr
   r   r   r   r	   Ú<module>   s   