509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Fl„fœÊ  ã               @   sì  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dlZd dl	Z	ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ d dljZd dljZdZy<d dlZi Z ej!dBk �r:de d< ej"efdddœe —Ž W nL   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„ Z)dd„ Z*dd „ Z+d!d"„ Z,d Z-dZ.d#Z/dZ0d$Z1d%Z2d Z3dZ4d#Z5dZ6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?i Z@eAd/ƒe@e3< eAd0ƒe@e4< eAd1ƒe@e5< eAd2ƒe@e6< eAd3ƒe@e7< eAd4ƒe@e8< eAd5ƒe@e9< eAd6ƒe@e:< eAd7ƒe@e;< eAd8ƒe@e<< eAd9ƒe@e=< eAd:ƒe@e>< eAd;ƒe@e?< d<d=„ ZBe3e4e5e8e6gZCe;e:e<e=e>gZDd>d?„ ZEG d@dA„ dAƒZFdS )Cé    N)Úget_all_typesÚget_all_attributesÚget_all_rolesé   )Ú
executable)Úboolean)Úetc_rw)Ú	unit_file)Ú	var_cache)Ú	var_spool)Úvar_lib)Úvar_log)Úvar_run)Útmp)Úrw)Únetwork)Úscript)Úspec)Úuserzselinux-pythoné   TÚunicodez/usr/share/localezutf-8)Z	localedirZcodesetÚ_c             C   sF   | d }| d }| d }|d |j dƒd  }|j dƒd }|||gS )z6Given an RPM header return the package NVR as a stringÚnameÚversionÚreleaseú-Ú.r   r   )Úsplit)Zhdrr   r   r   Zrelease_versionZ
os_version© r   ú/usr/lib/python3.6/generate.pyÚget_rpm_nvr_from_headerG   s    r    c          	   C   s`   y>dd l }d }|jƒ }|j|j| ƒ}x|D ]}t|ƒ}P q*W W n   td|  ƒ d }Y nX |S )Nr   z"Failed to retrieve rpm info for %s)ÚrpmÚtsZdbMatchZRPMTAG_NAMEr    Úprint)Úpackager!   Znvrr"   ZmiÚhr   r   r   Úget_rpm_nvr_listR   s    


r&   c              C   s„   i } xzt jt jƒD ]j}|d dks|d dks|d dks|d dks|d dkrTq|d |jdƒf| |d |d	 |d
 f< qW | S )NÚtypeZreserved_port_tZport_tZhi_reserved_port_tZephemeral_port_tZunreserved_port_tÚrangeZlowZhighÚprotocol)ÚsepolicyÚinfoZPORTÚget)ÚdictÚpr   r   r   Úget_all_portsb   s    ,r/   c              C   s6   dd„ t jt jƒD ƒ} | jdƒ | jdƒ | jƒ  | S )Nc             S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úxr   r   r   ú
<listcomp>p   s    z!get_all_users.<locals>.<listcomp>Zsystem_uÚroot)r*   r+   ÚUSERÚremoveÚsort)Úusersr   r   r   Úget_all_userso   s
    

r8   é   z_admin$z_role$é   é   é   é   é   é	   é
   é   é   zStandard Init DaemonzDBUS System DaemonzInternet Services DaemonzWeb Application/Script (CGI)ZSandboxzUser ApplicationzExisting Domain Typez Minimal Terminal Login User Rolez!Minimal X Windows Login User RolezDesktop Login User RolezAdministrator Login User Rolez Confined Root Administrator Rolez!Module information for a new typec              C   s>   t jƒ } | jƒ  tdƒ}x | D ]}|d|t | f 7 }qW |S )NzValid Types:
z%2s: %s
)ÚpoltypeÚkeysr6   r   )rD   ÚmsgÚkr   r   r   Úget_poltype_desc›   s    
rG   c             C   sð   | dkrg S d	}y¶g }x¬| j dƒD ]ž}|j dƒ}t|ƒdkr@t‚t|ƒdkrft|d ƒ}t|d ƒ}n$t|d ƒ}t|d ƒ}||krŠt‚x4t||d ƒD ]"}|dk s®||kr²t‚|j|ƒ qšW q"W |S  tk
rê   ttdƒ| ƒ‚Y nX d S )
NÚ r9   é   ú,r   r   r   z8Ports must be numbers or ranges of numbers from 1 to %d i   )r   ÚlenÚ
ValueErrorÚintr(   Úappendr   )ÚportsZmax_portÚtempÚaÚrÚbeginÚendr.   r   r   r   Úverify_ports§   s.    
rU   c               @   s¦  e Z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„ Z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'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d�„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdˆd‰„ ZFdŠd‹„ ZGdŒd�„ ZHdŽd�„ ZId�d‘„ ZJd’d“„ ZKd”d•„ ZLd–d—„ ZMd˜d™„ ZNdšd›„ ZOdœd�„ ZPdždŸ„ ZQd d¡„ ZRd¢d£„ ZSd¤d¥„ ZTd¦d§„ ZUd¨d©„ ZVdªd«„ ZWd¬d­„ ZXd®d¯„ ZYd°d±„ ZZd²d³„ Z[d´dµ„ Z\d¶d·„ Z]d¸d¹„ Z^dºd»„ Z_d¼d½„ Z`d¾d¿„ ZadÀdÁ„ ZbdÂdÃ„ ZcdÄdÅ„ ZddÆdÇ„ ZedÈdÉ„ ZfdÊdË„ ZgdÌdÍ„ ZhdÎdÏ„ ZidÐdÑ„ ZjdÒdÓ„ ZkdÔdÕ„ ZldÖd×„ ZmdØdÙ„ ZndÚdÛ„ ZodÜdÝ„ ZpdÞdß„ Zqdàdá„ Zrdâdã„ Zsetjuƒ fdädå„ZvdæS )èÚpolicyc             C   s  g | _ i | _tƒ | _g | _|tkr.ttdƒƒ‚|sFttdƒt|  ƒ‚ytƒ | _W nT tk
r| } zt	dƒ W Y d d }~X n, t
k
r¦ } zt	d|ƒ W Y d d }~X nX i | _d| jd< d| jd< d| jd< d	| jd
< d	| jd< d	| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd < d!| jd"< d#| jd$< d%| jd&< d'| jd(< d)| jd*< d+| jd,< d-| jd.< d/| jd0< d1| jd2< d3| jd4< d5| jd6< d7| jd8< d9| jd:< d;| jd<< d=| jd>< d?| jd@< dA| jdB< dC| jdD< dE| jdF< dG| jdH< dI| jdJ< dK| jdL< dM| jdN< dO| jdP< dQ| jdR< dS| jdT< dU| jdV< dW| jdX< dY| jdZ< d[| jd\< d]| jd^< d_| jd`< da| jdb< da| jdc< da| jdd< da| jde< df| jdg< df| jdh< df| jdi< df| jdj< df| jdg< dk| jdl< dm| jdn< do| jdp< dq| jdr< ds| jdt< du| jdv< dw| jdx< dy| jdz< d{| jd|< d}| jd~< d| jd€< d| jd�< d‚| jdƒ< d„| jd…< d†| jd‡< d†| jdˆ< d†| jd‰< dŠ| jd‹< dŒ| jd�< dŽ| jd�< d�| jd‘< d’| jd“< d”| jd•< d–| jd—< d˜| jd™< dš| jd›< dœ| jd�< i | _džg tg| jdŸ< d g tg| jd¡< d¢g tg| jd¢< d£g tg| jd¤< d£g tg| jd¥< d£g tg| jd¦< d§g tg| jd¨< d©g tg| jdª< d«g tg| jd¬< d­g tg| jd®< d¯g tg| jd°< i | _t| jd±< t| jd²< t| jd³< t| jd´< t| jdµ< t| jd¶< t| jd·< t| jd¸< dŸd¨d¬d¡d¢dªd®d°d¦d¤d¥g| _| j| jf| j| jf| j| jf| j| j f| j!| j"f| j#| j$f| j%| j&f| j'| j(f| j)| j*f| j+| j(f| j,| j(f| j-| j.f| j/| j0ff| _1t2j3d¹|ƒ�sÞttdºƒƒ‚|t4k�rôd»| | _5n|| _5|| _6g | _7g | _8|| _9d¼| _:d | _;d½d½d½g g| _<d½d½d½g g| _=d½d½d½g g| _>d½d½d½g g| _?d½| _@d½| _Ad½| _Bd½| _Cd½| _Dd½| _Ed½| _Fd½| _Gd½| _H| j9tItJgk| _K| j9tItJgk| _L| j9tItJgk| _Md½| _Nd½| _Oi | _Pi | _Qi | _Rg | _Sg | _Td½| _Ud½| _Vg | _Wg | _Xg | _Yg | _Zg | _[d S )¾Nz"You must enter a valid policy typez;You must enter a name for your policy module for your '%s'.z9Can not get port types, must be root for this informationzCan not get port typeszset_use_kerberos(True)Zopenlogzset_use_kerb_rcache(True)zset_use_syslog(True)zset_use_resolve(True)Z	gethostbyZgetaddrinfoZgetnameinfoZkrbzset_manage_krb5_rcache(True)Zgss_accept_sec_contextZkrb5_verify_init_credsZkrb5_rd_reqZ__syslog_chkzset_use_uid(True)ÚgetpwnamÚgetpwuidzset_use_dbus(True)Zdbus_zset_use_pam(True)Zpam_zset_use_audit(True)zadd_process('fork')Úforkzadd_process('transition')Z
transitionzadd_process('sigchld')Zsigchldzadd_process('sigkill')Zsigkillzadd_process('sigstop')Zsigstopzadd_process('signull')Zsignullzadd_process('ptrace')Zptracezadd_process('getsched')Zgetschedzadd_process('setsched')Zsetschedzadd_process('getsession')Z
getsessionzadd_process('getpgid')Úgetpgidzadd_process('setpgid')Úsetpgidzadd_process('getcap')Zgetcapzadd_process('setcap')Zsetcapzadd_process('share')Zsharezadd_process('getattr')Úgetattrzadd_process('setexec')Zsetexeczadd_process('setfscreate')Zsetfscreatezadd_process('noatsecure')Z
noatsecurezadd_process('siginh')Zsiginhzadd_process('signal_perms')Úkillzadd_process('setrlimit')Z	setrlimitzadd_process('rlimitinh')Z	rlimitinhzadd_process('dyntransition')Zdyntransitionzadd_process('setcurrent')Z
setcurrentzadd_process('execmem')Zexecmemzadd_process('execstack')Z	execstackzadd_process('execheap')Zexecheapzadd_process('setkeycreate')Zsetkeycreatezadd_process('setsockcreate')Zsetsockcreatezadd_capability('chown')Úchownzadd_capability('dac_override')Zdac_overridez!add_capability('dac_read_search')Zdac_read_searchzadd_capability('fowner')Zfownerzadd_capability('fsetid')Zfsetidzadd_capability('setgid')ÚsetgidÚsetegidÚ	setresgidÚsetregidzadd_capability('setuid')Ú	setresuidÚsetuidÚseteuidÚsetreuidzadd_capability('setpcap')Zsetpcapz!add_capability('linux_immutable')Zlinux_immutablez"add_capability('net_bind_service')Znet_bind_servicezadd_capability('net_broadcast')Znet_broadcastzadd_capability('net_admin')Z	net_adminzadd_capability('net_raw')Znet_rawzadd_capability('ipc_lock')Zipc_lockzadd_capability('ipc_owner')Z	ipc_ownerzadd_capability('sys_module')Ú
sys_modulezadd_capability('sys_rawio')Z	sys_rawiozadd_capability('sys_chroot')ÚchrootZ
sys_chrootzadd_capability('sys_ptrace')Z
sys_ptracezadd_capability('sys_pacct')Z	sys_pacctzadd_capability('sys_admin')ZmountZunshareZ	sys_adminzadd_capability('sys_boot')Zsys_bootzadd_capability('sys_nice')Zsys_nicezadd_capability('sys_resource')Zsys_resourcezadd_capability('sys_time')Zsys_timez add_capability('sys_tty_config')Zsys_tty_configzadd_capability('mknod')Úmknodzadd_capability('lease')Zleasezadd_capability('audit_write')Zaudit_writezadd_capability('audit_control')Zaudit_controlzadd_capability('setfcap')Zsetfcapr   z/etcr   z/tmpr   r	   z/usr/lib/systemd/systemz/lib/systemd/systemz/etc/systemd/systemr
   z
/var/cacher   z/var/libr   z/var/logr   z/var/runr   z
/var/spoolZ_tmp_tZ_unit_file_tZ_var_cache_tZ
_var_lib_tZ
_var_log_tZ
_var_run_tZ_var_spool_tZ_port_tz^[a-zA-Z0-9-_]+$zQName must be alpha numberic with no spaces. Consider using option "-n MODULENAME"zhttpd_%s_scriptrH   F)\ÚrpmsrO   r   Ú	all_rolesÚtypesrC   rL   r   r/   r#   ÚRuntimeErrorÚsymbolsÚDEFAULT_DIRSr   r   r   r	   r
   r   r   r   r   ÚDEFAULT_EXTr   ÚDEFAULT_KEYSÚgenerate_daemon_typesÚgenerate_daemon_rulesÚgenerate_dbusd_typesÚgenerate_dbusd_rulesÚgenerate_inetd_typesÚgenerate_inetd_rulesÚgenerate_cgi_typesÚgenerate_cgi_rulesÚgenerate_sandbox_typesÚgenerate_sandbox_rulesÚgenerate_userapp_typesÚgenerate_userapp_rulesÚgenerate_existing_user_typesÚgenerate_existing_user_rulesÚgenerate_min_login_user_typesÚgenerate_login_user_rulesÚgenerate_x_login_user_typesÚgenerate_x_login_user_rulesÚgenerate_login_user_typesÚgenerate_admin_user_typesÚgenerate_root_user_typesÚgenerate_root_user_rulesÚgenerate_new_typesÚgenerate_new_rulesÚDEFAULT_TYPESÚreÚmatchÚCGIr   Ú	file_nameÚcapabilitiesÚ	processesr'   Ú
initscriptÚprogramÚin_tcpÚin_udpÚout_tcpÚout_udpÚuse_resolveÚuse_tmpÚuse_uidÚ
use_syslogÚuse_kerberosÚmanage_krb5_rcacheÚuse_pamÚuse_dbusÚ	use_auditÚEUSERÚNEWTYPEÚuse_etcÚuse_localizationÚuse_fdÚuse_terminalÚuse_mailÚbooleansÚfilesÚdirsÚfound_tcp_portsÚfound_udp_portsÚneed_tcp_typeÚneed_udp_typeÚadmin_domainsÚexisting_domainsÚtransition_domainsÚtransition_usersÚroles)Úselfr   r'   Úer   r   r   Ú__init__Æ   sd   











































































































zpolicy.__init__c             C   s(   |t  p&|t p&|t p&t|t ƒdkS )Nr   )ÚALLÚRESERVEDÚ
UNRESERVEDrK   ÚPORTS)r³   Úlr   r   r   Z
__isnetset‡  s    zpolicy.__isnetsetc             C   s
   || _ d S )N)r®   )r³   r®   r   r   r   Úset_admin_domainsŠ  s    zpolicy.set_admin_domainsc             C   s
   || _ d S )N)r¯   )r³   r¯   r   r   r   Úset_existing_domains�  s    zpolicy.set_existing_domainsc             C   s
   || _ d S )N)r²   )r³   r²   r   r   r   Úset_admin_roles�  s    zpolicy.set_admin_rolesc             C   s
   || _ d S )N)r°   )r³   r°   r   r   r   Úset_transition_domains“  s    zpolicy.set_transition_domainsc             C   s
   || _ d S )N)r±   )r³   r±   r   r   r   Úset_transition_users–  s    zpolicy.set_transition_usersc             C   s   | j | jƒS )N)Ú_policy__isnetsetr”   )r³   r   r   r   Ú
use_in_udp™  s    zpolicy.use_in_udpc             C   s   | j | jƒS )N)rÀ   r–   )r³   r   r   r   Úuse_out_udpœ  s    zpolicy.use_out_udpc             C   s   | j ƒ p| jƒ S )N)rÁ   rÂ   )r³   r   r   r   Úuse_udpŸ  s    zpolicy.use_udpc             C   s   | j | jƒS )N)rÀ   r“   )r³   r   r   r   Ú
use_in_tcp¢  s    zpolicy.use_in_tcpc             C   s   | j | jƒS )N)rÀ   r•   )r³   r   r   r   Úuse_out_tcp¥  s    zpolicy.use_out_tcpc             C   s   | j ƒ p| jƒ S )N)rÄ   rÅ   )r³   r   r   r   Úuse_tcp¨  s    zpolicy.use_tcpc             C   s   | j ƒ p| jƒ S )N)rÆ   rÃ   )r³   r   r   r   Úuse_network«  s    zpolicy.use_networkÚtcpc             C   sF   x@| j jƒ D ]2\}}}||kr||kr||kr| j |||f S qW d S )N)rO   rD   )r³   Zportr)   rS   rT   r.   r   r   r   Ú	find_port®  s    zpolicy.find_portc             C   s    | j tkrttdƒƒ‚|| _d S )Nz0User Role types can not be assigned executables.)r'   ÚAPPLICATIONSrL   r   r’   )r³   r’   r   r   r   Úset_program´  s    
zpolicy.set_programc             C   s    | j tkrttdƒƒ‚|| _d S )Nz)Only Daemon apps can use an init script..)r'   ÚDAEMONrL   r   r‘   )r³   r‘   r   r   r   Úset_init_scriptº  s    
zpolicy.set_init_scriptc             C   s   |||t |ƒg| _d S )N)rU   r“   )r³   ÚallÚreservedÚ
unreservedrO   r   r   r   Ú
set_in_tcpÀ  s    zpolicy.set_in_tcpc             C   s   |||t |ƒg| _d S )N)rU   r”   )r³   rÎ   rÏ   rÐ   rO   r   r   r   Ú
set_in_udpÃ  s    zpolicy.set_in_udpc             C   s   |ddt |ƒg| _d S )NF)rU   r•   )r³   rÎ   rO   r   r   r   Úset_out_tcpÆ  s    zpolicy.set_out_tcpc             C   s   |ddt |ƒg| _d S )NF)rU   r–   )r³   rÎ   rO   r   r   r   Úset_out_udpÉ  s    zpolicy.set_out_udpc             C   s"   t |ƒtk	rttdƒƒ‚|| _d S )Nz$use_resolve must be a boolean value )r'   ÚboolrL   r   r—   )r³   Úvalr   r   r   Úset_use_resolveÌ  s    zpolicy.set_use_resolvec             C   s"   t |ƒtk	rttdƒƒ‚|| _d S )Nz#use_syslog must be a boolean value )r'   rÕ   rL   r   rš   )r³   rÖ   r   r   r   Úset_use_syslogÒ  s    zpolicy.set_use_syslogc             C   s"   t |ƒtk	rttdƒƒ‚|| _d S )Nz%use_kerberos must be a boolean value )r'   rÕ   rL   r   r›   )r³   rÖ   r   r   r   Úset_use_kerberosØ  s    zpolicy.set_use_kerberosc             C   s"   t |ƒtk	rttdƒƒ‚|| _d S )Nz+manage_krb5_rcache must be a boolean value )r'   rÕ   rL   r   rœ   )r³   rÖ   r   r   r   Úset_manage_krb5_rcacheÞ  s    zpolicy.set_manage_krb5_rcachec             C   s   |dk| _ d S )NT)r�   )r³   rÖ   r   r   r   Úset_use_pamä  s    zpolicy.set_use_pamc             C   s   |dk| _ d S )NT)rž   )r³   rÖ   r   r   r   Úset_use_dbusç  s    zpolicy.set_use_dbusc             C   s   |dk| _ d S )NT)rŸ   )r³   rÖ   r   r   r   Úset_use_auditê  s    zpolicy.set_use_auditc             C   s   |dk| _ d S )NT)r¢   )r³   rÖ   r   r   r   Úset_use_etcí  s    zpolicy.set_use_etcc             C   s   |dk| _ d S )NT)r£   )r³   rÖ   r   r   r   Úset_use_localizationð  s    zpolicy.set_use_localizationc             C   s   |dk| _ d S )NT)r¤   )r³   rÖ   r   r   r   Ú
set_use_fdó  s    zpolicy.set_use_fdc             C   s   |dk| _ d S )NT)r¥   )r³   rÖ   r   r   r   Úset_use_terminalö  s    zpolicy.set_use_terminalc             C   s   |dk| _ d S )NT)r¦   )r³   rÖ   r   r   r   Úset_use_mailù  s    zpolicy.set_use_mailc             C   sB   | j tkrttdƒƒ‚|r0| jd d jdƒ ng | jd d< d S )Nz'USER Types automatically get a tmp typez/tmpr   )r'   ÚUSERSrL   r   ro   rN   )r³   rÖ   r   r   r   Úset_use_tmpü  s
    
zpolicy.set_use_tmpc             C   s   |dk| _ d S )NT)r™   )r³   rÖ   r   r   r   Úset_use_uid  s    zpolicy.set_use_uidc             C   s    | j rtjd| jtjƒS dS d S )NÚTEMPLATETYPErH   )r™   r‹   Úsubr   r   Zte_uid_rules)r³   r   r   r   Úgenerate_uid_rules  s    zpolicy.generate_uid_rulesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )rš   r‹   rç   r   r   Zte_syslog_rules)r³   r   r   r   Úgenerate_syslog_rules  s    zpolicy.generate_syslog_rulesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )r—   r‹   rç   r   r   Zte_resolve_rules)r³   r   r   r   Úgenerate_resolve_rules  s    zpolicy.generate_resolve_rulesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )r›   r‹   rç   r   r   Zte_kerberos_rules)r³   r   r   r   Úgenerate_kerberos_rules  s    zpolicy.generate_kerberos_rulesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )rœ   r‹   rç   r   r   Zte_manage_krb5_rcache_rules)r³   r   r   r   Ú!generate_manage_krb5_rcache_rules   s    z(policy.generate_manage_krb5_rcache_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )r�   r‹   rç   r   r   Zte_pam_rules)r³   Únewter   r   r   Úgenerate_pam_rules&  s    zpolicy.generate_pam_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )rŸ   r‹   rç   r   r   Zte_audit_rules)r³   rí   r   r   r   Úgenerate_audit_rules,  s    zpolicy.generate_audit_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )r¢   r‹   rç   r   r   Zte_etc_rules)r³   rí   r   r   r   Úgenerate_etc_rules2  s    zpolicy.generate_etc_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )r¤   r‹   rç   r   r   Zte_fd_rules)r³   rí   r   r   r   Úgenerate_fd_rules8  s    zpolicy.generate_fd_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )r£   r‹   rç   r   r   Zte_localization_rules)r³   rí   r   r   r   Úgenerate_localization_rules>  s    z"policy.generate_localization_rulesc             C   s*   d}| j tkr&| jr&tjd| jtjƒ}|S )NrH   ræ   )r'   ÚDBUSrž   r‹   rç   r   r   Zte_dbus_rules)r³   rí   r   r   r   Úgenerate_dbus_rulesD  s    zpolicy.generate_dbus_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )r¦   r‹   rç   r   r   Zte_mail_rules)r³   rí   r   r   r   Úgenerate_mail_rulesJ  s    zpolicy.generate_mail_rulesc             C   sF   d}d|||f }|t jƒ kr.d|| jf }nd|| j|||f }|S )NrH   zcorenet_%s_%s_%sz	%s(%s_t)
zD
gen_require(`
    type %s_t;
')
allow %s_t %s_t:%s_socket name_%s;
)r*   Zget_methodsr   )r³   r)   ÚactionÚ	port_nameÚlineÚmethodr   r   r   Úgenerate_network_actionP  s    zpolicy.generate_network_actionc             C   sh  xf| j t D ]X}| jt|ƒdƒ}|d kr0d| _q|d d d
… }| jdd|ƒ}|| jkr| jj|ƒ qW xf| jt D ]X}| jt|ƒdƒ}|d kr˜d| _qt|d d d… }| jdd|ƒ}|| jkrt| jj|ƒ qtW xh| j	t D ]Z}| jt|ƒdƒ}|d k�rd| _
qÜ|d d d… }| jdd|ƒ}|| jkrÜ| jj|ƒ qÜW | j
dk�sR| jdk�rdtjd| jtjƒS d	S )NrÈ   Tr   r9   ZbindZconnectÚudpræ   rH   éþÿÿÿrü   rü   )r“   r¹   rÉ   rM   r¬   rú   rª   rN   r•   r”   r­   r«   r‹   rç   r   r   Úte_types)r³   ÚiZrecr÷   rø   r   r   r   Úgenerate_network_types^  s6    



zpolicy.generate_network_typesc             C   sZ   x:| j D ]0}|j|ƒdkr| j | d j|ƒ | j | S qW | j d d j|ƒ | j d S )Nr   r   r   )ro   ÚfindrN   )r³   ÚfileÚdr   r   r   Z__find_path„  s    zpolicy.__find_pathc             C   s   || j kr| j j|ƒ d S )N)r�   rN   )r³   Z
capabilityr   r   r   Úadd_capabilityŒ  s    
zpolicy.add_capabilityc             C   s
   || _ d S )N)rl   )r³   rl   r   r   r   Ú	set_types�  s    zpolicy.set_typesc             C   s   || j kr| j j|ƒ d S )N)r�   rN   )r³   Zprocessr   r   r   Úadd_process“  s    
zpolicy.add_processc             C   s   || j |< d S )N)r§   )r³   r   Údescriptionr   r   r   Úadd_boolean—  s    zpolicy.add_booleanc             C   s   | j |ƒ| j|< d S )N)Ú_policy__find_pathr¨   )r³   r  r   r   r   Úadd_fileš  s    zpolicy.add_filec             C   s   | j |ƒ| j|< d S )N)r  r©   )r³   r  r   r   r   Úadd_dir�  s    zpolicy.add_dirc             C   s6   d}| j jƒ  t| j ƒdkr2d| jdj| j ƒf }|S )NrH   r   z#allow %s_t self:capability { %s };
ú )r�   r6   rK   r   Újoin)r³   rí   r   r   r   Úgenerate_capabilities   s
    
zpolicy.generate_capabilitiesc             C   s6   d}| j jƒ  t| j ƒdkr2d| jdj| j ƒf }|S )NrH   r   z allow %s_t self:process { %s };
r  )r�   r6   rK   r   r  )r³   rí   r   r   r   Úgenerate_process§  s
    
zpolicy.generate_processc             C   s˜  d}| j ƒ �r”d}|tjd| jtjƒ7 }| jƒ �r®|d7 }|tjd| jtjƒ7 }| jƒ rœ|tjd| jtj	ƒ7 }| j
rœt| jt ƒdkrœ|tjd| jtjƒ7 }| j
rÊt| jt ƒdkrÊ|tjd| jtjƒ7 }| jt rê|tjd| jtjƒ7 }| jt �r|tjd| jtjƒ7 }| jt �r.|tjd| jtjƒ7 }| jt �rP|tjd| jtjƒ7 }| jt �rr|tjd| jtjƒ7 }| jt �r”|tjd| jtjƒ7 }x| jD ]}||7 }�qœW | jƒ �r”|d7 }|tjd| jtjƒ7 }| j�rô|tjd| jtjƒ7 }| jƒ �r|tjd| jtj ƒ7 }| j!t �r6|tjd| jtj"ƒ7 }| j!t �rX|tjd| jtj#ƒ7 }| j!t �rz|tjd| jtj$ƒ7 }x| j%D ]}||7 }�q‚W |S )NrH   Ú
ræ   r   )&rÇ   r‹   rç   r   r   Z
te_networkrÆ   Zte_tcprÄ   Z	te_in_tcpr¬   rK   r“   r¹   Zte_in_need_port_tcpr•   Zte_out_need_port_tcpr¶   Zte_in_all_ports_tcpr·   Zte_in_reserved_ports_tcpr¸   Zte_in_unreserved_ports_tcpZte_out_all_ports_tcpZte_out_reserved_ports_tcpZte_out_unreserved_ports_tcprª   rÃ   Zte_udpr­   Zte_in_need_port_udprÁ   Z	te_in_udpr”   Zte_in_all_ports_udpZte_in_reserved_ports_udpZte_in_unreserved_ports_udpr«   )r³   rí   rþ   r   r   r   Úgenerate_network_rules®  sV    




zpolicy.generate_network_rulesc             C   s„   d}x2| j D ](}tjd| jtjƒ}|tjd||ƒ7 }qW | jtkr€x<| jD ]2}tjd| jt	j
ƒ}|tjd|jdƒd |ƒ7 }qJW |S )NrH   ræ   ÚAPPLICATIONr4   Ú_ur   )r°   r‹   rç   r   r   Zte_transition_rulesr'   r4   r±   r   Zte_run_rulesr   )r³   rí   Úappr   ÚurP   r   r   r   Úgenerate_transition_rulesæ  s    
 z policy.generate_transition_rulesc             C   s,  d}| j tkr‚xn| jD ]d}|jdƒd }|d }xH| jD ]>}tjd|tjƒ}|| j	krdtj|d|ƒ}|tjd||ƒ7 }q8W qW |S | j t
k�r(|tjd| jtjƒ7 }x2| jD ](}tjd| jtjƒ}|tjd||ƒ7 }q¬W xN| jD ]D}|jdƒd }|d | j	kràtjd| jtjƒ}|tjd	||ƒ7 }qàW |S )
NrH   Ú_tr   Ú_rræ   Zsystem_rr  r  r4   )r'   r    r¯   r   r®   r‹   rç   r   Zte_admin_domain_rulesrk   ÚRUSERr   Zte_admin_rulesr±   Zte_admin_trans_rules)r³   rí   r  r   Úroler  r   r  r   r   r   Úgenerate_admin_rulesó  s,    

zpolicy.generate_admin_rulesc             C   s    d}| j rtjd| jtjƒ}|S )NrH   ræ   )rž   r‹   rç   r   r   Zif_dbus_rules)r³   Únewifr   r   r   Úgenerate_dbus_if  s    zpolicy.generate_dbus_ifc             C   s(   d}| j tkr|S tjd| jtjƒ}|S )NrH   ræ   )r'   ÚSANDBOXr‹   rç   r   r   Zif_sandbox_rules)r³   r  r   r   r   Úgenerate_sandbox_if  s
    
zpolicy.generate_sandbox_ifc             C   s  d}d}| j dkr>|tjd| jtjƒ7 }|tjd| jtjƒ7 }xd| jD ]Z}t| j	| d ƒdkrF|tjd| j| j	| d j
ƒ7 }|tjd| j| j	| d jƒ7 }qFW |dkrþtjd| jtjƒ}||7 }|tjd| jtjƒ7 }||7 }|tjd| jtjƒ7 }|S dS )NrH   ræ   r   r   r9   )r‘   r‹   rç   r   r   Zif_initscript_admin_typesZif_initscript_adminrq   rK   ro   Zif_admin_typesZif_admin_rulesZif_begin_adminZif_middle_adminZif_end_admin)r³   r  Znewtypesr  Úretr   r   r   Úgenerate_admin_if  s"    
 $zpolicy.generate_admin_ifc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   rŽ   r   Úte_cgi_types)r³   r   r   r   rx   5  s    zpolicy.generate_cgi_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   rŽ   r   Úte_sandbox_types)r³   r   r   r   rz   8  s    zpolicy.generate_sandbox_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_userapp_types)r³   r   r   r   r|   ;  s    zpolicy.generate_userapp_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_inetd_types)r³   r   r   r   rv   >  s    zpolicy.generate_inetd_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_dbusd_types)r³   r   r   r   rt   A  s    zpolicy.generate_dbusd_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_min_login_user_types)r³   r   r   r   r€   D  s    z$policy.generate_min_login_user_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_login_user_types)r³   r   r   r   r„   G  s    z policy.generate_login_user_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_admin_user_types)r³   r   r   r   r…   J  s    z policy.generate_admin_user_typesc             C   sŽ   t | jƒdkr$ttdƒt| j  ƒ‚tjd| jt	j
ƒ}|d7 }xB| jD ]8}|d| 7 }|jdƒd d }|| jkrF|d| 7 }qFW |d	7 }|S )
Nr   z,'%s' policy modules require existing domainsræ   zgen_require(`z
        type %s;r  r  z

	role %s;z
')
)rK   r¯   rL   r   rC   r'   r‹   rç   r   r   Zte_existing_user_typesr   rk   )r³   rí   r  r  r   r   r   r~   M  s    

z#policy.generate_existing_user_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_x_login_user_types)r³   r   r   r   r‚   _  s    z"policy.generate_x_login_user_typesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_root_user_types)r³   r   r   r   r†   b  s    zpolicy.generate_root_user_typesc          	   C   sÎ   d}t | jƒdkrttdƒƒ‚xj| jD ]`}xZ| jD ]P}|j|ƒr2t||d t |ƒ … ƒ |tjd|d t |ƒ … | j| j	ƒ7 }P q2W q&W t
rÊ|dkrÊg }x| jD ]}|j|ƒ q¢W ttdƒdj|ƒ ƒ‚|S )NrH   r   zType field requiredræ   z3You need to define a new type which ends with: 
 %sz
 )rK   rl   rL   r   rp   Úendswithr#   r‹   rç   rý   r¡   rN   r  )r³   rí   Útrþ   Zdefault_extr   r   r   rˆ   e  s    
(
zpolicy.generate_new_typesc             C   s   dS )NrH   r   )r³   r   r   r   r‰   y  s    zpolicy.generate_new_rulesc             C   s6   t jd| jtjƒ}| jdkr2|t jd| jtjƒ7 }|S )Nræ   rH   )r‹   rç   r   r   Zte_daemon_typesr‘   Zte_initscript_types)r³   rí   r   r   r   rr   |  s    
zpolicy.generate_daemon_typesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )r˜   r‹   rç   r   r   rý   )r³   r   r   r   Úgenerate_tmp_types‚  s    zpolicy.generate_tmp_typesc             C   s@   d}x6| j D ],}tjd|tjƒ}|tjd| j | |ƒ7 }qW |S )NrH   ÚBOOLEANZDESCRIPTION)r§   r‹   rç   r   Z
te_boolean)r³   rí   Úbr   r   r   r   Úgenerate_booleansˆ  s
    zpolicy.generate_booleansc             C   s,   d}x"| j D ]}|tjd|tjƒ7 }qW |S )NrH   r&  )r§   r‹   rç   r   Úte_rules)r³   rí   r'  r   r   r   Úgenerate_boolean_rules�  s    zpolicy.generate_boolean_rulesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   r"  )r³   r   r   r   Úgenerate_sandbox_te•  s    zpolicy.generate_sandbox_tec             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   r!  )r³   r   r   r   Úgenerate_cgi_te˜  s    zpolicy.generate_cgi_tec             C   s   t jd| jtjƒ}|S )Nræ   )r‹   rç   r   r   Zte_daemon_rules)r³   r  r   r   r   rs   ›  s    zpolicy.generate_daemon_rulesc          	   C   sr   d}xh| j D ]^}xX| jD ]N}|j|ƒr|d t|ƒ … d }|tjd|d t|ƒ … | j| jƒ7 }P qW qW |S )NrH   r  ræ   )rl   rp   r#  rK   r‹   rç   Úif_rules)r³   r  r$  rþ   Zreqtyper   r   r   Úgenerate_new_type_if   s    
(
zpolicy.generate_new_type_ifc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_login_user_rules)r³   r   r   r   r�   ª  s    z policy.generate_login_user_rulesc             C   s   t jd| jtjƒ}|S )Nræ   )r‹   rç   r   r   Zte_existing_user_rules)r³   Znerulesr   r   r   r   ­  s    z#policy.generate_existing_user_rulesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_x_login_user_rules)r³   r   r   r   rƒ   ±  s    z"policy.generate_x_login_user_rulesc             C   s   t jd| jtjƒ}|S )Nræ   )r‹   rç   r   r   Zte_root_user_rules)r³   rí   r   r   r   r‡   ´  s    zpolicy.generate_root_user_rulesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_userapp_rules)r³   r   r   r   r}   ¸  s    zpolicy.generate_userapp_rulesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_inetd_rules)r³   r   r   r   rw   »  s    zpolicy.generate_inetd_rulesc             C   s   t jd| jtjƒS )Nræ   )r‹   rç   r   r   Zte_dbusd_rules)r³   r   r   r   ru   ¾  s    zpolicy.generate_dbusd_rulesc             C   s    | j rtjd| jtjƒS dS d S )Nræ   rH   )r˜   r‹   rç   r   r   r)  )r³   r   r   r   Úgenerate_tmp_rulesÁ  s    zpolicy.generate_tmp_rulesc             C   s   d}|t jd| jtjƒ7 }|S )NrH   ræ   )r‹   rç   r   r   Zte_cgi_rules)r³   rí   r   r   r   ry   Ç  s    zpolicy.generate_cgi_rulesc             C   s   d}|t jd| jtjƒ7 }|S )NrH   ræ   )r‹   rç   r   r   Zte_sandbox_rules)r³   rí   r   r   r   r{   Ì  s    zpolicy.generate_sandbox_rulesc             C   sR   d}| j s| jtkr&tjd| jtjƒ}| jtt	t
tfkrN|tjd| jtjƒ7 }|S )NrH   ræ   )r¥   r'   r4   r‹   rç   r   r   Zif_user_program_rulesÚTUSERÚXUSERÚAUSERÚLUSERZif_role_change_rules)r³   r  r   r   r   Úgenerate_user_ifÑ  s    zpolicy.generate_user_ifc             C   sD  d}|t jd| jtjƒ7 }| jr6|t jd| jtjƒ7 }| jdkrV|t jd| jtjƒ7 }x | j	D ]–}t
| j| d ƒdkr^|t jd| j| j| d jƒ7 }xZ| j| d D ]H}tjj|ƒr¨tjtj|ƒtj ƒr¨|t jd| j| j| d jƒ7 }P q¨W q^W || jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|S )NrH   ræ   r   r   r9   )r‹   rç   r   r   Zif_heading_rulesr’   Zif_program_rulesr‘   Zif_initscript_rulesrq   rK   ro   r-  ÚosÚpathÚexistsÚstatÚS_ISSOCKÚST_MODEZif_stream_rulesr4  r  r   r  r.  r‰   )r³   r  r  rþ   r   r   r   Úgenerate_ifÚ  s(    
 " 
zpolicy.generate_ifc             C   s   | j | j d ƒ S )Nr   )rŠ   r'   )r³   r   r   r   Úgenerate_default_typesò  s    zpolicy.generate_default_typesc             C   s&   | j | j d r"| j | j d ƒ S dS )Nr   rH   )rŠ   r'   )r³   r   r   r   Úgenerate_default_rulesõ  s    zpolicy.generate_default_rulesc             C   sŒ   d}| j ttttfkrˆd}t| jƒdkrˆ|tjd| j	t
jƒ7 }|tjd| j	t
jƒ7 }x2| jD ](}tjd| j	t
jƒ}|tjd||ƒ7 }q\W |S )NrH   r   ræ   ZROLE)r'   r0  r1  r2  r3  rK   r²   r‹   rç   r   r   Zte_sudo_rulesZte_newrole_rulesZte_roles_rules)r³   rí   r²   r  r   r   r   r   Úgenerate_roles_rulesú  s    zpolicy.generate_roles_rulesc          	   C   sô  | j ƒ }xV| jD ]L}t| j| d ƒdkr| jtks<|dkr|tjd| j| j| d j	ƒ7 }qW | jt
krx|d| j 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }�xT| jD �]H}t| j| d ƒdkrÖ| jt
k�rXd}xt| jD ]H}|tjd|d d… d	 | j| d jƒ7 }|tjd
| jd |ƒ7 }�q
W n |tjd| j| j| d jƒ7 }x¦| j| d D ]”}tjj|ƒ�rˆtjtj|ƒtj ƒ�rˆ| jt
k�røxX| jD ],}|tjd|d d… | j| d jƒ7 }�qÆW n |tjd| j| j| d jƒ7 }P �qˆW qÖW || jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| jƒ 7 }|| j ƒ 7 }|| j!ƒ 7 }|| j"ƒ 7 }|| j#ƒ 7 }|| j$ƒ 7 }|| j%ƒ 7 }|| j&ƒ 7 }|| j'ƒ 7 }|| j(ƒ 7 }|| j)ƒ 7 }|| j*ƒ 7 }|| j+ƒ 7 }|S )Nr   r   r   ræ   r9   z@
########################################
#
# %s local policy
#
rH   ZTEMPLATETYPE_tr  ZTEMPLATETYPE_rw_tZ_rw_trü   rü   ),r<  rq   rK   ro   r'   r�   r‹   rç   r   rý   r    r  r  rÿ   r%  r(  r=  r*  r¯   r)  r5  r6  r7  r8  r9  r:  Zte_stream_rulesr/  r  rñ   rð   rî   rè   rï   ré   rò   rê   r>  rõ   r  r  rô   rë   rì   )r³   rí   r  Z	newte_tmpZdomainrþ   r   r   r   Úgenerate_te  s`    $
*  &. zpolicy.generate_tec             C   sÌ  d}g }xš| j jƒ D ]Œ}tjj|ƒrXtjtj|ƒtj ƒrXtj	d| j
| j | d jƒ}ntj	d| j
| j | d jƒ}tj	d||ƒ}|jtj	d| j | d |ƒƒ qW xZ| jjƒ D ]L}tj	d| j
| j| d jƒ}tj	d||ƒ}|jtj	d| j| d |ƒƒ q°W | jttg k�r&t|ƒdk�r&tjS | jttttg k�rR| j �rRttdƒƒ‚| j�r‚tj	d| jtjƒ}|jtj	d| j
|ƒƒ | jdk�r¶tj	d| jtjƒ}|jtj	d| j
|ƒƒ |jƒ  d	j|ƒ}|S )
NrH   ræ   r9   ÚFILENAMEZFILETYPEr   z<You must enter the executable path for your confined processZ
EXECUTABLEr  ) r¨   rD   r5  r6  r7  r8  r9  r:  r‹   rç   r   Zfc_sock_fileZfc_filerN   r©   Zfc_dirr'   rã   r  rK   r   Zfc_userr    r¡   r’   rL   r   Z
fc_programr‘   Zfc_initscriptr6   r  )r³   ZnewfcZfclistrþ   Út1Zt2r   r   r   Úgenerate_fcD  s4    """ 
zpolicy.generate_fcc             C   sô   d}| j tttttfkr|S d}x| jD ]}|d| 7 }q(W |dkrL|d7 }tjd| j	t
jƒ}|tjd||ƒ7 }| j tks„| j tkr¸x2| jD ](}tjd| j	t
jƒ}|tjd||ƒ7 }qŒW | j tkrÚ|tjd| j	t
jƒ7 }n|tjd| j	t
jƒ7 }|S )NrH   z %s_rz	 system_rræ   ZROLESr4   )r'   r0  r1  r2  r3  r  r²   r‹   rç   r   r   r7   r±   Zadmin_transZmin_login_user_default_contextZx_login_user_default_context)r³   Únewshr²   r  r   r  r   r   r   Úgenerate_user_shg  s$    
zpolicy.generate_user_shc             C   sÚ  t jd| jtjƒ}t jd| j|ƒ}| jtkrBt jdd| j |ƒ}n&t jd| j|ƒ}|t jd| jtjƒ7 }| j	r„|t jd| j	tj
ƒ7 }| jdkr¤|t jd| jtj
ƒ7 }x&| jjƒ D ]}|t jd|tj
ƒ7 }q°W x&| jjƒ D ]}|t jd|tj
ƒ7 }qØW xX| jt | jt  D ]@}| j|dƒd k�r
t jdd	| tjƒ}|t jd| j|ƒ7 }�q
W xN| jt D ]@}| j|d
ƒd k�rZt jdd	| tjƒ}|t jd| j|ƒ7 }�qZW || jƒ 7 }tjdd�d dk�rÖ|t jd| jtjƒ7 }|S )Nræ   Z
DOMAINTYPEZTEMPLATEFILEz%sr@  rH   rÈ   ZPORTNUMz%drû   r   )Úfull_distribution_nameÚredhatÚcentosÚSuSEÚfedoraÚmandrakeÚmandriva)rF  rG  rH  rI  rJ  rK  )r‹   rç   rŽ   r   Úcompiler   r'   r    Zmanpager’   Z
restoreconr‘   r¨   rD   r©   r“   r¹   r•   rÉ   Z	tcp_portsr”   Z	udp_portsrD  ÚplatformÚlinux_distributionr!   )r³   rP   rC  rþ   rA  r   r   r   Úgenerate_sh€  s4    

zpolicy.generate_shc             C   sÆ  d}t dƒ}|d krd}n|d }|tj7 }| jtkrÌ|tj7 }| jr\|tjd| jtj	ƒ7 }| j
dkr||tjd| j
tj	ƒ7 }x&| jjƒ D ]}|tjd|tj	ƒ7 }qˆW x&| jjƒ D ]}|tjd|tj	ƒ7 }q°W |tjd|tjƒ7 }tjd| j|ƒ}tjd| j|ƒ}t| jƒd	k�r$|d
dj| jƒ 7 }|tjd| jtjƒ7 }tjd| j|ƒ}tjdtjdƒ|ƒ}| jtk�rxtjdd|ƒ}| jtk�r˜tjd| j d|ƒ}| jtttttfk�rÂtjd| j d|ƒ}|S )NrH   zselinux-policyz0.0.0r   r@  ÚVERSIONZ
MODULENAMEZ
DOMAINNAMEr   zRequires(post): %s
z, Z
TODAYSDATEz%a %b %e %Yz%relabel_filesz.*%s_selinux.8.*z.*%s_u.*)r&   r   Zheader_comment_sectionr'   rÊ   Zdefine_relabel_files_beginr’   r‹   rç   Zdefine_relabel_files_endr‘   r¨   rD   r©   Zbase_sectionrŽ   r   rK   rj   r  Zmid_sectionÚtimeZstrftimer    r0  r1  r2  r3  r  )r³   ZnewspecZselinux_policynvrZselinux_policyverrþ   r   r   r   Úgenerate_spec¤  s>    



zpolicy.generate_specc             C   s2   d|| j f }t|dƒ}|j| jƒ ƒ |jƒ  |S )Nz%s/%s_selinux.specÚw)rŽ   ÚopenÚwriterR  Úclose)r³   Úout_dirZspecfileÚfdr   r   r   Ú
write_specÎ  s
    
zpolicy.write_specc             C   s2   d|| j f }t|dƒ}|j| jƒ ƒ |jƒ  |S )Nz%s/%s.terS  )rŽ   rT  rU  r?  rV  )r³   rW  ZtefilerX  r   r   r   Úwrite_teÖ  s
    
zpolicy.write_tec             C   s>   d|| j f }t|dƒ}|j| jƒ ƒ |jƒ  tj|dƒ |S )Nz%s/%s.shrS  iè  )rŽ   rT  rU  rO  rV  r5  Úchmod)r³   rW  ZshfilerX  r   r   r   Úwrite_shÝ  s    
zpolicy.write_shc             C   s2   d|| j f }t|dƒ}|j| jƒ ƒ |jƒ  |S )Nz%s/%s.ifrS  )rŽ   rT  rU  r;  rV  )r³   rW  ZiffilerX  r   r   r   Úwrite_ifå  s
    
zpolicy.write_ifc             C   s2   d|| j f }t|dƒ}|j| jƒ ƒ |jƒ  |S )Nz%s/%s.fcrS  )rŽ   rT  rU  rB  rV  )r³   rW  ZfcfilerX  r   r   r   Úwrite_fcì  s
    
zpolicy.write_fcc       
      C   sD  dd l }|jƒ ��(}|jƒ  |jdd� |jjƒ }|jƒ }|j| jd�}xì|D ]ä}| j	j
|jƒ xT|jD ]J}xD| jD ]:}|dkr‚qt|j|ƒrttjj|ƒr¤| j|ƒ qt| j|ƒ qtW qhW |jƒ }|j|jd�}xd|D ]\}	xV|	jD ]L}xF| jD ]<}|dkrøqê|j|ƒrêtjj|ƒ�r| j|ƒ qê| j|ƒ qêW qÞW qÒW qNW W d Q R X d S )Nr   T)Zload_system_repo)r  z/etc)Zprovides)ÚdnfZBaseZread_all_reposZ	fill_sackZsackÚqueryZ	availableÚfilterr’   rj   rN   r   r¨   ro   Ú
startswithr5  r6  Úisfiler	  r
  Zsource_name)
r³   r_  Úbaser`  ZpqZpkgZfnamer'  ZsqZbpkgr   r   r   Z__extract_rpmsó  s8    




zpolicy.__extract_rpmsc             C   sô  y| j ƒ  W n tk
r    Y nX tjjd| j ƒrD| jd| j ƒ tjjd| j ƒrf| jd| j ƒ tjjd| j ƒrˆ| jd| j ƒ tjjd| j ƒrª| jd| j ƒ tjjd| j ƒrÌ| jd| j ƒ tjjd| j ƒrî| j	d| j ƒ g }xü| j
jƒ D ]î}g }y| j
| d d	 d
 }W n tk
�r8   wþY nX x4| j
| d D ]"}|j|ƒ�rJ|j|ƒ n�qJ�qJW t|ƒd	krþxF|D ]>}|| jjƒ k�r | j|= n|| jjƒ k�r‚| j|= n�q‚�q‚W tt| j
| d ƒt|ƒ ƒ| j
| d< qþW d S )Nz/var/run/%s.pidz/var/run/%sz/var/log/%sz/var/log/%s.logz/var/lib/%sz/etc/rc.d/init.d/%sz/etc/rc\.d/init\.d/%sr   r   ú/)Ú_policy__extract_rpmsÚImportErrorr5  r6  rc  r   r	  Úisdirr
  rÍ   ro   rD   Ú
IndexErrorrb  rN   rK   r©   r¨   ÚlistÚset)r³   Ztemp_basepathr.   Z	temp_dirsrþ   r   r   r   Úgen_writeable  sF    




zpolicy.gen_writeablec             C   s�   | j tkrd S tjj| jƒs2tjjd| j ƒ d S tj	d| j ƒ}x@|j
ƒ jƒ D ]0}x*| jD ] }|j|ƒr\td| j|  ƒ q\W qPW |jƒ  d S )Nzl
***************************************
Warning %s does not exist
***************************************

znm -D %s | grep Uzself.%s)r'   rÊ   r5  r6  r7  r’   ÚsysÚstderrrU  ÚpopenÚreadr   rn   rb  ÚexecrV  )r³   rX  Úsr'  r   r   r   Úgen_symbolsJ  s    

zpolicy.gen_symbolsc             C   s¨   d}|d| j |ƒtdƒf 7 }|d| j|ƒtdƒf 7 }|d| j|ƒtdƒf 7 }| jtkr¤tjdd�d dkrŠ|d| j|ƒtdƒf 7 }|d| j	|ƒtdƒf 7 }|S )NzCreated the following files:
z%s # %s
zType Enforcement filezInterface filezFile Contexts filer   )rE  rF  rG  rH  rI  rJ  rK  z	Spec filezSetup Script)rF  rG  rH  rI  rJ  rK  )
rZ  r   r]  r^  r'   r¡   rM  rN  rY  r\  )r³   rW  Úoutr   r   r   Úgenerate\  s    
zpolicy.generateN)rÈ   )wÚ__name__Ú
__module__Ú__qualname__rµ   rÀ   r»   r¼   r½   r¾   r¿   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÉ   rË   rÍ   rÑ   rÒ   rÓ   rÔ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rä   rå   rè   ré   rê   rë   rì   rî   rï   rð   rñ   rò   rô   rõ   rú   rÿ   r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r   rx   rz   r|   rv   rt   r€   r„   r…   r~   r‚   r†   rˆ   r‰   rr   r%  r(  r*  r+  r,  rs   r.  r�   r   rƒ   r‡   r}   rw   ru   r/  ry   r{   r4  r;  r<  r=  r>  r?  rB  rD  rO  rR  rY  rZ  r\  r]  r^  rf  rl  rs  r5  Úgetcwdru  r   r   r   r   rV   Ä   sæ    B
	&8
	>#$*$3rV   )r   )Gr5  rm  r8  r‹   r*   r   r   r   rQ  rM  Z	templatesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zsepolgen.interfacesZ
interfacesZsepolgen.defaultsZdefaultsZPROGNAMEÚgettextÚkwargsÚversion_infoZinstallÚbuiltinsÚstrÚ__dict__rg  Z__builtin__r   r    r&   r/   r8   r¶   r·   r¸   r¹   ZADMIN_TRANSITION_INTERFACEZUSER_TRANSITION_INTERFACErÌ   ró   ZINETDr�   r  r4   r    r0  r1  r3  r2  r  r¡   rC   r   rG   rÊ   rã   rU   rV   r   r   r   r   Ú<module>   s¦   

