
    Vh;                         d dl mZmZmZ eZdZdZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZ d dlmZmZ d dlmZ  G d	 d
e      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
---
module: sysctl
short_description: Manage entries in sysctl.conf.
description:
    - This module manipulates sysctl entries and optionally performs a C(/sbin/sysctl -p) after changing them.
version_added: "1.0.0"
options:
    name:
        description:
            - The dot-separated path (also known as O(key)) specifying the sysctl variable.
        required: true
        aliases: [ 'key' ]
        type: str
    value:
        description:
            - Desired value of the sysctl key.
        aliases: [ 'val' ]
        type: str
    state:
        description:
            - Whether the entry should be present or absent in the sysctl file.
        choices: [ "present", "absent" ]
        default: present
        type: str
    ignoreerrors:
        description:
            - Use this option to ignore errors about unknown keys.
        type: bool
        default: false
    reload:
        description:
            - If V(true), performs a C(/sbin/sysctl -p) if the O(sysctl_file) is
              updated. If V(false), does not reload C(sysctl) even if the
              O(sysctl_file) is updated.
        type: bool
        default: true
    sysctl_file:
        description:
            - Specifies the absolute path to C(sysctl.conf), if not C(/etc/sysctl.conf).
        default: /etc/sysctl.conf
        type: path
    sysctl_set:
        description:
            - Verify token value with the sysctl command and set with C(-w) if necessary.
        type: bool
        default: false
author:
- David CHANIAL (@davixx)
a7  
# Set vm.swappiness to 5 in /etc/sysctl.conf
- ansible.posix.sysctl:
    name: vm.swappiness
    value: '5'
    state: present

# Remove kernel.panic entry from /etc/sysctl.conf
- ansible.posix.sysctl:
    name: kernel.panic
    state: absent
    sysctl_file: /etc/sysctl.conf

# Set kernel.panic to 3 in /tmp/test_sysctl.conf
- ansible.posix.sysctl:
    name: kernel.panic
    value: '3'
    sysctl_file: /tmp/test_sysctl.conf
    reload: false

# Set ip forwarding on in /proc and verify token value with the sysctl command
- ansible.posix.sysctl:
    name: net.ipv4.ip_forward
    value: '1'
    sysctl_set: true

# Set ip forwarding on in /proc and in the sysctl file and reload if necessary
- ansible.posix.sysctl:
    name: net.ipv4.ip_forward
    value: '1'
    sysctl_set: true
    state: present
    reload: true
N)AnsibleModule)string_types)BOOLEANS_FALSEBOOLEANS_TRUE)	to_nativec                   Z    e Zd ZddddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)SysctlModuleC)LANGLC_ALLLC_MESSAGESc                 6   || _         | j                   j                  | _        | j                   j                  dd      | _        | j                  d   | _        d | _        d | _        g | _        i | _	        d| _
        d| _        d| _        | j                          y )NsysctlT)requiredsysctl_fileF)moduleparamsargsget_bin_path
sysctl_cmdr   
proc_value
file_value
file_linesfile_valueschangedset_proc
write_fileprocess)selfr   s     h/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/ansible/posix/plugins/modules/sysctl.py__init__zSysctlModule.__init__u   s    KK&&	++228d2K99]3    c                    t        j                         j                         | _         | j                  d   j	                         | j                  d<   | j                  | j                  d         | j                  d<   | j                  d   }| j                  |      | _        | j                          || j                  vrd | j                  |<   | j                          | j                  |   !| j                  d   dk(  rd| _        d| _        n| j                  |   | j                  d   dk(  rd| _        n| j                  |   r!| j                  d   dk(  rd| _        d| _        n| j                  |   | j                  d   k7  rd| _        d| _        nS| j                  d   rD| j                  d| _        n0| j                  | j                  | j                  d         sd| _        | j                  d	   r]| j                  d   dk(  rK| j                  d| _        n7| j                  | j                  | j                  d         sd| _        d| _        | j                  j                   s| j                  r,| j#                  | j                  d   | j                  d          | j                  r| j%                          | j                  r!| j                  d   r| j'                          y y y y )
NnamevaluestatepresentTabsentFreload
sysctl_set)platformsystemlowerr   strip_parse_valueget_token_curr_valuer   read_sysctl_filer   	fix_linesr   r    _values_is_equalr   r   
check_modeset_token_valuewrite_sysctlreload_sysctl)r"   thisnames     r#   r!   zSysctlModule.process   sx    )//1 !IIf-335		&!..tyy/AB		'99V$ 33H= 	4+++)-DX& 	 H%-$))G2D	2QDL"DOh'/DIIg4F(4R DLh'DIIg,>(,JDL"DOh'499W+==DL"DO YYx &#**4??DIIg<NO# 99\"tyy'9Y'F&#**4??DIIg<NO# $ {{%%}}$$TYYv%6		'8JK!!#||		( 3""$ !4| &r%   c                     ||y|j                         }|j                         }t        |      t        |      k7  ryt        t        ||      D cg c]  \  }}||k(  s| c}}      t        |      k(  S c c}}w )zExpects two string values. It will split the string by whitespace
        and compare each value. It will return True if both lists are the same,
        contain the same elements and the same order.F)splitlenzip)r"   abijs        r#   r6   zSysctlModule._values_is_equal   sk     9	GGIGGIq6SV#a)6$!QqAvA673q6AA6s   A8
 A8
c                     |yt        |t              r|ryyt        |t              r>|j                         t        v ry|j                         t
        v ry|j                         S |S )N 10)
isinstanceboolr   r0   r	   r   r1   )r"   r(   s     r#   r2   zSysctlModule._parse_value   sZ    =t$|,{{}-.0{{}$Lr%   c                 T    d}t        j                  ||t         j                        d uS )NzG^sysctl: setting key "[^"]+": (Invalid argument|Read-only file system)$)research	MULTILINE)r"   errerrors_regexs      r#   _stderr_failedzSysctlModule._stderr_failed   s&    
 byysBLL9EEr%   c                     | j                   dk(  r| j                  d|}n| j                  d|}| j                  j                  || j                        \  }}}|dk7  ry |S )Nopenbsdz -n z -e -n environ_updater   )r.   r   r   run_commandLANG_ENV)r"   tokenthiscmdrcoutrN   s         r#   r3   z!SysctlModule.get_token_curr_value   s\    ==I%$(OOU;G'+>G{{..wt}}.UC7Jr%   c                 ,   t        |j                               dkD  rd|z   dz   }| j                  dk(  r| j                  d|d|}nd| j                  dk(  r+d}| j                  d   rd	}| j                  d|d|d|}n*d}| j                  d   rd
}| j                  d|d|d|}| j
                  j                  || j                        \  }}}|dk7  s| j                  |      r&| j
                  j                  d|d||z          y |S )Nr   "rR    =freebsdrE   ignoreerrorsz-i-ez -w rS   zsetting z	 failed: msg)
r>   r=   r.   r   r   r   rU   rV   rP   	fail_json)r"   rW   r(   rX   ignore_missingrY   rZ   rN   s           r#   r8   zSysctlModule.set_token_value   s    u{{}!%K#%E==I%$(OOUEBG]]i'Nyy(!%'+uUGNyy(!%*.//>5RWXG{{..wt}}.UC7d))#.KK!!c	&R!SIr%   c                 "   | j                   dk(  r-| j                  j                  d| j                        \  }}}n| j                   dk(  r| j                  j                         D ]3  \  }}d}|| j                  d   k7  s| j                  ||      }|dk7  s3 n dk(  r>| j                  d   dk(  r,| j                  | j                  d   | j                  d	         }y | j                  d
| j                  g}| j                  d   r|j                  dd       | j                  j                  || j                        \  }}}|dk7  s| j                  |      r5| j                  j                  dt        |      z  t        |      z          y y )Nr_   z/etc/rc.d/sysctl reloadrS   rR   r   r'   r)   r*   r(   z-pr`      ra   zFailed to reload sysctl: %srb   )r.   r   rU   rV   r   itemsr   r8   r   r   insertrP   rd   r
   )r"   rY   rZ   rN   kvsysctl_argss          r#   r:   zSysctlModule.reload_sysctl  su   ==I%;;223L]a]j]j2kLBS]]i' ((..0 1		&))--a3BQw Qw499W-:))$))F*;TYYw=OP
   ??D$2B2BCKyy(""1d+;;22;t}}2]LBS7d))#.KK!!&CiPSn&TW`adWe&e!f /r%   c           	         g }t         j                  j                  | j                        r0	 t	        | j                  d      5 }|j                         }d d d        |D ]  }|j                         }| j                  j                  |       |r|j                  d      sd|vrF|j                  dd      \  }}|j                         }|j                         }|j                         | j                  |<    y # 1 sw Y   xY w# t        $ rH}| j                  j                  dt        | j                        dt        |             Y d }~d }~ww xY w)NrzFailed to open : rb   #;r^   rg   )ospathisfiler   open	readlinesIOErrorr   rd   r
   r1   r   append
startswithr=   r   )r"   lines	read_fileelinerj   rk   s          r#   r4   zSysctlModule.read_sysctl_file=  s   77>>$**+q$**C0 2I%//1E2
  	,D::<DOO""4( 4??:6#T/::c1%DAq	A	A"#'')DQ	,2 2 q%%YtO_O_E`bklmbn*o%ppqs/   D C9D 9D>D 	E>EEc                 H   g }g | _         | j                  D ]'  }|j                         r#|j                         j                  d      sd|vr| j                   j	                  |       S|j                         }|j                  dd      \  }}|j                         }|j                         }||vs|j	                  |       || j                  d   k(  rE| j                  d   dk(  s|d| j                  d   d}| j                   j	                  |       |d|d}| j                   j	                  |       * | j                  d   |vrQ| j                  d   dk(  r>| j                  d   d| j                  d   d}| j                   j	                  |       y y y )	Nrp   r^   rg   r'   r)   r*   r(   
)fixed_linesr   r1   rz   ry   r=   r   )r"   checkedr~   tmplinerj   rk   new_lines          r#   r5   zSysctlModule.fix_linesU  sh   OO 	6D::<4::<#:#::#F#UY/  ''-jjlG==a(DAq	A	Aq!		&))yy)Y601499W3E#F((//9,-q1H$$++H5!	6$ 99VG+		'0Bi0O$(IIf$5tyy7IJH##H- 1P+r%   c           	         t        j                  ddt        j                  j	                  t        j                  j                  | j                                    \  }}t        |d      }	 | j                  D ]$  }|j                  |j                         dz          & 	 |j                          |j!                          | j                  j#                  |t        j                  j                  | j                               y # t        $ r5}| j                  j                  d|dt        |             Y d }~d }~ww xY w)Nz.confz.ansible_m_sysctl_wr   zFailed to write to file ro   rb   )tempfilemkstemprs   rt   dirnamerealpathr   rv   r   writer1   rx   r   rd   r
   flushcloseatomic_move)r"   fdtmp_pathflr}   s         r#   r9   zSysctlModule.write_sysctlo  s    ''1ErwwWYW^W^WgWghlhxhxWyGz{H3	c%% *	D()* 	
			 	"''*:*:4;K;K*LM  	cKK!!(T]^_T`&a!bb	cs   ,3D 	E+D==EN)__name__
__module____qualname__rV   r$   r!   r6   r2   rP   r3   r8   r:   r4   r5   r9    r%   r#   r   r   o   sM     s3?H,8%tB$F
0gJ,0.4Nr%   r   c                     t        t        t        dgd      t        dgdd      t        ddd	g
      t        dd      t        dd      t        dd      t        dd            ddddgfg      } | j                  d   | j                  d       | j                  d   dk(  r!| j                  d   | j                  d       | j                  d   dk(  r| j                  d       | j                  d   dk(  r$| j                  d   dk(  r| j                  d       t	        |       }| j                  |j                         y )NkeyT)aliasesr   valFstr)r   r   typer*   r+   )defaultchoicesrI   )r   r   z/etc/sysctl.confrt   )r'   r(   r)   r,   r-   r`   r   r)   r(   )argument_specsupports_check_moderequired_ifr'   zname cannot be Nonerb   zvalue cannot be NonerE   zname cannot be blankzvalue cannot be blank)r   )r   dictr   rd   r   	exit_jsonr   )r   results     r#   mainr     sG    ug5wUCy9h2GH62E7e&9%7fE
 !y7)45F }}V$23}}W*v}}W/E/M34 }}V"34}}W*v}}W/E/K45&!F
V^^,r%   __main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESrs   r.   rK   r   ansible.module_utils.basicr   ansible.module_utils.sixr   )ansible.module_utils.parsing.convert_boolr   r	   ansible.module_utils._textr
   objectr   r   r   r   r%   r#   <module>r      sh    A @1f!J 
  	  4 1 S 0MN6 MNf-B zF r%   