3
s_\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 reZdS )&AptCdromz represents a apt cdrom object c             C   s0   || _ || _t | _t | _t | _tj  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jtjjdtjjd}t jj|| r>tj	|| | dS )z\ restore the backup copy of the cdroms.list file 
           (*not* sources.list)! 
        z
Dir::Statez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  }| j|| j}tjjd}t|}|j }W dQ R X |j|d| }t|d}|j	| W dQ R X d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   sF  t  }t  }t  }x&tj| jddD ]\}}}|jdsF|jdrT|dd= q&q&d|kr`q&q&d|kr~|jtjj|d q&d|kr|jtjj|d q&d	|ksd
|krtj	d|  q&d|kr|jtjj|d q&d|krxRtj
tjj|dD ]}|jtjj|d| qW q&tjj|d dkr&|dd= q&W |||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   s2     



zAptCdrom._scanCDc             C   sl   t jjd}t j }|jtjjj }| j	 }t
|d*}|jd||f  |jd||f  W dQ R X d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	   _writeDatabasek   s    zAptCdrom._writeDatabasec             C   sD   t |}tjjd}x*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	   	_dropArchu   s    zAptCdrom._dropArchc             C   s^   | j }tjj| j dd}tjj|rZt|}|j }W d Q R X xdD ]}|j|d}qFW |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|}|s2ttd|jd}|jd}|j|jd qW | sf| rjd 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rtj|@}t|d*}x"|jd}	|j|	 |	dkrP qW W d Q R X W d Q R X qtj|| qW d	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rtj|@}t|d*}x"|jd}	|j|	 |	dkrP qW W d Q R X W d Q R X qtj|| qW d	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   sP  xH|D ]>}t jj|d }t jj|d }t jj }ddd||g}tj .}|jt	j
j  |j|d< tj||d}W dQ R X |dksdS t|"}	t	j|	}
|
j  |
jd	 }W dQ R X x|jd
D ]z}|j \}}}t jj||}	t jj|	stjd|	  qt|	}t	j|}W dQ R X ||kstjd||f  dS qW qW dS )z! verify the signatues and hashes r   zapt-keyz--quietZverifyZ
APT_CONFIG)envNFZSHA256
zignoring missing '%s'z(hash sum mismatch expected %s but got %sT)r   r   r6   rX   environr   tempfileZNamedTemporaryFiler'   r   r   dumpname
subprocesscallr$   ZTagFilestepZsectionr   r   r3   rD   Z	sha256sumr4   )r   r   sigZbasepathreleasefZ
verify_envcmdfpZretr+   tZsha256_sectionentryhashsizerf   sumr   r   r	   _verifyRelease   s:    





zAptCdrom._verifyReleasec             C   s   |st jjd}| j }xd|D ]\}tjj|d }xF||fD ]:}t jd|||jdd f }t	j
|tjj|| q<W qW d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(   rj   rk   r+   r[   r   r   r	   _copyRelease   s    
zAptCdrom._copyReleasec             C   s   | j  \| _| _| _| j| j| _t| jdkrFtjd tt	d| j
| jr^| j| j | j| j | j| j | j }|stjd dS | j|| j}tjjd}t|}|j }W dQ R X t|d}|jd	||f  W dQ R X | 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   rs   rt   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 |rLtjjtjjdtjj	d}tjj
|rLtj|||  tjjd| j tjjdd y| j }W nL ttfk
r } z,t jd|  | jjtdtd	|  d
S d}~X nX t 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   rv   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)N)N)N)N)r   r   r   r   r   r   r-   r:   r@   rC   r!   r"   r_   r`   rs   rt   rv   r2   r|   sysversionZ__nonzero__r   r   r   r	   r
   (   s$   	!


"
)

r
   )rM   r   r<   r   r3   rY   r   rg   r~   rd   r   rH   	Exceptionr   objectr
   r   r   r   r	   <module>   s   