
    VhX)                     \   d dl mZmZmZ eZdZdZd dlZd dl	Z	dZ
	 d dlZdZdZ	 d dlZdZd dlmZmZ d dlmZ d d	lmZmZ dd
Zd Zd Zd Zd Zd ZddZ d Z!d Z"d Z#d Z$e%dk(  r e$        yy# e$ r  e	j                         Z
dZY jw xY w# e$ r  e	j                         ZdZY w xY w)    )absolute_importdivisionprint_functiona"  
---
module: seboolean
short_description: Toggles SELinux booleans
description:
     - Toggles SELinux booleans.
version_added: "1.0.0"
options:
  name:
    description:
      - Name of the boolean to configure.
    required: true
    type: str
  persistent:
    description:
      - Set to V(true) if the boolean setting should survive a reboot.
    type: bool
    default: false
  state:
    description:
      - Desired boolean value.
    type: bool
    required: true
  ignore_selinux_state:
    description:
    - Useful for scenarios (chrooted environment) that you can't get the real SELinux state.
    type: bool
    default: false
notes:
   - Not tested on any Debian based system.
requirements:
- libselinux-python
- libsemanage-python
- python3-libsemanage
author:
- Stephen Fromm (@sfromm)
z
- name: Set httpd_can_network_connect flag on and keep it persistent across reboots
  ansible.posix.seboolean:
    name: httpd_can_network_connect
    state: true
    persistent: true
NTF)AnsibleModulemissing_required_lib)to_text)respawn_moduleHAS_RESPAWN_UTILc                 6    | du rdS t        j                         S )NT)selinuxis_selinux_enabled)ignore_selinux_states    k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/ansible/posix/plugins/modules/seboolean.pyget_runtime_statusr   P   s    '4/4QW5O5O5QQ    c                     d}	 t        j                  |      }|dk(  ryy# t        $ r | j                  d|z         Y 'w xY w)Nr   z0Failed to determine current state for boolean %smsg   TF)r   security_get_boolean_activeOSError	fail_json)modulenamestates      r   get_boolean_valuer   T   sW    EX33D9 z  XORVVWXs     A Ac                    t        j                         }|s| j                  d       t        j                  |      }|dk  rt        j                  |       |dk  r| j                  d       |dk(  r<t        j                         dk(  r| j                  d       n| j                  d       t        j                  |      dk  r't        j                  |       | j                  d       |S )Nz(Failed to create semanage library handler   r   z,Failed to determine whether policy is managez5Cannot set persistent booleans without managed policyz2Cannot set persistent booleans; please try as rootzFailed to connect to semanage)semanagesemanage_handle_creater   semanage_is_managedsemanage_handle_destroyosgetuidsemanage_connect)r   handlemanageds      r   semanage_get_handler'   `   s    ,,.FGH**62G!|((0{KL!|99;!!XY!UV  (1,((0<=Mr   c                     t        j                  |      dk  r(t        j                  |       | j                  d       y y )Nr   z$Failed to begin semanage transactionr   )r   semanage_begin_transactionr!   r   )r   r%   s     r   r)   r)   w   s:    **62Q6((0CD 7r   c                    t        j                  |      \  }}|dk  r't        j                  |       | j                  d       t        j                  |||      dk  r't        j                  |       | j                  d       t        j
                  ||      \  }}|dk  r't        j                  |       | j                  d       t        j                  ||      \  }}|dk  r't        j                  |       | j                  d       |s*t        j                  |       | j                  d|z         t        j                  ||      \  }}|dk  r't        j                  |       | j                  d       t        j                  ||       t        j                  |||      dk  r't        j                  |       | j                  d	       t        j                         rAt        j                  |||      dk  r't        j                  |       | j                  d
       t        j                  |       t        j                  |       t        j                  |       y )Nr   (Failed to create seboolean with semanager   *Failed to set seboolean name with semanage+Failed to extract boolean key with semanage%Failed to check if boolean is defined6SELinux boolean %s is not defined in persistent policy,Failed to query boolean in persistent policyz*Failed to modify boolean key with semanagez.Failed to set boolean key active with semanage)r   semanage_bool_creater!   r   semanage_bool_set_namesemanage_bool_key_extractsemanage_bool_existssemanage_bool_querysemanage_bool_set_valuesemanage_bool_modify_localr   r   semanage_bool_set_activesemanage_bool_key_freesemanage_bool_free)	r   r%   r   valuerct_bboolkeyexistssebools	            r   semanage_set_boolean_valuerA   }   s
   ++F3GB	Av((0GH&&vsD9A=((0IJ44VSAKB	Av((0JK..vw?JB	Av((0DE((0UX\\]--fg>JB	Av((0KL$$VU3**67FCaG((0IJ &&(11&'6JQN((0MN##G,$'r   c                    t        j                  |      \  }}|dk  r't        j                  |       | j                  d       t        j                  |||      dk  r't        j                  |       | j                  d       t        j
                  ||      \  }}|dk  r't        j                  |       | j                  d       t        j                  ||      \  }}|dk  r't        j                  |       | j                  d       |s*t        j                  |       | j                  d|z         t        j                  ||      \  }}|dk  r't        j                  |       | j                  d       t        j                  |      }t        j                  |       t        j                  |       t        j                  |       |S )	Nr   r+   r   r,   r-   r.   r/   r0   )r   r1   r!   r   r2   r3   r4   r5   semanage_bool_get_valuer9   r:   )	r   r%   r   r<   r=   r>   r?   r@   r;   s	            r   semanage_get_boolean_valuerD      s   ++F3GB	Av((0GH&&vsD9A=((0IJ44VSAKB	Av((0JK..vw?JB	Av((0DE((0UX\\]--fg>JB	Av((0KL,,V4E##G,$'Lr   c                     t        j                  ||       t        j                  |      dk  r(t        j                  |       | j	                  d       y y )Nr   z$Failed to commit changes to semanager   )r   semanage_set_reloadsemanage_commitr!   r   )r   r%   loads      r   rG   rG      sJ      .'!+((0CD ,r   c                     t        j                  |      }t        j                  |       |dk  r| j                  d       y y )Nr   z"Failed to disconnect from semanager   )r   semanage_disconnectr!   r   )r   r%   r<   s      r   semanage_destroy_handlerK      s>    		%	%f	-B$$V,	AvAB r   c           	      B   d}d}|rd}	 t        |       }t        | |       t        | ||      }||k7  r(d}| j                  st	        | |||       t        | |       t        | |       |S # t        $ r,}| j                  d|dt        |             Y d }~|S d }~ww xY w)Nr   Fr   Tz$Failed to manage policy for boolean z: r   )
r'   r)   rD   
check_moderA   rG   rK   	Exceptionr   r   )r   r   r   r;   changedr%   	cur_valuees           r   semanage_boolean_valuerR      s    EGa$V,"662.vvtD	G$$*664G// N  adT[\]T^_``Nas   AA) )	B2!BBc                     d}d}|rd}	 t        j                  ||      }|dk(  ryy# t        $ r | j                  d|d|       Y *w xY w)Nr   r   Failed to set boolean  to r   TF)r   security_set_booleanr   r   )r   r   r   r<   r;   s        r   set_boolean_valuerW      sd    	
BEO))$6 
Qw  OuMNOs   ' !A
Ac                     t        t        t        dd      t        dd      t        dd      t        dd            d      } t        st        st        rt        d	       t        s | j                  t        d
      t               t        s | j                  t        d      t               | j                  d   }t        |      s| j                  d       | j                  d   }| j                  d   }| j                  d   }t        |||      }d}t        t        d      rt        j                  |      }|rt        | ||      }not        j                          r[t#        | |      }||k7  rJd}| j$                  s<t'        | ||      }|s| j                  d|d|       	 t        j(                          ||d<    | j,                  di | y # t*        $ r | j                  d|z         Y 8w xY w)NboolF)typedefaultstrT)rZ   required)r   r   
persistentr   )argument_specsupports_check_moder   zlibselinux-python)r   	exceptionz)libsemanage-python or python3-libsemanager   z!SELinux is disabled on this host.r   r   r^   r   )r   r^   r   selinux_boolean_subrT   rU   z)Failed to commit pending boolean %s valuerO    )r   dictHAVE_SELINUXHAVE_SEMANAGEr
   r	   r   r   SELINUX_IMP_ERRSEMANAGE_IMP_ERRparamsr   hasattrr   rb   rR   r   r   rM   rW   security_commit_booleansrN   	exit_json)r   r   r   r^   r   resultrO   rP   s           r   mainrn     s   !%65!A5407FT2	
 !F 2B 	y!12EFRab12]^jz{!==)?@23@A== D|,JMM'"EF
 Gw-. **40(u=		#	#	%%fd3	G$$+FD%@$$TSX)Y$Z]446  F9Fv ! ]$$)TW[)[$\]s   )G G65G6__main__)F)r   )&
__future__r   r   r   rZ   __metaclass__DOCUMENTATIONEXAMPLESr"   	tracebackrg   r   re   ImportError
format_excrh   r   rf   ansible.module_utils.basicr   r   ansible.module_utils._textr   ?ansible_collections.ansible.posix.plugins.module_utils._respawnr	   r
   r   r   r'   r)   rA   rD   rG   rK   rR   rW   rn   __name__rc   r   r   <module>r{      s    A @$L 
 L
  M
 K . lR	.E+(\"JEC(=@ zF I  *i**,OL  +y++-Ms"   A2 B 2BBB+*B+