
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
Klf                @   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 rd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 rt
| ttdt|}|dk rt
| ttdt|atdk rt
| 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xt|D ]}t||}t| j|\}}|dk rdttdt| j|\}}|dk rttdt| j|\}}	|dk rttdt	| j|\}}
|dk rt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 |rtdtd  x|D ]}t| qW 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   zThe 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 rttd| |d dkry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rt| j
||}|dk rttd| t| j
||}|dk rttd| t| j
|
|}|dk rt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 rttd| t| j|
\}}|dk rttd| |st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 rt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 rt	t
d| |st	t
d| t| j|\}}|dk rt	t
d| |st	t
d| t| j|}|dk rt	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 | _xt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|rtd
| j	  x|D ]0}|| }td||d t|d |d	 f  qW 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 rttd| t| j||}|dk rttd| x6|D ].}	t	| j||	}|dk rttd	|	|f qW t dkrVt
| j||}|dk r.ttd
| t| j||}|dk rVttd| t| j||}|dk rttd|	|f t| j|\}}
|dk rttd| t| j||}|dk rt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 rttd| t| j|
\}	}|	dk rttd| |sttd	| t| j|
\}	}|	dk rt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rx"|D ]}||krt|| qW x&|D ]}||krt| j|| qW t| j|
|}	|	dk rt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 rttd| |sttd| t| j|\}}|dk rt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  qW nB|rtdtdtdf  x$|D ]}td||| d f  qW 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rttd	t
| j|||\}}	|dk rt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 rttd||f t
|
| t|
|| t| j	\}	}|	dk rttd||f t| j	|d	}	|	dk rt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rt| j	||}	|	dk rttd||f t| j	|
|}	|	dk rttd||f t| j	||
}	|	dk rt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 rttd||f |
sttd||f t	| j|\}	}|	dk rt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 rttd| t
| j|	}|dk rt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 rttd||f |sttd||f t| j|}|dk rt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rg |||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}xt|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 }qW 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 rt 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 rttd||f t
| j	|	| t|	|| t| j	\}}
|dk rt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rt| j	|
|}|dk rttd||f t| j	|	|
}|dk rttd||f t| j	||	}|dk rt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 rttd||f |	sttd||f t	| j|\}}
|dk rt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 rttd| t	| j|}|dk rt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 rttd||f |sttd||f t| j|}|dk rt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rg |||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}xt|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 }qW 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 rttd||f t
| j	|| t|| t| j	\}}	|dk rttd||f t| j	|	d	}|dk rt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rt| j	|	|}|dk rttd||f t| j	||	}|dk rttd||f t| j	||}|dk rt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 rttd||f |sttd||f t	| j|\}}	|dk rt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 rt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 rttd||f |sttd||f t| j|}|dk rt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rg |||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 }qW 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 rttd| t
| j	\}}|dk rttd| t|| t| j	|||}t| j	\}}	|dk rt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 rttd| tdkr|dkrt| j	|	|}|dk rt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 rttd| t| j|\}}|dk rttd| |sttd| t	| j|\}}	|dk rt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 rttd| |sttd| t| j|}|dk rt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}xt|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rx|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  qW 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 rttd| t| j||}t| j\}}|dk rttd| t	| j|d	}|dk rt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 rttd| t| j||}|dk rttd| t| j||}|dk rt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| |st td| t| j|\}}|dk rt td| t|}tdkr|dkrt| j|t	| |dkrt
| 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 rttd| |sttd| t| j|}|dk rt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rx|D ]@}td||| d || d || d t|| d d	f  qLW n:x8|D ]0}td
||| d || d || d f  qW 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rq|jdrq|j \}}|| j|< qW |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 rt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rt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 rttd|||| f qW qW | 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 %sr  )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rt| j|d	}|dk rt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 rttd| t| j	\}}|dk rttd| t| j	||}|dkr\| j||}	t| j	|	|}|dk rt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 rttd| |dkrt|	 t| t| |sd}| 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| |st| j|\}}|dk rt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 rt td| t	| j|\}}|dk rt td| |ry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rt| j|
t| |dkrt| j|
| |dkrt| 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 rt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 rttd| |st| j	|\}}|dk rttd| |rt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\}| _nt| 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
|}
|
rt|
t|
t|
t|
f|||	f< q|
|||	f< qW |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rx*| jj D ]}|jd| j| |f  qW |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 ]}|| rtrt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  qW 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rd
| _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 rttd| |j | j	krt
|| 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   |rt|}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 rttd| |sttd| t| j|}|dk rt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 |rtdt dt dt d	t d
f  xNt|j D ]>}|| rtd|||| d  ||| d  | j|f  qW 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   .