î
yË XÔ  ã               @   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 m Z d  d l	 m
 Z
 d Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd	 d
 „  d
 e ƒ Z Gd d „  d e ƒ Z d d „  Z d d „  Z d S)é    N)Úutil)Ústring_typesé   c               @   s^   e  Z d  Z d d d „ Z d d „  Z d d „  Z d d	 d
 „ Z d d „  Z d d „  Z d S)Ú
BaseSocketNc             C   s   | |  _  | |  _ | |  _ | d  k rB t j |  j t j ƒ } n t j | |  j t j ƒ } |  j | d | d  k	 ƒ|  _ d  S)NÚbound)	ÚlogÚconfÚcfg_addrÚsocketÚFAMILYÚSOCK_STREAMÚfromfdÚset_optionsÚsock)ÚselfÚaddressr   r   Úfdr   © r   ú=/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/sock.pyÚ__init__   s    			zBaseSocket.__init__c             C   s   d |  j  j ƒ  S)Nz<socket %d>)r   Úfileno)r   Únamer   r   r   Ú__str__"   s    zBaseSocket.__str__c             C   s   t  |  j | ƒ S)N)Úgetattrr   )r   r   r   r   r   Ú__getattr__%   s    zBaseSocket.__getattr__Fc             C   sr   | j  t j t j d ƒ | s/ |  j | ƒ n  | j d ƒ t | d ƒ r[ | j d ƒ n  | j |  j	 j
 ƒ | S)Né   r   Úset_inheritableT)Ú
setsockoptr
   Ú
SOL_SOCKETÚSO_REUSEADDRÚbindÚsetblockingÚhasattrr   Úlistenr   Zbacklog)r   r   r   r   r   r   r   (   s    zBaseSocket.set_optionsc             C   s   | j  |  j ƒ d  S)N)r    r	   )r   r   r   r   r   r    5   s    zBaseSocket.bindc             C   su   |  j  d  k r d  Sy |  j  j ƒ  WnA t j k
 rg } z |  j j d t | ƒ ƒ WYd  d  } ~ Xn Xd  |  _  d  S)NzError while closing socket %s)r   Úcloser
   Úerrorr   ÚinfoÚstr)r   Úer   r   r   r$   8   s    ,zBaseSocket.close)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r    r$   r   r   r   r   r      s   r   c                   s:   e  Z d  Z e j Z d d „  Z d ‡  f d d † Z ‡  S)Ú	TCPSocketc             C   sC   |  j  j r d } n d } |  j j ƒ  } d | | d | d f S)NÚhttpsÚhttpz
%s://%s:%dr   r   )r   Zis_sslr   Úgetsockname)r   ÚschemeÚaddrr   r   r   r   H   s
    	zTCPSocket.__str__Fc                s5   | j  t j t j d ƒ t t |  ƒ j | d | ƒS)Nr   r   )r   r
   ÚIPPROTO_TCPÚTCP_NODELAYÚsuperr,   r   )r   r   r   )Ú	__class__r   r   r   Q   s    zTCPSocket.set_options)r)   r*   r+   r
   ÚAF_INETr   r   r   r   r   )r5   r   r,   D   s   		r,   c               @   s%   e  Z d  Z e j Z d d „  Z d S)Ú
TCP6Socketc             C   s)   |  j  j ƒ  \ } } } } d | | f S)Nzhttp://[%s]:%d)r   r/   )r   ÚhostÚportÚflZscr   r   r   r   Z   s    zTCP6Socket.__str__N)r)   r*   r+   r
   ÚAF_INET6r   r   r   r   r   r   r7   V   s   	r7   c                   sX   e  Z d  Z e j Z d ‡  f d d † Z d d „  Z d d „  Z ‡  f d d	 †  Z	 ‡  S)
Ú
UnixSocketNc                s¾   | d  k r˜ y t  j | ƒ } WnA t k
 rb } z! | j d t j k rP ‚  n  WYd  d  } ~ Xq˜ Xt j | j ƒ r… t  j | ƒ q˜ t	 d | ƒ ‚ n  t
 t |  ƒ j | | | d | ƒd  S)Nr   z%r is not a socketr   )ÚosÚstatÚOSErrorÚargsÚerrnoÚENOENTÚS_ISSOCKÚst_modeÚremoveÚ
ValueErrorr4   r<   r   )r   r1   r   r   r   Ústr(   )r5   r   r   r   c   s    zUnixSocket.__init__c             C   s   d |  j  S)Nzunix:%s)r	   )r   r   r   r   r   q   s    zUnixSocket.__str__c             C   sX   t  j |  j j ƒ } | j |  j ƒ t j |  j |  j j |  j j ƒ t  j | ƒ d  S)N)	r=   Úumaskr   r    r	   r   ÚchownÚuidÚgid)r   r   Z	old_umaskr   r   r   r    t   s    "zUnixSocket.bindc                s'   t  j |  j ƒ t t |  ƒ j ƒ  d  S)N)r=   Úunlinkr	   r4   r<   r$   )r   )r5   r   r   r$   z   s    zUnixSocket.close)
r)   r*   r+   r
   ÚAF_UNIXr   r   r   r    r$   r   r   )r5   r   r<   _   s
   	r<   c             C   s`   t  |  t ƒ r4 t j |  d ƒ r+ t } q\ t } n( t  |  t ƒ rL t } n t d |  ƒ ‚ | S)Nr   z Unable to create socket from: %r)	Ú
isinstanceÚtupler   Zis_ipv6r7   r,   r   r<   Ú	TypeError)r1   Ú	sock_typer   r   r   Ú
_sock_type   s    			rR   c             C   s¡  g  } d t  j k rÓt t  j j d ƒ ƒ t  j ƒ  k rÓxPt t t  j j d d ƒ ƒ ƒ D]-} | t } yt j | t j	 t j
 ƒ } | j ƒ  } t | t ƒ rÕ | j d ƒ rÕ | j t | |  | d | ƒƒ nš t | ƒ d k rd | d k r| j t d | |  | d | ƒƒ nR t | ƒ d	 k rod
 | d k ro| j t d | d d … |  | d | ƒƒ n  Wq[ t j k
 r‡Yq[ Xq[ Wt  j d =t  j d =| rÓ| j d d j d d „  | Dƒ ƒ ƒ | Sn  |  j } |  j rt  j j |  j ƒ rt d |  j ƒ ‚ n  |  j rFt  j j |  j ƒ rFt d |  j ƒ ‚ n  d t  j k r*t  j j d ƒ j d ƒ } x³ t | ƒ D]¥ \ } } t | ƒ } | | }	 t  |	 ƒ }
 y# | j |
 |	 |  | d | ƒƒ Wq}t j k
 r!} z. | j! d t" j# k r| j d ƒ n ‚  WYd d } ~ Xq}Xq}W| Sxp| D]h}	 t  |	 ƒ }
 d } xt d ƒ D] } y |
 |	 |  | ƒ } Wnà t j k
 rT} z½ | j! d t" j$ k r¹| j d t |	 ƒ ƒ n  | j! d t" j% k rè| j d t |	 ƒ ƒ n  | d k  rBd } | j | j& d t |	 ƒ d t | ƒ ƒ ƒ | j d ƒ t' j( d ƒ n  WYd d } ~ XqVXPqVW| d k rŒ| j d t |	 ƒ ƒ t) j* d ƒ n  | j | ƒ q1W| S)zÂ
    Create a new socket for the given address. If the
    address is a tuple, a TCP socket is created. If it
    is a string, a Unix socket is created. Otherwise
    a TypeError is raised.
    Z
LISTEN_PIDZ
LISTEN_FDSr   ú/r   é   Ú.z%s:%sé   ú:z[%s]:%sNzSocket activation sockets: %sú,c             S   s   g  |  ] } t  | ƒ ‘ q Sr   )r'   )Ú.0Úlr   r   r   ú
<listcomp>­   s   	 z"create_sockets.<locals>.<listcomp>zcertfile "%s" does not existzkeyfile "%s" does not existZGUNICORN_FDz+GUNICORN_FD should refer to an open socket.é   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error}r1   r%   zRetrying in 1 second.r   zCan't connect to %s)+r=   ÚenvironÚintÚgetÚgetpidÚrangeÚSD_LISTEN_FDS_STARTr
   r   rM   r   r/   rN   r'   Ú
startswithÚappendr<   Úlenr,   r7   r%   ÚdebugÚjoinr   ÚcertfileÚpathÚexistsrF   ÚkeyfileÚpopÚsplitÚ	enumeraterR   r@   rA   ÚENOTCONNZ
EADDRINUSEZEADDRNOTAVAILÚformatÚtimeÚsleepÚsysÚexit)r   r   Z	listenersÚir   r   ZsocknameÚladdrZfdsr1   rQ   r(   Úmsgr   r   r   Úcreate_socketsŒ   s~    $(
"""			
#+#rx   )rA   Úfcntlr=   r
   r>   rs   rq   Zgunicornr   Zgunicorn.sixr   rb   Úobjectr   r,   r7   r<   rR   rx   r   r   r   r   Ú<module>   s   0	 