a
    lOKc                     @   sv   d dl Z d dlZd dlZd dlZd dlZzd dlmZmZ W n   d dlmZmZ Y n0 de jv Z	G dd dZ
dS )    N)QueueEmptyposixc                   @   sL   e Zd Zdd Zdd Zdd Zddd	ZdddZdddZdddZ	dS )Runc                 C   s   d S N )selfr   r   3/Volumes/EFI-PX-HACK/Utils/GenSMBIOS/Scripts/run.py__init__   s    zRun.__init__c                    sF   z&t  fdddD ]}|| qW n ty8   Y n0    d S )Nc                      s
     dS )N   )readr   piper   r	   <lambda>       z"Run._read_output.<locals>.<lambda>r   )iterZput
ValueErrorclose)r   r   qliner   r   r	   _read_output   s    zRun._read_outputc                 C   s(   t  }tj| j||fd}d|_||fS )N)targetargsT)r   	threadingThreadr   daemon)r   outputr   tr   r   r	   _create_thread   s    zRun._create_threadFc              	   C   s  d }}d }zp|r4t |tu r4ddd |D }|sNt |tu rNt|}tj||tjtjddt	d}| 
|j\}}| 
|j\}}	|  |	  d }
}z| }
W n ty   Y n 0 tj|
 ||
7 }tj  z| }W n ty   Y n 0 tj| ||7 }tj  |
|  kr6dks:q q|  |jd krRq^td q| \}}|| || |jfW S    |rz| \}}W n   d }}Y n0 || || |jf Y S Y d	S 0 d S )
N  c                 s   s   | ]}t |V  qd S r   shlexquote.0xr   r   r	   	<genexpr>"   r   z%Run._stream_output.<locals>.<genexpr>r   T)shellstdoutstderrbufsizeuniversal_newlines	close_fdsg{Gz?r   zCommand not found!r   )typelistjoinstrr"   split
subprocessPopenPIPEON_POSIXr   r)   r*   startZ
get_nowaitr   syswriteflushpoll
returncodetimesleepcommunicate)r   commr(   r   errorpr   r   ZqeZteczoer   r   r	   _stream_output   sH    


zRun._stream_outpututf-8ignorec                 C   s$   t jdkr t|tr |||S |S )N)   r   )r9   version_info
isinstancebytesdecode)r   valueencodingerrorsr   r   r	   _decodeM   s    zRun._decodec                 C   s   d }z`|r*t |tu r*ddd |D }|sDt |tu rDt|}tj||tjtjd}|	 }W n   |d krzY dS Y n0 | 
|d | 
|d |jfS )Nr    c                 s   s   | ]}t |V  qd S r   r!   r$   r   r   r	   r'   W   r   z#Run._run_command.<locals>.<genexpr>)r(   r)   r*   r.   r   r   )r/   r0   r1   r2   r"   r3   r4   r5   r6   r@   rS   r=   )r   rA   r(   rD   rC   r   r   r	   _run_commandS   s    
zRun._run_commandc                 C   s  t |tu r|g}g }|D ]}|dg }|dd}|dd}|dd}|dd}	|dd}
|dd }|d	d}|d kst| t|sq|r| d
dg}d|d v rt |tu r|d|d dd n&t |t	u r|d ddd | }|rtd
| |r0| ||}nL| ||}|	r\t|d r\t|d  |
r|t|d r|t|d  || |r|d dkr qqt|dkr|d S |S )Nr   r(   Fstreamsudor)   r*   messageshowwhichr   
r   r    r      )r/   dictgetprintlenrT   r0   insertreplacer2   r1   rH   append)r   Zcommand_listZleave_on_failZoutput_listrA   r   r(   rU   rV   r)   r*   ZmessrX   outr   r   r	   runa   sL    

zRun.runN)F)rI   rJ   )F)F)
__name__
__module____qualname__r
   r   r   rH   rS   rT   rd   r   r   r   r	   r   	   s   
0

r   )r9   r4   r>   r   r"   r   r   Zqueuebuiltin_module_namesr7   r   r   r   r   r	   <module>   s   (
