
    Vh'                     r    d dl mZmZmZ eZdZdZdZd dl	m
Z
 d Zd Zd Zd	 Zd
 Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
author:
  - Kairo Araujo (@kairoaraujo)
module: aix_devices
short_description: Manages AIX devices
description:
  - This module discovers, defines, removes and modifies attributes of AIX devices.
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  attributes:
    description:
      - A list of device attributes.
    type: dict
  device:
    description:
      - The name of the device.
      - V(all) is valid to rescan C(available) all devices (AIX C(cfgmgr) command).
    type: str
  force:
    description:
      - Forces action.
    type: bool
    default: false
  recursive:
    description:
      - Removes or defines a device and children devices.
    type: bool
    default: false
  state:
    description:
      - Controls the device state.
      - V(available) (alias V(present)) rescan a specific device or all devices (when O(device) is not specified).
      - V(removed) (alias V(absent) removes a device.
      - V(defined) changes device to Defined state.
    type: str
    choices: [available, defined, removed]
    default: available
a0  
- name: Scan new devices
  community.general.aix_devices:
    device: all
    state: available

- name: Scan new virtual devices (vio0)
  community.general.aix_devices:
    device: vio0
    state: available

- name: Removing IP alias to en0
  community.general.aix_devices:
    device: en0
    attributes:
      delalias4: 10.0.0.100,255.255.255.0

- name: Removes ent2
  community.general.aix_devices:
    device: ent2
    state: removed

- name: Put device en2 in Defined
  community.general.aix_devices:
    device: en2
    state: defined

- name: Removes ent4 (inexistent).
  community.general.aix_devices:
    device: ent4
    state: removed

- name: Put device en4 in Defined (inexistent)
  community.general.aix_devices:
    device: en4
    state: defined

- name: Put vscsi1 and children devices in Defined state.
  community.general.aix_devices:
    device: vscsi1
    recursive: true
    state: defined

- name: Removes vscsi1 and children devices.
  community.general.aix_devices:
    device: vscsi1
    recursive: true
    state: removed

- name: Changes en1 mtu to 9000 and disables arp.
  community.general.aix_devices:
    device: en1
    attributes:
      mtu: 900
      arp: 'off'
    state: available

- name: Configure IP, netmask and set en1 up.
  community.general.aix_devices:
    device: en1
    attributes:
      netaddr: 192.168.0.100
      netmask: 255.255.255.0
      state: up
    state: available

- name: Adding IP alias to en0
  community.general.aix_devices:
    device: en0
    attributes:
      alias4: 10.0.0.100,255.255.255.0
    state: available
z # )AnsibleModulec                     | j                  dd      }| j                  d|z  ddd|z  g      \  }}}|dk7  r| j                  d||       |r|j                         d	   }d|fS d
}d|fS )z
    Check if device already exists and the state.
    Args:
        module: Ansible module.
        device: device to be checked.

    Returns: bool, device state

    lsdevT%sz-C-lr   zFailed to run lsdevmsgrcerr   NFget_bin_pathrun_command	fail_jsonsplit)moduledevice	lsdev_cmdr   	lsdev_outr   device_states          q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/aix_devices.py_check_devicer      s     ##GT2I++TI-=tT4RX=,YZB	3	Qw2rsC (+\!!L,    c                     | j                  dd      }| j                  d|z  dd|z  dd|z  g      \  }}}ddg}|dk(  r||v rd	}|S d
}|S |dk7  r| j                  d|z  ||       |j                         d   }|S )z

    Args:
        module: Ansible module.
        device: device to check attributes.
        attr: attribute to be checked.

    Returns:

    lsattrTr	   z-El-a	delalias4	delalias6    Nr   zFailed to run lsattr: %sr   r   r   )	r   r   attr
lsattr_cmdr   
lsattr_outr   hidden_attrscurrent_params	            r   _check_device_attrr)      s     $$Xt4J ,,dZ.?vW[]adh]h-ijB
C-L	Sy<M  !M	q7#="#N$$&q)Mr   c                     | j                  dd      }|d|z  }nd}d}d}| j                  s!| j                  d|z  d|z  g      \  }}}d}|}||fS )z Discover AIX devices.cfgmgrTz-l %sr#   r	   )r   
check_moder   )r   r   
cfgmgr_cmdchangedr   r   
cfgmgr_outr   s           r   discover_devicer0      sw    $$Xt4J6! G
C$00$2CTF]1STJC<r   c           	         g }g }g }| j                  dd      }t        |j                               D ]  }||   }	t        | ||      }
|
|j	                  |       )|
|	k7  r|rd|z  dd|z  d|d||   d|z  g}nd|z  dd|z  d|d||   g}| j
                  s.| j                  |      \  }}}|dk7  r| j                  d||	       |j	                  ||          |j	                  ||           t        |      dkD  rd}d
dj                  |      z  }nd}d}t        |      dkD  rddj                  |      z  }nd}t        |      dkD  rddj                  |      z  }nd}|||}||fS )z Change AIX device attribute. chdevTr	   r
   r   =r   zFailed to run chdev.r   zAttributes changed: %s. ,Fr#   zAttributes already set: %s. zInvalid attributes: %s z, )
r   listkeysr)   appendr,   r   	exit_jsonlenjoin)r   
attributesr   forceattr_changedattr_not_changedattr_invalid	chdev_cmdr$   	new_paramr(   cmdr   	chdev_outr   r.   attr_changed_msgattr_not_changed_msgattr_invalid_msgr   s                       r   change_device_attrrG      s    LL##GT2IZ__&' 6t$	*664@ %i'i'tf}dtU_`dUeDfhlothtui'tf}dtU_`dUeDfg$$%+%7%7%<"Is7$$)?BC$P
4 01##Jt$45)6, <158NN
q =IY@ZZ!
<14tyy7NN&(<>N
OCC<r   c                 D   dddd}ddd}||   }||   }d}d}| j                  dd      }	| j                  sf|r'| j                  d|	z  d	d|z  d|z  d|z  g      \  }
}}n"| j                  d|	z  d	d|z  d|z  g      \  }
}}|
d
k7  r| j                  d|
|       |}||fS )z1 Puts device in defined state or removes device. z-dr#   )removedabsentdefinedz-RTFTrmdevr	   r
   r   zFailed to run rmdevr   )r   r,   r   r   )r   r   r<   	recursivestate	state_optrecursive_optr.   r   	rmdev_cmdr   	rmdev_outr   s                r   remove_devicerT     s     I M
 i(IeEG
C##GT2I!'!3!3TI5EtTTZ]\`cl\lnruznz4{!|B	3!'!3!3TI5EtTTZ]\`cl\l4m!nB	37!623GC<r   c                     t        t        t        d      t        d      t        dd      t        dd      t        ddg d	      
      d      } ddd}| j                  d   }| j                  d   }|| j                  d      }| j                  d   }| j                  d   }t        dd      }|dk(  s|dk(  r|r2t        | |      \  }}	|rt	        | |||      \  |d<   |d<   nd|z  |d<   n|r5|dk7  r0t        | |      \  }}	|rt        | |      \  |d<   |d<   nd|z  |d<   nt        | |      \  |d<   |d<   n||dk(  s
|dk(  s|dk(  rS|sd|d<   net        | |      \  }
}	|
r1|dk(  r|	dk(  rd|d<   d |z  |d<   n<t        | ||||      \  |d<   |d<   n#d|z  |d<   nd!|z  |d<    | j                  d"i |  | j                  d"i | y )#Ndict)typestrboolF)rW   default	available)r[   rK   rI   )rW   rZ   choices)r;   r   r<   rN   rO   T)argument_specsupports_check_modez-fr#   rL   r;   r   r<   rN   rO   )r.   r   presentr.   r   zDevice %s does not exist.allrI   rJ   rK   z/device is required to removed or defined state.DefinedzDevice %s already in DefinedzUnexpected state %s. )	r   rV   paramsr   rG   r0   rT   r   r8   )r   	force_optr;   r   r<   rN   rO   resultdevice_statusr   check_devices              r   mainrh   *  s>   (U#FE26E;@cd
 !	F I
 |,J]]8$FfmmG,-Ek*IMM'"EF
 u	1*7*G'M<3EfjZ`bg3h0y!6%= ;f Du &E/.;FF.K+| 7Fvv7V4F9%ve} %@&$HF5M 4C663R0y!6%=	)	u0EY4FMF5M *7vv)F&L,I%,)*C(-F9%$BV$KF5M 8EVVUZ\egl7m4F9%ve} !<f Du /6u"6"Fvr   __main__N)
__future__r   r   r   rW   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   r   r)   r0   rG   rT   rh   __name__rb   r   r   <module>rq      se    A @+ZHT 
 40@(1h FJZ zF r   