o
    헛d                     @   sH   d dl Z d dlZd dlmZmZmZ G dd deZG dd deZdS )    N)PopenPIPECalledProcessErrorc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )MultiArchUtilsc                 C   s`   ddd| _ |  | _t| j  tt| j  | j  | _tj	
ds.dtj	d< d S d S )Ni386x86_64)r   amd64PATH/sbin:/usr/sbin:/bin:/usr/bin)_supported_architectures_get_architecture
_main_archlistvaluesintindex_other_archosenvirongetself r   =/usr/lib/python3/dist-packages/NvidiaDetector/alternatives.py__init__   s   
zMultiArchUtils.__init__c                 C   sF   t dd}tddgt|dd}| d }|  | }| j|S )N	/dev/nullwdpkgz--print-architectureTstdoutstderruniversal_newlinesr   )openr   r   communicateclosestripr   r   )r   dev_nullp1parchitecturer   r   r   r   (   s   

z MultiArchUtils._get_architecturec                 C   s   d| }|S )Nz%s-linux-gnu_gl_confr   )r   r)   alternativer   r   r   _get_alternative_name_from_arch1   s   z.MultiArchUtils._get_alternative_name_from_archc                 C      |  | jS N)r+   r   r   r   r   r   get_main_alternative_name5      z(MultiArchUtils.get_main_alternative_namec                 C   r,   r-   )r+   r   r   r   r   r   get_other_alternative_name8   r/   z)MultiArchUtils.get_other_alternative_nameN)__name__
__module____qualname__r   r   r+   r.   r0   r   r   r   r   r      s    	r   c                   @   s^   e Zd Zdd Zdd Zd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S )Alternativesc                 C   s6   d| _ d| _d| _|| _tjdsdtjd< d S d S )Nzmesa/ld.so.confzmesa-egl/ld.so.confzupdate-alternativesr	   r
   )_open_drivers_alternative_open_egl_drivers_alternative_command_master_linkr   r   r   )r   master_linkr   r   r   r   >   s   zAlternatives.__init__c                 C   sj   t dd}g }t| jd| jgt|dd}| d }|  |d}|D ]}| o1|	|  q%|S )z0Get the list of alternatives for the master linkr   r   z--listTr   r   
)
r"   r   r7   r8   r   r#   r$   splitr%   append)r   r&   alternativesr'   r(   cliner   r   r   list_alternativesH   s   

zAlternatives.list_alternativesc                 C   sr   t dd}t| jd| jgt|dd}| d }|  |d}|D ]}| 	dr6|
dd	   S q#d
S )zGet the alternative in user   r   z--queryTr   r   r:   zValue: N)r"   r   r7   r8   r   r#   r$   r;   r%   
startswithreplace)r   r&   r'   r(   r>   r?   r   r   r   get_current_alternativeV   s   

z$Alternatives.get_current_alternativeNc                 C   s@   |r| |d}|  }|D ]}|dd |kr|  S qdS )zuGet the alternative link by providing the driver name

        ignore_pattern allows ignoring a substring in the namerA   /N)rC   r@   r;   )r   nameignore_patternr=   r*   r   r   r   get_alternative_by_namec   s   z$Alternatives.get_alternative_by_namec                 C   r,   )z)Get the alternative link for open drivers)rI   r5   r   r   r   r   get_open_drivers_alternativeq      z)Alternatives.get_open_drivers_alternativec                 C   r,   )z2Get the alternative link for open EGL/GLES drivers)rI   r6   r   r   r   r    get_open_egl_drivers_alternativeu   rK   z-Alternatives.get_open_egl_drivers_alternativec              	   C   s<   zt g d t g d W dS  ttfy   Y dS w )z8Trigger gmenu so that the icons will show up in the menu)zdpkg-triggerz--by-package=fakepackage
gmenucache)r   z--configurez-aN)
subprocess
check_callOSErrorr   r   r   r   r   update_gmenuy   s   zAlternatives.update_gmenuc                 C   sD   zt | jd| j|g |   W n
 ty   Y dS w |   dS )z?Tries to set an alternative and returns the boolean exit statusz--setFT)rN   rO   r7   r8   ldconfigr   rQ   )r   pathr   r   r   set_alternative   s   
zAlternatives.set_alternativec                 C   s(   z	t dg W dS  ty   Y dS w )zCall ldconfigrR   FT)rN   rO   r   r   r   r   r   rR      s   zAlternatives.ldconfigc                 C   sj   t dd}tdd|gt|dd}| d }|  |d}|D ]}| d	r- d
S |   S d
S )z0Get the 1st kernel module name matching an aliasr   r   modprobez--resolve-aliasTr   r   r:   zUsage:N)r"   r   r   r#   r$   r;   r%   rB   )r   aliasr&   r'   r(   r>   r?   r   r   r   resolve_module_alias   s   

z!Alternatives.resolve_module_aliasr-   )r1   r2   r3   r   r@   rD   rI   rJ   rL   rQ   rT   rR   rW   r   r   r   r   r4   <   s    

	r4   )r   rN   r   r   r   objectr   r4   r   r   r   r   <module>   s
   !