U
    ¸~HjÈ  ã                   @   s„   d Z ddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZmZ ejejdœZG dd	„ d	ejƒZd
d„ ZdS )zë
Twisted inetd TAP support

The purpose of inetdtap is to provide an inetd-like server, to allow Twisted to
invoke other programs to handle incoming sockets.
This is a useful thing as a "networking swiss army knife" tool, like netcat.
é    N)ÚinternetÚservice)ÚServerFactory)ÚlogÚusage)ÚinetdÚ	inetdconf)ÚtcpÚudpc                   @   sJ   e Zd ZdZddddgdddd	ggZd
ddggZejde d¡id�Z	dS )ÚOptionszù
    To use it, create a file named `sample-inetd.conf` with:

    8123 stream tcp wait some_user /bin/cat -

    You can then run it as in the following example and port 8123 became an
    echo server.

    twistd -n inetd -f sample-inetd.conf
    ZrpcÚrz/etc/rpcz$DEPRECATED. RPC procedure table fileÚfileÚfz/etc/inetd.confzService configuration fileÚ
nointernalÚizDon't run internal servicesz*.conf)Z
optActionsN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ZoptParametersZoptFlagsr   ZCompletionsZCompleteFilesZcompData© r   r   ú;/tmp/pip-unpacked-wheel-ewod1tgb/twisted/runner/inetdtap.pyr      s   

þr   c                 C   s  t  ¡ }t ¡ }t| d ƒ�}| |¡ W 5 Q R X |jD �]Ä}|j}|j d¡r\t	 
d¡ q8||jfdkr‚t	 
d|j|jf ¡ q8zt|jƒ|_W nV tk
rè   zt |j¡d |_W n* tk
râ   t	 
d|j ¡ Y Y q8Y nX Y nX |jd k�r
t |j¡d |_nlzt|jƒ|_W nZ tk
�rt   zt |j¡d |_W n, tk
�rn   t	 
d	|j ¡ Y Y q8Y nX Y nX |jd
k�rÄ| d �rŽq8|jtjk�r®t	 
d|j ¡ q8tƒ }tj|j |_n
t |¡}|dk�rît |j|¡ |¡ q8|dkr8t dƒ‚q8|S )Nr   zrpc/z/Skipping rpc service due to lack of rpc support))r	   Ústream)r
   Zdgramz)Skipping unsupported type/protocol: %s/%sé   zUnknown user: é   zUnknown group: Zinternalr   zUnknown internal service: r	   r
   znot supporting UDP)!Ú
appserviceZMultiServicer   Z	InetdConfÚopenÚ	parseFileZservicesÚprotocolÚ
startswithr   ÚmsgZ
socketTypeÚintÚuserÚ
ValueErrorÚpwdÚgetpwnamÚKeyErrorÚgroupÚgetpwuidÚgrpÚgetgrnamÚprogramÚnamer   ZinternalProtocolsr   ZInetdFactoryr   Ú	TCPServerÚportZsetServiceParentÚRuntimeError)ÚconfigÚsÚconfr   r   r   Úfactoryr   r   r   ÚmakeService0   s`    

ÿÿ



r3   )r   r(   r#   ÚsocketZtwisted.applicationr   r   r   Ztwisted.internet.protocolr   Ztwisted.pythonr   r   Ztwisted.runnerr   r   ÚIPPROTO_TCPÚIPPROTO_UDPZprotocolDictr   r3   r   r   r   r   Ú<module>   s   