U
    
W[                     @   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m	Z	 ddl
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)inetd	inetdconf)logusage)ServerFactory)internetservice)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   9/usr/lib/python3/dist-packages/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rt	
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 rq8|jtjkrt	
d|j  q8t }tj|j |_n
t|}|dkrt|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openZ	parseFileservicesprotocol
startswithr   msgZ
socketTypeintuser
ValueErrorpwdgetpwnamKeyErrorgroupgetpwuidgrpZgetgrnamZprogramnamer   ZinternalProtocolsr   ZInetdFactoryr   Z	TCPServerZportZsetServiceParentRuntimeError)Zconfigsconfr   r   r   factoryr   r   r   makeService1   s\    





r.   )r   r#   r(   ZsocketZtwisted.runnerr   r   Ztwisted.pythonr   r   Ztwisted.internet.protocolr   Ztwisted.applicationr   r   r   ZIPPROTO_TCPZIPPROTO_UDPZprotocolDictr   r.   r   r   r   r   <module>   s   