ó
“$Nc           @   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 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$  Z/ d%   Z0 d&   Z1 d'   Z2 d(   Z3 d)   Z4 d S(*   i’’’’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   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_address6L   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_address4f   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 } | r! d } n  d |  k r |  j d  } | r\ | d d k r\ | d =q | s | d d k s | d d k r | d =q q n | j |   | rż t |  d k rż t | d |  rż y t | d |  | d <Wqż t k
 rł qż Xn  | d	 } t j } | r"t j	 } n  t j
 | t j | |   } | | d	 k rY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   t   appendR   R   t   _dotted_netmask_to_cidrR   R   R   R   t	   inet_ntopR   R   t   _address4_to_networkt   debugR'   R   (	   t   origR#   R   t   changedR&   R   t   typet   networkt   dbg_msg(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   normalize_address   sN    	
 ,
		


	c         C   s.   y t  |  d  } Wn t k
 r)   n X| S(   s"   Opens the specified file read-onlyt   r(   t   openR   (   t   fR/   (    (    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   s(    (    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   updatet   e(    (    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=   R   t   communicatet
   returncode(   t   commandt   spRL   t   out(    (    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.RN   t   stdini   i    (   RP   RQ   RR   RN   R=   R   RT   RU   (   t   command1t   command2t   sp1t   sp2RL   RX   (    (    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   sysRO   t   IOErrort   exit(   t   msgRb   (    (    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`   RO   Ra   (   Rc   (    (    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   (   Rc   t   output(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyRc   4  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`   RO   Ra   (   Rc   (    (    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>K  s
   4t    (   t   reduceR   (   t   textRj   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt	   word_wrapE  s    c         C   s   t  |  d  S(   s   Word wrap to a specific widthiK   (   Ro   (   Rn   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt	   wrap_textU  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.pyRk   d  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.pyRk   e  s    N(   t   sort(   t   list(    (   Rx   s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt
   human_sortZ  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   (   Rr   R   R   R@   t   patht   joinR   t   isfileRa   t   filet	   readlinesR   (   t   pt   pidt   namet   ppid(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_ppidh  s    $c         C   sZ  y t  |   } Wn\ t k
 r< } t d  } t |  t St k
 rn 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 rL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   R   R   R@   R}   R~   R   R   R   R   R.   R   t	   under_ssh(   R   R   RL   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   Rr   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   Rr   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   R   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   Rr   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(   NR   i   i’’’’(   R~   R   R   (   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   Rr   R*   R,   R   (   R   R£   R   t	   orig_hostt   netmaskt   unpackedR   t   iR   t   jR   R   t   lstR2   (    (    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   xR¢   R#   R   R¤   R„   t   addresst   orig_networkR2   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt
   in_networkP  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   rcRX   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   dRh   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 rst t j d   qsnS t j t j t j  } t j t j | j   d t j d |  d    d d ! } t | |  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   Rs   Rr   Ra   t   ENODEVR   R   t
   SOCK_DGRAMR   t   fcntlt   ioctlt   filenoR   R   R4   (   t   ifnameR#   R   t   procRh   R   R§   RD   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_ip_from_if±  s$    A-#c   
      C   s)  t  } t |   r t } n! t |   s< t t j d   n  d } | rld } t j j	 |  sy t
 t j d |   n  x©t |  j   D]Ł } | j   } | d j   } d j g  t d t | d  d  D] } | d | | d !^ qŃ  } | d	 j   d
 k r1d | t | d	 j   d  f } n  |  | k s[d | k r t |  | t  r | } Pq q Wn¹ d } t j j	 |  st
 t j d |   n  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   No such deviceR   s   /proc/net/if_inet6s   '%s' does not existi   R²   i    i   i   Ræ   s   %s/%si   R   s   /proc/net/dev(   R   R   R   R!   Ra   R>   RĀ   R@   R}   RĮ   R=   R?   R   R   R   t   stripR~   R   R   Rs   Rr   R®   RÉ   (
   R   R#   t   matchedRČ   Rh   R   RĒ   R§   t   tmp_addrt   ip(    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   get_if_from_ipĢ  sH    	A&c    	      C   sN  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 n Xy t  j |  } Wn
 q8 n Xxa | D]Y } y& t  j t  j j | |   d } Wn
 qé n Xd | t  j j |  f | | <qé Wq8 W| S(   Ns   /procs   ^[0-9]+$RC   Rµ   R   i   s   %s/%s(   R@   t   listdirRy   R   t   compileR·   R   R}   R~   t   accesst   F_OKt   R_OKt   readlinkR|   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   Rr   R¹   R*   (   t   protocolt
   tcp_statest   proc_net_fieldst   fnR©   t   skipped_firstt   linesRh   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   Rs   R   R*   R   Rr   R   (   t   paddrt	   convertedR   R§   RØ   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyt   convert_proc_addressO  s    E	<7 c      
   C   s<  t    } d d g } |  r. | d d g 7} n  xI | D]A } y t |  | | <Wq5 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Ż   t   keysRy   R÷   Rŗ   Rr   (   R#   t   proc_net_dataR	   R   R   RŲ   t	   protocolsRD   R³   R   R“   RÜ   Rź   R   R   (    (    s,   /usr/lib/python2.7/dist-packages/ufw/util.pyR¶   b  s.    	
	
 2(5   R>   RÄ   R@   R   RF   R   R   RP   R`   t   tempfileR    R   Rf   R
   R   R   R!   R    R'   R4   R8   R<   RE   R   RM   RY   R_   Rd   R   RN   Rc   R.   Ro   Rp   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^   						9	
										&			&			1	2		&	1	$	.	