o
    헛d                     @   s8   d dl Z d dlZd dlZd dlmZ G dd deZdS )    N)Popenc                   @   sV   e Zd Zd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 ZdS )KernelDetectionNc                 C   sF   |r|| _ t|| _d S t  t  td | _ t|| _d S N)	apt_cacheapt_pkgDepCacheapt_depcacheinit_configinit_systemCache)selfcache r   ?/usr/lib/python3/dist-packages/UbuntuDrivers/kerneldetection.py__init__    s   zKernelDetection.__init__c                 C   s   t d}||}||}|r)d|d|df }d|d|df }td||f  d||f }t|d}|  |j	 S )Nz(.+)-([0-9]+)-(.+)%s-%s      zComparing %s with %sz dpkg --compare-versions %s gt %s )
recompilematchgrouploggingdebugr   splitcommunicate
returncode)r   term1term2patternmatch1match2commandprocessr   r   r   _is_greater_than*   s"   




z KernelDetection._is_greater_thanc                 C   s*   t d}||}d}|r|d}|S )Nz2linux-image-([0-9]+\.[0-9]+\.[0-9]+)-([0-9]+)-(.+)    )r   r   r   r   )r   
candidatesimager    r   flavourr   r   r   _get_linux_flavour=   s   


z"KernelDetection._get_linux_flavourc                 C   s2   |j }|drd|vr|js| j|r|S d S )Nlinux-imageextra)name
startswithcurrent_verr   marked_install)r   pkgpackage_namer   r   r   _filter_cacheF   s   

zKernelDetection._filter_cachec              	      s  d}d}d}d|dkrdnd  t d}t| j| jjD ]&}|rC||}|rC|d}d|d|d	f }	| |	|rC|	}|}q|r|dkrQ|	dd}
n|}
 fd
d| j|
 j
D }|rd}|D ]0}z%| j| }| r|r|js~| j|r|	 d|	 dkr|}W qf ty   Y qfw |dkrdd | j| j
D }|r| ||
}d}|D ]}|d| r|} nq|s|d }|S |}|S )z7Get the linux headers, linux-image or linux metapackager&   zlinux-%sheadersr)   zlinux-image-(.+)-([0-9]+)-(.+)r   r   r   r   c                    s"   g | ]}|j j r|j jqS r   
parent_pkgr.   r/   .0depprefixr   r   
<listcomp>n       z:KernelDetection._get_linux_metapackage.<locals>.<listcomp>metac                 S   s"   g | ]}|j jd r|j jqS )zlinux-r6   r8   r   r   r   r=      r>   z	linux-%s-)r   r   mapr4   r   packagesr   r   r%   replacerev_depends_listr/   r0   r   r1   KeyErrorr+   )r   targetmetapackageimage_packageversionr    r3   r   current_packagecurrent_versiontarget_packagereverse_dependencies	candidatecandidate_pkgr*   
linux_metar?   r   r;   r   _get_linux_metapackageO   sv   





z&KernelDetection._get_linux_metapackagec                 C   
   |  dS )5Get the linux headers for the newest_kernel installedr5   rP   r   r   r   r   get_linux_headers_metapackage      
z-KernelDetection.get_linux_headers_metapackagec                 C   rQ   )rR   r)   rS   rT   r   r   r   get_linux_image_metapackage   rV   z+KernelDetection.get_linux_image_metapackagec                 C   rQ   )z9Get the linux metapackage for the newest_kernel installedr?   rS   rT   r   r   r   get_linux_metapackage   rV   z%KernelDetection.get_linux_metapackagec                 C   s   |   }d}z,| j| j| }|jdD ]}|D ]\}}}|dr.| dd} nqqW |S  t	yC   t
d|  Y d S w )Nr&   Dependsr,   zlinux-image-z#No dependencies can be found for %s)rW   r   get_candidate_verr   depends_list_strgetr/   striprB   rD   r   error)r   linux_image_metalinux_versionrM   dep_listdep_namedep_verdep_opr   r   r   get_linux_version   s"   
z!KernelDetection.get_linux_versionr   )__name__
__module____qualname__r   r%   r+   r4   rP   rU   rW   rX   re   r   r   r   r   r      s    

		Dr   )r   r   r   
subprocessr   objectr   r   r   r   r   <module>   s
   