
    Vh$                        d dl mZ d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 	 d dlmZ dZd
 Zd Zd Zd Z G d de	      Zy# e$ r d	ZY !w xY w)    )annotationsa  
author: Unknown (!UNKNOWN)
name: logdna
type: notification
short_description: Sends playbook logs to LogDNA
description:
  - This callback will report logs from playbook actions, tasks, and events to LogDNA (U(https://app.logdna.com)).
requirements:
  - LogDNA Python Library (U(https://github.com/logdna/python))
  - whitelisting in configuration
options:
  conf_key:
    required: true
    description: LogDNA Ingestion Key.
    type: string
    env:
      - name: LOGDNA_INGESTION_KEY
    ini:
      - section: callback_logdna
        key: conf_key
  plugin_ignore_errors:
    required: false
    description: Whether to ignore errors on failing or not.
    type: boolean
    env:
      - name: ANSIBLE_IGNORE_ERRORS
    ini:
      - section: callback_logdna
        key: plugin_ignore_errors
    default: false
  conf_hostname:
    required: false
    description: Alternative Host Name; the current host name by default.
    type: string
    env:
      - name: LOGDNA_HOSTNAME
    ini:
      - section: callback_logdna
        key: conf_hostname
  conf_tags:
    required: false
    description: Tags.
    type: string
    env:
      - name: LOGDNA_TAGS
    ini:
      - section: callback_logdna
        key: conf_tags
    default: ansible
N)getnode)CallbackBase)AnsibleJSONEncoder)LogDNAHandlerTFc                      t               d dj                  t         fdt        t	        t               dz                          S )N012x:c                    | | dz    S )N    )indexmacs    m/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/callback/logdna.py<lambda>zget_mac.<locals>.<lambda>L   s    c%	&:     r   )r   joinmaprangeintlen)r   s   @r   get_macr   J   s9    YtC88C:E#c#hQRlBS<TUVVr   c                 b    t        t        j                               j                  dd      d   S )Nz.local   r   )strsocketgethostnamesplitr   r   r   get_hostnamer   P   s(    v!!#$**8Q7::r   c                 ~   	 t        j                  t                     S # t        $ r t        j                   t         j                  t         j
                        } 	 | j                  d       | j                         d   }n# t        $ r d}Y nw xY w| j                          n# | j                          w xY w|cY S w xY w)N)z10.255.255.255r   r   z	127.0.0.1)	r   gethostbynamer   	ExceptionAF_INET
SOCK_DGRAMconnectgetsocknameclose)sIPs     r   get_ipr*   U   s    ##LN33 	MM&..&*;*;<	II+,#B 	B	 GGIAGGI		sE    ;B<$B ?B" BB"BB"B<"B44B<;B<c                \    	 t        j                  | dt               y# t        $ r Y yw xY w)NT	sort_keysclsF)jsondumpsr   r"   )objs    r   
isJSONabler2   e   s-    

3$,>? s    	++c                       e Zd ZdZdZdZdZd fd	Zd fd	Zd Z	d Z
d	 Zd
 Zd Zd ZddZd Zd Zd Zd Z xZS )CallbackModuleg?notificationzcommunity.general.logdnaTc                    t         t        |   |       d| _        d | _        d | _        d | _        d | _        d | _        d | _	        y )N)displayT)
superr4   __init__disabledplaybook_nameplaybookconf_keyplugin_ignore_errorsconf_hostname	conf_tags)selfr7   	__class__s     r   r9   zCallbackModule.__init__u   sI    nd,W,=!$(!!r   c                *   t         t        |   |||       | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _        t               | _	        t               | _        | j                  t               | _        | j                  j                  d      | _        t        rt        j                   d      | _        | j"                  j%                  t        j&                         | j                  | j                  dd	| _        | j"                  j+                  t-        | j                  | j(                               d
| _        y d| _        | j0                  j3                  d       y )N)	task_keysvar_optionsdirectr=   r>   r?   r@   ,logdnaT)hostnamer   
index_metaFzDWARNING:
Please, install LogDNA Python Package: `pip install logdna`)r8   r4   set_options
get_optionr=   r>   r?   r@   r   r   r*   ipr   r   
HAS_LOGDNAlogging	getLoggerlogsetLevelINFOoptions
addHandlerr   r:   _displaywarning)rA   rD   rE   rF   rB   s       r   rK   zCallbackModule.set_options   s"   nd/)Q\ek/l
3$(OO4J$K!!___=59(%!-D--c2((2DHHHgll+(,(:(:488[_`DLHHdmmT\\ JK!DM DMMM!!"ijr   c                    g }d}|j                         D ]'  \  }}t        |      r|j                  |       |dz  }) |dkD  r!|D ]  }||=  ddj                  |       |d<   |S )Nr   r   z These keys have been sanitized: z, __errors)itemsr2   appendr   )rA   metainvalidKeysninvalidKeyskeyvalues         r   metaIndexingzCallbackModule.metaIndexing   s    **, 	"JCe$""3'!	" !" I!A$))KBXAYZDr   c                    	 t        j                  t        j                  |dt                    S # t        $ r# ddt        j                  |dt              gicY S w xY w)NTr,   warningszJSON Formatting Issue)r/   loadsr0   r   r"   )rA   datas     r   sanitizeJSONzCallbackModule.sanitizeJSON   sV    	u::djjCUVWW 	u!8$**TUY_q:r stt	us   .1 )AAc                p    t         r0| j                  j                  t        j                  |      |       y y N)rN   rQ   infor/   r0   )rA   rQ   rT   s      r   flushzCallbackModule.flush   s$    HHMM$**S/73 r   c                    d| j                   ||dd}|d   j                  dd        |d   j                  dd       }|| j                  d|i|       | j                  ||       y )Nansible)r<   hostcategory)appr\   ri   
invocationrc   warn)r;   poprj   )rA   rm   rn   logdatarT   rc   s         r   sendLogzCallbackModule.sendLog   sl    #$:L:LVZhp-qrL$/6?&&z48JJ)73

7G$r   c                4    || _         |j                  | _        y rh   )r<   
_file_namer;   )rA   r<   s     r   v2_playbook_on_startz#CallbackModule.v2_playbook_on_start   s     %00r   c                    t               }|j                  j                         D ]  }|j                  |      ||<    | j	                  | j
                  dd| j                  |      i       y )NSTATSri   )dict	processedkeys	summarizert   r?   rf   )rA   statsresultrm   s       r   v2_playbook_on_statsz#CallbackModule.v2_playbook_on_stats   s]    OO((* 	1D ??40F4L	1T''64;L;LV;T2UVr   c                ~    | j                   r| j                   }| j                  |d| j                  |      |d       y )NFAILED)ri   ignore_errors)r>   rt   rf   )rA   rm   resr   s       r   runner_on_failedzCallbackModule.runner_on_failed   s7    $$ 55MT8d.?.?.DWd%efr   c                L    | j                  |dd| j                  |      i       y )NOKri   rt   rf   rA   rm   r   s      r   runner_on_okzCallbackModule.runner_on_ok   s"    T4&$*;*;C*@!ABr   c                L    | j                  |dd| j                  |      i       y )NUNREACHABLEri   r   r   s      r   runner_on_unreachablez$CallbackModule.runner_on_unreachable   s"    T=643D3DS3I*JKr   c                N    | j                  |d| j                  |      |d       y )NASYNC_FAILEDri   job_idr   rA   rm   r   jids       r   runner_on_async_failedz%CallbackModule.runner_on_async_failed   s#    T>D4E4Ec4JVY+Z[r   c                N    | j                  |d| j                  |      |d       y )NASYNC_OKr   r   r   s       r   runner_on_async_okz!CallbackModule.runner_on_async_ok   s#    T:0A0A#0FRU'VWr   rh   )NNN)F)__name__
__module____qualname__CALLBACK_VERSIONCALLBACK_TYPECALLBACK_NAMECALLBACK_NEEDS_WHITELISTr9   rK   ra   rf   rj   rt   rw   r   r   r   r   r   r   __classcell__)rB   s   @r   r4   r4   n   sb    "M.M#	k2u4%1Wg
CL\Xr   r4   )
__future__r   DOCUMENTATIONrO   r/   r   uuidr   ansible.plugins.callbackr   ansible.parsing.ajsonr   rH   r   rN   ImportErrorr   r   r*   r2   r4   r   r   r   <module>r      so    #1f     1 4$JW;
 cX\ cXS  Js   A AA