
    Vh$                    v    d dl mZ dZd dl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  G d de      Zy)	    )annotationsa.  
name: mail
type: notification
short_description: Sends failure events through email
description:
  - This callback will report failures through email.
author:
  - Dag Wieers (@dagwieers)
requirements:
  - whitelisting in configuration
options:
  mta:
    description:
      - Mail Transfer Agent, server that accepts SMTP.
    type: str
    env:
      - name: SMTPHOST
    ini:
      - section: callback_mail
        key: smtphost
    default: localhost
  mtaport:
    description:
      - Mail Transfer Agent Port.
      - Port at which server SMTP.
    type: int
    ini:
      - section: callback_mail
        key: smtpport
    default: 25
  to:
    description:
      - Mail recipient.
    type: list
    elements: str
    ini:
      - section: callback_mail
        key: to
    default: [root]
  sender:
    description:
      - Mail sender.
      - This is required since community.general 6.0.0.
    type: str
    required: true
    ini:
      - section: callback_mail
        key: sender
  cc:
    description:
      - CC'd recipients.
    type: list
    elements: str
    ini:
      - section: callback_mail
        key: cc
  bcc:
    description:
      - BCC'd recipients.
    type: list
    elements: str
    ini:
      - section: callback_mail
        key: bcc
  message_id_domain:
    description:
      - The domain name to use for the L(Message-ID header, https://en.wikipedia.org/wiki/Message-ID).
      - The default is the hostname of the control node.
    type: str
    ini:
      - section: callback_mail
        key: message_id_domain
    version_added: 8.2.0
N)to_bytes)AnsibleJSONEncoder)CallbackBasec                       e Zd ZdZdZdZdZdZd fd	Zd fd	Z	ddZ
d	 Zdd
Zd Zd Zd ZddZd Zd Zd Z xZS )CallbackModulezB This Ansible callback plugin mails errors to interested parties. g       @notificationzcommunity.general.mailTc                    t         t        |   |       d | _        d| _        t        j                  dd      | _        d| _        d | _	        d | _
        y )N)displayrootSMTPHOST	localhost   )superr   __init__sendertoosgetenvsmtphostsmtpportccbcc)selfr   	__class__s     k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/callback/mail.pyr   zCallbackModule.__init__f   sJ    nd,W,=		*k:    c                :   t         t        |   |||       | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _	        y )N)	task_keysvar_optionsdirectr   r   mtamtaportr   r   )
r   r   set_options
get_optionr   r   r   r   r   r   )r   r   r    r!   r   s       r   r$   zCallbackModule.set_optionso   s{    nd/)Q\ek/looh///$'.	2//$'??5)r   c           
        ||}t        j                  | j                  | j                        }t        j
                  j                  | j                        }| j                  r)t        j
                  j                  | j                        }| j                  r)t        j
                  j                  | j                        }| j                  r)t        j
                  j                  | j                        }dt        j
                  j                          d}|dt        j
                  j                  |       dz  }| j                  rC|ddj                  D 	cg c]!  }	t        j
                  j                  |	      # c}	       dz  }| j                  rC|ddj                  D 	cg c]!  }	t        j
                  j                  |	      # c}	       dz  }|dt        j
                  j                  | j!                  d	      
       dz  }|d|j#                          dz  }||z  }}
| j                  r|
z  }
| j                  r|
z  }
|
s| j$                  j'                  d       |j)                  | j                  |
D cg c]  \  }}|	 c}}t+        |             |j-                          y c c}	w c c}	w c c}}w )N)portzDate: 
zFrom: zTo: z, zCc: zMessage-ID: message_id_domain)domainz	Subject: 

z<No receiver has been specified for the mail callback plugin.)smtplibSMTPr   r   emailutils	parseaddrr   r   getaddressesr   r   
formatdate
formataddrjoin
make_msgidr%   strip_displaywarningsendmailr   quit)r   subjectbodysmtpsender_addressto_addressescc_addressesbcc_addressescontentpair	addressesnameaddresss                r   mailzCallbackModule.mailz   s*   <D||DMM>..t{{;77 ;;33DGG<L77 ;;33DGG<L88!KK44TXX>M5;;1134B7VEKK22>BC2FF77diiR^(_$)?)?)E(_`aacddG77diiR^(_$)?)?)E(_`aacddG\%++"8"8Pc@d"8"e!ffhiiYw}}/t444 	77%I88&IMM!!"`adkk#KgG#KXV]M^_		% )`(_ $Ls   &J;,&K Kc                T    |j                  d      j                         |   }| d| S )N
: )r6   
splitlines)r   	multilinefailtypelinenrmsgs        r   subject_msgzCallbackModule.subject_msg   s/    oof%0026:2cU##r   c                V    t        j                  dd|z  |t         j                        S )N^ )flags)resub	MULTILINE)r   rL   indents      r   rX   zCallbackModule.indent   s    vvc3<",,GGr   c                    d| d}dj                  |j                  d      j                               }| | j                  |       dS )zK Turn some text output in a well-indented block for sending in a mail body zwith the following z:

r(   rI   )r4   r6   rK   rX   )r   rL   texttypeintroblobs        r   	body_blobzCallbackModule.body_blob   sK    %hZu5yy0;;=>T*+2..r   c           
        |j                   j                         }| j                  sd| d| _        | j                  r| j                  }nD|j
                  j                  d      du rd}n#|j
                  j                  d      r!| j                  |j
                  d   |d      }n|j
                  j                  d      r!| j                  |j
                  d   |d	      }n|j
                  j                  d
      r!| j                  |j
                  d
   |d	      }no|j
                  j                  d      r!| j                  |j
                  d   |d	      }n3| d|j                  j                  xs |j                  j                   }dt        j                  j                  | j                  j                         d}|j                  j                  r|d|j                  j                   dz  }|d|j                  j                   dz  }|d| dz  }|dz  }|dz  }d|j
                  v rT|| j!                  |j                  j                   dt#        j$                  |j
                  d   d   d       d      z  }n|j                  j                  rC|| j!                  |j                  j                   d|j                  j                   d      z  }n+|| j!                  |j                  j                   d      z  }|dz  }| j                  r|| j                  z  }n|j
                  j                  d      du rA| j!                  ddj'                  |j                  j(                        z         }|d| dz  }n=|j
                  j                  d      r"|| j+                  |j
                  d   d      z  }|j
                  j                  d
      r"|| j+                  |j
                  d
   d      z  }|j
                  j                  d      r"|| j+                  |j
                  d   d      z  }|j
                  j                  d      r"|| j+                  |j
                  d   d      z  }|j
                  j                  d       r]t-        t/        |j
                  j                  d                   D ]-  }|| j+                  |j
                  d    |   d!|d"z          z  }/ |j
                  j                  d#      r]t-        t/        |j
                  j                  d#                  D ]-  }|| j+                  |j
                  d#   |   d!|d"z          z  }/ |d$z  }|| j!                  | dt#        j$                  |j
                  t0        d%             z  }| j3                  ||&       y )'Nz
"Ansible: z" <root>failed_when_resultTz%Failed due to 'failed_when' conditionrO   r   stderrstdout	exceptionrJ   z
Playbook: r(   zTask: zModule: zHost: zThe following task failed:


invocationmodule_args   )rX   z (z)
zfailed_when:
- z
- z!due to the following condition:

r+   messagezstandard outputzerror outputwarningsz
exception    deprecationsz#and a complete dump of the error:

clsrX   )r;   r<   )_hostget_namer   itembodyitemsubject_resultgetrP   _taskrE   actionr   pathbasenameplaybook
_file_namerX   jsondumpsr4   failed_whenr]   rangelenr   rG   )r   resultrM   hostr;   r<   	fail_condis           r   mail_resultzCallbackModule.mail_result   s   ||$$&{{&tfH5DK ==&&G^^ 45==G^^&&&v~~e'<hJG^^)&&v~~h'?2NG^^)&&v~~h'?2NG^^,&&v~~k'BHbQG!
"V\\%6%6%M&,,:M:M$NOG BGG,,T]]-E-EFGrJ<<fV\\../r22D(6<<../r22&b!! 	006>>)DKK6<<#6#6"7r$**V^^T`EaboEpyz:{9||~   A  AD\\DKK6<<#4#4"5R8K8K7LC PQQDDKK6<<#6#6"7r :;;D ==DMM!D^^ 45=$6V\\E]E]9^$^_I9)DIID^^&DNN6>>%#8)DDD >>h'DNN6>>(#;=NOOD>>h'DNN6>>(#;^LLD>>k*DNN6>>+#>LLD>>j)3v~~11*=>? \v~~j'A!'D
STWXSXRYFZ[[\>>n-3v~~11.ABC `v~~n'Ea'HJWX[\W\V]J^__` 	77xj4::fnnJ\ef+g*hijj		'	-r   c                     || _         d| _        y )N )rw   ro   )r   rw   s     r   v2_playbook_on_startz#CallbackModule.v2_playbook_on_start   s     r   c                .    |ry | j                  |d       y )NFailedr   )r   r~   ignore_errorss      r   v2_runner_on_failedz"CallbackModule.v2_runner_on_failed   s    *r   c                (    | j                  |d       y )NUnreachabler   r   r~   s     r   v2_runner_on_unreachablez'CallbackModule.v2_runner_on_unreachable   s    /r   c                (    | j                  |d       y )NzAsync failurer   r   s     r   v2_runner_on_async_failedz(CallbackModule.v2_runner_on_async_failed   s    1r   c           	         |j                   d   | _        | xj                  | j                  t	        j
                  |j                   t        d      d|j                   d    d      z  c_        y )NrO   rf   rk   zfailed item dump 'item')rq   rp   ro   r]   ry   rz   r   r   s     r   v2_runner_item_on_failedz'CallbackModule.v2_runner_item_on_failed   s~    !>>%0

6>>GYbc(dhz  |B  |J  |J  KQ  |R  {S  ST  gU  V  	Vr   )N)NNN)zAnsible error mailN)   )F)__name__
__module____qualname____doc__CALLBACK_VERSIONCALLBACK_TYPECALLBACK_NAMECALLBACK_NEEDS_WHITELISTr   r$   rG   rP   rX   r]   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   _   s]    L"M,M#	*#J$H/A.F+02Vr   r   )
__future__r   DOCUMENTATIONry   r   rU   email.utilsr.   r,   +ansible.module_utils.common.text.convertersr   ansible.parsing.ajsonr   ansible.plugins.callbackr   r    r   r   <module>r      s=    #IV  	 	   @ 4 1cV\ cVr   