
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Kl„f¯© ã               @   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 dlT dZ	d dl
Z
d dlZd dlZy:d dlZi ZejdRk r„ded< eje	fddd	œe—Ž W nJ   yd dlZeejd
< W n& ek
râ   d dlZeejd
< Y nX Y nX d dlZi Zeed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< eed< e ed < e ed!< e ed"< dddddddd d#œZ!d$d$d%d&d'd(d)d*dd+œ	Z"y(d dl#Z#e#j$e#j%ƒ ƒ G d,d-„ d-ƒZ&W n( e'efk
�r4   G d.d-„ d-ƒZ&Y nX G d/d0„ d0ƒZ(d1d2„ Z)dSd4d5„Z*dTd6d7„Z+G d8d9„ d9ƒZ,G d:d;„ d;e,ƒZ-G d<d=„ d=e,ƒZ.G d>d?„ d?e,ƒZ/G d@dA„ dAe,ƒZ0G dBdC„ dCe,ƒZ1G dDdE„ dEe,ƒZ2G dFdG„ dGe,ƒZ3G dHdI„ dIe,ƒZ4G dJdK„ dKe,ƒZ5G dLdM„ dMe,ƒZ6G dNdO„ dOe,ƒZ7G dPdQ„ dQe,ƒZ8dS )Ué    N)Ú*zselinux-pythoné   TÚunicodez/usr/share/localezutf-8)Z	localedirZcodesetÚ_Ú z	all filesÚazregular filez--Úfz-dÚ	directoryÚdz-czcharacter deviceÚcz-bzblock deviceÚbz-sÚsocketÚsz-lÚlzsymbolic linkÚpz-pz
named pipe)z	all fileszregular filer	   zcharacter devicezblock devicer   zsymbolic linkz
named pipeÚanyÚblockÚcharÚdirÚfileÚsymlinkÚpipe)	r   r   r   r   r
   r   r   r   r   c               @   s8   e Zd Zdd„ Zddd„Zddd„Zdd	„ Zd
d„ ZdS )Úloggerc             C   s   t jƒ | _g | _g | _d S )N)ÚauditÚ
audit_openÚaudit_fdÚlog_listÚlog_change_list)Úself© r   ú/usr/lib/python3.6/seobject.pyÚ__init__l   s    
zlogger.__init__r   c	       
      C   sˆ   d}	||kr||	d 7 }d}	||kr4||	d 7 }d}	||krL||	d 7 }d}	| j j| jtjtjd t|ƒ|d||||||dddgƒ d S )Nú-Úsenameú,ÚroleÚranger   r   )r   Úappendr   r   ZAUDIT_ROLE_ASSIGNÚsysÚargvÚstr)
r   ÚmsgÚnamer#   ÚseroleÚserangeÚ	oldsenameÚ	oldseroleÚ
oldserangeÚsepr   r   r    Úlogq   s    z
logger.logc	       	      C   s<   | j j| jtjtjd t|ƒ|d||||||dddgƒ d S )Nr   r   )r   r'   r   r   ZAUDIT_ROLE_REMOVEr(   r)   r*   )	r   r+   r,   r#   r-   r.   r/   r0   r1   r   r   r    Ú
log_remove€   s    zlogger.log_removec             C   s&   | j j| jtjt|ƒddddgƒ d S )NÚsemanager   )r   r'   r   r   ZAUDIT_USER_MAC_CONFIG_CHANGEr*   )r   r+   r   r   r    Ú
log_changeƒ   s    zlogger.log_changec             C   sP   x| j D ]}tj||g Ž  qW x| jD ]}tj||g Ž  q(W g | _ g | _d S )N)r   r   Zaudit_log_semanage_messager   Zaudit_log_user_comm_message)r   Úsuccessr   r   r   r    Úcommit†   s    zlogger.commitN)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r!   r3   r4   r6   r8   r   r   r   r    r   j   s
   

r   c               @   s8   e Zd Zdd„ Zddd„Zddd„Zdd	„ Zd
d„ ZdS )r   c             C   s
   g | _ d S )N)r   )r   r   r   r    r!   ‘   s    zlogger.__init__r   c	       
      C   s¤   d||f }	|dkr |	d| 7 }	|dkr4|	d| 7 }	|dkrH|	d| 7 }	|dkr\|	d| 7 }	|dkrx|d k	rx|	d| 7 }	|dkr”|d k	r”|	d| 7 }	| j j|	ƒ d S )	Nz %s name=%sr   z sename=z oldsename=z role=z
 old_role=z
 MLSRange=z old_MLSRange=)r   r'   )
r   r+   r,   r#   r-   r.   r/   r0   r1   Úmessager   r   r    r3   ”   s    z
logger.logc	       	   	   C   s   | j ||||||||ƒ d S )N)r3   )	r   r+   r,   r#   r-   r.   r/   r0   r1   r   r   r    r4   ¤   s    zlogger.log_removec             C   s   | j jd| ƒ d S )Nz %s)r   r'   )r   r+   r   r   r    r6   §   s    zlogger.log_changec             C   s8   |dkrd}nd}x | j D ]}tjtj|| ƒ qW d S )Né   zSuccessful: zFailed: )r   ÚsyslogZLOG_INFO)r   r7   r<   r   r   r   r    r8   ª   s
    zlogger.commitN)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r9   r:   r;   r!   r3   r4   r6   r8   r   r   r   r    r   �   s
   

c               @   s0   e Zd Zddd„Zddd„Zdd„ Zdd	„ Zd
S )Ú
nullloggerr   c	       	      C   s   d S )Nr   )	r   r+   r,   r#   r-   r.   r/   r0   r1   r   r   r    r3   µ   s    znulllogger.logc	       	      C   s   d S )Nr   )	r   r+   r,   r#   r-   r.   r/   r0   r1   r   r   r    r4   ¸   s    znulllogger.log_removec             C   s   d S )Nr   )r   r+   r   r   r    r6   »   s    znulllogger.log_changec             C   s   d S )Nr   )r   r7   r   r   r    r8   ¾   s    znulllogger.commitN)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r9   r:   r;   r3   r4   r6   r8   r   r   r   r    r?   ³   s   

r?   c             C   sX   d}d}|d | d }|d | d }|d | d d | d }t jd	| d
 | ƒS )Nzs[0-9]*zc[0-9]*z(\.z)?z(\,z)*z(-z(:ú^ú$)ÚreÚsearch)ÚrawZsensitivityÚcategoryZ	cat_rangeZ
categoriesZregr   r   r    Úvalidate_levelÂ   s    rF   r=   c             C   s`   d}|dkrd|| f }n| }t j|ƒ\}}|dkr8| S |rL|t|ƒd … }|dkrX| S |S d S )Nza:b:c:r=   z%s%sr   r   )ÚselinuxZselinux_raw_to_trans_contextÚlen)rD   ÚprependÚfillerÚcontextÚrcÚtransr   r   r    Ú	translateË   s    rN   c             C   s`   d}|dkrd|| f }n| }t j|ƒ\}}|dkr8| S |rL|t|ƒd … }|dkrX| S |S d S )Nza:b:c:r=   z%s%sr   r   )rG   Zselinux_trans_to_raw_contextrH   )rM   rI   rJ   rK   rL   rD   r   r   r    ÚuntranslateÜ   s    rO   c               @   sf   e Zd ZdZdZdZdZddd„Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚsemanageRecordsFNc             C   s¨   |rt |ƒtkr|| _n|| _t|ddƒ| _| js@t|ddƒ| _| j| jƒ| _tj	ƒ \}}| jdksn| j|krxt
ƒ | _n,tj| jƒ tjdtjƒ | jf ƒ tƒ | _d S )NÚnoreloadFÚstorer   z%s%s)Útyper*   rR   ÚargsÚgetattrrQ   Ú
get_handleÚshrG   Úselinux_getpolicytyper   ÚmylogÚsepolicyZload_store_policyZselinux_set_policy_rootZselinux_pathr?   )r   rT   rL   Z
localstorer   r   r    r!   ô   s    
zsemanageRecords.__init__c             C   s   | | _ d S )N)rQ   )r   Úloadr   r   r    Ú
set_reload
  s    zsemanageRecords.set_reloadc             C   sØ   t jrt jS tƒ }|s"ttdƒƒ‚t j rD|dkrDt||tƒ |t _t	|ƒs`t
|ƒ ttdƒƒ‚t|ƒ}|tk r„t
|ƒ ttdƒƒ‚t|ƒ}|dk r¨t
|ƒ ttdƒƒ‚t|ƒatdk rÌt
|ƒ ttdƒƒ‚|t _t jS )Nz Could not create semanage handler   z:SELinux policy is not managed or store cannot be accessed.zCannot read policy store.r   z'Could not establish semanage connectionz!Could not test MLS enabled status)rP   ÚhandleZsemanage_handle_createÚ
ValueErrorr   ÚtransactionZsemanage_select_storeZSEMANAGE_CON_DIRECTrR   Zsemanage_is_managedZsemanage_handle_destroyZsemanage_access_checkZSEMANAGE_CAN_READZsemanage_connectZsemanage_mls_enabledÚis_mls_enabled)r   rR   r]   rL   r   r   r    rV     s2    zsemanageRecords.get_handlec             C   s   t tdƒƒ‚d S )NzNot yet implemented)r^   r   )r   r   r   r    Ú	deleteall1  s    zsemanageRecords.deleteallc             C   s$   t jrttdƒƒ‚| jƒ  dt _d S )Nz(Semanage transaction already in progressT)rP   r_   r^   r   Úbegin)r   r   r   r    Ústart4  s    zsemanageRecords.startc             C   s,   t jr
d S t| jƒ}|dk r(ttdƒƒ‚d S )Nr   z$Could not start semanage transaction)rP   r_   Zsemanage_begin_transactionrW   r^   r   )r   rL   r   r   r    rb   :  s
    
zsemanageRecords.beginc             C   s   t tdƒƒ‚d S )NzNot yet implemented)r^   r   )r   r   r   r    Ú
customizedA  s    zsemanageRecords.customizedc             C   sV   t jr
d S | jrt| jdƒ t| jƒ}|dk rF| jjdƒ tt	dƒƒ‚| jjdƒ d S )Nr   z%Could not commit semanage transactionr=   )
rP   r_   rQ   Zsemanage_set_reloadrW   Zsemanage_commitrY   r8   r^   r   )r   rL   r   r   r    r8   D  s    
zsemanageRecords.commitc             C   s$   t jsttdƒƒ‚dt _| jƒ  d S )Nz$Semanage transaction not in progressF)rP   r_   r^   r   r8   )r   r   r   r    ÚfinishP  s    zsemanageRecords.finish)N)r9   r:   r;   r_   r]   rR   rT   r!   r\   rV   ra   rc   rb   rd   r8   re   r   r   r   r    rP   î   s   
$rP   c               @   sP   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d„ Z	dd„ Z
dS )ÚmoduleRecordsNc             C   s   t j| |ƒ d S )N)rP   r!   )r   rT   r   r   r    r!   Y  s    zmoduleRecords.__init__c             C   s  g }t | jƒ\}}}|dk r(ttdƒƒ‚x¼t|ƒD ]°}t||ƒ}t| j|ƒ\}}|dk rdttdƒƒ‚t| j|ƒ\}}|dk rˆttdƒƒ‚t| j|ƒ\}}	|dk r¬ttdƒƒ‚t	| j|ƒ\}}
|dk rÐttdƒƒ‚|j
|||	|
fƒ q2W |jdd„ d	d
� |jdd„ d� |S )Nr   zCould not list SELinux moduleszCould not get module namezCould not get module enabledzCould not get module priorityzCould not get module lang_extc             S   s   | d S )Nr   r   )Útr   r   r    Ú<lambda>x  s    z'moduleRecords.get_all.<locals>.<lambda>T)ÚkeyÚreversec             S   s   | d S )Nr   r   )rg   r   r   r    rh   y  s    )ri   )Zsemanage_module_list_allrW   r^   r   r&   Úsemanage_module_list_nthZsemanage_module_info_get_nameZ semanage_module_info_get_enabledZ!semanage_module_info_get_priorityZ!semanage_module_info_get_lang_extr'   Úsort)r   r   rL   ÚmlistÚnumberÚiÚmodr,   ZenabledÚpriorityZlang_extr   r   r    Úget_all\  s,    
zmoduleRecords.get_allc             C   s0   | j ƒ }t|ƒdkrg S dd„ dd„ |D ƒD ƒS )Nr   c             S   s   g | ]}d |d  ‘qS )z-d %sr   r   )Ú.0Úxr   r   r    ú
<listcomp>€  s    z,moduleRecords.customized.<locals>.<listcomp>c             S   s   g | ]}|d  dkr|‘qS )r=   r   r   )rs   rg   r   r   r    ru   €  s    )rr   rH   )r   Úallr   r   r    rd   |  s    zmoduleRecords.customizedr=   r   c             C   sŒ   | j ƒ }t|ƒdkrd S |r:tdtdƒtdƒtdƒf ƒ xL|D ]D}|d dkrZtdƒ}n
|r`q@d}td	|d |d
 |d |f ƒ q@W d S )Nr   z
%-25s %-9s %s
zModule NameZPriorityZLanguager=   ZDisabledr   z%-25s %-9s %-5s %sé   r   )rr   rH   Úprintr   )r   ÚheadingÚ	locallistrv   rg   Zdisabledr   r   r    Úlist‚  s    

zmoduleRecords.listc             C   s`   t jj|ƒsttdƒ| ƒ‚t| j|ƒ}|dk r@ttdƒ| ƒ‚t| j|ƒ}|dkr\| jƒ  d S )NzModule does not exist: %s r   z3Invalid priority %d (needs to be between 1 and 999))	ÚosÚpathÚexistsr^   r   Úsemanage_set_default_priorityrW   Zsemanage_module_install_filer8   )r   r   rq   rL   r   r   r    Úadd’  s    zmoduleRecords.addc             C   sž   x�|j ƒ D ]„}t| jƒ\}}|dk r0ttdƒƒ‚t| j||ƒ}|dk rRttdƒƒ‚t| j||ƒ}|dk r
|r~ttdƒ| ƒ‚q
ttdƒ| ƒ‚q
W | jƒ  d S )Nr   zCould not create module keyzCould not set module key namezCould not enable module %szCould not disable module %s)ÚsplitZsemanage_module_key_createrW   r^   r   Zsemanage_module_key_set_nameZsemanage_module_set_enabledr8   )r   ÚmoduleÚenableÚmrL   ri   r   r   r    Úset_enabledž  s    zmoduleRecords.set_enabledc             C   sn   t | j|ƒ}|dk r$ttdƒ| ƒ‚x<|jƒ D ]0}t| j|ƒ}|dk r.|dkr.ttdƒ| ƒ‚q.W | jƒ  d S )Nr   z3Invalid priority %d (needs to be between 1 and 999)rw   z*Could not remove module %s (remove failed)éþÿÿÿ)r   rW   r^   r   r�   Úsemanage_module_remover8   )r   r‚   rq   rL   r„   r   r   r    Údelete°  s    zmoduleRecords.deletec             C   s:   dd„ dd„ | j ƒ D ƒD ƒ}x|D ]}| j|dƒ q"W d S )Nc             S   s   g | ]}|d  ‘qS )r   r   )rs   rt   r   r   r    ru   ½  s    z+moduleRecords.deleteall.<locals>.<listcomp>c             S   s   g | ]}|d  dkr|‘qS )r=   r   r   )rs   rg   r   r   r    ru   ½  s    T)rr   r…   )r   r   r„   r   r   r    ra   ¼  s    
zmoduleRecords.deleteall)N)r=   r   )r9   r:   r;   r!   rr   rd   r{   r€   r…   rˆ   ra   r   r   r   r    rf   W  s   
 
rf   c               @   s   e Zd Zddd„Zdd„ ZdS )ÚdontauditClassNc             C   s   t j| |ƒ d S )N)rP   r!   )r   rT   r   r   r    r!   Ä  s    zdontauditClass.__init__c             C   s8   |dkrt tdƒƒ‚| jƒ  t| j|dkƒ | jƒ  d S )NÚonÚoffz'dontaudit requires either 'on' or 'off')rŠ   r‹   )r^   r   rb   Zsemanage_set_disable_dontauditrW   r8   )r   Z	dontauditr   r   r    ÚtoggleÇ  s
    zdontauditClass.toggle)N)r9   r:   r;   r!   rŒ   r   r   r   r    r‰   Â  s   
r‰   c               @   sH   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d„ Z	dS )ÚpermissiveRecordsNc             C   s   t j| |ƒ d S )N)rP   r!   )r   rT   r   r   r    r!   Ñ  s    zpermissiveRecords.__init__c             C   sr   g }t | jƒ\}}}|dk r(ttdƒƒ‚xDt|ƒD ]8}t||ƒ}t|ƒ}|r2|jdƒr2|j|j	dƒd ƒ q2W |S )Nr   zCould not list SELinux modulesZpermissive_r=   )
Zsemanage_module_listrW   r^   r   r&   rk   Zsemanage_module_get_nameÚ
startswithr'   r�   )r   r   rL   rm   rn   ro   rp   r,   r   r   r    rr   Ô  s    
zpermissiveRecords.get_allc             C   s   dd„ t | jƒ ƒD ƒS )Nc             S   s   g | ]}d | ‘qS )z-a %sr   )rs   rt   r   r   r    ru   â  s    z0permissiveRecords.customized.<locals>.<listcomp>)Úsortedrr   )r   r   r   r    rd   á  s    zpermissiveRecords.customizedr=   r   c             C   s¨   dd„ dd„ t jt jƒD ƒD ƒ}t|ƒdkr0d S |rDtdtdƒ ƒ | jƒ }x|D ]}||krRt|ƒ qRW t|ƒdkrzd S |rŽtdtdƒ ƒ x|D ]}t|ƒ q”W d S )Nc             S   s   g | ]}|d  ‘qS )r,   r   )rs   Úyr   r   r    ru   å  s    z*permissiveRecords.list.<locals>.<listcomp>c             S   s   g | ]}|d  r|‘qS )Z
permissiver   )rs   rt   r   r   r    ru   å  s    r   z
%-25s
zBuiltin Permissive TypeszCustomized Permissive Types)rZ   ÚinfoZTYPErH   rx   r   rr   )r   ry   rz   rv   rd   rg   r   r   r    r{   ä  s     

zpermissiveRecords.listc             C   s‚   ydd l j}W n  tk
r.   ttdƒƒ‚Y nX d| }d| }t| j|t|ƒ|dƒ}|dkrf| jƒ  |dk r~ttdƒ| ƒ‚d S )Nr   zÎThe sepolgen python module is required to setup permissive domains.
In some distributions it is included in the policycoreutils-devel package.
# yum install policycoreutils-devel
Or similar for your distro.zpermissive_%sz(typepermissive %s)Zcilz?Could not set permissive domain %s (module installation failed))	Zsepolgen.moduler‚   ÚImportErrorr^   r   Zsemanage_module_installrW   rH   r8   )r   rS   r‚   r,   ZmodtxtrL   r   r   r    r€   ø  s    zpermissiveRecords.addc             C   sF   x8|j ƒ D ],}t| jd| ƒ}|dk r
ttdƒ| ƒ‚q
W | jƒ  d S )Nzpermissive_%sr   z5Could not remove permissive domain %s (remove failed))r�   r‡   rW   r^   r   r8   )r   r,   ÚnrL   r   r   r    rˆ     s
    zpermissiveRecords.deletec             C   s,   | j ƒ }t|ƒdkr(dj|ƒ}| j|ƒ d S )Nr   ú )rr   rH   Újoinrˆ   )r   r   rv   r   r   r    ra     s    
zpermissiveRecords.deleteall)N)r=   r   )
r9   r:   r;   r!   rr   rd   r{   r€   rˆ   ra   r   r   r   r    r�   Ï  s   

r�   c               @   s~   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd dd„Zd!dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zd"dd„Zdd„ Zd#dd„ZdS )$ÚloginRecordsNc             C   s(   t j| |ƒ d | _d | _d | _d | _d S )N)rP   r!   r/   r1   r#   r.   )r   rT   r   r   r    r!     s
    zloginRecords.__init__c             C   sü  t j|ƒ\}| _| _|dkr d}t| jƒ}|j| jƒ\}\}}|j|ƒ\}\}}	tdkrn|dkrjt|ƒ}n|}t	| j
|ƒ\}}
|dk r–ttdƒ| ƒ‚|d dkràytj|dd … ƒ W n$   ttdƒ|dd …  ƒ‚Y nX n,ytj|ƒ W n   ttdƒ| ƒ‚Y nX t| j
ƒ\}}|dk �r4ttd	ƒ| ƒ‚t| j
||ƒ}|dk �r\ttd
ƒ| ƒ‚tdk�r˜|dk�r˜t| j
||ƒ}|dk �r˜ttdƒ| ƒ‚t| j
||ƒ}|dk �rÀttdƒ| ƒ‚t| j
|
|ƒ}|dk �rèttdƒ| ƒ‚t|
ƒ t|ƒ d S )Nr   Zuser_ur=   r   zCould not create a key for %sú%zLinux Group %s does not existzLinux User %s does not existz%Could not create login mapping for %szCould not set name for %szCould not set MLS range for %sz!Could not set SELinux user for %sz"Could not add login mapping for %s)rG   Úgetseuserbynamer/   r1   ÚseluserRecordsrT   Úgetr`   rO   Úsemanage_seuser_key_createrW   r^   r   ÚgrpZgetgrnamÚpwdÚgetpwnamZsemanage_seuser_createZsemanage_seuser_set_nameÚsemanage_seuser_set_mlsrangeÚsemanage_seuser_set_senameÚsemanage_seuser_modify_localÚsemanage_seuser_key_freeÚsemanage_seuser_free)r   r,   r#   r.   ÚrecÚuserrecr&   rL   r0   r-   ÚkÚur   r   r    Ú__add   sP    

 




zloginRecords.__addc             C   sx   yL| j ƒ  | j|ƒr4ttdƒ| ƒ | j|||ƒ n| j|||ƒ | jƒ  W n& tk
rr } z
|‚W Y d d }~X nX d S )Nz:Login mapping for %s is already defined, modifying instead)rb   Ú_loginRecords__existsrx   r   Ú_loginRecords__modifyÚ_loginRecords__addr8   r^   )r   r,   r#   r.   Úerrorr   r   r    r€   V  s    
zloginRecords.addc             C   s\   t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚t|ƒ |S )Nr   zCould not create a key for %sz2Could not check if login mapping for %s is defined)r›   rW   r^   r   Úsemanage_seuser_existsr¢   )r   r,   rL   r¦   r~   r   r   r    Ú__existsd  s    zloginRecords.__existsr   c             C   s°  t j|ƒ\}| _| _|dkr0|dkr0ttdƒƒ‚t| jƒ}|j| jƒ\}\}}|dkrj|j|ƒ\}\}}	n|}	|dkr~|| _	n|| _	t
| j|ƒ\}}
|dk r¬ttdƒ| ƒ‚t| j|
ƒ\}}|dk rÔttdƒ| ƒ‚|sèttdƒ| ƒ‚t| j|
ƒ\}}|dk �rttdƒ| ƒ‚t|ƒ| _t|ƒ| _tdk�rL|dk�rLt| j|t|ƒƒ |dk�rlt| j||ƒ || _n| j| _t| j|
|ƒ}|dk �rœttd	ƒ| ƒ‚t|
ƒ t|ƒ d S )
Nr   zRequires seuser or seranger   zCould not create a key for %sz2Could not check if login mapping for %s is definedz#Login mapping for %s is not definedzCould not query seuser for %sr=   z%Could not modify login mapping for %s)rG   r˜   r/   r1   r^   r   r™   rT   rš   r.   r›   rW   r­   Zsemanage_seuser_queryÚsemanage_seuser_get_mlsrangeÚsemanage_seuser_get_senamer`   rŸ   rO   r    r#   r¡   r¢   r£   )r   r,   r#   r.   r¤   r¥   r&   rL   r0   r-   r¦   r~   r§   r   r   r    Ú__modifyp  sF    





zloginRecords.__modifyc             C   sN   y"| j ƒ  | j|||ƒ | jƒ  W n& tk
rH } z
|‚W Y d d }~X nX d S )N)rb   rª   r8   r^   )r   r,   r#   r.   r¬   r   r   r    Úmodify¢  s    zloginRecords.modifyc       
      C   s*  t j|ƒ\}| _| _t| jƒ}|j| jƒ\}\}}t| j|ƒ\}}|dk rZt	t
dƒ| ƒ‚t| j|ƒ\}}|dk r‚t	t
dƒ| ƒ‚|s–t	t
dƒ| ƒ‚t| j|ƒ\}}|dk r¾t	t
dƒ| ƒ‚|sÒt	t
dƒ| ƒ‚t| j|ƒ}|dk röt	t
dƒ| ƒ‚t|ƒ t jdƒ\}| _| _|j| jƒ\}\}}	d S )Nr   zCould not create a key for %sz2Could not check if login mapping for %s is definedz#Login mapping for %s is not definedz<Login mapping for %s is defined in policy, cannot be deletedz%Could not delete login mapping for %sZ__default__)rG   r˜   r/   r1   r™   rT   rš   r›   rW   r^   r   r­   Zsemanage_seuser_exists_localZsemanage_seuser_del_localr¢   r#   r.   )
r   r,   r¤   r¥   r&   rL   r0   r¦   r~   r-   r   r   r    Ú__deleteª  s,    
zloginRecords.__deletec             C   sJ   y| j ƒ  | j|ƒ | jƒ  W n& tk
rD } z
|‚W Y d d }~X nX d S )N)rb   Ú_loginRecords__deleter8   r^   )r   r,   r¬   r   r   r    rˆ   È  s    
zloginRecords.deletec             C   s~   t | jƒ\}}|dk r"ttdƒƒ‚y0| jƒ  x|D ]}| jt|ƒƒ q2W | jƒ  W n& tk
rx } z
|‚W Y d d }~X nX d S )Nr   zCould not list login mappings)Úsemanage_seuser_list_localrW   r^   r   rb   r´   Úsemanage_seuser_get_namer8   )r   rL   Úulistr§   r¬   r   r   r    ra   Ñ  s    
zloginRecords.deleteallc             C   s¨   i }t jƒ d | _x�tj| jƒD ]€\}}}|| jkr xj|D ]b}yHt|d | ƒ}|jƒ jƒ jdƒ}|j	ƒ  |d |d |d f||< W q: t
k
rš   Y q:X q:W q W |S )Nz/loginsú/ú:r=   rw   r   )rG   Zselinux_policy_rootÚlogins_pathr|   ÚwalkÚopenÚreadÚrstripr�   ÚcloseÚ
IndexError)r   Úddictr}   ÚdirsÚfilesr,   Úfdr¤   r   r   r    Úget_all_loginsÞ  s    

zloginRecords.get_all_loginsr   c             C   sp   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚x,| jD ]"}t|ƒ}t|ƒt|ƒdf||< qFW |S )Nr   zCould not list login mappingsr   )	rµ   rW   r·   Zsemanage_seuser_listr^   r   r¶   r°   r¯   )r   rz   rÁ   rL   r§   r,   r   r   r    rr   í  s    zloginRecords.get_allc             C   st   g }| j dƒ}x`t|jƒ ƒD ]P}|| d rR|jd|| d || d |f ƒ q|jd|| d |f ƒ qW |S )NTr=   z-a -s %s -r '%s' %sr   z-a -s %s %s)rr   r�   Úkeysr'   )r   r   rÁ   r¦   r   r   r    rd   û  s    
&zloginRecords.customizedr=   c       	      C   sN  | j |ƒ}| jƒ }t|jƒ ƒ}t|jƒ ƒ}t|ƒdkrFt|ƒdkrFd S tdk�r|rxtdtdƒtdƒtdƒtdƒf ƒ x8|D ]0}|| }td||d t|d ƒ|d	 f ƒ q~W t|ƒrÈtd
| j	 ƒ x€|D ]0}|| }td||d t|d ƒ|d	 f ƒ qÎW nF|�r"tdtdƒtdƒf ƒ x&|D ]}td||| d f ƒ �q(W d S )Nr   r=   z
%-20s %-20s %-20s %s
z
Login NamezSELinux UserzMLS/MCS RangeZServicez%-20s %-20s %-20s %srw   z
Local customization in %sz
%-25s %-25s
z%-25s %-25s)
rr   rÅ   r�   rÆ   rH   r`   rx   r   rN   rº   )	r   ry   rz   rÁ   ZldictZlkeysrÆ   r¦   r§   r   r   r    r{     s*    

$
(
*
zloginRecords.list)N)r   r   )r   r   )r   )r=   r   )r9   r:   r;   r!   r«   r€   r©   rª   r²   r´   rˆ   ra   rÅ   rr   rd   r{   r   r   r   r    r–     s   
6
2
	

r–   c               @   sŽ   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zg dddfdd„Zg dddfdd„Z	dd„ Z
dd„ Zdd„ Zd dd„Zdd„ Zd!dd„ZdS )"r™   Nc             C   s   t j| |ƒ d S )N)rP   r!   )r   rT   r   r   r    r!   "  s    zseluserRecords.__init__c             C   s¤   t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚t| j|ƒ\}}|dk rxttdƒ| ƒ‚t|ƒ}t| j|ƒ}t|ƒ t	|ƒ ||fS )Nr   zCould not create a key for %sz-Could not check if SELinux user %s is definedzCould not query user for %s)
Úsemanage_user_key_createrW   r^   r   Úsemanage_user_existsÚsemanage_user_queryÚsemanage_user_get_mlsrangeÚsemanage_user_get_rolesÚsemanage_user_key_freeÚsemanage_user_free)r   r,   rL   r¦   r~   r§   r.   r-   r   r   r    rš   %  s    zseluserRecords.getc             C   s  t dkr4|dkrd}nt|ƒ}|dkr,d}nt|ƒ}t|ƒdk rPttdƒ| ƒ‚t| j|ƒ\}}|dk rxttdƒ| ƒ‚t| jƒ\}}|dk ržttdƒ| ƒ‚t| j||ƒ}|dk rÄttdƒ| ƒ‚x6|D ].}	t	| j||	ƒ}|dk rÊttd	ƒ|	|f ƒ‚qÊW t dk�rVt
| j||ƒ}|dk �r.ttd
ƒ| ƒ‚t| j||ƒ}|dk �rVttdƒ| ƒ‚t| j||ƒ}|dk �r‚ttdƒ|	|f ƒ‚t| j|ƒ\}}
|dk �r¬ttdƒ| ƒ‚t| j||ƒ}|dk �rÔttdƒ| ƒ‚t|ƒ t|ƒ | jjd|dj|ƒ|d� d S )Nr=   r   Ús0z%You must add at least one role for %sr   zCould not create a key for %sz$Could not create SELinux user for %szCould not set name for %szCould not add role %s for %szCould not set MLS range for %szCould not set MLS level for %szCould not add prefix %s for %szCould not extract key for %szCould not add SELinux user %sÚseuserr$   )r#   r-   r.   )r`   rO   rH   r^   r   rÇ   rW   Zsemanage_user_createZsemanage_user_set_nameÚsemanage_user_add_roleÚsemanage_user_set_mlsrangeÚsemanage_user_set_mlslevelÚsemanage_user_set_prefixZsemanage_user_key_extractÚsemanage_user_modify_localrÌ   rÍ   rY   r3   r•   )r   r,   ÚrolesÚselevelr.   ÚprefixrL   r¦   r§   Úrri   r   r   r    r¨   5  sR    






zseluserRecords.__addc             C   sŒ   yT| j ƒ  | j|ƒr8ttdƒ| ƒ | j|||||ƒ n| j|||||ƒ | jƒ  W n2 tk
r† } z| jjdƒ |‚W Y d d }~X nX d S )Nz5SELinux user %s is already defined, modifying insteadr   )	rb   Ú_seluserRecords__existsrx   r   Ú_seluserRecords__modifyÚ_seluserRecords__addr8   r^   rY   )r   r,   rÕ   rÖ   r.   r×   r¬   r   r   r    r€   l  s    
zseluserRecords.addc             C   s\   t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚t|ƒ |S )Nr   zCould not create a key for %sz-Could not check if SELinux user %s is defined)rÇ   rW   r^   r   rÈ   rÌ   )r   r,   rL   r¦   r~   r   r   r    r®   y  s    zseluserRecords.__existsr   c          	   C   s@  d}d}dj |ƒ}|dkrXt|ƒdkrX|dkrX|dkrXtdkrLttdƒƒ‚nttdƒƒ‚t| j|ƒ\}	}
|	dk r€ttdƒ| ƒ‚t| j|
ƒ\}	}|	dk r¨ttdƒ| ƒ‚|s¼ttd	ƒ| ƒ‚t| j|
ƒ\}	}|	dk rättd
ƒ| ƒ‚t	|ƒ}t
| j|ƒ\}	}|	dk�rdj |ƒ}tdk�r6|dk�r6t| j|t|ƒƒ tdk�r\|dk�r\t| j|t|ƒƒ |dk�rtt| j||ƒ t|ƒdk�rÎx"|D ]}||k�rˆt||ƒ �qˆW x&|D ]}||k�r¬t| j||ƒ �q¬W t| j|
|ƒ}	|	dk �röttdƒ| ƒ‚t|
ƒ t|ƒ dj |jƒ ƒ}dj |jƒ ƒ}| jjd||||||d� d S )Nr   r”   r   r=   z&Requires prefix, roles, level or rangezRequires prefix or roleszCould not create a key for %sz-Could not check if SELinux user %s is definedzSELinux user %s is not definedzCould not query user for %sz Could not modify SELinux user %sr$   rÏ   )r#   r/   r-   r.   r0   r1   )r•   rH   r`   r^   r   rÇ   rW   rÈ   rÉ   rÊ   rË   rÑ   rO   rÒ   rÓ   Zsemanage_user_del_rolerÐ   rÔ   rÌ   rÍ   r�   rY   r3   )r   r,   rÕ   rÖ   r.   r×   r0   r1   ZnewrolesrL   r¦   r~   r§   ÚrlistrØ   r%   r   r   r    r±   …  sV    
$







zseluserRecords.__modifyc             C   s^   y&| j ƒ  | j|||||ƒ | jƒ  W n2 tk
rX } z| jjdƒ |‚W Y d d }~X nX d S )Nr   )rb   rÚ   r8   r^   rY   )r   r,   rÕ   rÖ   r.   r×   r¬   r   r   r    r²   ½  s    zseluserRecords.modifyc       	      C   s8  t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚|sdttdƒ| ƒ‚t| j|ƒ\}}|dk rŒttdƒ| ƒ‚|s ttdƒ| ƒ‚t| j|ƒ\}}|dk rÈttdƒ| ƒ‚t|ƒ}t| j|ƒ\}}dj	|ƒ}t
| j|ƒ}|dk �rttdƒ| ƒ‚t|ƒ t|ƒ | jjd	|||d
� d S )Nr   zCould not create a key for %sz-Could not check if SELinux user %s is definedzSELinux user %s is not definedz7SELinux user %s is defined in policy, cannot be deletedzCould not query user for %sr$   z Could not delete SELinux user %srÏ   )r/   r1   r0   )rÇ   rW   r^   r   rÈ   Zsemanage_user_exists_localrÉ   rÊ   rË   r•   Zsemanage_user_del_localrÌ   rÍ   rY   r4   )	r   r,   rL   r¦   r~   r§   r1   rÜ   r0   r   r   r    r³   Æ  s2    

zseluserRecords.__deletec             C   sV   y| j ƒ  | j|ƒ | jƒ  W n2 tk
rP } z| jjdƒ |‚W Y d d }~X nX d S )Nr   )rb   Ú_seluserRecords__deleter8   r^   rY   )r   r,   r¬   r   r   r    rˆ   ç  s    
zseluserRecords.deletec             C   sŠ   t | jƒ\}}|dk r"ttdƒƒ‚y0| jƒ  x|D ]}| jt|ƒƒ q2W | jƒ  W n2 tk
r„ } z| jjdƒ |‚W Y d d }~X nX d S )Nr   zCould not list login mappings)	Úsemanage_user_list_localrW   r^   r   rb   rÝ   Úsemanage_user_get_namer8   rY   )r   rL   r·   r§   r¬   r   r   r    ra   ñ  s    
zseluserRecords.deleteallr   c             C   s¬   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xh| jD ]^}t|ƒ}t| j|ƒ\}}|dk rzttdƒ| ƒ‚dj|ƒ}t	|ƒt
|ƒt|ƒ|f|t|ƒ< qFW |S )Nr   zCould not list SELinux usersz Could not list roles for user %sr”   )rÞ   rW   r·   Zsemanage_user_listr^   r   rß   rË   r•   Zsemanage_user_get_prefixZsemanage_user_get_mlslevelrÊ   )r   rz   rÁ   rL   r§   r,   rÜ   rÕ   r   r   r    rr   ÿ  s    
$zseluserRecords.get_allc             C   sŠ   g }| j dƒ}xvt|jƒ ƒD ]f}|| d s8|| d rh|jd|| d || d || d |f ƒ q|jd|| d |f ƒ qW |S )NTr=   rw   z-a -L %s -r %s -R '%s' %sr   z-a -R '%s' %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   r   r   r    rd     s    
0zseluserRecords.customizedr=   c          	   C   s  | j |ƒ}t|ƒdkrd S t|jƒ ƒ}tdkrÊ|r|tddtdƒtdƒtdƒf ƒ tdtdƒtd	ƒtd
ƒtdƒtdƒf ƒ xŽ|D ]B}td||| d t|| d ƒt|| d ƒ|| d f ƒ q‚W nB|rætdtdƒtdƒf ƒ x$|D ]}td||| d f ƒ qìW d S )Nr   r=   z
%-15s %-10s %-10s %-30sr   ZLabelingzMLS/z%-15s %-10s %-10s %-30s %s
zSELinux UserZPrefixz	MCS Levelz	MCS RangezSELinux Rolesz%-15s %-10s %-10s %-30s %srw   r   z	%-15s %s
z%-15s %s)rr   rH   r�   rÆ   r`   rx   r   rN   )r   ry   rz   rÁ   rÆ   r¦   r   r   r    r{     s    
 *
D
zseluserRecords.list)N)r   )r=   r   )r9   r:   r;   r!   rš   rÛ   r€   rÙ   rÚ   r²   rÝ   rˆ   ra   rr   rd   r{   r   r   r   r    r™      s   
78	!


r™   c               @   sˆ   e Zd Zg Zd dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd!dd„Zd"dd„Zdd„ Zd#dd„ZdS )$ÚportRecordsNc             C   sJ   t j| |ƒ y$tttjtjdƒƒd d ƒ| _W n tk
rD   Y nX d S )NZ	port_typer   Útypes)rP   r!   r{   rZ   r‘   Ú	ATTRIBUTEÚvalid_typesÚRuntimeError)r   rT   r   r   r    r!   4  s
    $zportRecords.__init__c       
      C   sÔ   t tttdœ}||jƒ kr$|| }nttdƒƒ‚|dkrDttdƒƒ‚|jdƒ}t|ƒdkrlt	|d ƒ }}nt	|d ƒ}t	|d ƒ}|dkr˜ttd	ƒƒ‚t
| j|||ƒ\}}	|dk rÈttd
ƒ||f ƒ‚|	|||fS )N)ZtcpZudpZsctpZdccpz0Protocol has to be one of udp, tcp, dccp or sctpr   zPort is requiredr"   r=   r   iÿÿ  zInvalid Portz Could not create a key for %s/%s)ZSEMANAGE_PROTO_TCPZSEMANAGE_PROTO_UDPZSEMANAGE_PROTO_SCTPZSEMANAGE_PROTO_DCCPrÆ   r^   r   r�   rH   ÚintZsemanage_port_key_createrW   )
r   ÚportÚprotoZ	protocolsÚproto_dZportsÚhighÚlowrL   r¦   r   r   r    Ú__genkey;  s(    

zportRecords.__genkeyc             C   s,  t dkr|dkrd}nt|ƒ}|dkr2ttdƒƒ‚tj|ƒ}|| jkrVttdƒ| ƒ‚| j||ƒ\}}}}t| j	ƒ\}	}
|	dk r”ttdƒ||f ƒ‚t
|
|ƒ t|
||ƒ t| j	ƒ\}	}|	dk rÔttdƒ||f ƒ‚t| j	|d	ƒ}	|	dk rþttd
ƒ||f ƒ‚t| j	|dƒ}	|	dk �r*ttdƒ||f ƒ‚t| j	||ƒ}	|	dk �rVttdƒ||f ƒ‚t dk�r–|dk�r–t| j	||ƒ}	|	dk �r–ttdƒ||f ƒ‚t| j	|
|ƒ}	|	dk �rÂttdƒ||f ƒ‚t| j	||
ƒ}	|	dk �rîttdƒ||f ƒ‚t|ƒ t|ƒ t|
ƒ | jjd|tj|ƒd	d||f ƒ d S )Nr=   r   rÎ   zType is requiredz'Type %s is invalid, must be a port typer   zCould not create port for %s/%sz"Could not create context for %s/%sÚsystem_uz,Could not set user in port context for %s/%sÚobject_rz,Could not set role in port context for %s/%sz,Could not set type in port context for %s/%sz2Could not set mls fields in port context for %s/%sz$Could not set port context for %s/%szCould not add port %s/%sz8resrc=port op=add lport=%s proto=%s tcontext=%s:%s:%s:%s)r`   rO   r^   r   rZ   Úget_real_type_namerã   Ú_portRecords__genkeyZsemanage_port_createrW   Zsemanage_port_set_protoZsemanage_port_set_rangeÚsemanage_context_createÚsemanage_context_set_userÚsemanage_context_set_roleÚsemanage_context_set_typeÚsemanage_context_set_mlsZsemanage_port_set_conÚsemanage_port_modify_localÚsemanage_context_freeÚsemanage_port_key_freeÚsemanage_port_freerY   r6   r   Úgetprotobyname)r   ræ   rç   r.   rS   r¦   rè   rê   ré   rL   r   Úconr   r   r    r¨   W  sR    







zportRecords.__addc             C   sX   | j ƒ  | j||ƒr<ttdƒj||d�ƒ | j||||ƒ n| j||||ƒ | jƒ  d S )Nz6Port {proto}/{port} already defined, modifying instead)rç   ræ   )rb   Ú_portRecords__existsrx   r   ÚformatÚ_portRecords__modifyÚ_portRecords__addr8   )r   ræ   rç   r.   rS   r   r   r    r€   ‘  s    zportRecords.addc       	      C   sN   | j ||ƒ\}}}}t| j|ƒ\}}|dk rBttdƒj||d�ƒ‚t|ƒ |S )Nr   z1Could not check if port {proto}/{port} is defined)rç   ræ   )rï   Úsemanage_port_existsrW   r^   r   rü   r÷   )	r   ræ   rç   r¦   rè   rê   ré   rL   r~   r   r   r    r®   š  s    zportRecords.__existsc             C   sŒ  |dkr2|dkr2t dkr&ttdƒƒ‚nttdƒƒ‚tj|ƒ}|rZ|| jkrZttdƒ| ƒ‚| j||ƒ\}}}}t| j|ƒ\}	}
|	dk ršttdƒ||f ƒ‚|
s²ttdƒ||f ƒ‚t	| j|ƒ\}	}|	dk rÞttd	ƒ||f ƒ‚t
|ƒ}t dk�r|dk�r d
}nt| j|t|ƒƒ |dk�r*t| j||ƒ t| j||ƒ}	|	dk �rVttdƒ||f ƒ‚t|ƒ t|ƒ | jjd|tj|ƒdd||f ƒ d S )Nr   r=   zRequires setype or serangezRequires setypez'Type %s is invalid, must be a port typer   z(Could not check if port %s/%s is definedzPort %s/%s is not definedzCould not query port %s/%srÎ   zCould not modify port %s/%sz;resrc=port op=modify lport=%s proto=%s tcontext=%s:%s:%s:%srì   rí   )r`   r^   r   rZ   rî   rã   rï   rÿ   rW   Zsemanage_port_queryÚsemanage_port_get_conrô   rO   ró   rõ   r÷   rø   rY   r6   r   rù   )r   ræ   rç   r.   Úsetyper¦   rè   rê   ré   rL   r~   r   rú   r   r   r    r±   ¤  s:    




zportRecords.__modifyc             C   s$   | j ƒ  | j||||ƒ | jƒ  d S )N)rb   rý   r8   )r   ræ   rç   r.   r  r   r   r    r²   Î  s    zportRecords.modifyc             C   sî   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x¶|D ]®}t|ƒ}t|ƒ}t|ƒ}t|ƒ}d||f }| j	||ƒ\}	}
}}|dk rŒttdƒ| ƒ‚t
| j|	ƒ}|dk r°ttdƒ| ƒ‚t|	ƒ ||krÄ|}| jjd|tj|ƒf ƒ q0W | jƒ  d S )Nr   zCould not list the portsz%s-%szCould not create a key for %szCould not delete the port %sz&resrc=port op=delete lport=%s proto=%s)Úsemanage_port_list_localrW   r^   r   rb   Úsemanage_port_get_protoÚsemanage_port_get_proto_strÚsemanage_port_get_lowÚsemanage_port_get_highrï   Úsemanage_port_del_localr÷   rY   r6   r   rù   r8   )r   rL   Úplistræ   rç   Ú	proto_strrê   ré   Zport_strr¦   rè   r   r   r    ra   Ó  s*    
zportRecords.deleteallc       	      C   sê   | j ||ƒ\}}}}t| j|ƒ\}}|dk r@ttdƒ||f ƒ‚|sXttdƒ||f ƒ‚t| j|ƒ\}}|dk r„ttdƒ||f ƒ‚|sœttdƒ||f ƒ‚t| j|ƒ}|dk rÄttdƒ||f ƒ‚t|ƒ | jj	d|t
j|ƒf ƒ d S )Nr   z(Could not check if port %s/%s is definedzPort %s/%s is not definedz2Port %s/%s is defined in policy, cannot be deletedzCould not delete port %s/%sz&resrc=port op=delete lport=%s proto=%s)rï   rÿ   rW   r^   r   Zsemanage_port_exists_localr  r÷   rY   r6   r   rù   )	r   ræ   rç   r¦   rè   rê   ré   rL   r~   r   r   r    r³   ñ  s     zportRecords.__deletec             C   s    | j ƒ  | j||ƒ | jƒ  d S )N)rb   Ú_portRecords__deleter8   )r   ræ   rç   r   r   r    rˆ     s    zportRecords.deleter   c             C   sœ   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xX| jD ]N}t|ƒ}t|ƒ}t|ƒ}t	|ƒ}t
|ƒ}	t|ƒ}
t|ƒ}||f||
||	f< qFW |S )Nr   zCould not list ports)r  rW   r  Úsemanage_port_listr^   r   r   Úsemanage_context_get_typeÚsemanage_context_get_mlsr  r  r  r  )r   rz   rÁ   rL   ræ   rú   ÚctypeÚlevelrç   r	  rê   ré   r   r   r    rr     s     zportRecords.get_allc             C   sØ   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚x”| jD ]Š}t|ƒ}t|ƒ}t|ƒ}t	|ƒ}t
|ƒ}	t|ƒ}
||f|jƒ kr–g |||f< |	|
kr¶|||f jd|	 ƒ qF|||f jd|	|
f ƒ qFW |S )Nr   zCould not list portsz%dz%d-%d)r  rW   r  r  r^   r   r   r  r  r  r  r  rÆ   r'   )r   rz   rÁ   rL   ræ   rú   r  rç   r	  rê   ré   r   r   r    Úget_all_by_type   s&    zportRecords.get_all_by_typec             C   s¬   g }| j dƒ}x˜t|jƒ ƒD ]ˆ}|d |d kr8|d nd|d |d f }|| d r„|jd|| d || d |d |f ƒ q|jd|| d |d |f ƒ qW |S )NTr   r=   z%s-%sz-a -t %s -r '%s' -p %s %srw   z-a -t %s -p %s %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   ræ   r   r   r    rd   8  s    
,,$zportRecords.customizedr=   c             C   s¤   | j |ƒ}t|ƒdkrd S t|jƒ ƒ}|rHtdtdƒtdƒtdƒf ƒ xV|D ]N}d| }|d|| d  7 }x$|| dd … D ]}|d	| 7 }q€W t|ƒ qNW d S )
Nr   z%-30s %-8s %s
zSELinux Port TypeZProtozPort Numberz%-30s %-8s z%sr=   z, %s)r  rH   r�   rÆ   rx   r   )r   ry   rz   rÁ   rÆ   ro   r¤   r   r   r   r    r{   C  s    

zportRecords.list)N)r   )r   )r=   r   )r9   r:   r;   rã   r!   rï   rþ   r€   rû   rý   r²   ra   r
  rˆ   rr   r  rd   r{   r   r   r   r    rà   0  s   
:	
*

rà   c               @   sˆ   e Zd Zg Zd dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd!dd„Zd"dd„Zdd„ Zd#dd„ZdS )$ÚibpkeyRecordsNc          
   C   sX   t j| |ƒ y:tjtjtj| jƒƒdgd�}tdd„ |j	ƒ D ƒƒ| _
W n   Y nX d S )NZibpkey_type)Úattrsc             s   s   | ]}t |ƒV  qd S )N)r*   )rs   rg   r   r   r    ú	<genexpr>Z  s    z)ibpkeyRecords.__init__.<locals>.<genexpr>)rP   r!   ÚsetoolsÚ	TypeQueryÚSELinuxPolicyrZ   Úget_store_policyrR   r�   Úresultsrã   )r   rT   Úqr   r   r    r!   V  s    zibpkeyRecords.__init__c             C   sª   |dkrt tdƒƒ‚|jdƒ}t|ƒdkr>t|d dƒ }}nt|d dƒ}t|d dƒ}|dkrnt tdƒƒ‚t| j|||ƒ\}}|dk ržt tdƒ||f ƒ‚||||fS )	Nr   zSubnet Prefix is requiredr"   r=   r   iÿÿ  zInvalid Pkeyz Could not create a key for %s/%s)r^   r   r�   rH   rå   Zsemanage_ibpkey_key_createrW   )r   ÚpkeyÚsubnet_prefixZpkeysré   rê   rL   r¦   r   r   r    rë   ^  s    
zibpkeyRecords.__genkeyc             C   s  t dkr|dkrd}nt|ƒ}|dkr2ttdƒƒ‚tj|ƒ}|| jkrVttdƒ| ƒ‚| j||ƒ\}}}}t| j	ƒ\}}	|dk r”ttdƒ||f ƒ‚t
| j	|	|ƒ t|	||ƒ t| j	ƒ\}}
|dk rØttdƒ||f ƒ‚t| j	|
d	ƒ}|dk �rttd
ƒ||f ƒ‚t| j	|
dƒ}|dk �r0ttdƒ||f ƒ‚t| j	|
|ƒ}|dk �r\ttdƒ||f ƒ‚t dk�rœ|dk�rœt| j	|
|ƒ}|dk �rœttdƒ||f ƒ‚t| j	|	|
ƒ}|dk �rÈttdƒ||f ƒ‚t| j	||	ƒ}|dk �rôttdƒ||f ƒ‚t|
ƒ t|ƒ t|	ƒ d S )Nr=   r   rÎ   zType is requiredz)Type %s is invalid, must be a ibpkey typer   z!Could not create ibpkey for %s/%sz"Could not create context for %s/%srì   z.Could not set user in ibpkey context for %s/%srí   z.Could not set role in ibpkey context for %s/%sz.Could not set type in ibpkey context for %s/%sz4Could not set mls fields in ibpkey context for %s/%sz&Could not set ibpkey context for %s/%szCould not add ibpkey %s/%s)r`   rO   r^   r   rZ   rî   rã   Ú_ibpkeyRecords__genkeyZsemanage_ibpkey_createrW   Z!semanage_ibpkey_set_subnet_prefixZsemanage_ibpkey_set_rangerð   rñ   rò   ró   rô   Zsemanage_ibpkey_set_conÚsemanage_ibpkey_modify_localrö   Úsemanage_ibpkey_key_freeÚsemanage_ibpkey_free)r   r  r  r.   rS   r¦   rê   ré   rL   r   rú   r   r   r    r¨   q  sP    







zibpkeyRecords.__addc             C   sX   | j ƒ  | j||ƒr<ttdƒj||d�ƒ | j||||ƒ n| j||||ƒ | jƒ  d S )Nz@ibpkey {subnet_prefix}/{pkey} already defined, modifying instead)r  r  )rb   Ú_ibpkeyRecords__existsrx   r   rü   Ú_ibpkeyRecords__modifyÚ_ibpkeyRecords__addr8   )r   r  r  r.   rS   r   r   r    r€   ©  s    zibpkeyRecords.addc             C   sN   | j ||ƒ\}}}}t| j|ƒ\}}|dk rBttdƒj||d�ƒ‚t|ƒ |S )Nr   z;Could not check if ibpkey {subnet_prefix}/{pkey} is defined)r  r  )r  Úsemanage_ibpkey_existsrW   r^   r   Zformnatr  )r   r  r  r¦   rê   ré   rL   r~   r   r   r    r®   ²  s    zibpkeyRecords.__existsc             C   sb  |dkr2|dkr2t dkr&ttdƒƒ‚nttdƒƒ‚tj|ƒ}|rZ|| jkrZttdƒ| ƒ‚| j||ƒ\}}}}t| j|ƒ\}}	|dk ršttdƒ||f ƒ‚|	s²ttdƒ||f ƒ‚t	| j|ƒ\}}
|dk rÞttd	ƒ||f ƒ‚t
|
ƒ}t dkoô|dk�r
t| j|t|ƒƒ |dk�r"t| j||ƒ t| j||
ƒ}|dk �rNttd
ƒ||f ƒ‚t|ƒ t|
ƒ d S )Nr   r=   zRequires setype or serangezRequires setypez)Type %s is invalid, must be a ibpkey typer   z*Could not check if ibpkey %s/%s is definedzibpkey %s/%s is not definedzCould not query ibpkey %s/%szCould not modify ibpkey %s/%s)r`   r^   r   rZ   rî   rã   r  r#  rW   Zsemanage_ibpkey_queryÚsemanage_ibpkey_get_conrô   rO   ró   r  r  r  )r   r  r  r.   r  r¦   rê   ré   rL   r~   r   rú   r   r   r    r±   ¼  s4    


zibpkeyRecords.__modifyc             C   s$   | j ƒ  | j||||ƒ | jƒ  d S )N)rb   r!  r8   )r   r  r  r.   r  r   r   r    r²   â  s    zibpkeyRecords.modifyc       	      C   sÈ   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x�|D ]ˆ}t| j|ƒ\}}t|ƒ}t|ƒ}d||f }| j||ƒ\}}}}|dk rŒttdƒ| ƒ‚t	| j|ƒ}|dk r°ttdƒ| ƒ‚t
|ƒ q0W | jƒ  d S )Nr   zCould not list the ibpkeysz%s-%szCould not create a key for %szCould not delete the ibpkey %s)Úsemanage_ibpkey_list_localrW   r^   r   rb   Ú!semanage_ibpkey_get_subnet_prefixÚsemanage_ibpkey_get_lowÚsemanage_ibpkey_get_highr  Úsemanage_ibpkey_del_localr  r8   )	r   rL   r  Úibpkeyr  rê   ré   Zpkey_strr¦   r   r   r    ra   ç  s"    
zibpkeyRecords.deleteallc             C   sÐ   | j ||ƒ\}}}}t| j|ƒ\}}|dk r@ttdƒ||f ƒ‚|sXttdƒ||f ƒ‚t| j|ƒ\}}|dk r„ttdƒ||f ƒ‚|sœttdƒ||f ƒ‚t| j|ƒ}|dk rÄttdƒ||f ƒ‚t|ƒ d S )Nr   z*Could not check if ibpkey %s/%s is definedzibpkey %s/%s is not definedz4ibpkey %s/%s is defined in policy, cannot be deletedzCould not delete ibpkey %s/%s)r  r#  rW   r^   r   Zsemanage_ibpkey_exists_localr)  r  )r   r  r  r¦   rê   ré   rL   r~   r   r   r    r³   þ  s    zibpkeyRecords.__deletec             C   s    | j ƒ  | j||ƒ | jƒ  d S )N)rb   Ú_ibpkeyRecords__deleter8   )r   r  r  r   r   r    rˆ     s    zibpkeyRecords.deleter   c             C   s¦   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xb| jD ]X}t|ƒ}t|ƒ}|dkrdqFt|ƒ}t	| j|ƒ\}}t
|ƒ}	t|ƒ}
||f||	|
|f< qFW |S )Nr   zCould not list ibpkeysZreserved_ibpkey_t)r%  rW   r  Úsemanage_ibpkey_listr^   r   r$  r  r  r&  r'  r(  )r   rz   rÁ   rL   r*  rú   r  r  r  rê   ré   r   r   r    rr     s"    zibpkeyRecords.get_allc       
      C   sØ   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚x”| jD ]Š}t|ƒ}t|ƒ}t| j|ƒ\}}t	|ƒ}t
|ƒ}	||f|jƒ kr–g |||f< ||	kr¶|||f jd| ƒ qF|||f jd||	f ƒ qFW |S )Nr   zCould not list ibpkeysz0x%xz	0x%x-0x%x)r%  rW   r  r,  r^   r   r$  r  r&  r'  r(  rÆ   r'   )
r   rz   rÁ   rL   r*  rú   r  r  rê   ré   r   r   r    r  ,  s$    zibpkeyRecords.get_all_by_typec             C   s¬   g }| j dƒ}x˜t|jƒ ƒD ]ˆ}|d |d kr8|d nd|d |d f }|| d r„|jd|| d || d |d |f ƒ q|jd|| d |d |f ƒ qW |S )NTr   r=   z%s-%sz-a -t %s -r '%s' -x %s %srw   z-a -t %s -x %s %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   ræ   r   r   r    rd   C  s    
,,$zibpkeyRecords.customizedr=   c             C   s¤   | j |ƒ}|jƒ }t|ƒdkr"d S |rDtdtdƒtdƒtdƒf ƒ xZt|ƒD ]N}d| }|d|| d  7 }x$|| dd … D ]}|d	| 7 }q€W t|ƒ qNW d S )
Nr   z%-30s %-18s %s
zSELinux IB Pkey TypeZSubnet_PrefixzPkey Numberz%-30s %-18s z%sr=   z, %s)r  rÆ   rH   rx   r   r�   )r   ry   rz   rÁ   rÆ   ro   r¤   r   r   r   r    r{   O  s    
zibpkeyRecords.list)N)r   )r   )r=   r   )r9   r:   r;   rã   r!   r  r"  r€   r   r!  r²   ra   r+  rˆ   rr   r  rd   r{   r   r   r   r    r  R  s   
8	
&

r  c               @   sˆ   e Zd Zg Zd dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd!dd„Zd"dd„Zdd„ Zd#dd„ZdS )$ÚibendportRecordsNc          
   C   sX   t j| |ƒ y:tjtjtj| jƒƒdgd�}tdd„ |j	ƒ D ƒƒ| _
W n   Y nX d S )NZibendport_type)r  c             s   s   | ]}t |ƒV  qd S )N)r*   )rs   rg   r   r   r    r  f  s    z,ibendportRecords.__init__.<locals>.<genexpr>)rP   r!   r  r  r  rZ   r  rR   Úsetr  rã   )r   rT   r  r   r   r    r!   b  s    zibendportRecords.__init__c             C   sp   |dkrt tdƒƒ‚t|ƒ}|dks,|dk r8t tdƒƒ‚t| j||ƒ\}}|dk rft tdƒ||f ƒ‚|||fS )Nr   zIB device name is requiredéÿ   r=   zInvalid Port Numberr   z*Could not create a key for ibendport %s/%s)r^   r   rå   Zsemanage_ibendport_key_createrW   )r   Ú	ibendportÚ
ibdev_nameræ   rL   r¦   r   r   r    rë   j  s    zibendportRecords.__genkeyc       
      C   s
  t dkr|dkrd}nt|ƒ}|dkr2ttdƒƒ‚tj|ƒ}|| jkrVttdƒ| ƒ‚| j||ƒ\}}}t| j	ƒ\}}|dk r’ttdƒ||f ƒ‚t
| j	||ƒ t||ƒ t| j	ƒ\}}	|dk rÔttdƒ||f ƒ‚t| j	|	d	ƒ}|dk rþttd
ƒ||f ƒ‚t| j	|	dƒ}|dk �r*ttdƒ||f ƒ‚t| j	|	|ƒ}|dk �rVttdƒ||f ƒ‚t dk�r–|dk�r–t| j	|	|ƒ}|dk �r–ttdƒ||f ƒ‚t| j	||	ƒ}|dk �rÂttdƒ||f ƒ‚t| j	||ƒ}|dk �rîttdƒ||f ƒ‚t|	ƒ t|ƒ t|ƒ d S )Nr=   r   rÎ   zType is requiredz-Type %s is invalid, must be an ibendport typer   z$Could not create ibendport for %s/%sz"Could not create context for %s/%srì   z1Could not set user in ibendport context for %s/%srí   z1Could not set role in ibendport context for %s/%sz1Could not set type in ibendport context for %s/%sz7Could not set mls fields in ibendport context for %s/%sz)Could not set ibendport context for %s/%szCould not add ibendport %s/%s)r`   rO   r^   r   rZ   rî   rã   Ú_ibendportRecords__genkeyZsemanage_ibendport_createrW   Z!semanage_ibendport_set_ibdev_nameZsemanage_ibendport_set_portrð   rñ   rò   ró   rô   Zsemanage_ibendport_set_conÚsemanage_ibendport_modify_localrö   Úsemanage_ibendport_key_freeÚsemanage_ibendport_free)
r   r0  r1  r.   rS   r¦   ræ   rL   r   rú   r   r   r    r¨   x  sP    







zibendportRecords.__addc             C   sX   | j ƒ  | j||ƒr<ttdƒj|td�ƒ | j||||ƒ n| j||||ƒ | jƒ  d S )Nz@ibendport {ibdev_name}/{port} already defined, modifying instead)r1  ræ   )	rb   Ú_ibendportRecords__existsrx   r   rü   ræ   Ú_ibendportRecords__modifyÚ_ibendportRecords__addr8   )r   r0  r1  r.   rS   r   r   r    r€   ¯  s    zibendportRecords.addc             C   sL   | j ||ƒ\}}}t| j|ƒ\}}|dk r@ttdƒj||d�ƒ‚t|ƒ |S )Nr   z;Could not check if ibendport {ibdev_name}/{port} is defined)r1  ræ   )r2  Úsemanage_ibendport_existsrW   r^   r   rü   r4  )r   r0  r1  r¦   ræ   rL   r~   r   r   r    r®   ¸  s    zibendportRecords.__existsc             C   s`  |dkr2|dkr2t dkr&ttdƒƒ‚nttdƒƒ‚tj|ƒ}|rZ|| jkrZttdƒ| ƒ‚| j||ƒ\}}}t| j|ƒ\}}|dk r˜ttdƒ||f ƒ‚|s°ttdƒ||f ƒ‚t	| j|ƒ\}}	|dk rÜttd	ƒ||f ƒ‚t
|	ƒ}
t dkoò|dk�rt| j|
t|ƒƒ |dk�r t| j|
|ƒ t| j||	ƒ}|dk �rLttd
ƒ||f ƒ‚t|ƒ t|	ƒ d S )Nr   r=   zRequires setype or serangezRequires setypez-Type %s is invalid, must be an ibendport typer   z-Could not check if ibendport %s/%s is definedzibendport %s/%s is not definedzCould not query ibendport %s/%sz Could not modify ibendport %s/%s)r`   r^   r   rZ   rî   rã   r2  r9  rW   Zsemanage_ibendport_queryÚsemanage_ibendport_get_conrô   rO   ró   r3  r4  r5  )r   r0  r1  r.   r  r¦   ræ   rL   r~   r   rú   r   r   r    r±   Â  s4    


zibendportRecords.__modifyc             C   s$   | j ƒ  | j||||ƒ | jƒ  d S )N)rb   r7  r8   )r   r0  r1  r.   r  r   r   r    r²   è  s    zibendportRecords.modifyc             C   s¾   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x†|D ]~}t| j|ƒ\}}t|ƒ}| jt|ƒ|ƒ\}}}|dk r~ttdƒt	|f ƒ‚t
| j|ƒ}|dk r¦ttdƒ||f ƒ‚t|ƒ q0W | jƒ  d S )Nr   zCould not list the ibendportsz Could not create a key for %s/%dz$Could not delete the ibendport %s/%d)Úsemanage_ibendport_list_localrW   r^   r   rb   Ú!semanage_ibendport_get_ibdev_nameÚsemanage_ibendport_get_portr2  r*   Z	ibdevnameÚsemanage_ibendport_del_localr4  r8   )r   rL   r  r0  r1  ræ   r¦   r   r   r    ra   í  s    
zibendportRecords.deleteallc             C   sÎ   | j ||ƒ\}}}t| j|ƒ\}}|dk r>ttdƒ||f ƒ‚|sVttdƒ||f ƒ‚t| j|ƒ\}}|dk r‚ttdƒ||f ƒ‚|sšttdƒ||f ƒ‚t| j|ƒ}|dk rÂttdƒ||f ƒ‚t|ƒ d S )Nr   z-Could not check if ibendport %s/%s is definedzibendport %s/%s is not definedz7ibendport %s/%s is defined in policy, cannot be deletedz Could not delete ibendport %s/%s)r2  r9  rW   r^   r   Zsemanage_ibendport_exists_localr>  r4  )r   r0  r1  r¦   ræ   rL   r~   r   r   r    r³     s    zibendportRecords.__deletec             C   s    | j ƒ  | j||ƒ | jƒ  d S )N)rb   Ú_ibendportRecords__deleter8   )r   r0  r1  r   r   r    rˆ     s    zibendportRecords.deleter   c       
      C   sœ   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xX| jD ]N}t|ƒ}t|ƒ}|dkrdqFt|ƒ}t	| j|ƒ\}}t
|ƒ}	||f||	|f< qFW |S )Nr   zCould not list ibendportsZreserved_ibendport_t)r;  rW   r  Úsemanage_ibendport_listr^   r   r:  r  r  r<  r=  )
r   rz   rÁ   rL   r0  rú   r  r  r1  ræ   r   r   r    rr     s     zibendportRecords.get_allc       	      C   s¬   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xh| jD ]^}t|ƒ}t|ƒ}t| j|ƒ\}}t	|ƒ}||f|j
ƒ krŽg |||f< |||f jd| ƒ qFW |S )Nr   zCould not list ibendportsz0x%x)r;  rW   r  r@  r^   r   r:  r  r<  r=  rÆ   r'   )	r   rz   rÁ   rL   r0  rú   r  r1  ræ   r   r   r    r  /  s    z ibendportRecords.get_all_by_typec             C   sˆ   g }| j dƒ}xtt|jƒ ƒD ]d}|| d r\|jd|| d || d |d |d f ƒ q|jd|| d |d |d f ƒ qW |S )NTr=   z-a -t %s -r '%s' -z %s %sr   z-a -t %s -z %s %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   r   r   r    rd   B  s    
0(zibendportRecords.customizedr=   c             C   s¤   | j |ƒ}|jƒ }t|ƒdkr"d S |rDtdtdƒtdƒtdƒf ƒ xZt|ƒD ]N}d| }|d|| d  7 }x$|| dd … D ]}|d	| 7 }q€W t|ƒ qNW d S )
Nr   z%-30s %-18s %s
zSELinux IB End Port TypezIB Device NamezPort Numberz%-30s %-18s z%sr=   z, %s)r  rÆ   rH   rx   r   r�   )r   ry   rz   rÁ   rÆ   ro   r¤   r   r   r   r    r{   M  s    
zibendportRecords.list)N)r   )r   )r=   r   )r9   r:   r;   rã   r!   r2  r8  r€   r6  r7  r²   ra   r?  rˆ   rr   r  rd   r{   r   r   r   r    r-  ^  s   
7	
&

r-  c               @   s~   e Zd Zg Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ Zd dd„ZdS )!ÚnodeRecordsNc             C   sT   t j| |ƒ ddg| _y$tttjtjdƒƒd d ƒ| _W n tk
rN   Y nX d S )NZipv4Zipv6Z	node_typer   rá   )	rP   r!   Úprotocolr{   rZ   r‘   râ   rã   rä   )r   rT   r   r   r    r!   `  s    
$znodeRecords.__init__c          	   C   s®   |}|}d}|dkr t tdƒƒ‚t|ƒdks8|d dkrztj|| ƒ}t|jƒ}t|jƒ}|dkrp|jdkrpd}d|j }y| j	j
|ƒ}W n   t td	ƒƒ‚Y nX |||fS )
Nr   zNode Address is requiredr   r¸   z0.0.0.0é   z::zipv%dzUnknown or missing protocol)r^   r   rH   Ú	ipaddressZ
ip_networkr*   Znetwork_addressZnetmaskÚversionrB  Úindex)r   ÚaddrÚmaskrB  ZnewaddrZnewmaskZnewprotocolro   r   r   r    Úvalidateh  s"    


znodeRecords.validatec       
   	   C   sp  | j |||ƒ\}}}tdkr2|dkr*d}nt|ƒ}|dkrFttdƒƒ‚tj|ƒ}|| jkrjttdƒ| ƒ‚t| j	|||ƒ\}}|dk r–ttdƒ| ƒ‚t
| j	ƒ\}}|dk r¼ttdƒ| ƒ‚t||ƒ t| j	|||ƒ}t| j	ƒ\}}	|dk rüttd	ƒ| ƒ‚t| j	|||ƒ}|dk �r&ttd
ƒ| ƒ‚t| j	|	dƒ}|dk �rNttdƒ| ƒ‚t| j	|	dƒ}|dk �rvttdƒ| ƒ‚t| j	|	|ƒ}|dk �ržttdƒ| ƒ‚tdk�rÚ|dk�rÚt| j	|	|ƒ}|dk �rÚttdƒ| ƒ‚t| j	||	ƒ}|dk �rttdƒ| ƒ‚t| j	||ƒ}|dk �r*ttdƒ| ƒ‚t|	ƒ t|ƒ t|ƒ | jjd||tj| j| ƒdd||f ƒ d S )Nr=   r   rÎ   zSELinux node type is requiredz'Type %s is invalid, must be a node typer   zCould not create key for %szCould not create addr for %szCould not create context for %szCould not set mask for %srì   z)Could not set user in addr context for %srí   z)Could not set role in addr context for %sz)Could not set type in addr context for %sz/Could not set mls fields in addr context for %sz!Could not set addr context for %szCould not add addr %szCresrc=node op=add laddr=%s netmask=%s proto=%s tcontext=%s:%s:%s:%s)rI  r`   rO   r^   r   rZ   rî   rã   Úsemanage_node_key_createrW   Zsemanage_node_createZsemanage_node_set_protoZsemanage_node_set_addrrð   Zsemanage_node_set_maskrñ   rò   ró   rô   Zsemanage_node_set_conÚsemanage_node_modify_localrö   Úsemanage_node_key_freeÚsemanage_node_freerY   r6   r   rù   rB  )
r   rG  rH  rç   r.   r  rL   r¦   Únoderú   r   r   r    r¨   �  s^    









znodeRecords.__addc             C   sX   | j ƒ  | j|||ƒr:ttdƒ| ƒ | j|||||ƒ n| j|||||ƒ | jƒ  d S )Nz*Addr %s already defined, modifying instead)rb   Ú_nodeRecords__existsrx   r   Ú_nodeRecords__modifyÚ_nodeRecords__addr8   )r   rG  rH  rç   r.   r  r   r   r    r€   Ã  s    znodeRecords.addc             C   st   | j |||ƒ\}}}t| j|||ƒ\}}|dk r@ttdƒ| ƒ‚t| j|ƒ\}}|dk rhttdƒ| ƒ‚t|ƒ |S )Nr   zCould not create key for %sz%Could not check if addr %s is defined)rI  rJ  rW   r^   r   Úsemanage_node_existsrL  )r   rG  rH  rç   rL   r¦   r~   r   r   r    r®   Ì  s    znodeRecords.__existsc          	   C   s”  | j |||ƒ\}}}|dkr0|dkr0ttdƒƒ‚tj|ƒ}|rX|| jkrXttdƒ| ƒ‚t| j|||ƒ\}}|dk r„ttdƒ| ƒ‚t| j|ƒ\}}|dk r¬ttdƒ| ƒ‚|sÀttdƒ| ƒ‚t	| j|ƒ\}}	|dk rèttdƒ| ƒ‚t
|	ƒ}
td	k�r|dk�rt| j|
t|ƒƒ |dk�r.t| j|
|ƒ t| j||	ƒ}|dk �rVttd
ƒ| ƒ‚t|ƒ t|	ƒ | jjd||tj| j| ƒdd||f ƒ d S )Nr   zRequires setype or serangez'Type %s is invalid, must be a node typer   zCould not create key for %sz%Could not check if addr %s is definedzAddr %s is not definedzCould not query addr %sr=   zCould not modify addr %szFresrc=node op=modify laddr=%s netmask=%s proto=%s tcontext=%s:%s:%s:%srì   rí   )rI  r^   r   rZ   rî   rã   rJ  rW   rR  Zsemanage_node_queryÚsemanage_node_get_conr`   rô   rO   ró   rK  rL  rM  rY   r6   r   rù   rB  )r   rG  rH  rç   r.   r  rL   r¦   r~   rN  rú   r   r   r    r±   Ú  s8    


znodeRecords.__modifyc             C   s&   | j ƒ  | j|||||ƒ | jƒ  d S )N)rb   rP  r8   )r   rG  rH  rç   r.   r  r   r   r    r²     s    znodeRecords.modifyc             C   s
  | j |||ƒ\}}}t| j|||ƒ\}}|dk r@ttdƒ| ƒ‚t| j|ƒ\}}|dk rhttdƒ| ƒ‚|s|ttdƒ| ƒ‚t| j|ƒ\}}|dk r¤ttdƒ| ƒ‚|s¸ttdƒ| ƒ‚t| j|ƒ}|dk rÜttdƒ| ƒ‚t|ƒ | j	j
d||tj| j| ƒf ƒ d S )Nr   zCould not create key for %sz%Could not check if addr %s is definedzAddr %s is not definedz/Addr %s is defined in policy, cannot be deletedzCould not delete addr %sz1resrc=node op=delete laddr=%s netmask=%s proto=%s)rI  rJ  rW   r^   r   rR  Zsemanage_node_exists_localZsemanage_node_del_localrL  rY   r6   r   rù   rB  )r   rG  rH  rç   rL   r¦   r~   r   r   r    r³     s&    znodeRecords.__deletec             C   s"   | j ƒ  | j|||ƒ | jƒ  d S )N)rb   Ú_nodeRecords__deleter8   )r   rG  rH  rç   r   r   r    rˆ   #  s    znodeRecords.deletec             C   st   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x<|D ]4}| jt| j|ƒd t| j|ƒd | jt	|ƒ ƒ q0W | j
ƒ  d S )Nr   z!Could not deleteall node mappingsr=   )Úsemanage_node_list_localrW   r^   r   rb   rT  Úsemanage_node_get_addrÚsemanage_node_get_maskrB  Úsemanage_node_get_protor8   )r   rL   ZnlistrN  r   r   r    ra   (  s    
4znodeRecords.deleteallr   c       	      C   s®   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚xj| jD ]`}t|ƒ}t| j|ƒ}t| j|ƒ}| j	t
|ƒ }t|ƒt|ƒt|ƒt|ƒf||d |d |f< qFW |S )Nr   zCould not list addrsr=   )rU  rW   ÚilistZsemanage_node_listr^   r   rS  rV  rW  rB  rX  Úsemanage_context_get_userÚsemanage_context_get_roler  r  )	r   rz   rÁ   rL   rN  rú   rG  rH  rç   r   r   r    rr   2  s    2znodeRecords.get_allc          	   C   s”   g }| j dƒ}x€t|jƒ ƒD ]p}|| d rb|jd|d |d || d || d |d f ƒ q|jd|d |d || d |d f ƒ qW |S )NTr   z-a -M %s -p %s -t %s -r '%s' %sr=   rw   r   z-a -M %s -p %s -t %s %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   r   r   r    rd   D  s    
6.znodeRecords.customizedr=   c             C   s  | j |ƒ}t|ƒdkrd S t|jƒ ƒ}|r6tdd ƒ tr¸xÆ|D ]r}d}x|D ]}|d t|ƒ }qNW td	|d |d
 |d || d || d
 || d t|| d dƒf ƒ q@W nJxH|D ]@}td|d |d
 |d || d || d
 || d f ƒ q¾W d S )Nr   z%-18s %-18s %-5s %-5s
ú
IP AddressÚNetmaskÚProtocolÚContextr   ú	z%-18s %-18s %-5s %s:%s:%s:%s r=   rw   r   Fz%-18s %-18s %-5s %s:%s:%s )r\  r]  r^  r_  )rr   rH   r�   rÆ   rx   r`   r*   rN   )r   ry   rz   rÁ   rÆ   r¦   ÚvalZfieldsr   r   r    r{   N  s    


R
znodeRecords.list)N)r   )r=   r   )r9   r:   r;   rã   r!   rI  rQ  r€   rO  rP  r²   rT  rˆ   ra   rr   rd   r{   r   r   r   r    rA  \  s   
B	(


rA  c               @   sr   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Zddd„ZdS )ÚinterfaceRecordsNc             C   s   t j| |ƒ d S )N)rP   r!   )r   rT   r   r   r    r!   c  s    zinterfaceRecords.__init__c             C   s  t dkr|dkrd}nt|ƒ}|dkr2ttdƒƒ‚t| j|ƒ\}}|dk rZttdƒ| ƒ‚t| jƒ\}}|dk r€ttdƒ| ƒ‚t| j||ƒ}t| jƒ\}}|dk r´ttdƒ| ƒ‚t	| j|d	ƒ}|dk rÚttd
ƒ| ƒ‚t
| j|dƒ}|dk �rttdƒ| ƒ‚t| j||ƒ}|dk �r*ttdƒ| ƒ‚t dk�rf|dk�rft| j||ƒ}|dk �rfttdƒ| ƒ‚t| j||ƒ}|dk �rŽttdƒ| ƒ‚t| j||ƒ}|dk �r¶ttdƒ| ƒ‚t| j||ƒ}|dk �rÞttdƒ| ƒ‚t|ƒ t|ƒ t|ƒ | jjd|d	d||f ƒ d S )Nr=   r   rÎ   zSELinux Type is requiredr   zCould not create key for %sz!Could not create interface for %szCould not create context for %srì   z.Could not set user in interface context for %srí   z.Could not set role in interface context for %sz.Could not set type in interface context for %sz4Could not set mls fields in interface context for %sz&Could not set interface context for %sz$Could not set message context for %szCould not add interface %sz4resrc=interface op=add netif=%s tcontext=%s:%s:%s:%s)r`   rO   r^   r   Úsemanage_iface_key_createrW   Zsemanage_iface_createZsemanage_iface_set_namerð   rñ   rò   ró   rô   Zsemanage_iface_set_ifconZsemanage_iface_set_msgconÚsemanage_iface_modify_localrö   Úsemanage_iface_key_freeÚsemanage_iface_freerY   r6   )r   Ú	interfacer.   r  rL   r¦   Úifacerú   r   r   r    r¨   f  sT    





zinterfaceRecords.__addc             C   sL   | j ƒ  | j|ƒr2ttdƒ| ƒ | j|||ƒ n| j|||ƒ | jƒ  d S )Nz/Interface %s already defined, modifying instead)rb   Ú_interfaceRecords__existsrx   r   Ú_interfaceRecords__modifyÚ_interfaceRecords__addr8   )r   rg  r.   r  r   r   r    r€      s    
zinterfaceRecords.addc             C   s\   t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚t|ƒ |S )Nr   zCould not create key for %sz*Could not check if interface %s is defined)rc  rW   r^   r   Úsemanage_iface_existsre  )r   rg  rL   r¦   r~   r   r   r    r®   ©  s    zinterfaceRecords.__existsc       	      C   s>  |dkr|dkrt tdƒƒ‚t| j|ƒ\}}|dk rDt tdƒ| ƒ‚t| j|ƒ\}}|dk rlt tdƒ| ƒ‚|s€t tdƒ| ƒ‚t| j|ƒ\}}|dk r¨t tdƒ| ƒ‚t|ƒ}tdkrÒ|dkrÒt| j|t	|ƒƒ |dkrèt
| j||ƒ t| j||ƒ}|dk �rt td	ƒ| ƒ‚t|ƒ t|ƒ | jjd
|dd||f ƒ d S )Nr   zRequires setype or seranger   zCould not create key for %sz*Could not check if interface %s is definedzInterface %s is not definedzCould not query interface %sr=   zCould not modify interface %sz7resrc=interface op=modify netif=%s tcontext=%s:%s:%s:%srì   rí   )r^   r   rc  rW   rl  Zsemanage_iface_queryÚsemanage_iface_get_ifconr`   rô   rO   ró   rd  re  rf  rY   r6   )	r   rg  r.   r  rL   r¦   r~   rh  rú   r   r   r    r±   µ  s0    
zinterfaceRecords.__modifyc             C   s"   | j ƒ  | j|||ƒ | jƒ  d S )N)rb   rj  r8   )r   rg  r.   r  r   r   r    r²   ×  s    zinterfaceRecords.modifyc             C   sà   t | j|ƒ\}}|dk r(ttdƒ| ƒ‚t| j|ƒ\}}|dk rPttdƒ| ƒ‚|sdttdƒ| ƒ‚t| j|ƒ\}}|dk rŒttdƒ| ƒ‚|s ttdƒ| ƒ‚t| j|ƒ}|dk rÄttdƒ| ƒ‚t|ƒ | jj	d| ƒ d S )Nr   zCould not create key for %sz*Could not check if interface %s is definedzInterface %s is not definedz4Interface %s is defined in policy, cannot be deletedzCould not delete interface %sz"resrc=interface op=delete netif=%s)
rc  rW   r^   r   rl  Zsemanage_iface_exists_localZsemanage_iface_del_localre  rY   r6   )r   rg  rL   r¦   r~   r   r   r    r³   Ü  s$    zinterfaceRecords.__deletec             C   s   | j ƒ  | j|ƒ | jƒ  d S )N)rb   Ú_interfaceRecords__deleter8   )r   rg  r   r   r    rˆ   õ  s    
zinterfaceRecords.deletec             C   sR   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x|D ]}| jt|ƒƒ q0W | jƒ  d S )Nr   z(Could not delete all interface  mappings)Úsemanage_iface_list_localrW   r^   r   rb   rn  Úsemanage_iface_get_namer8   )r   rL   r·   ro   r   r   r    ra   ú  s    
zinterfaceRecords.deleteallr   c             C   s~   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚x:| jD ]0}t|ƒ}t|ƒt|ƒt	|ƒt
|ƒf|t|ƒ< qFW |S )Nr   zCould not list interfaces)ro  rW   rY  Zsemanage_iface_listr^   r   rm  rZ  r[  r  r  rp  )r   rz   rÁ   rL   rg  rú   r   r   r    rr   	  s    (zinterfaceRecords.get_allc             C   st   g }| j dƒ}x`t|jƒ ƒD ]P}|| d rR|jd|| d || d |f ƒ q|jd|| d |f ƒ qW |S )NTr   z-a -t %s -r '%s' %srw   z-a -t %s %s)rr   r�   rÆ   r'   )r   r   rÁ   r¦   r   r   r    rd   	  s    
&zinterfaceRecords.customizedr=   c          
   C   sÐ   | j |ƒ}t|ƒdkrd S t|jƒ ƒ}|rBtdtdƒtdƒf ƒ tr’x„|D ]@}td||| d || d || d t|| d d	ƒf ƒ qLW n:x8|D ]0}td
||| d || d || d f ƒ q˜W d S )Nr   z	%-30s %s
zSELinux Interfacer_  z%-30s %s:%s:%s:%s r=   rw   r   Fz%-30s %s:%s:%s )rr   rH   r�   rÆ   rx   r   r`   rN   )r   ry   rz   rÁ   rÆ   r¦   r   r   r    r{   	  s    

B
zinterfaceRecords.list)N)r   )r=   r   )r9   r:   r;   r!   rk  r€   ri  rj  r²   rn  rˆ   ra   rr   rd   r{   r   r   r   r    rb  a  s   
:	"


rb  c               @   s¤   e Zd Zg Zd(dd„Zdd„ Zdd„ Zdd	„ Zd)dd„Zdd„ Z	d*dd„Z
d+dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd,d!d"„Zd#d$„ Zd-d&d'„ZdS ).ÚfcontextRecordsNc             C   s„  t j| |ƒ yLtttjtjdƒƒd d ƒ| _|  jtttjtjdƒƒd d ƒ7  _W n tk
rl   Y nX i | _i | _	d| _
ydttjƒ dƒ}xH|jƒ D ]<}|jƒ }t|ƒdkr´qš|jdƒrÀqš|jƒ \}}|| j|< qšW |jƒ  W n tk
rø   Y nX ynttjƒ dƒ}xR|jƒ D ]F}|jƒ }t|ƒdk�r2�q|jdƒ�rB�q|jƒ \}}|| j	|< �qW |jƒ  W n tk
�r~   Y nX d S )NZ	file_typer   rá   Zdevice_nodeFrØ   ú#)rP   r!   r{   rZ   r‘   râ   rã   rä   ÚequivÚ
equiv_distÚ	equal_indr¼   rG   Úselinux_file_context_subs_pathÚ	readlinesÚstriprH   rŽ   r�   r¿   ÚIOErrorZ#selinux_file_context_subs_dist_path)r   rT   rÄ   ro   ÚtargetÚ
substituter   r   r    r!   1	  sF     ,
zfcontextRecords.__init__c          
   C   sž   | j r�tjƒ }d| }t|dƒ}x*| jjƒ D ]}|jd|| j| f ƒ q,W |jƒ  ytj	|tj
|ƒt
j ƒ W n   Y nX tj||ƒ d| _ tj| ƒ d S )Nz%s.tmpÚwz%s %s
F)ru  rG   rv  r¼   rs  rÆ   Úwriter¿   r|   ÚchmodÚstatÚST_MODEÚrenamerP   r8   )r   Z	subs_fileZtmpfilerÄ   rz  r   r   r    r8   W	  s    
zfcontextRecords.commitc             C   sL  | j ƒ  |dkr,|d dkr,ttdƒ| ƒ‚|dkrP|d dkrPttdƒ| ƒ‚|| jjƒ kr²ttdƒ| ƒ || j|< d| _| jjdt	j
d|d	ƒt	j
d
|d	ƒf ƒ | jƒ  d S | j|ƒ xJ| j| jfD ]:}x4|D ],}|j|d ƒrÔttdƒ|||| f ƒ‚qÔW qÊW | jjdt	j
d|d	ƒt	j
d
|d	ƒf ƒ || j|< d| _| jƒ  d S )Nr¸   r=   z=Target %s is not valid. Target is not allowed to end with '/'zESubstitute %s is not valid. Substitute is not allowed to end with '/'z:Equivalence class for %s already exists, modifying insteadTz$resrc=fcontext op=modify-equal %s %sÚsglobr   Útglobz4File spec %s conflicts with equivalency rule '%s %s'z!resrc=fcontext op=add-equal %s %séÿÿÿÿr„  )rb   r^   r   rs  rÆ   rx   ru  rY   r6   r   Úaudit_encode_nv_stringr8   rI  rt  rŽ   )r   rz  r{  Úfdictro   r   r   r    Ú	add_equalg	  s*    
(

"(
zfcontextRecords.add_equalc             C   sj   | j ƒ  || jjƒ kr&ttdƒ| ƒ‚|| j|< d| _| jjdtj	d|dƒtj	d|dƒf ƒ | j
ƒ  d S )Nz'Equivalence class for %s does not existTz$resrc=fcontext op=modify-equal %s %sr‚  r   rƒ  )rb   rs  rÆ   r^   r   ru  rY   r6   r   r…  r8   )r   rz  r{  r   r   r    Úmodify_equal„	  s    
(zfcontextRecords.modify_equalrì   c             C   s°   t | jƒ\}}|dk r&ttdƒ| ƒ‚|dkr2d}t| j||ƒ}|dk rXttdƒ| ƒ‚t| j|dƒ}|dk r~ttdƒ| ƒ‚tdkr¬t| j|d	ƒ}|dk r¬ttd
ƒ| ƒ‚|S )Nr   zCould not create context for %sr   rì   z)Could not set user in file context for %srí   z)Could not set role in file context for %sr=   rÎ   z/Could not set mls fields in file context for %s)rð   rW   r^   r   rñ   rò   r`   rô   )r   rz  rÏ   rL   rú   r   r   r    Ú	createcon�	  s     zfcontextRecords.createconc             C   s    |dks|j dƒdkr"ttdƒƒ‚|j dƒd
kr<ttdƒƒ‚x^| j| jfD ]N}xH|D ]@}|j|d ƒrTtj||| |ƒ}ttd	ƒ|||| |f ƒ‚qTW qJW d S )Nr   Ú
r   zInvalid file specificationr”   r=   z)File specification can not include spacesr¸   zMFile spec %s conflicts with equivalency rule '%s %s'; Try adding '%s' insteadr„  )Úfindr^   r   rs  rt  rŽ   rB   Úsub)r   rz  r†  ro   rg   r   r   r    rI  ¥	  s    
zfcontextRecords.validater   c       
      C   sì  | j |ƒ tdkrt|ƒ}|dkr.ttdƒƒ‚|dkrZtj|ƒ}|| jkrZttdƒ| ƒ‚t| j	|t
| ƒ\}}|dk rˆttdƒ| ƒ‚t| j	ƒ\}}|dk r®ttdƒ| ƒ‚t| j	||ƒ}|dk�r\| j||ƒ}	t| j	|	|ƒ}|dk røttd	ƒ| ƒ‚tdk�r4|dk�r4t| j	|	|ƒ}|dk �r4ttd
ƒ| ƒ‚t| j	||	ƒ}|dk �r\ttdƒ| ƒ‚t|t
| ƒ t| j	||ƒ}|dk �r’ttdƒ| ƒ‚|dk�r¤t|	ƒ t|ƒ t|ƒ |�s¾d}| jjdtjd|dƒt| |d||f ƒ d S )Nr=   r   zSELinux Type is requiredz<<none>>z1Type %s is invalid, must be a file or device typer   zCould not create key for %sz$Could not create file context for %sz)Could not set type in file context for %sz/Could not set mls fields in file context for %sz!Could not set file context for %sz!Could not add file context for %srì   z6resrc=fcontext op=add %s ftype=%s tcontext=%s:%s:%s:%srƒ  rí   )rI  r`   rO   r^   r   rZ   rî   rã   Úsemanage_fcontext_key_createrW   Ú
file_typesZsemanage_fcontext_createZsemanage_fcontext_set_exprr‰  ró   rô   Úsemanage_fcontext_set_conZsemanage_fcontext_set_typeÚsemanage_fcontext_modify_localrö   Úsemanage_fcontext_key_freeÚsemanage_fcontext_freerY   r6   r   r…  Úftype_to_audit)
r   rz  rS   Úftyper.   rÏ   rL   r¦   Úfcontextrú   r   r   r    r¨   °	  sN    







zfcontextRecords.__addc             C   sV   | j ƒ  | j||ƒr8ttdƒ| ƒ | j|||||ƒ n| j|||||ƒ | jƒ  d S )Nz6File context for %s already defined, modifying instead)rb   Ú_fcontextRecords__existsrx   r   Ú_fcontextRecords__modifyÚ_fcontextRecords__addr8   )r   rz  rS   r”  r.   rÏ   r   r   r    r€   æ	  s    zfcontextRecords.addc             C   sŽ   t | j|t| ƒ\}}|dk r.ttdƒ| ƒ‚t| j|ƒ\}}|dk rVttdƒ| ƒ‚|s‚t| j|ƒ\}}|dk r‚ttdƒ| ƒ‚t|ƒ |S )Nr   zCould not create key for %sz1Could not check if file context for %s is defined)r�  rW   rŽ  r^   r   Úsemanage_fcontext_existsÚsemanage_fcontext_exists_localr‘  )r   rz  r”  rL   r¦   r~   r   r   r    r®   ï	  s    zfcontextRecords.__existsc             C   sª  |dkr$|dkr$|dkr$t tdƒƒ‚|dkrPtj|ƒ}|| jkrPt tdƒ| ƒ‚| j|ƒ t| j|t| ƒ\}}|dk rˆt tdƒ| ƒ‚t	| j|ƒ\}}|dk r°t tdƒ| ƒ‚|rðyt
| j|ƒ\}}	W n$ tk
rì   t tdƒ| ƒ‚Y nX n|t| j|ƒ\}}|dk �rt tdƒ| ƒ‚|�s0t td	ƒ| ƒ‚yt| j|ƒ\}}	W n& tk
�rj   t tdƒ| ƒ‚Y nX |dk�rt|	ƒ}
|
d k�r’| j|ƒ}
td
k�r¸|dk�r¸t| j|
t|ƒƒ |dk�rÐt| j|
|ƒ |dk�rèt| j|
|ƒ t| j|	|
ƒ}|dk �r:t tdƒ| ƒ‚n(t| j|	d ƒ}|dk �r:t tdƒ| ƒ‚t| j||	ƒ}|dk �rbt tdƒ| ƒ‚t|ƒ t|	ƒ |�s|d}| jjdtjd|dƒt| |d||f ƒ d S )Nr   z"Requires setype, serange or seuserú<<none>>z1Type %s is invalid, must be a file or device typer   zCould not create a key for %sz1Could not check if file context for %s is definedz#Could not query file context for %sz"File context for %s is not definedr=   z!Could not set file context for %sz$Could not modify file context for %srì   z9resrc=fcontext op=modify %s ftype=%s tcontext=%s:%s:%s:%srƒ  rí   )r   r›  )r^   r   rZ   rî   rã   rI  r�  rW   rŽ  r™  Zsemanage_fcontext_queryÚOSErrorrš  Zsemanage_fcontext_query_localÚsemanage_fcontext_get_conr‰  r`   rô   rO   rñ   ró   r�  r�  r‘  r’  rY   r6   r   r…  r“  )r   rz  r  r”  r.   rÏ   rL   r¦   r~   r•  rú   r   r   r    r±    
  sf    











zfcontextRecords.__modifyc             C   s&   | j ƒ  | j|||||ƒ | jƒ  d S )N)rb   r—  r8   )r   rz  r  r”  r.   rÏ   r   r   r    r²   C
  s    zfcontextRecords.modifyc             C   sè   t | jƒ\}}|dk r"ttdƒƒ‚| jƒ  x¤|D ]œ}t|ƒ}t|ƒ}t|ƒ}t| j|t	| ƒ\}}|dk rzttdƒ| ƒ‚t
| j|ƒ}|dk ržttdƒ| ƒ‚t|ƒ | jjdtjd|dƒtt|  f ƒ q0W i | _d| _| jƒ  d S )Nr   z Could not list the file contextszCould not create a key for %sz$Could not delete the file context %sz$resrc=fcontext op=delete %s ftype=%srƒ  T)Úsemanage_fcontext_list_localrW   r^   r   rb   Úsemanage_fcontext_get_exprÚsemanage_fcontext_get_typeÚsemanage_fcontext_get_type_strr�  rŽ  Úsemanage_fcontext_del_localr‘  rY   r6   r   r…  r“  Úfile_type_str_to_optionrs  ru  r8   )r   rL   Úflistr•  rz  r”  Ú	ftype_strr¦   r   r   r    ra   H
  s&    
*zfcontextRecords.deleteallc             C   s:  || j jƒ kr>| j j|ƒ d| _| jjdtjd|dƒ ƒ d S t| j	|t
| ƒ\}}|dk rlttdƒ| ƒ‚t| j	|ƒ\}}|dk r”ttdƒ| ƒ‚|sæt| j	|ƒ\}}|dk rÀttdƒ| ƒ‚|rÖttdƒ| ƒ‚nttdƒ| ƒ‚t| j	|ƒ}|dk �rttd	ƒ| ƒ‚t|ƒ | jjd
tjd|dƒt| f ƒ d S )NTz!resrc=fcontext op=delete-equal %srƒ  r   zCould not create a key for %sz1Could not check if file context for %s is definedz;File context for %s is defined in policy, cannot be deletedz"File context for %s is not definedz$Could not delete file context for %sz$resrc=fcontext op=delete %s ftype=%s)rs  rÆ   Úpopru  rY   r6   r   r…  r�  rW   rŽ  r^   r   rš  r™  r¢  r‘  r“  )r   rz  r”  rL   r¦   r~   r   r   r    r³   b
  s.    
zfcontextRecords.__deletec             C   s    | j ƒ  | j||ƒ | jƒ  d S )N)rb   Ú_fcontextRecords__deleter8   )r   rz  r”  r   r   r    rˆ   ƒ
  s    zfcontextRecords.deleter   c             C   s  |rt | jƒ\}| _n„t| jƒ\}| _|dk r:ttdƒƒ‚t| jƒ\}}|dk r\ttdƒƒ‚t | jƒ\}}|dk r~ttdƒƒ‚|  j|7  _|  j|7  _i }xd| jD ]Z}t|ƒ}t|ƒ}t	|ƒ}	t
|ƒ}
|
rôt|
ƒt|
ƒt|
ƒt|
ƒf|||	f< q¦|
|||	f< q¦W |S )Nr   zCould not list file contextsz1Could not list file contexts for home directoriesz"Could not list local file contexts)rž  rW   r¤  Zsemanage_fcontext_listr^   r   Zsemanage_fcontext_list_homedirsrŸ  r   r¡  r�  rZ  r[  r  r  )r   rz   rL   Z
fchomedirsZfclocalrÁ   r•  Úexprr”  r¥  rú   r   r   r    rr   ˆ
  s.    &zfcontextRecords.get_allc             C   sÊ   g }| j dƒ}x€|jƒ D ]t}|| r|| d rd|jdt|d  || d || d |d f ƒ q|jdt|d  || d |d f ƒ qW t| jƒrÆx*| jjƒ D ]}|jd| j| |f ƒ q¦W |S )	NTr   z-a -f %s -t %s -r '%s' '%s'r=   rw   r   z-a -f %s -t %s '%s'z-a -e %s %s)rr   rÆ   r'   r£  rH   rs  )r   r   Ú	fcon_dictr¦   rz  r   r   r    rd   ¨
  s    
4,
zfcontextRecords.customizedr=   c             C   s¤  | j |ƒ}t|ƒdk�r|r:tdtdƒtdƒtdƒf ƒ |rH|jƒ }nt|jƒ ƒ}x°|D ]¨}|| rêtr²td|d |d || d || d || d t|| d	 d
ƒf ƒ n6td|d |d || d || d || d f ƒ qZtd|d |d f ƒ qZW t| jƒ�rV|�sV|�r*ttdƒƒ x*| jjƒ D ]}td|| j| f ƒ �q6W t| j	ƒ�r |�rtttdƒƒ x*| j	jƒ D ]}td|| j	| f ƒ �q€W d S )Nr   z%-50s %-18s %s
zSELinux fcontextrS   r_  z%-50s %-18s %s:%s:%s:%s r=   rw   r   Fz%-50s %-18s %s:%s:%s z%-50s %-18s <<None>>z,
SELinux Distribution fcontext Equivalence 
z%s = %sz%
SELinux Local fcontext Equivalence 
)
rr   rH   rx   r   rÆ   r�   r`   rN   rt  rs  )r   ry   rz   r©  Zfkeysr¦   rz  r   r   r    r{   ·
  s0    


H8zfcontextRecords.list)N)rì   )r   r   rì   )r   r   rì   )r   )r=   r   )r9   r:   r;   rã   r!   r8   r‡  rˆ  r‰  rI  r˜  r€   r–  r—  r²   ra   r§  rˆ   rr   rd   r{   r   r   r   r    rq  -	  s$   
&

6
	C!
 rq  c               @   sl   e Zd Zddd„Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Zddd„Z	dd„ Z
dd„ Zdd„ Zddd„ZdS )ÚbooleanRecordsNc          	   C   sª   t j| |ƒ i | _d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< ytjƒ \}| _tjƒ \}}W n   g | _d }Y nX | jd	ks˜| j|kr d
| _nd| _d S )Nr=   ZTRUEr   ZFALSEZONZOFFÚ1Ú0r   TF)	rP   r!   ÚdictrG   Zsecurity_get_boolean_namesÚcurrent_booleansrX   rR   Úmodify_local)r   rT   rL   Zptyper   r   r    r!   Ú
  s"    






zbooleanRecords.__init__c             C   sL  t j|ƒ}t| j|ƒ\}}|dk r2ttdƒ| ƒ‚t| j|ƒ\}}|dk rZttdƒ| ƒ‚|snttdƒ| ƒ‚t| j|ƒ\}}|dk r–ttdƒ| ƒ‚|jƒ | j	krºt
|| j	|jƒ  ƒ nttdƒdj| j	jƒ ƒ ƒ‚| joä|| jk�rt| j||ƒ}|dk �rttdƒ| ƒ‚t| j||ƒ}|dk �r8ttd	ƒ| ƒ‚t|ƒ t|ƒ d S )
Nr   zCould not create a key for %sz(Could not check if boolean %s is definedzBoolean %s is not definedzCould not query file context %sz0You must specify one of the following values: %sz, z(Could not set active value of boolean %szCould not modify boolean %s)rG   Úselinux_boolean_subÚsemanage_bool_key_createrW   r^   r   Úsemanage_bool_existsZsemanage_bool_queryÚupperr­  Zsemanage_bool_set_valuer•   rÆ   r¯  r®  Zsemanage_bool_set_activeZsemanage_bool_modify_localÚsemanage_bool_key_freeZsemanage_bool_free)r   r,   ÚvaluerL   r¦   r~   r   r   r   r    Z__modð
  s0    


zbooleanRecords.__modFc             C   s´   | j ƒ  |rœt|ƒ}x||jƒ jdƒD ]j}|jƒ }t|ƒdkr>q$y|jdƒ\}}W n( tk
rx   ttd||f ƒƒ‚Y nX | j|jƒ |jƒ ƒ q$W |j	ƒ  n| j||ƒ | j
ƒ  d S )NrŠ  r   ú=zBad format %s: Record %s)rb   r¼   r½   r�   rx  rH   r^   r   Ú_booleanRecords__modr¿   r8   )r   r,   rµ  Úuse_filerÄ   r   Zboolnamera  r   r   r    r²     s    
zbooleanRecords.modifyc             C   sÚ   t j|ƒ}t| j|ƒ\}}|dk r2ttdƒ| ƒ‚t| j|ƒ\}}|dk rZttdƒ| ƒ‚|snttdƒ| ƒ‚t| j|ƒ\}}|dk r–ttdƒ| ƒ‚|sªttdƒ| ƒ‚t| j|ƒ}|dk rÎttdƒ| ƒ‚t	|ƒ d S )Nr   zCould not create a key for %sz(Could not check if boolean %s is definedzBoolean %s is not definedz2Boolean %s is defined in policy, cannot be deletedzCould not delete boolean %s)
rG   r°  r±  rW   r^   r   r²  Zsemanage_bool_exists_localZsemanage_bool_del_localr´  )r   r,   rL   r¦   r~   r   r   r    r³   #  s$    
zbooleanRecords.__deletec             C   s   | j ƒ  | j|ƒ | jƒ  d S )N)rb   Ú_booleanRecords__deleter8   )r   r,   r   r   r    rˆ   ;  s    
zbooleanRecords.deletec             C   sZ   t | jƒ\}| _|dk r$ttdƒƒ‚| jƒ  x | jD ]}t|ƒ}| j|ƒ q4W | jƒ  d S )Nr   zCould not list booleans)	Úsemanage_bool_list_localrW   Úblistr^   r   rb   Úsemanage_bool_get_namer¹  r8   )r   rL   Úbooleanr,   r   r   r    ra   @  s    zbooleanRecords.deleteallr   c             C   sÂ   i }|rt | jƒ\}| _nt| jƒ\}| _|dk r>ttdƒƒ‚x~| jD ]t}g }t|ƒ}|jt|ƒƒ | j	r–|| j
kr–|jtj|ƒƒ |jtj|ƒƒ n|j|d ƒ |j|d ƒ |||< qFW |S )Nr   zCould not list booleans)rº  rW   r»  Zsemanage_bool_listr^   r   r¼  r'   Zsemanage_bool_get_valuer¯  r®  rG   Zsecurity_get_boolean_pendingZsecurity_get_boolean_active)r   rz   rÁ   rL   r½  rµ  r,   r   r   r    rr   M  s"    zbooleanRecords.get_allc             C   s   t j|ƒ}tj|ƒS )N)rG   r°  rZ   Zboolean_desc)r   r,   r   r   r    Úget_descd  s    
zbooleanRecords.get_descc             C   s   t j|ƒ}tj|ƒS )N)rG   r°  rZ   Zboolean_category)r   r,   r   r   r    Úget_categoryh  s    
zbooleanRecords.get_categoryc             C   sJ   g }| j dƒ}x6t|jƒ ƒD ]&}|| r|jd|| d |f ƒ qW |S )NTz	-m -%s %srw   )rr   r�   rÆ   r'   )r   r   rÁ   r¦   r   r   r    rd   l  s    
zbooleanRecords.customizedTc             C   sî   t dƒt dƒf}|rX| j|ƒ}x4t|jƒ ƒD ]$}|| r,td||| d f ƒ q,W d S | j|ƒ}t|ƒdkrrd S |rštdt dƒt dƒt d	ƒt d
ƒf ƒ xNt|jƒ ƒD ]>}|| r¨td|||| d  ||| d  | j|ƒf ƒ q¨W d S )Nr‹   rŠ   z%s=%srw   r   z%-30s %s  %s %s
zSELinux booleanZStateZDefaultZDescriptionz%-30s (%-5s,%5s)  %s)r   rr   r�   rÆ   rx   rH   r¾  )r   ry   rz   r¸  Zon_offrÁ   r¦   r   r   r    r{   t  s    

$zbooleanRecords.list)N)NF)r   )TFF)r9   r:   r;   r!   r·  r²   r¹  rˆ   ra   rr   r¾  r¿  rd   r{   r   r   r   r    rª  Ø
  s   


rª  )r   )r=   )r=   )9r�   rœ   rG   r|   rB   r(   r  r   r5   ZPROGNAMErZ   r  rD  ÚgettextÚkwargsÚversion_infoZinstallÚbuiltinsr*   Ú__dict__r’   Z__builtin__r   r>   rŽ  ZSEMANAGE_FCONTEXT_ALLZSEMANAGE_FCONTEXT_REGZSEMANAGE_FCONTEXT_DIRZSEMANAGE_FCONTEXT_CHARZSEMANAGE_FCONTEXT_BLOCKZSEMANAGE_FCONTEXT_SOCKZSEMANAGE_FCONTEXT_LINKZSEMANAGE_FCONTEXT_PIPEr£  r“  r   Zaudit_closer   r   rœ  r?   rF   rN   rO   rP   rf   r‰   r�   r–   r™   rà   r  r-  rA  rb  rq  rª  r   r   r   r    Ú<module>   sÜ   
$$	

ikH      $        M   .