
    Vh|-                     "   d dl mZmZmZ eZdZdZdZd dl	Z	d dl
Z
d dlZd dlZdZ	 d dlmZmZmZmZ d dlmZmZmZmZ d dlmZmZ d	Zd dlmZmZ d dlm Z m!Z!  G d d      Z"d Z#e$dk(  r e#        yy# e$ r  ej6                         Zd
ZY Ew xY w)    )absolute_importdivisionprint_functiona  
module: omapi_host
short_description: Setup OMAPI hosts
description: Manage OMAPI hosts into compatible DHCPd servers.
requirements:
  - pypureomapi
author:
  - Loic Blot (@nerzhul)
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: none
  diff_mode:
    support: none
options:
  state:
    description:
      - Create or remove OMAPI host.
    type: str
    required: true
    choices: [absent, present]
  hostname:
    description:
      - Sets the host lease hostname (mandatory if O(state=present)).
    type: str
    aliases: [name]
  host:
    description:
      - Sets OMAPI server host to interact with.
    type: str
    default: localhost
  port:
    description:
      - Sets the OMAPI server port to interact with.
    type: int
    default: 7911
  key_name:
    description:
      - Sets the TSIG key name for authenticating against OMAPI server.
    type: str
    required: true
  key:
    description:
      - Sets the TSIG key content for authenticating against OMAPI server.
    type: str
    required: true
  macaddr:
    description:
      - Sets the lease host MAC address.
    type: str
    required: true
  ip:
    description:
      - Sets the lease host IP address.
    type: str
  statements:
    description:
      - Attach a list of OMAPI DHCP statements with host lease (without ending semicolon).
    type: list
    elements: str
    default: []
  ddns:
    description:
      - Enable dynamic DNS updates for this host.
    type: bool
    default: false
a  
- name: Add a host using OMAPI
  community.general.omapi_host:
    key_name: defomapi
    key: +bFQtBCta6j2vWkjPkNFtgA==
    host: 10.98.4.55
    macaddr: 44:dd:ab:dd:11:44
    name: server01
    ip: 192.168.88.99
    ddns: true
    statements:
      - filename "pxelinux.0"
      - next-server 1.1.1.1
    state: present

- name: Remove a host using OMAPI
  community.general.omapi_host:
    key_name: defomapi
    key: +bFQtBCta6j2vWkjPkNFtgA==
    host: 10.1.1.1
    macaddr: 00:66:ab:dd:11:44
    state: absent
aU  
lease:
  description: Dictionary containing host information.
  returned: success
  type: complex
  contains:
    ip-address:
      description: IP address, if there is.
      returned: success
      type: str
      sample: '192.168.1.5'
    hardware-address:
      description: MAC address.
      returned: success
      type: str
      sample: '00:11:22:33:44:55'
    hardware-type:
      description: Hardware type, generally V(1).
      returned: success
      type: int
      sample: 1
    name:
      description: Hostname.
      returned: success
      type: str
      sample: 'mydesktop'
N)OmapiOmapiMessage
OmapiErrorOmapiErrorNotFound)pack_ip	unpack_ippack_mac
unpack_mac)OMAPI_OP_STATUSOMAPI_OP_UPDATETF)AnsibleModulemissing_required_lib)to_bytes	to_nativec                   :    e Zd Zd Zd Zd Zed        Zd Zd Z	y)OmapiHostManagerc                 @    || _         d | _        | j                          y )N)moduleomapiconnect)selfr   s     p/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/omapi_host.py__init__zOmapiHostManager.__init__   s    
    c                 X   	 t        | j                  j                  d   | j                  j                  d   t        | j                  j                  d         | j                  j                  d         | _        y # t
        j                  $ r | j                  j                  d       Y y t        $ r2}| j                  j                  dt        |      z         Y d }~y d }~wt        j                  $ r2}| j                  j                  dt        |      z         Y d }~y d }~ww xY w)	Nhostportkey_namekeyzAUnable to open OMAPI connection. 'key' is not a valid base64 key.msgziUnable to open OMAPI connection. Ensure 'host', 'port', 'key' and 'key_name' are valid. Exception was: %sz%Unable to connect to OMAPI server: %s)r   r   paramsr   r   binasciiError	fail_jsonr   r   socketerrorr   es     r   r   zOmapiHostManager.connect   s    		^t{{11&94;;;M;Mf;UW_`d`k`k`r`rs}`~W#{{11%8:DJ~~ 	kKK!!&i!j 	UKK!! 'EGPQR|'T! U U|| 	^KK!!&MPYZ[P\&\!]]	^s*   A8A; ;/D),D)4(C!!D)7(D$$D)c                 ~   t        j                  t        dd            }|j                  j	                  t        dd      t        |      f       |j                  j	                  t        dd      t        j                  dd      f       | j                  j                  |      }|j                  t        k7  ry |S )Nr   surrogate_or_stricterrorshardware-addresshardware-type!I   )r   openr   objappendr   structpackr   query_serveropcoder   )r   macaddrr$   responses       r   get_hostzOmapiHostManager.get_host   s    8M NO!3<QRT\]dTefg9NOQWQ\Q\]acdQefg::**3/??o-r   c                 
   t        |       }d|v r#t        t        |t        d                     |d<   d|v r#t        t	        |t        d                     |d<   d|v r%t        j                  d|t        d               |d<   |S )Nr1   
ip-addressr2   r3   )dictr   r   r   r   r8   unpack)r6   results     r   unpack_factszOmapiHostManager.unpack_facts   s    c')2:fXN`Ea>b3c)dF%&6!#,Yvh|>T7U-V#WF< f$&,mmD&/AZ:[&\F?#r   c                    | j                   j                  d   %t        | j                   j                  d         dk(  r| j                   j                  d       d }| j	                  | j                   j                  d         }|t        j                  t        dd            }|j                  j                  t        d	      t        j                  d
d      f       |j                  j                  t        d      t        j                  d
d      f       |j                  j                  t        d      t        | j                   j                  d         f       |j                  j                  t        d      t        j                  d
d      f       |j                  j                  t        d      t        | j                   j                  d         f       | j                   j                  d   H|j                  j                  t        dd      t        | j                   j                  d         f       d}| j                   j                  d   r+|dj                  | j                   j                  d         z  }	 t        | j                   j                  d         dkD  r0|dj!                  | j                   j                  d         z  }|dz  }t        |      dkD  r/|j                  j                  t        d      t        |      f       	 | j&                  j)                  |      }|j*                  t,        k7  r| j                   j                  d       | j                   j/                  d| j1                  |j                               y | j1                  |j                        }i }t        dd      |vs3t5        |t        dd               | j                   j                  d   k7  r%t        | j                   j                  d         |d<   d|vs|d   | j                   j                  d   k7  r=| j                   j                  d|d   d| j                   j                  d   d       	 t        |      dk(  r| j                   j/                  d|       n0t        j6                  |j8                        }|j;                  |       	 | j&                  j)                  |      }|j*                  t<        k7  r| j                   j                  d        | j                   j/                  d!       y # t"        $ r3}| j                   j                  dt%        |      z         Y d }~d }~ww xY w# t2        $ r2}| j                   j                  dt%        |      z         Y d }~y d }~ww xY w# t2        $ r2}| j                   j                  dt%        |      z         Y d }~y d }~ww xY w)"Nhostnamer   z@name attribute could not be empty when adding or modifying host.r#   r<   r   r.   r/   creater3   r4   	exclusiver1   r2   nameipr@    ddnszddns-hostname "{0}"; 
statementsz; zInvalid statements found: %szHFailed to add host, ensure authentication and host parameters are valid.T)changedleaseOMAPI error: %sz,Changing hostname is not supported. Old was z	, new is z!. Please delete host and add new.FzKFailed to modify host, ensure authentication and host parameters are valid.rN   )r   r%   lenr(   r>   r   r5   r   messager7   r8   r9   r6   r   r
   formatjoin	TypeErrorr   r   r:   r;   r   	exit_jsonrD   r   r   updatehandleupdate_objectr   )r   r$   host_response	stmt_joinr,   r=   response_objfields_to_updates           r   
setup_hostzOmapiHostManager.setup_host   s   ;;j)1S9K9KJ9W5X\]5]KK!!&h!idkk&8&8&CD ##HV<Q$RSCKK 2FKKa4HIJKK 5v{{47KLMGGNNH%78(4;;CUCUV_C`:abcGGNNH_5v{{47KLMGGNNHV,ht{{7I7I*7U.VWX{{!!$'3>S TV]^b^i^i^p^pqu^vVwxyI{{!!&)4;;DKK<N<Nz<Z[[	Yt{{)),781<4;;+=+=l+K!LLI%I 9~! 68KLML::2237??o5KK)) /;) <%%d$:K:KHLL:Y%Z
  ,,]->->?L!-BC<Wl8LI^+_`aeiepepewewx|e}}189K9KD9Q1R . \)\&-AT[[EWEWXbEc-c%%+7+?ASAST^A_+a% b #$)%%e<%H"))-*>*>?!!"23L::2237??o5KK)) /;) <%%d%3a  Y%%*H9UV<*W%XXY  L%%*;il*J%KKLJ  L%%*;il*J%KKLsK   
AU B V  A&W 	V(U>>V	W(V<<W	W?(W::W?c                 f   	 | j                   j                  | j                  j                  d          | j                  j	                  d       y # t
        $ r | j                  j	                          Y y t        $ r2}| j                  j                  dt        |      z         Y d }~y d }~ww xY w)Nr<   TrQ   rP   r#   )	r   del_hostr   r%   rW   r	   r   r(   r   r+   s     r   remove_hostzOmapiHostManager.remove_host  s    	HJJ 2 29 =>KK!!$!/! 	$KK!!# 	HKK!!&7)A,&F!GG	Hs   AA #B06B0>(B++B0N)
__name__
__module____qualname__r   r   r>   staticmethodrD   r_   rb    r   r   r   r      s4    

^  KLZHr   r   c                  r   t        t        t        ddddg      t        dd      t        dd	      t        dd
      t        ddd      t        dd
      t        ddg      t        d      t        dd      t        ddg       
      d      } t        s | j                  t	        d      t
               | j                  d   t        | j                  d         dk(  r| j                  d       | j                  d   t        | j                  d         dk(  r| j                  d       t        |       }	 | j                  d   dk(  r|j                          y | j                  d   dk(  r|j                          y y # t        $ r(}| j                  dt        |      z         Y d }~y d }~ww xY w)NstrTabsentpresent)typerequiredchoices	localhost)rl   defaultinti  )rl   rm   )rl   rm   no_logrI   )rl   aliases)rl   boolFlist)rl   elementsrp   )
stater   r    r!   r"   r<   rF   rJ   rL   rM   )argument_specsupports_check_modepypureomapi)r$   	exceptionr"   r   z 'key' parameter cannot be empty.r#   r!   z%'key_name' parameter cannot be empty.rw   zOMAPI input value error: %s)r   rA   pureomapi_foundr(   r   PUREOMAPI_IMP_ERRr%   rR   r   r_   rb   
ValueErrorr   )r   host_managerr,   s      r   mainr     s   ED8Y:OP5+65$/ut4%$t<ed3uvh7651%D
 "F  1-@L]^}}U#s6==+?'@A'E?@}}Z (Cj0I,Ja,ODE#F+LK==!Y.##%]]7#x/$$& 0 K:Yq\IJJKs   >"F !"F 	F6F11F6__main__)%
__future__r   r   r   rl   __metaclass__DOCUMENTATIONEXAMPLESRETURNr&   r)   r8   	tracebackr}   rz   r   r   r   r	   r
   r   r   r   r   r   r|   ImportError
format_excansible.module_utils.basicr   r   +ansible.module_utils.common.text.convertersr   r   r   r   rc   rg   r   r   <module>r      s    A @CH0
8     OODD<O
 K K}H }H@!KH zF Y  ,	,,.Os   "A3 3BB