ó
¢¢^Oc           @   s   d  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
 m Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 d
 „ Z d „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z d „  Z e d „ Z d „  Z e	 j d „ Z d „  Z  d „  Z! d „  Z" d „  Z# e j$ ƒ  d „ Z% e j$ ƒ  d „ Z& d „  Z' d „  Z( d „  Z) d „  Z* d „  Z+ d  „  Z, d! „  Z- d" d# „ Z. d$ „  Z/ e d% „ Z0 d& „  Z1 d' „  Z2 d( „  Z3 d) „  Z4 d* „  Z5 d S(+   s"   util.py: utility functions for ufwiÿÿÿÿN(   t   mkstempc         C   s£   d } y t  j |  ƒ Wn t k
 r- ‚  n Xy t  j |  d ƒ d } Wn t k
 r[ n Xy/ t  j |  d ƒ | d k r„ d } n d } Wn t k
 rž n X| S(   s8   Get the protocol for a specified port from /etc/servicest    t   tcpt   udpt   any(   t   sockett   getservbynamet	   Exception(   t   portt   proto(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_services_proto!   s$    
	
c         C   sy   d } d } |  j  d ƒ } t | ƒ d k r@ | d } d } n/ t | ƒ d k ri | d } | d } n t ‚ | | f S(   s   Parse port or port and protocolR   t   /i   i    R   i   (   t   splitt   lent
   ValueError(   t   p_strR   R	   t   tmp(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   parse_port_proto;   s    
	
c         C   sÅ   t  j s t d ƒ t St |  ƒ d k s< t j d |  ƒ r@ t S|  j d ƒ } y t  j t  j	 | d ƒ Wn t
 k
 r~ t SXt | ƒ d k r• t St | ƒ d k rÁ t | d t ƒ sÁ t Sn  t S(   s   Verifies if valid IPv6 addresss"   python does not have IPv6 support.i+   s   ^[a-fA-F0-9:\./]+$R   i    i   i   (   R   t   has_ipv6t   warnt   FalseR   t   ret   matchR   t	   inet_ptont   AF_INET6R   t   _valid_cidr_netmaskt   True(   t   addrt   net(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   valid_address6K   s     	
%c         C   sÅ   t  |  ƒ d k s% t j d |  ƒ r) t S|  j d ƒ } y2 t j t j | d ƒ t | d t ƒ si t SWn t	 k
 r~ t SXt  | ƒ d k r• t St  | ƒ d k rÁ t
 | d t ƒ sÁ t Sn  t S(   s   Verifies if valid IPv4 addressi   s   ^[0-9\./]+$R   i    i   i   (   R   R   R   R   R   R   R   t   AF_INETt   _valid_dotted_quadsR   t   valid_netmaskR   (   R   R   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   valid_address4e   s    %c         C   s   t  |  | ƒ p t |  | ƒ S(   s(   Verifies if valid cidr or dotted netmask(   R   R   (   t   nmt   v6(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR    }   s    R   c         C   sX   | d k r t  |  ƒ S| d k r, t |  ƒ S| d k rN t |  ƒ pM t  |  ƒ St ‚ d S(   s   Validate IP addressest   6t   4R   N(   R   R!   R   (   R   t   version(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   valid_addressˆ   s    

c   	   
   C   sõ  g  } t  } d } t j } | r3 d } t j } n  d |  k r¢ |  j d ƒ } | rn | d d k rn | d =q¯ | r¯ | d d k s• | d d k r¯ | d =q¯ n | j |  ƒ | rt | ƒ d k rt | d | ƒ ry t | d | ƒ | d <Wqt	 k
 r	qXn  | d	 } t j
 | t j | | ƒ ƒ } | | d	 k rNt } n  t | ƒ d k r¿| d | d 7} | s¿t | ƒ } | | k r¼d
 | | f } t | ƒ | } t } q¼q¿n  t | | ƒ sëd | } t | ƒ t ‚ n  | | f S(   sÎ   Convert address to standard form. Use no netmask for IP addresses. If
       netmask is specified and not all 1's, for IPv4 use cidr if possible,
       otherwise dotted netmask and for IPv6, use cidr.
    R%   R$   R   i   t   128t   32s   255.255.255.255i   i    s   Using '%s' for address '%s's   Invalid address '%s'(   R   R   R   R   R   t   appendR   R   t   _dotted_netmask_to_cidrR   t	   inet_ntopR   R   t   _address4_to_networkt   debugR'   R   (	   t   origR#   R   t   changedR&   t   s_typeR   t   networkt   dbg_msg(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   normalize_address”   sJ    	
',
	


	c         C   s.   y t  |  d ƒ } Wn t k
 r) ‚  n X| S(   s"   Opens the specified file read-onlyt   r(   t   openR   (   t   fnR/   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   open_file_readË   s
    c         C   s{   y t  |  ƒ } Wn t k
 r& ‚  n Xy t ƒ  \ } } Wn t k
 rZ | j ƒ  ‚  n Xi | d 6|  d 6| d 6| d 6S(   s=   Opens the specified file read-only and a tempfile read-write.R/   t   orignameR   t   tmpname(   R8   R   R    t   close(   R7   R/   R   R:   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt
   open_filesÕ   s    
c         C   s\   | d k r d S|  s+ t  t j d ƒ ‚ n  t j |  | ƒ d k rX t  t j d ƒ ‚ n  d S(   s~   Write to the file descriptor and error out of 0 bytes written. Intended
       to be used with open_files() and close_files().R   Ns   Not a valid file descriptori    s"   Could not write to file descriptor(   t   OSErrort   errnot   ENOENTt   ost   writet   EIO(   t   fdt   out(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   write_to_fileå   s    c         C   s£   |  d j  ƒ  t j  |  d ƒ | rs y4 t j |  d |  d ƒ t j |  d |  d ƒ Wqs t k
 ro ‚  qs Xn  y t j |  d ƒ Wn t k
 rž ‚  n Xd S(   su   Closes the specified files (as returned by open_files), and update
       original file with the temporary file.
    R/   R   R9   R:   N(   R;   R@   t   shutilt   copystatt   copyR   t   unlinkR=   (   t   fnst   update(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   close_filesò   s    
c         C   so   t  |  ƒ y% t j |  d t j d t j ƒ} Wn  t k
 rQ } d t | ƒ g SX| j ƒ  d } | j | g S(   s!   Try to execute the given command.t   stdoutt   stderri   i    (	   R.   t
   subprocesst   Popent   PIPEt   STDOUTR=   t   strt   communicatet
   returncode(   t   commandt   spt   exRD   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   cmd  s    
c         C   st   y4 t  j |  d t  j ƒ} t  j | d | j ƒ} Wn  t k
 rV } d t | ƒ g SX| j ƒ  d } | j | g S(   s#   Try to pipe command1 into command2.RM   t   stdini   i    (   RO   RP   RQ   RM   R=   RS   RT   RU   (   t   command1t   command2t   sp1t   sp2RX   RD   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   cmd_pipe  s    c         C   sC   y t  j d |  IJWn t k
 r( n X| r? t  j d ƒ n  d S(   s   Print error message and exits	   ERROR: %si   N(   t   sysRN   t   IOErrort   exit(   RD   t   do_exit(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   error  s    c         C   s-   y t  j d |  IJWn t k
 r( n Xd S(   s   Print warning messages   WARN: %sN(   R`   RN   Ra   (   RD   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR   *  s    c         C   s*   y | d |  IJWn t  k
 r% n Xd S(   s   Print messages   %sN(   Ra   (   RD   t   output(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   msg2  s    c         C   s6   t  r2 y t j d |  IJWq2 t k
 r. q2 Xn  d S(   s   Print debug messages	   DEBUG: %sN(   t	   DEBUGGINGR`   RN   Ra   (   RD   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR.   :  s
    c         C   s   t  | d „ |  j d ƒ ƒ S(   s¡   
    A word-wrap function that preserves existing line breaks
    and most spaces in the text. Expects that existing line
    breaks are posix newlines (
).
    c         S   sL   d |  d t  |  ƒ |  j d ƒ d t  | j d d ƒ d ƒ | k | f S(   Ns   %s%s%ss    
s   
i   i    (   R   t   rfindR   (   t   linet   wordt   width(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   <lambda>I  s
   4t    (   t   reduceR   (   t   textRk   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt	   word_wrapC  s    c         C   s   t  |  d ƒ S(   s   Word wrap to a specific widthiK   (   Rp   (   Ro   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt	   wrap_textS  s    c            s&   d „  ‰  |  j  d ‡  f d †  ƒ d S(   s$  Sorts list of strings into numeric order, with text case-insensitive.
       Modifies list in place.

       Eg:
       [ '80', 'a222', 'a32', 'a2', 'b1', '443', 'telnet', '3', 'http', 'ZZZ']

       sorts to:
       ['3', '80', '443', 'a2', 'a32', 'a222', 'b1', 'http', 'telnet', 'ZZZ']
    c         S   s    |  j  ƒ  r t |  ƒ S|  j ƒ  S(   N(   t   isdigitt   intt   lower(   t   t(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyRl   b  s    t   keyc            s)   g  t  j d |  ƒ D] } ˆ  | ƒ ^ q S(   Ns   ([0-9]+)(   R   R   (   t   kt   c(   t   norm(    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyRl   c  s    N(   t   sort(   t   lst(    (   Ry   s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt
   human_sortX  s    
	c         C   s¸   y t  |  ƒ } Wn t k
 r/ t d ƒ ‚ n Xt j j d t | ƒ d ƒ } t j j | ƒ ss t d | ƒ ‚ n  y$ t	 | ƒ j
 ƒ  d j ƒ  d } Wn t k
 r­ ‚  n Xt  | ƒ S(   sd   Finds parent process id for pid based on /proc/<pid>/stat. See
       'man 5 proc' for details.
    s   pid must be an integers   /proct   stats   Couldn't find '%s'i    i   (   Rs   R   R   R@   t   patht   joinRS   t   isfileRa   t   filet	   readlinesR   (   t   mypidt   pidt   namet   ppid(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_ppidf  s    $c         C   sX  y t  |  ƒ } WnZ t k
 r: t d ƒ } t | ƒ t St k
 rl t d ƒ t |  ƒ } t | ƒ ‚ n X|  d k s… | d k r‰ t St j	 j
 d t | ƒ d ƒ } t j	 j | ƒ sØ t d ƒ | } t | ƒ ‚ n  y$ t | ƒ j ƒ  d j ƒ  d } Wn- t k
 r+t d ƒ | } t | ƒ ‚ n Xt d	 | ƒ | d
 k rJt St | ƒ Sd S(   s1   Determine if current process is running under sshs%   Couldn't find pid (is /proc mounted?)s!   Couldn't find parent pid for '%s'i   s   /procR}   s   Couldn't find '%s'i    s"   Could not find executable for '%s's   under_ssh: exe is '%s's   (sshd)N(   R‡   Ra   t   _R   R   R   RS   R   R@   R~   R   R€   R   R‚   R   R.   R   t	   under_ssh(   R„   R†   t   warn_msgt   err_msgR~   t   exe(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR‰   {  s0    
$c         C   sT   d } | r d } n  t  j d |  ƒ sL t |  ƒ d k  sL t |  ƒ | k rP t St S(   s   Verifies cidr netmasksi    i€   s   ^[0-9]+$i    (   R   R   Rs   R   R   (   R"   R#   t   num(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR   ¡  s    	7c         C   s   | r
 t  St j d |  ƒ r‡ t j d |  ƒ } t | ƒ d k rD t  SxD | D]5 } | s| t | ƒ d k  s| t | ƒ d k rK t  SqK Wn t  St S(   s.   Verifies dotted quad ip addresses and netmaskss   ^[0-9]+\.[0-9\.]+$s   \.i   i    iÿ   (   R   R   R   R   R   Rs   R   (   R"   R#   t   quadst   q(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR   ­  s    +c         C   só   d } | r t  ‚ nÂ t |  | ƒ s- t  ‚ n  d } t t j d t j |  ƒ ƒ d ƒ } t } xK t d ƒ D]= } | | ?d @d k rŽ t	 } qk | rž d } Pqk | d 7} qk W| d k r× | d k r× t
 d | ƒ } n  t | | ƒ sï t  ‚ n  | S(   s@   Convert netmask to cidr. IPv6 dotted netmasks are not supported.R   i    s   >Li    i   iÿÿÿÿ(   R   R   t   longt   structt   unpackR   t	   inet_atonR   t   rangeR   RS   R   (   R"   R#   t   cidrt   mbitst   bitst	   found_onet   n(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR+   Æ  s(    		%		c         C   s¨   d } | r t  ‚ nw t |  | ƒ s- t  ‚ n  d } x; t d ƒ D]- } | t |  ƒ k  r@ | d d | >O} q@ q@ Wt j t j d | ƒ ƒ } t | | ƒ s¤ t  ‚ n  | S(   s<   Convert cidr to netmask. IPv6 dotted netmasks not supported.R   l    i    i   i   s   >L(	   R   R   R”   Rs   R   t	   inet_ntoaR‘   t   packR   (   R•   R#   R"   R—   R™   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   _cidr_to_dotted_netmaskì  s    			c   	      C   s+  d |  k r t  d ƒ |  S|  j d ƒ } t | ƒ d k sO t | d t ƒ rX t ‚ n  | d } | d } | } t | t ƒ r® y t | t ƒ } Wq® t k
 rª ‚  q® Xn  t	 t
 j d t j | ƒ ƒ d ƒ } t	 t
 j d t j | ƒ ƒ d ƒ } | | @} t j t
 j d | ƒ ƒ } d | | f S(   s8   Convert an IPv4 address and netmask to a network addressR   s8   _address4_to_network: skipping address without a netmaski   i    i   s   >Ls   %s/%s(   R.   R   R   R   R   R   R   Rœ   R   R   R‘   R’   R   R“   Rš   R›   (	   R   R   t   hostt   orig_nmR"   t	   host_bitst   nm_bitst   network_bitsR2   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR-      s&    
&	


%%
c         C   s  d „  } d |  k r# t  d ƒ |  S|  j d ƒ } t | ƒ d k sX t | d t ƒ ra t ‚ n  | d } | d } t j d t j	 t j
 | ƒ ƒ } d } xf t d	 ƒ D]X } | | | d
 ƒ } x< t d
 ƒ D]. }	 | d t | |	 ƒ @d |	 | d
 >O} qÏ Wq© Wd }
 x; t d ƒ D]- } | t | ƒ k  r|
 d d | >O}
 qqW| |
 @} g  } xF t d	 ƒ D]8 } | j t | | d ƒ | d
 | d
 d
 !d ƒ ƒ qfWt j t j
 t j d | d | d | d | d | d | d | d | d ƒ	 ƒ } d | | f S(   s8   Convert an IPv6 address and netmask to a network addressc         S   s>   d j  g  t | d d d ƒ D] } t |  | ?d @ƒ ^ q ƒ S(   s   Decimal to binaryR   i   iÿÿÿÿ(   R   R”   RS   (   R   t   countt   y(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   dec2bin  s    R   s8   _address6_to_network: skipping address without a netmaski   i   i    s   >8Hl    i   i   i   i€   i   i   i   i   i   s   %s/%si   (   R.   R   R   R    R   R   R‘   R’   R   R   R   R”   Rs   R*   R,   R›   (   R   R¤   R   t	   orig_hostt   netmaskt   unpackedRŸ   t   iR™   t   jR    R   R{   R2   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   _address6_to_network  s:    	
&	

0
6c   	      C   s  | j  d ƒ } t | ƒ d k s5 t | d | ƒ r> t ‚ n  | d } | d } | d k sj | d k rn t S|  } d | k rË | j  d ƒ } t | ƒ d k sµ t | d | ƒ r¾ t ‚ n  | d } n  | d k sã | d k rç t S| rt | ƒ st | ƒ r6t ‚ q6n# t | ƒ s-t | ƒ r6t ‚ n  t | | ƒ ry| ryy t | | ƒ } Wqyt	 k
 ru‚  qyXn  | rÈt
 d | | f ƒ j  d ƒ d } t
 d | | f ƒ j  d ƒ d } nF t d | | f ƒ j  d ƒ d } t d | | f ƒ j  d ƒ d } | | k S(   s&   Determine if address x is in network yR   i   i   i    s   0.0.0.0s   ::s   %s/%s(   R   R   R    R   R   R   R!   R   Rœ   R   Rª   R-   (	   t
   tested_addt
   tested_netR#   R   R¥   R¦   t   addresst   orig_networkR2   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt
   in_networkO  sF    &	

&		
 s   /sbin/iptablesc         C   sf   t  |  d g ƒ \ } } | d k r= t t j d |  ƒ ‚ n  t j d | ƒ } t j d d | d ƒ S(   s   Return iptables versions   -Vi    s   Error running '%s's   \ss   ^vR   i   (   RY   R=   R>   R?   R   R   t   sub(   RŒ   t   rcRD   R   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_iptables_version  s
    c         C   s{  t  |  ƒ } t ƒ  } x_| j ƒ  D]Q} | j d ƒ rN | j d ƒ rN q" n  | j ƒ  } | d } | d j d ƒ d } t ƒ  } d j | d j d ƒ d  ƒ | d <| d | d	 <| d
 j d ƒ d | d <| d d k rò | d | d <n | d
 j d ƒ d | d <| j | ƒ s:t ƒ  | | <g  | | | <n$ | | j | ƒ s^g  | | | <n  | | | j | ƒ q" W| S(   s:   Get and parse netstat the output from get_netstat_outout()R   R   i    i   t   :iÿÿÿÿt   laddri   t   uidi   R   R„   t   -RŒ   (   t   get_netstat_outputt   dictt
   splitlinest
   startswithR   R   t   has_keyR*   (   R#   t   netstat_outputt   dRi   R   R	   R   t   item(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   parse_netstat_outputŠ  s,    	 
	$c         C   s®  d } | r d } t  j j | ƒ s= t t j d | ƒ ‚ n  x¼ t | ƒ j ƒ  D]¨ } | j ƒ  } |  | d k rP d j	 g  t
 d t | d ƒ d ƒ D] } | d | | d !^ q• ƒ } | d j ƒ  d	 k rø d
 | t | d j ƒ  d ƒ f } qø qP qP W| d k rt t j d ƒ ‚ qn} t j t j t j ƒ } y? t j t j | j ƒ  d t j d |  d  ƒ ƒ d d !ƒ } Wn# t k
 rœt t j d ƒ ‚ n Xt | | ƒ d S(   s   Get IP address for interfaceR   s   /proc/net/if_inet6s   '%s' does not existi   R³   i    i   i   t   80s   %s/%si   s   No such devicei‰  t   256si   i   i   (   R@   R~   t   existsR=   R>   R?   R   R‚   R   R   R”   R   Rt   Rs   Ra   t   ENODEVR   R   t
   SOCK_DGRAMRš   t   fcntlt   ioctlt   filenoR‘   R›   R   R4   (   t   ifnameR#   R   t   procRi   R   R¨   t   s(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_ip_from_if°  s*    A-'c   
      C   sþ  t  } d } t |  ƒ r' t } d } n! t |  ƒ sH t t j d ƒ ‚ n  t j j	 | ƒ ss t
 t j d | ƒ ‚ n  d } | rrxxt | ƒ j ƒ  D]Ù } | j ƒ  } | d j ƒ  } d j g  t d t | d ƒ d	 ƒ D] } | d | | d	 !^ q× ƒ } | d
 j ƒ  d k r7d | t | d
 j ƒ  d ƒ f } n  |  | k sad | k r’ t |  | t ƒ r’ | } Pq’ q’ Wnˆ x… t | ƒ j ƒ  D]q } d | k rq…n  | j d ƒ d j ƒ  } y t | t  ƒ }	 Wn t k
 rßq…n X|	 |  k r…| } Pq…q…W| S(   s   Get interface for IP addresss   /proc/net/devs   /proc/net/if_inet6s   No such devices   '%s' does not existR   i   R³   i    i   i   RÀ   s   %s/%si   R   (   R   R   R   R!   Ra   R>   RÃ   R@   R~   RÂ   R=   R?   R   R‚   R   t   stripR   R”   R   Rt   Rs   R¯   RË   (
   R   R#   RÉ   t   matchedRi   R   RÈ   R¨   t   tmp_addrt   ip(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_if_from_ipÎ  sD    	A&c    	      C   sb  t  j d ƒ }  |  j ƒ  t j d ƒ } t ƒ  } x*|  D]"} | j | ƒ sS q8 n  t  j j d | d ƒ } t  j	 | t  j
 t  j Bƒ s q8 n  d } y% t  j t  j j d | d ƒ ƒ } Wn t k
 rË n Xy t  j | ƒ } Wn
 q8 n Xxk | D]c } y& t  j t  j j | | ƒ ƒ d } Wn t k
 r5qó n Xd | t  j j | ƒ f | | <qó Wq8 W| S(   s   Get inodes of files in /procs   /procs   ^[0-9]+$RC   R¶   RŒ   i   s   %s/%s(   R@   t   listdirRz   R   t   compileR¸   R   R~   R   t   accesst   F_OKt   R_OKt   readlinkR   R}   t   basename(	   t
   proc_filest   patt   inodesR¨   t   fd_patht   exe_patht   dirsR©   t   inode(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   _get_proc_inodesü  s4    
	%&(c         C   s²  i d d 6d d 6d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6} i d d 6d d 6d d 6d d 6} t  j j d |  ƒ } t  j | t  j t  j Bƒ s¯ t ‚ n  g  } t } t | ƒ j	 ƒ  } xÞ | D]Ö } | j
 ƒ  } | sø t } qÔ n  | t | | d d ƒ }	 |  j d ƒ r+d }	 n! |  j d ƒ rL|	 d k rLqÔ n  | | d j
 d  ƒ \ }
 } | | d } | | d } | j |
 t | d ƒ | | |	 f ƒ qÔ W| S(!   s=   Read /proc/net/(tcp|udp)[6] file and return a list of tuples t   ESTABLISHEDi   t   SYN_SENTi   t   SYN_RECVi   t	   FIN_WAIT1i   t	   FIN_WAIT2i   t	   TIME_WAITi   t   CLOSEi   t
   CLOSE_WAITi   t   LAST_ACKi	   t   LISTENi
   t   CLOSINGi   t
   local_addrt   stateRµ   RÞ   s	   /proc/neti   R   t   NAR   R³   (   R@   R~   R   RÓ   RÔ   RÕ   R   R   R   R‚   R   R   Rs   Rº   R*   (   t   protocolt
   tcp_statest   proc_net_fieldsR7   R{   t   skipped_firstt   linesRi   t   fieldsRì   R´   R   Rµ   RÞ   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   _read_proc_net_protocol!  sH    



		)c         C   sN  d } t  |  ƒ d k rÑ d } x[ t d d d ƒ D]G } | d j g  t | d | d ƒ D] } |  | d | !^ qW ƒ 7} q1 Wt d j g  t d t  | ƒ d ƒ D] } | | | d !j ƒ  ^ qž ƒ t ƒ d } ny g  } xT g  t d d d ƒ D] } |  | d | !^ qí D]" } | j t t | d	 ƒ ƒ ƒ qWt d
 j | ƒ t	 ƒ d } | S(   sD   Convert an address from /proc/net/(tcp|udp)* to a normalized addressR   i   i    i    iþÿÿÿi   R³   i   i   t   .(
   R   R”   R   R4   Rt   R   R*   RS   Rs   R   (   t   paddrt	   convertedR   R¨   R©   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   convert_proc_addressO  s    E	<7 c      
   C   sF  t  ƒ  } d d g } |  r. | d d g 7} n  xS | D]K } y t | ƒ | | <Wq5 t k
 r t d | ƒ } t | ƒ q5 q5 Xq5 Wt ƒ  } | j ƒ  } | j ƒ  d } x– | D]Ž } x… | | D]y \ } }	 }
 } } t | ƒ } d } | j	 t
 | ƒ ƒ r| t
 | ƒ } n  | d | d	 | |	 f | |
 | | f 7} qÁ Wq° W| S(
   s5   netstat-style output, without IPv6 address truncationR   R   t   tcp6t   udp6s!   Could not get statistics for '%s'R   R¶   s   %-5s %-46s %-11s %-5s %-11s %s
s   %s:%s(   R¸   Rô   R   Rˆ   R   Rß   t   keysRz   Rø   R»   Rs   (   R#   t   proc_net_dataR	   t   pRŠ   RÚ   t	   protocolsRÊ   R´   R   Rµ   RÞ   Rì   R   RŒ   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR·   b  s2    	
	
 	(6   t   __doc__R>   RÅ   R@   R   RF   R   R‘   RO   R`   t   tempfileR    R   Rg   R
   R   R   R!   R    R'   R4   R8   R<   RE   R   RL   RY   R_   Rd   R   RM   Rf   R.   Rp   Rq   R|   t   getpidR‡   R‰   R   R   R+   Rœ   R-   Rª   R¯   R²   R¿   RË   RÐ   Rß   Rô   Rø   R·   (    (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   <module>   s`   						7	
										&			&			2	2		&	.	%	.	