o
    b                     @   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                   @   s@   e Zd ZdZg dg dgZg d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
    )rpcrz/etc/rpcz$DEPRECATED. RPC procedure table file)filefz/etc/inetd.confzService configuration file)
nointernalizDon't run internal servicesr   z*.conf)
optActionsN)
__name__
__module____qualname____doc__optParametersoptFlagsr   CompletionsCompleteFilescompData r   r   9/usr/lib/python3/dist-packages/twisted/runner/inetdtap.pyr      s    
r   c                 C   s  t  }t }t| d }|| W d    n1 sw   Y  |jD ]}|j}|jdr7t	
d q&||jfdvrJt	
d|j|jf  q&zt|j|_W n' tyy   zt|jd |_W n tyv   t	
d|j  Y Y q&w Y nw |jd u rt|jd |_n0zt|j|_W n' ty   zt|jd |_W n ty   t	
d	|j  Y Y q&w Y nw |jd
kr| d rq&|jtjvrt	
d|j  q&t }tj|j |_nt|}|dkrt|j|| q&|dkrt dq&|S )Nr   zrpc/z/Skipping rpc service due to lack of rpc support))r	   stream)r
   dgramz)Skipping unsupported type/protocol: %s/%s   zUnknown user:    zUnknown group: internalr   zUnknown internal service: r	   r
   znot supporting UDP)!
appserviceMultiServicer   	InetdConfopen	parseFileservicesprotocol
startswithr   msg
socketTypeintuser
ValueErrorpwdgetpwnamKeyErrorgroupgetpwuidgrpgetgrnamprogramnamer   internalProtocolsr   InetdFactoryr   	TCPServerportsetServiceParentRuntimeError)configsconfr   r   r)   factoryr   r   r   makeService0   sp   





rC   )r   r5   r0   sockettwisted.applicationr   r   r#   twisted.internet.protocolr   twisted.pythonr   r   twisted.runnerr   r   IPPROTO_TCPIPPROTO_UDPprotocolDictr   rC   r   r   r   r   <module>   s   