3
J_                 @   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   s   |r|| _ n
tj | _ d S )N)	apt_cacheaptZCache)selfcache r   ?/usr/lib/python3/dist-packages/UbuntuDrivers/kerneldetection.py__init__    s    zKernelDetection.__init__c             C   s   t jd}|j|}|j|}|rRd|jd|jdf }d|jd|jdf }tjd||f  d||f }t|jd}|j  |j	 S )Nz(.+)-([0-9]+)-(.+)z%s-%s      zComparing %s with %sz dpkg --compare-versions %s gt %s )
recompilematchgrouploggingdebugr   splitZcommunicate
returncode)r   Zterm1Zterm2patternZmatch1Zmatch2ZcommandZprocessr   r   r	   _is_greater_than&   s    





z KernelDetection._is_greater_thanc             C   s   t  }x| jD ]}|jj|r.d|jkr.|js4|jrg }|jrL|j|jj |j	r`|j|j	j x<|D ]4}x.|D ]&}|j
dkrqp|j|krp|j|j qpW qfW qW t|S )NextraDepends)setr   name
startswithis_installedmarked_install	candidateextenddependenciesZ	installedZrawtypeaddlist)r   packageprefixdepspkgr!   Zordepdepr   r   r	   _find_reverse_dependencies9   s$    




z*KernelDetection._find_reverse_dependenciesc             C   s*   t jd}|j|}d}|r&|jd}|S )Nz2linux-image-([0-9]+\.[0-9]+\.[0-9]+)-([0-9]+)-(.+)    )r   r   r   r   )r   Z
candidatesimager   r   flavourr   r   r	   _get_linux_flavourR   s    


z"KernelDetection._get_linux_flavourc             C   s  d}d}d}d|dkrdnd }t jd}x| jD ]|}|jjdrZd|jkrZ| j|j jsh| j|j jr2|j|j}|r2|jd}	d	|jd
|jdf }
| j	|
|r2|
}|	}q2W |r|dkr|j
dd}n|}| j||}|rd}x2|D ]*}|j|r|j
|d|j
|dkr|}qW |dkr| j|d}|r| j||}d}x$|D ]}|jd| rN|}P qNW |s~|d }n|}|S )z7Get the linux headers, linux-image or linux metapackager*   zlinux-%sheadersr,   zlinux-image-(.+)-([0-9]+)-(.+)zlinux-imager   r   z%s-%sr   r   metazlinux-z	linux-%s-)r   r   r   r   r   r   r   r   r   r   replacer)   r.   )r   targetZmetapackageZimage_packageversionr%   r   r'   r   Zcurrent_packageZcurrent_versionZtarget_packageZreverse_dependenciesr   r-   Z
linux_metar0   r   r   r	   _get_linux_metapackage[   sV    








z&KernelDetection._get_linux_metapackagec             C   s
   | j dS )z5Get the linux headers for the newest_kernel installedr/   )r4   )r   r   r   r	   get_linux_headers_metapackage   s    z-KernelDetection.get_linux_headers_metapackagec             C   s
   | j dS )z5Get the linux headers for the newest_kernel installedr,   )r4   )r   r   r   r	   get_linux_image_metapackage   s    z+KernelDetection.get_linux_image_metapackagec             C   s
   | j dS )z9Get the linux metapackage for the newest_kernel installedr0   )r4   )r   r   r   r	   get_linux_metapackage   s    z%KernelDetection.get_linux_metapackagec             C   s   | j  }d}y| j| jjd }W n" tk
rD   tjd|  d S X d|kr~|jd}xB|D ]}|jdr^|j	dd}q^W n|j
 jdr|j
 j	dd}|S )Nr*   r   z#No dependencies can be found for %sz, zlinux-imagezlinux-image-)r6   r   r   recordKeyErrorr   errorr   r   r1   strip)r   Zlinux_image_metaZlinux_versionr!   r&   r(   r   r   r	   get_linux_version   s     



z!KernelDetection.get_linux_version)N)__name__
__module____qualname__r
   r   r)   r.   r4   r5   r6   r7   r<   r   r   r   r	   r      s   
	Cr   )r   r   r   
subprocessr   objectr   r   r   r   r	   <module>   s   