U
    ٪zc1                     @   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  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sd
|krt	d|  q"d|kr|tj|d q"d|krt
tj|dD ]}|tj|d| qq"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rt|<}t|d&}|d}	||	 |	dkr|qq|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rt|<}t|d&}|d}	||	 |	dkr|qq|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
|	  qt|	}t	|}W 5 Q R X ||kstd||f    dS qq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   