
    VhL                         d dl mZ d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	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 d	lmZ  G d
 de      Z G d de      Zy)    )annotationsa  
name: loganalytics
type: notification
short_description: Posts task results to Azure Log Analytics
author: "Cyrus Li (@zhcli) <cyrus1006@gmail.com>"
description:
  - This callback plugin will post task results in JSON formatted to an Azure Log Analytics workspace.
  - Credits to authors of splunk callback plugin.
version_added: "2.4.0"
requirements:
  - Whitelisting this callback plugin.
  - An Azure log analytics work space has been established.
options:
  workspace_id:
    description: Workspace ID of the Azure log analytics workspace.
    type: str
    required: true
    env:
      - name: WORKSPACE_ID
    ini:
      - section: callback_loganalytics
        key: workspace_id
  shared_key:
    description: Shared key to connect to Azure log analytics workspace.
    type: str
    required: true
    env:
      - name: WORKSPACE_SHARED_KEY
    ini:
      - section: callback_loganalytics
        key: shared_key
a]  
examples: |-
  Whitelist the plugin in ansible.cfg:
    [defaults]
    callback_whitelist = community.general.loganalytics
  Set the environment variable:
    export WORKSPACE_ID=01234567-0123-0123-0123-01234567890a
    export WORKSPACE_SHARED_KEY=dZD0kCbKl3ehZG6LHFMuhtE0yHiFCmetzFMc2u+roXIUQuatqU924SsAAAAPemhjbGlAemhjbGktTUJQAQIDBA==
  Or configure the plugin in ansible.cfg in the callback_loganalytics block:
    [callback_loganalytics]
    workspace_id = 01234567-0123-0123-0123-01234567890a
    shared_key = dZD0kCbKl3ehZG6LHFMuhtE0yHiFCmetzFMc2u+roXIUQuatqU924SsAAAAPemhjbGlAemhjbGktTUJQAQIDBA==
N)basename)open_url)AnsibleJSONEncoder)CallbackBase)nowc                  *    e Zd Zd Zd Zd Zd Zd Zy)AzureLogAnalyticsSourcec                    d| _         d| _        d| _        t        t	        j
                               | _        t        j                         | _	        t        j                         | _        d| _        y )NF )ansible_check_modeansible_playbookansible_versionstruuiduuid4sessionsocketgethostnamehostgetpassgetuseruser
extra_varsselfs    s/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/callback/loganalytics.py__init__z AzureLogAnalyticsSource.__init__K   sQ    "' "!4::<(&&(	OO%	    c                $   d| d| d}|j                  d      }t        j                  |      }t        j                  ||t
        j                        j                         }t        j                  |      j                  d      }	d| d|	 }
|
S )NzPOST
z
application/json
x-ms-date:z

/api/logszutf-8)	digestmodz
SharedKey :)
encodebase64	b64decodehmacnewhashlibsha256digest	b64encodedecode)r   dateworkspace_id
shared_keycontent_lengthsigs	utf8_sigsdecoded_shared_keyhmac_sha256_sigsencoded_hash	signatures              r   __build_signaturez)AzureLogAnalyticsSource.__build_signatureT   s    ''EdV;WKK(	#--j988	W^^EEKVX 	''(89@@I a~>	r   c                    d| dS )Nzhttps://z9.ods.opinsights.azure.com/api/logs?api-version=2016-04-01 )r   r.   s     r   __build_workspace_urlz-AzureLogAnalyticsSource.__build_workspace_url_   s    ,'`aar   c                4    t               j                  d      S )Nz%a, %d %b %Y %H:%M:%S GMT)r   strftimer   s    r   __rfc1123datez%AzureLogAnalyticsSource.__rfc1123dateb   s    u~~9::r   c           	     N   |j                   d   j                  d      du rd| _        |j                   d   j                  d      r#|j                   d   j                  d      | _        |j                  j
                  r t        |j                  j
                        }nd }i }|j                  j                  |d<   | j                  |d<   ||d<   | j                         |d<   | j                  |d	<   | j                  |d
<   ||d<   | j                  |d<   | j                  |d<   |j                  j                  |d<   | j                  |d<   ||d<   |j                   |d<   d|d   v r|d   j                  d       |j                   |d<   d|d   v r|d   j                  d       | j"                  |d<   t%        j&                  d|it(        d      }t+        |      }	| j                         }
| j-                  |
|||	      }| j/                  |      }t1        ||d|d|
dd       y )Nargs_ansible_check_modeT_ansible_versionr   r   status	timestampr   r   runtimer   r   ansible_hostr   ansible_roleansible_taskansible_resultcontentr   event)cls	sort_keyszapplication/json)zcontent-typeAuthorizationzLog-Typez	x-ms-datePOST)headersmethod)_task_fieldsgetr   r   _task_roler   _uuidr   %_AzureLogAnalyticsSource__rfc1123dater   r   _hostnamer   pop_resultr   jsondumpsr   len)_AzureLogAnalyticsSource__build_signature-_AzureLogAnalyticsSource__build_workspace_urlr   )r   r.   r/   stateresultrD   rF   datajsondatar0   rfc1123dater6   workspace_urls                r   
send_eventz"AzureLogAnalyticsSource.send_evente   s/   v&**+@ATI&*D#v&**+=>##F+//0BC   <<v||112LL||))V,,YX ..0[yyVyyV!Y"&"6"6%)%<%<!"%||00^#'#8#8 +^%22^T.)) $$V,!'-..!"&&y1 "__\ ::wo3EQUVX((***;jR`a	22<@ 2!*.(	 
	
r   N)__name__
__module____qualname__r   r^   r_   rV   rf   r9   r   r   r
   r
   J   s    	b;6
r   r
   c                  x     e Zd ZdZdZdZdZd fd	Zd Zd fd	Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Z xZS )CallbackModuleg       @notificationloganalyticsTc                v    t         t        |   |       i | _        d | _        d | _        t               | _        y )N)display)superrk   r   start_datetimesr.   r/   r
   rm   )r   ro   	__class__s     r   r   zCallbackModule.__init__   s7    nd,W,=! 35r   c                z    t               | j                  |j                  j                     z
  j	                         S N)r   rq   rS   rU   total_seconds)r   ra   s     r   _seconds_since_startz#CallbackModule._seconds_since_start   s0    E  !3!345
-/	r   c                    t         t        |   |||       | j                  d      | _        | j                  d      | _        y )N)	task_keysvar_optionsdirectr.   r/   )rp   rk   set_options
get_optionr.   r/   )r   rx   ry   rz   rr   s       r   r{   zCallbackModule.set_options   s<    nd/)Q\ek/l OON;//,7r   c                ^    |j                         }|j                  }|| j                  _        y rt   )get_variable_managerr   rm   )r   playvmr   s       r   v2_playbook_on_play_startz(CallbackModule.v2_playbook_on_play_start   s'    &&(]]
'1$r   c                L    t        |j                        | j                  _        y rt   )r   
_file_namerm   r   )r   playbooks     r   v2_playbook_on_startz#CallbackModule.v2_playbook_on_start   s    -5h6I6I-J*r   c                F    t               | j                  |j                  <   y rt   r   rq   rU   )r   taskis_conditionals      r   v2_playbook_on_task_startz(CallbackModule.v2_playbook_on_task_start       +.5TZZ(r   c                F    t               | j                  |j                  <   y rt   r   )r   r   s     r   !v2_playbook_on_handler_task_startz0CallbackModule.v2_playbook_on_handler_task_start   r   r   c           	         | j                   j                  | j                  | j                  d|| j	                  |             y )NOKrm   rf   r.   r/   rv   r   ra   kwargss      r   v2_runner_on_okzCallbackModule.v2_runner_on_ok   s:    $$OO%%f-	
r   c           	         | j                   j                  | j                  | j                  d|| j	                  |             y )NSKIPPEDr   r   s      r   v2_runner_on_skippedz#CallbackModule.v2_runner_on_skipped   s:    $$OO%%f-	
r   c           	         | j                   j                  | j                  | j                  d|| j	                  |             y NFAILEDr   r   s      r   v2_runner_on_failedz"CallbackModule.v2_runner_on_failed   :    $$OO%%f-	
r   c           	         | j                   j                  | j                  | j                  d|| j	                  |             y r   r   r   s      r   runner_on_async_failedz%CallbackModule.runner_on_async_failed   r   r   c           	         | j                   j                  | j                  | j                  d|| j	                  |             y )NUNREACHABLEr   r   s      r   v2_runner_on_unreachablez'CallbackModule.v2_runner_on_unreachable   s:    $$OO%%f-	
r   rt   )NNN)rg   rh   ri   CALLBACK_VERSIONCALLBACK_TYPECALLBACK_NAMECALLBACK_NEEDS_WHITELISTr   rv   r{   r   r   r   r   r   r   r   r   r   __classcell__)rr   s   @r   rk   rk      sV    "M"M#68
2
K11




r   rk   )
__future__r   DOCUMENTATIONEXAMPLESr(   r&   r$   r[   r   r   r   os.pathr   ansible.module_utils.urlsr   ansible.parsing.ajsonr   ansible.plugins.callbackr   Cansible_collections.community.general.plugins.module_utils.datetimer   objectr
   rk   r9   r   r   <module>r      s^    #B         . 4 1
Q
f Q
hQ
\ Q
r   