ó
qâÉXc           @   s2  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 e f d „  ƒ  YZ	 e
 a d e d „ Z d „  Z e j d „ Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d d „  ƒ  YZ d „  Z d „  Z d d „ Z d „  Z d S(   iÿÿÿÿNt   AppArmorExceptionc           B   s    e  Z d  Z d „  Z d „  Z RS(   s)   This class represents AppArmor exceptionsc         C   s   | |  _  d  S(   N(   t   value(   t   selfR   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   __init__   s    c         C   s   t  |  j ƒ S(   N(   t   reprR   (   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   __str__   s    (   t   __name__t
   __module__t   __doc__R   R   (    (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyR       s   	i   c         C   sC   y t  j d |  IJWn t k
 r( n X| r? t  j | ƒ n  d S(   s   Print error message and exits	   ERROR: %sN(   t   syst   stderrt   IOErrort   exit(   t   outt	   exit_codet   do_exit(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   error(   s    c         C   s-   y t  j d |  IJWn t k
 r( n Xd S(   s   Print warning messages   WARN: %sN(   R	   R
   R   (   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   warn3   s    c         C   s*   y | d |  IJWn t  k
 r% n Xd S(   s   Print messages   %sN(   R   (   R   t   output(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   msg;   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   stdoutR
   i   i    (	   t   debugt
   subprocesst   Popent   PIPEt   STDOUTt   OSErrort   strt   communicatet
   returncode(   t   commandt   spt   exR   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   cmdC   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.R   t   stdini   i    (   R   R   R   R   R   R   R   R   (   t   command1t   command2t   sp1t   sp2R    R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   cmd_pipeP   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	   R
   R   (   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyR   \   s
    c         C   s•   y t  j j |  ƒ } Wn t k
 r4 t d ƒ t SX|  | k rO t d ƒ t St  j j | ƒ se t St  j j |  ƒ } | | k r‘ t d ƒ t St S(   s   Validate names'   Could not find absolute path for binarys,   Binary should use a normalized absolute paths   Binary should not be a symlink(	   t   ost   patht   abspatht	   ExceptionR   t   Falset   existst   Truet   realpath(   R*   t   a_patht   r_path(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   valid_binary_pathe   s    


c         C   s   t  j d |  ƒ r t St S(   s   Validate variable names   [a-zA-Z0-9_]+$(   t   ret   searchR/   R-   (   t   var(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   valid_variable_name|   s    c         C   sf   d |  } |  j  d ƒ s+ t d | ƒ t Sy t j j |  ƒ Wn  t k
 ra t d | ƒ t SXt S(   s
   Valid paths   Invalid path: %st   /s   %s (relative)s   %s (could not normalize)(   t
   startswithR   R-   R)   R*   t   normpathR,   R/   (   R*   t   m(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt
   valid_pathƒ   s    
c         C   sO   t  |  ƒ s d Sg  } x( t j |  d ƒ D] } | j | ƒ q* W| j ƒ  | S(   s$   Find contents of the given directorys   /*N(   R<   t   Nonet   globt   appendt   sort(   R*   t   filest   f(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   get_directory_contents“   s    
c         C   s4   y t  j |  d d ƒ } Wn t k
 r/ ‚  n X| S(   s   Open specified file read-onlyt   rs   UTF-8(   t   codecst   openR,   (   R*   t   orig(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   open_file_readŸ   s
    c         C   sñ   d } t  j j | ƒ sM t d d g ƒ \ } } | d k rM t d ƒ t Sn  d } t |  j ƒ  ƒ d k r€ t |  ƒ r€ |  } n5 t	 j
 d d	 ƒ \ } } t  j | |  ƒ t  j | ƒ t | d
 | g ƒ \ } } t  j | ƒ | d k rí t St S(   s   Verify policy compiless   /sbin/apparmor_parsert   whicht   apparmor_parseri    s/   Could not find apparmor_parser. Skipping verifyt    i   t   prefixs   aa-easyprofs   -p(   R)   R*   R.   R!   R   R/   t   lent
   splitlinesR<   t   tempfilet   mkstempt   writet   closet   unlinkR-   (   t   policyt   exet   rct   fnRB   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   verify_policy©   s"    
$	t   AppArmorEasyProfilec        	   B   s›   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z g  d d g  g  d d d d „ Z RS(   s   Easy profile classc         C   sG  d |  _  | j  r- t j j | j  ƒ |  _  n  t ƒ  |  _ t j j |  j  ƒ r[ |  j ƒ  n  | j r˜ t j j	 | j ƒ r˜ t j j | j ƒ |  j d <nb | j rú | j
 rú t j j | j
 ƒ rú t | j
 ƒ rú t j j t j j | j
 ƒ ƒ |  j d <n  | j r7t j j	 | j ƒ r7t j j | j ƒ |  j d <n  |  j j d ƒ sXt d ƒ ‚ n  |  j j d ƒ syt d ƒ ‚ n  d |  _ | |  _ | d  k r¹t | ƒ s¹t d | ƒ ‚ q¹n  |  j | j
 ƒ |  j | j ƒ | j rõ|  j | j ƒ n" |  j d  k r|  j |  j ƒ n  t |  j d ƒ |  _ t |  j d ƒ |  _ d  S(   Ns   /etc/apparmor/easyprof.conft	   templatest   policygroupss"   Could not find templates directorys%   Could not find policygroups directorys   /etc/apparmor.ds   Invalid path for binary: '%s'(   t   conffileR)   R*   R+   t   dictt   dirst   isfilet   _get_defaultst   templates_dirt   isdirt   templateR<   t   dirnamet   policy_groups_dirt   has_keyR    t	   aa_topdirt   binaryR=   R3   t   set_templatet   set_policygroupt   policy_groupst   namet   set_nameRC   RZ   (   R   Rh   t   opt(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyR   È   s@    		
	+			c         C   s¥  t  j j |  j ƒ s+ t d |  j ƒ ‚ n  t |  j ƒ } t j d ƒ } x« | D]£ } | j | ƒ sk qP n  | j	 d ƒ r¯ t j
 d | j ƒ  ƒ d j d ƒ } | |  j d <qP | j	 d ƒ rP t j
 d | j ƒ  ƒ d j d ƒ } | |  j d	 <qP qP W| j ƒ  |  j j ƒ  } d	 | k r2t d
 |  j ƒ ‚ n  d | k rTt d |  j ƒ ‚ n  xJ |  j j ƒ  D]9 } t  j j |  j | ƒ sdt d |  j | ƒ ‚ qdqdWd S(   s#   Read in defaults from configurations   Could not find '%s's
   ^\w+=".*"?s   POLICYGROUPS_DIR=t   =i   s   ["']R[   s   TEMPLATES_DIR=RZ   s$   Could not find TEMPLATES_DIR in '%s's'   Could not find POLICYGROUPS_DIR in '%s'N(   R)   R*   R.   R\   R    RH   R4   t   compileR5   R9   t   splitt   stripR^   RR   t   keysRb   (   R   RB   t   patt   linet   dRs   t   k(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyR`   ô   s,    %%
c         C   s   | |  _  d S(   s   Set name of policyN(   Rl   (   R   Rl   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyRm     s    c         C   s   t  |  j ƒ j ƒ  S(   s    Get contents of current template(   RF   Rc   t   read(   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   get_template  s    c         C   si   | |  _  | j d ƒ s: t j j |  j d | ƒ |  _  n  t j j |  j  ƒ se t d |  j  ƒ ‚ n  d S(   s   Set current templateR8   RZ   s   %s does not existN(   Rc   R9   R)   R*   t   joinR^   R.   R    (   R   Rc   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyRi     s
    	"c         C   s   |  j  S(   s/   Get list of all available templates by filename(   RZ   (   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   get_templates"  s    c         C   su   | } | j  d ƒ s4 t j j |  j d | ƒ } n  |  j d k sR | |  j k re t d | ƒ ‚ n  t | ƒ j	 ƒ  S(   s$   Get contents of specific policygroupR8   R[   s    Policy group '%s' does not existN(
   R9   R)   R*   Rz   R^   Rk   R=   R    RF   Rx   (   R   t   policygroupt   p(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   get_policygroup&  s    c         C   s™   g  |  _  | d k r• x} | j d ƒ D]i } | j d ƒ sY t j j |  j d | ƒ } n  t j j | ƒ s~ t	 d | ƒ ‚ n  |  j  j
 | ƒ q% Wn  d S(   s   Set policygroupst   ,R8   R[   s   %s does not existN(   Rk   R=   Rq   R9   R)   R*   Rz   R^   R.   R    R?   (   R   R[   R}   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyRj   /  s    	c         C   s   |  j  S(   s)   Get list of all policy groups by filename(   Rk   (   R   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   get_policy_groups:  s    c         C   sH   t  j j |  j d | ƒ } t  j j | ƒ s@ t d | ƒ ‚ n  d | S(   s   Generate an abstraction rulet   abstractionss   %s does not exists   #include <abstractions/%s>(   R)   R*   Rz   Rg   R.   R    (   R   t   abstractionR}   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   gen_abstraction_rule>  s    c         C   s)   t  j d | ƒ s% t d | ƒ ‚ n  | S(   s   Generate a variable declarations   ^@\{[a-zA-Z_]+\}=.+s!   Invalid variable declaration '%s'(   R4   R5   R    (   R   t   dec(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   gen_variable_declarationE  s    c         C   s%  g  } | j  d ƒ r9 | j  d ƒ r9 t d | ƒ ‚ n  d } | j  d ƒ s] | j  d ƒ rf d } n  | j d ƒ r© | j d | | f ƒ | j d	 | | | f ƒ nx | j d
 ƒ sÇ | j d ƒ r| j d t j j | ƒ | f ƒ | j d | | | f ƒ n | j d | | | f ƒ | S(   NR8   t   @s    '%s' should not be relative pathRK   s   /home/s   @{HOMEs   owner s   %s %s,s
   %s%s** %s,s   /**s   /*s   %s%s %s,(   R9   R    t   endswithR?   R)   R*   Rd   (   R   R*   t   accesst   rulet   owner(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   gen_path_ruleK  s     	#c         C   sR  d „  } |  j  ƒ  } d | k r t } d } xF | j ƒ  D]8 } | sd | j d ƒ r: t } q: q: n  | | d 7} q: W| } n  t j d | | ƒ } t j d | | ƒ } |	 d  k rÑ t j d d |	 | ƒ } n  | d  k rù t j d	 d
 | | ƒ } n  |
 d  k r!t j d d |
 | ƒ } n  d } | | | ƒ } d | } | d  k rd | } x7 | j d ƒ D]# } | d | |  j	 | ƒ f 7} qfWn  t j d | | | ƒ } d } | | | ƒ } d | } | d  k rUd | } xt | j d ƒ D]` } x1 |  j
 | ƒ j ƒ  D] } | d | | f 7} q
W| | j d ƒ d k rî| d 7} qîqîWn  t j d | | | ƒ } d } | | | ƒ } d | } t | ƒ d k rÚd | } x. | D]# } | d | |  j | ƒ f 7} q°Wn  t j d | | | ƒ } d } | | | ƒ } d | } t | ƒ d k rsd | } xB | D]7 } x. |  j | d ƒ D] } | d | | f 7} qNWq5Wn  t j d | | | ƒ } d } | | | ƒ } d  | } t | ƒ d k rd! | } xB | D]7 } x. |  j | d" ƒ D] } | d | | f 7} qçWqÎWn  t j d | | | ƒ } t | ƒ sNt d | ƒ t d# ƒ ‚ n  | S($   Nc         S   sg   t  j d | ƒ } d } xG |  j ƒ  D]9 } | j | ƒ r& d t | ƒ t | j ƒ  ƒ } Pq& q& W| S(   s9   Calculate whitespace prefix based on occurrence of s in ts   ^ *%sRK   t    (   R4   Rp   RN   t   matchRM   t   lstrip(   t   tt   sRt   R}   Ru   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   find_prefixa  s     s   ###ENDUSAGE###RK   s   
s
   ###NAME###s   ###BINARY###s   ###COMMENT###s   Comment: %ss   ###AUTHOR###s
   Author: %ss   ###COPYRIGHT###s   Copyright: %ss   ###ABSTRACTIONS###s   %s# No abstractions specifieds   %s# Specified abstractionsR   s   
%s%ss    *%ss   ###POLICYGROUPS###s   %s# No policy groups specifieds%   %s# Rules specified via policy groupsiÿÿÿÿs	   ###VAR###s#   %s# No template variables specifiedi    s   %s# Specified profile variabless   ###READS###s   %s# No read paths specifieds   %s# Specified read permissionsRD   s   ###WRITES###s   %s# No write paths specifieds   %s# Specified write permissionst   rwks   Invalid policy(   Ry   R-   RN   R9   R/   R4   t   subR=   Rq   Rƒ   R~   RM   R…   R‹   RX   R   R    (   R   Rl   Rh   t   template_varR   Rk   t	   read_patht
   write_patht   authort   commentt	   copyrightR‘   RT   t   foundt   tmpRu   R5   RL   R   t   iRD   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt
   gen_policy`  sŠ    	
		

$



$



N(   R   R   R   R   R`   Rm   Ry   Ri   R{   R~   Rj   R€   Rƒ   R…   R‹   R=   R   (    (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyRY   Æ   s   	,												c         C   s*   x# |  D] } d t  j j | ƒ GHq Wd  S(   Ns   %s(   R)   R*   t   basename(   RA   Rœ   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   print_basefilenames¾  s    c         C   s&   x |  D] } t  | ƒ j ƒ  GHq Wd  S(   N(   RF   Rx   (   RA   Rœ   (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   print_filesÂ  s    c         C   s  t  j ƒ  } | j d d d d d d d d ƒ| j d	 d
 d d d d d t ƒ| j d d d d d d d d d d ƒ| j d d d d d d t ƒ| j d d d d d d d ƒ| j d d d d d d t ƒ| j d d d d d d ƒ| j d  d d! d d d t ƒ| j d" d d# d d$ d d ƒ| j d% d d& d d d t ƒ| j d' d( d d) d d* d d+ ƒ| j d, d d- d d. d d/ d d0 ƒ| j d1 d d2 d d3 d d/ d d0 ƒ| j d4 d5 d d6 d d7 d d8 ƒ| j d9 d d: d d; d d< ƒ| j d= d d> d d? d d< ƒ| j d@ d dA d dB d d< ƒ| j dC d dD d dE d dF d d0 ƒ| j |  ƒ \ } } | j r…t a n  | | f S(G   s   Parse argumentss   -cs   --config-filet   destR\   t   helps    Use alternate configuration filet   metavart   FILEs   -ds   --debugs   Show debugging outputt   actiont
   store_truet   defaults   -ts
   --templateRc   s   Use non-default policy templatet   TEMPLATEs   --list-templatess   List available templatess   --templates-dirRa   s#   Use non-default templates directoryt   DIRs   --show-templates   Show specified templates   -ps   --policy-groupss%   Comma-separated list of policy groupst   POLICYGROUPSs   --list-policy-groupss   List available policy groupss   --policy-groups-dirRe   s'   Use non-default policy-groups directorys   --show-policy-groups   Show specified policy groupss   -as   --abstractionsR   s$   Comma-separated list of abstractionst   ABSTRACTIONSs   --read-pathR•   s   Path allowing owner readst   PATHR?   s   --write-pathR–   s   Path allowing owner writess   -ns   --nameRl   s   Name of policyt   NAMEs	   --commentR˜   s   Comment for policyt   COMMENTs   --authorR—   s   Author of policys   --copyrightR™   s   Copyright for policys   --template-varR”   s   Declare AppArmor variables   @{VARIABLE}=VALUE(   t   optparset   OptionParsert
   add_optionR-   t
   parse_argsR   R/   R(   (   t   argst   parsert   my_optt   my_args(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyR²   Æ  s     		c         C   s#  t  d |  ƒ } | j r( | j | d <n t j j |  ƒ | d <| j rW | j | d <n  | j rp | j | d <n  | j r‰ | j | d <n  | j r¢ | j | d <n  | j	 r» | j	 | d <n  | j rÔ | j | d <n  | j
 rí | j
 | d <n  | j r| j | d	 <n  | j r| j | d
 <n  | S(   s"   Generate parameters for gen_policyRh   Rl   R”   R   Rk   R•   R–   R˜   R—   R™   (   R]   Rl   R)   R*   Rž   R”   R   Rk   R•   R–   R˜   R—   R™   (   Rh   Rn   t   params(    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   gen_policy_params  s.    										(    (    RE   R>   R¯   R)   R4   R   R	   RO   R,   R    R-   R(   R/   R   R   R   R   R!   R'   R   R3   R7   R<   RC   RH   RX   RY   RŸ   R    R=   R²   R¸   (    (    (    s5   /usr/lib/python2.7/dist-packages/apparmor/easyprof.pyt   <module>   s4   										
	ø		V