o
    ä
Åe¹  ã                   @   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ZejjZej d¡ZG dd„ deƒZdd„ ZG dd„ deƒZG d	d
„ d
eƒZdS )é    NÚunixctl_serverc                   @   sL   e 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S )ÚUnixctlConnectionc                 C   s"   t |tjjƒs	J ‚|| _d | _d S ©N)Ú
isinstanceÚovsÚjsonrpcÚ
ConnectionÚ_rpcÚ_request_id)ÚselfÚrpc© r   ú4/usr/lib/python3/dist-packages/ovs/unixctl/server.pyÚ__init__"   ó   
zUnixctlConnection.__init__c                 C   s¤   | j  ¡  | j  ¡ }|s| j  ¡ r|S tdƒD ]8}|s| jr! |S | j  ¡ \}}|rH|jtj	kr6|  
|¡ nt d| j jt |j¡f ¡ tj}|sO| j  ¡ }q|S )Né
   z"%s: received unexpected %s message)r	   ÚrunÚ
get_statusÚget_backlogÚranger
   ÚrecvÚtypeÚMessageÚ	T_REQUESTÚ_process_commandÚvlogÚwarnÚnameÚtype_to_stringÚerrnoÚEINVAL)r   ÚerrorÚ_Úmsgr   r   r   r   '   s,   


ò
ÿÿ
€zUnixctlConnection.runc                 C   ó   |   d|¡ d S )NT©Ú_reply_impl©r   Úbodyr   r   r   ÚreplyA   ó   zUnixctlConnection.replyc                 C   r$   )NFr%   r'   r   r   r   Úreply_errorD   r*   zUnixctlConnection.reply_errorc                 C   ó   | j  ¡  d | _d S r   )r	   Úcloser
   ©r   r   r   r   Ú_closeH   ó   

zUnixctlConnection._closec                 C   s*   | j  |¡ | j  ¡ s| j  |¡ d S d S r   )r	   Úwaitr   Ú	recv_wait)r   Úpollerr   r   r   Ú_waitL   s   
ÿzUnixctlConnection._waitc                 C   sŒ   t |tƒsJ ‚|d u st |tƒsJ ‚| jd usJ ‚|d u rd}|r*| d¡s*|d7 }|r4t || j¡}nt || j¡}| j 	|¡ d | _d S )NÚ Ú
)
r   ÚboolÚstrr
   Úendswithr   Úcreate_replyÚcreate_errorr	   Úsend)r   Úsuccessr(   r)   r   r   r   r&   Q   s   
zUnixctlConnection._reply_implc                 C   sö   t |tjjƒs	J ‚|jtjjjksJ ‚|j| _d }|j}|j	}tj
j |¡}|d u r/d| }nAt|ƒ|jk r>d||jf }n2t|ƒ|jkrMd||jf }n#|D ]}t |tƒs\d| } nqO|d u rpdd„ |D ƒ}| | ||j¡ |ry|  |¡ d S d S )Nz"%s" is not a valid commandz+"%s" command requires at least %d argumentsz'"%s" command takes at most %d argumentsz$"%s" command has non-string argumentc                 S   s   g | ]}t |ƒ‘qS r   )r8   )Ú.0Úpr   r   r   Ú
<listcomp>~   s    z6UnixctlConnection._process_command.<locals>.<listcomp>)r   r   r   r   r   r   Úidr
   ÚparamsÚmethodÚunixctlÚcommandsÚgetÚlenÚmin_argsÚmax_argsr8   ÚcallbackÚauxr+   )r   Úrequestr!   rB   rC   ÚcommandÚparamÚunicode_paramsr   r   r   r   e   s8   
ÿÿ
þÿz"UnixctlConnection._process_commandN)Ú__name__Ú
__module__Ú__qualname__r   r   r)   r+   r/   r4   r&   r   r   r   r   r   r   !   s    r   c                 C   s,   t | tƒsJ ‚dtjj|f }|  |¡ d S )Nz%s (Open vSwitch) %s)r   r   r   ÚutilÚPROGRAM_NAMEr)   )ÚconnÚunused_argvÚversionr   r   r   Ú_unixctl_version…   s   rX   c                   @   s:   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zedd
d„ƒZd	S )ÚUnixctlServerc                 C   s"   t |tjjƒs	J ‚|| _g | _d S r   )r   r   ÚstreamÚPassiveStreamÚ	_listenerÚ_conns)r   Úlistenerr   r   r   r   Œ   r   zUnixctlServer.__init__c                 C   sÂ   t dƒD ]<}| j ¡ \}}tjdkr|tjkrtj}|s+tj	 
|¡}| j t|ƒ¡ q|tjkr2 nt d| jjt |¡f ¡ qt | j¡D ]}| ¡ }|r^|tjkr^| ¡  | j |¡ qGd S )Nr   Úwin32z%s: accept failed: %s)r   r\   ÚacceptÚsysÚplatformr   ÚWSAEWOULDBLOCKÚEAGAINr   r   r   r]   Úappendr   r   r   r   ÚosÚstrerrorÚcopyr   r/   Úremove)r   r"   r!   rZ   r   rU   r   r   r   r   ‘   s&   

ÿ€üzUnixctlServer.runc                 C   s&   | j  |¡ | jD ]}| |¡ q	d S r   )r\   r1   r]   r4   )r   r3   rU   r   r   r   r1   ¨   s   
ÿzUnixctlServer.waitc                 C   s.   | j D ]}| ¡  qd | _ | j ¡  d | _d S r   )r]   r/   r\   r-   ©r   rU   r   r   r   r-   ­   s
   



zUnixctlServer.closeNc                 C   sÒ   | du st | tƒsJ ‚| durdtj tjj| ¡ } ntjdkr+dtjjtjj	f } ndtjjtjj	t
 ¡ f } |du r@tjj}tjj | ¡\}}|rXtj |d|  ¡ |dfS tj ddd	d	t|¡ d	t|ƒfS )
a  Creates a new UnixctlServer which listens on a unixctl socket
        created at 'path'.  If 'path' is None, the default path is chosen.
        'version' contains the version of the server as reported by the unixctl
        version command.  If None, ovs.version.VERSION is used.Nzpunix:%sr_   zpunix:%s/%s.ctlzpunix:%s/%s.%d.ctlz&could not initialize control socket %srW   r5   r   )r   r8   r   rS   Úabs_file_nameÚdirsÚRUNDIRra   rb   rT   rf   ÚgetpidrW   ÚVERSIONrZ   r[   ÚopenÚ	ovs_errorrD   Úcommand_registerrX   rY   )ÚpathrW   r!   r^   r   r   r   Úcreateµ   s.   
ÿþ
ÿÿzUnixctlServer.creater   )	rP   rQ   rR   r   r   r1   r-   Ústaticmethodrt   r   r   r   r   rY   ‹   s    rY   c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZd	S )
ÚUnixctlClientc                 C   s   t |tjjƒs	J ‚|| _d S r   )r   r   r   r   Ú_connrj   r   r   r   r   Ù   s   
zUnixctlClient.__init__c                 C   s²   t |tƒsJ ‚t |tƒsJ ‚|D ]	}t |tƒsJ ‚qt ||¡}| j |¡\}}|r=t d| jj	t
 |¡f ¡ |d d fS |jd urJdt|jƒd fS |jd usQJ ‚dd t|jƒfS )Nzerror communicating with %s: %sr   )r   r8   Úlistr   Úcreate_requestrw   Útransact_blockr   r   r   rf   rg   r!   Úresult)r   rM   ÚargvÚargrL   r!   r)   r   r   r   ÚtransactÝ   s   ÿ

zUnixctlClient.transactc                 C   r,   r   )rw   r-   rU   r.   r   r   r   r-   ñ   r0   zUnixctlClient.closec                 C   sn   t | tƒsJ ‚dtj tjj| ¡ }tjj 	tjj 
|¡¡\}}|r-t d|  ¡ |d fS dttj |¡ƒfS )Nzunix:%szfailed to connect to %sr   )r   r8   r   rS   rk   rl   rm   rZ   ÚStreamÚ
open_blockrp   r   r   rv   r   r   )rs   Úunixr!   rZ   r   r   r   rt   õ   s   ÿzUnixctlClient.createN)rP   rQ   rR   r   r~   r-   ru   rt   r   r   r   r   rv   Ø   s    rv   )rh   r   rf   ra   Úovs.dirsr   Úovs.jsonrpcÚ
ovs.streamÚovs.unixctlÚovs.utilÚovs.versionÚovs.vlogr   r   r   ÚVlogÚobjectr   rX   rY   rv   r   r   r   r   Ú<module>   s"   dM