
    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mZ d dlmZ d dlmZmZ d d	lmZ d dlmc mc mc mc mZ 	 d dlZd
Z e       Z	 d dl!Z!d
Z" e       Z#	 d dl$m%Z% d
Z& e       Z' G d de      Z(d Z)d Z*e+dk(  r e*        yy# e$ r  e
j@                         ZdZY Ww xY w# e$ r  e
j@                         Z#dZ"Y gw xY w# e$ r  e
j@                         Z'dZ&Y uw xY w)    )absolute_importdivisionprint_functiona  
---
module: zabbix_map
author:
    - "Antony Alekseyev (@Akint)"
short_description: Create/update/delete Zabbix maps
description:
    - "This module allows you to create, modify and delete Zabbix map entries,
      using Graphviz binaries and text description written in DOT language.
      Nodes of the graph will become map elements and edges will become links between map elements.
      See U(https://en.wikipedia.org/wiki/DOT_(graph_description_language)) and U(https://www.graphviz.org/) for details.
      Inspired by U(http://blog.zabbix.com/maps-for-the-lazy/)."
    - "The following extra node attributes are supported:
        C(zbx_host) contains name of the host in Zabbix. Use this if desired type of map element is C(host).
        C(zbx_group) contains name of the host group in Zabbix. Use this if desired type of map element is C(host group).
        C(zbx_sysmap) contains name of the map in Zabbix. Use this if desired type of map element is C(map).
        C(zbx_label) contains label of map element.
        C(zbx_image) contains name of the image used to display the element in default state.
        C(zbx_image_disabled) contains name of the image used to display disabled map element.
        C(zbx_image_maintenance) contains name of the image used to display map element in maintenance.
        C(zbx_image_problem) contains name of the image used to display map element with problems.
        C(zbx_url) contains map element URL in C(name:url) format.
            More than one URL could be specified by adding a postfix (e.g., C(zbx_url1), C(zbx_url2))."
    - "The following extra link attributes are supported:
        C(zbx_draw_style) contains link line draw style. Possible values: C(line), C(bold), C(dotted), C(dashed).
        C(zbx_trigger) contains name of the trigger used as a link indicator in C(host_name:trigger_name) format.
            More than one trigger could be specified by adding a postfix (e.g., C(zbx_trigger1), C(zbx_trigger2)).
        C(zbx_trigger_color) contains indicator color specified either as CSS3 name or as a hexadecimal code starting with C(#).
        C(zbx_trigger_draw_style) contains indicator draw style. Possible values are the same as for C(zbx_draw_style)."
requirements:
    - "python >= 3.9"
    - pydotplus
    - webcolors
    - Pillow
    - Graphviz
options:
    name:
        description:
            - Name of the map.
        required: true
        aliases: [ "map_name" ]
        type: str
    data:
        description:
            - Graph written in DOT language.
        required: false
        aliases: [ "dot_data" ]
        type: str
    state:
        description:
            - State of the map.
            - On C(present), it will create if map does not exist or update the map if the associated data is different.
            - On C(absent) will remove the map if it exists.
        required: false
        choices: ["present", "absent"]
        default: "present"
        type: str
    width:
        description:
            - Width of the map.
        required: false
        default: 800
        type: int
    height:
        description:
            - Height of the map.
        required: false
        default: 600
        type: int
    margin:
        description:
            - Size of white space between map's borders and its elements.
        required: false
        default: 40
        type: int
    expand_problem:
        description:
            - Whether the problem trigger will be displayed for elements with a single problem.
        required: false
        type: bool
        default: true
    highlight:
        description:
            - Whether icon highlighting is enabled.
        required: false
        type: bool
        default: true
    label_type:
        description:
            - Map element label type.
        required: false
        choices: ["label", "ip", "name", "status", "nothing", "custom"]
        default: "name"
        type: str
    default_image:
        description:
            - Name of the Zabbix image used to display the element if this element doesn't have the C(zbx_image) attribute defined.
        required: false
        aliases: [ "image" ]
        type: str

extends_documentation_fragment:
- community.zabbix.zabbix

z # a
  
# If you want to use Username and Password to be authenticated by Zabbix Server
- name: Set credentials to access Zabbix Server API
  ansible.builtin.set_fact:
    ansible_user: Admin
    ansible_httpapi_pass: zabbix

# If you want to use API token to be authenticated by Zabbix Server
# https://www.zabbix.com/documentation/current/en/manual/web_interface/frontend_sections/administration/general#api-tokens
- name: Set API token
  ansible.builtin.set_fact:
    ansible_zabbix_auth_key: 8ec0d52432c15c91fcafe9888500cf9a607f44091ab554dbee860f6b44fac895

###
### Example inventory:
# [web]
# web[01:03].example.com ansible_host=127.0.0.1
# [db]
# db.example.com ansible_host=127.0.0.1
# [backup]
# backup.example.com ansible_host=127.0.0.1
###
### Each inventory host is present in Zabbix with a matching name.
###
### Contents of "map.j2":
# digraph G {
#     graph [layout=dot splines=false overlap=scale]
#     INTERNET [zbx_url="Google:https://google.com" zbx_image="Cloud_(96)"]
# {% for web_host in groups.web %}
#     {% set web_loop = loop %}
#     web{{ '%03d' % web_loop.index }} [zbx_host="{{ web_host }}"]
#     INTERNET -> web{{ '%03d' % web_loop.index }} [zbx_trigger="{{ web_host }}:Zabbix agent on {HOST.NAME} is unreachable for 5 minutes"]
#     {% for db_host in groups.db %}
#       {% set db_loop = loop %}
#     web{{ '%03d' % web_loop.index }} -> db{{ '%03d' % db_loop.index }}
#     {% endfor %}
# {% endfor %}
#     { rank=same
# {% for db_host in groups.db %}
#     {% set db_loop = loop %}
#     db{{ '%03d' % db_loop.index }} [zbx_host="{{ db_host }}"]
#     {% for backup_host in groups.backup %}
#         {% set backup_loop = loop %}
#         db{{ '%03d' % db_loop.index }} -> backup{{ '%03d' % backup_loop.index }} [color="blue"]
#     {% endfor %}
# {% endfor %}
# {% for backup_host in groups.backup %}
#     {% set backup_loop = loop %}
#         backup{{ '%03d' % backup_loop.index }} [zbx_host="{{ backup_host }}"]
# {% endfor %}
#     }
# }
###
### Create Zabbix map "Demo Map" made of template "map.j2"
- name: Create Zabbix map
  # set task level variables as we change ansible_connection plugin here
  vars:
    ansible_network_os: community.zabbix.zabbix
    ansible_connection: httpapi
    ansible_httpapi_port: 443
    ansible_httpapi_use_ssl: true
    ansible_httpapi_validate_certs: false
    ansible_zabbix_url_path: "zabbixeu"  # If Zabbix WebUI runs on non-default (zabbix) path ,e.g. http://<FQDN>/zabbixeu
    ansible_host: zabbix-example-fqdn.org
  community.zabbix.zabbix_map:
    name: Demo map
    state: present
    data: "{{ lookup('template', 'map.j2') }}"
    default_image: Server_(64)
    expand_problem: no
    highlight: no
    label_type: label
  delegate_to: localhost
  run_once: yes
N)BytesIO)
itemgetter)AnsibleModulemissing_required_lib)
ZabbixBaseTF)Imagec                       e 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ed'd       Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed'd       Zd Zd Zd Z d Z!ed        Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z( xZ)S )(Mapc                 *   t         t        |   |||       |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _	        | j                  | j                        | _        |j                  d   | _        |j                  d   | _        |j                  d	   | _        |j                  d
   | _        | j!                         | _        y )Nnamedatawidthheightstatedefault_imagemarginexpand_problem	highlight
label_type)superr   __init__paramsmap_namedot_datar   r   r   r   _get_sysmap_idmap_idr   r   r   r   _get_selements_sort_keysselements_sort_keys)selfmodulezbxzapi_wrapper	__class__s       o/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/zabbix/plugins/modules/zabbix_map.pyr   zMap.__init__   s    c4!&#|<f-f-]]7+
mmH-]]7+
#]]?;))$--8mmH-$mm,<={3 --5#'#@#@#B     c                     	 t        j                  | j                        }|j                         }t        j                  |      }|r|S y # t        $ r)}| j
                  j                  d|z         Y d }~y d }~ww xY w)Nz'Failed to build graph from DOT data: %smsg)	pydotplusgraph_from_dot_datar   
create_dot	Exception_module	fail_json)r"   graph_without_positionsdot_data_with_positionsgraph_with_positionses        r'   _build_graphzMap._build_graph   s}    	V&/&C&CDMM&R#&=&H&H&J##,#@#@AX#Y #++ $ 	VLL""'PST'T"UU	Vs   AA 	A=A88A=c                    | j                   s| j                  j                  d       | j                         }| j	                  |      }| j                  |      }| j                         }| j                  | j                  | j                        t        | j                        t        | j                        | j                  | j                  | j                  |||      | j!                  ||      d}|S )Nz('data' is mandatory with state 'present'r*   )r   r   expandproblemr   r   r   	selementslinks)r   r0   r1   r6   _get_graph_nodes_get_graph_edges_get_icon_idsr   _get_label_type_idr   intr   r   r   r   _get_selements
_get_links)r"   graphnodesedgesicon_ids
map_configs         r'   get_map_configzMap.get_map_config  s    }}LL""'Q"R!!#%%e,%%e,%%'MM11$//B !4!45T^^,ZZkk,,UE8D__UE2	

 r(   c                     ddddddd}	 ||   }|S # t         $ r-}| j                  j                  d|d	|
       Y d }~S d }~ww xY w)Nr                  labelipr   statusnothingcustomz"Failed to find id for label type '': r*   r/   r0   r1   )r"   r   label_type_idslabel_type_idr5   s        r'   r>   zMap._get_label_type_id  sl    
	f*:6M   	fLL""V`bc'd"ee	fs    	A"AAc                 |   dddddddddd	ddd
dddg}i }| j                   r| j                   nt        |j                               d   d   }|D ]g  }|j                  |d   d       }|s	|d   r|}n#t	        |      }||v r||   ||d   <   |d   rCd|d<   I| j
                  j                  d|z         i |S )N	zbx_image
iconid_offT)dot_tagzbx_property	mandatoryzbx_image_disablediconid_disabledFzbx_image_maintenanceiconid_maintenancezbx_image_problem	iconid_onr   r[   r]   r\   use_iconmapz Failed to find id for image '%s'r*   )r   sorteditemsgetremove_quotesr0   r1   )r"   r   rE   imagesimages_infor   image
image_names           r'   _get_images_infozMap._get_images_info%  s    ' ,! 0 1" 3 4" / +"!
, .2.@.@**fX^^M]F^_`FabcFd 	\E%	"2D9J%!.J&z2JX%5=j5IE.12[)12K.&&+MPZ+Z&[	\ r(   c                    dddddd}d|d   i}t        |j                               D ]  \  }}d	|z   }||v sd
|z   dz   }t        ||         }t        | |d       }	|	s6 |	|      }
|
r>t	        |
      dkD  r0|j                  ||d       |j                  d|dz   |
igi        |S | j                  j                  d|d|d        |S )Nr   rI   rJ   rK   rL   )hostsysmaptriggergrouprk   elementtyperk   zbx__get__id)rs   rO   elementsidzFailed to find id for z ''r*   )re   rf   rh   getattrr?   updater0   r1   )r"   r   typeselement_type	type_nametype_id
field_namemethod_nameelement_nameget_element_id	elementids              r'   _get_element_typezMap._get_element_typeN  s   
 5>
 #)"7 	pIw)+JT!%	1E9,T*-=>!({D!A! .| <I S^a%7$+++2%1-  %++& )D 0)* )- 
   ..V_am3n.o)	p* r(   c                 D   g }i }| j                  |      }t        |j                         d      D ]  \  }\  }}	d|i}
||	d<   | j                  |	|      }|
j	                  |       |d   }||vr| j                  |      ||<   | j                  |	d   |||         }|
j	                  |       t        |      |
d<   | j                  |	      }|
j	                  |       | j                  |	      }|r||
d<   | j                  |	      }|r||
d<   |j                  |
        |S )NrI   )start
selementidrZ   posrO   urls)_get_scales	enumeraterf   rm   r{   _get_icon_size_convert_coordinatesrh   r   
_get_label	_get_urlsappend)r"   rB   rC   rE   r9   
icon_sizesscalesr   noder   selementrj   image_idr   r}   rO   r   s                    r'   r@   zMap._get_selementsq  s>   	
!!%((1%++-q(I 	'$JtjH ",D//h?KOOK("<0Hz)'+':':8'D
8$++DKHAUVCOOC  -d 3HW11$7LOOL)OOD)E$)!>>$'D#' X&7	'8 r(   c           	         i }|D ]+  }t        t        |j                  d               }|\  }}|j                  d   }d|v r	|d   dk(  rF||vr4t        ||   d   ||   d         t	        ||   d   ||   d         d||<   ||   }	d|	vr-| j                  t        |j                  dd                  |	d<   d	|	vr-| j                  t        |j                  d	d
                  |	d<   | j                  |      }
|
r	d|	vr|
|	d<   | j                  |      }|sd|	vrg |	d<   |	dxx   |z  cc<   . t        |j                               S )Npoints
attributesstyleinvisr   )selementid1selementid2colorgreenzbx_draw_stylelinedrawtyperO   linktriggers)tuplere   obj_dictminmax_get_color_hexrh   rg   _get_link_draw_style_idr   _get_triggerslistvalues)r"   rC   rD   r:   edgelink_idnode1node2r   linkrO   triggerss               r'   rA   zMap._get_links  sw    	1DF4==#:;<G"LE5==.D$4=G#;e##&uU|L'A5<P\C]#^#&uU|L'A5<P\C]#^"g >Dd" $ 3 3M$((7T[B\4] ^Wt+#'#?#?dhhWgioNp@q#rZ OOD)E, %W))$/H!-+-D(^$0$;	1> ELLN##r(   c                 `   g }|j                         D cg c]"  \  }}|j                  d      st        |      $ c}}D ],  }	 |j                  dd      \  }}|j                  d       . |S c c}}w # t        $ r,}| j
                  j                  d|d|       Y d }~Nd }~ww xY w)Nzbx_url:rI   zFailed to parse zbx_url='rT   r*   )r   url)rf   
startswithrh   splitr/   r0   r1   r   )	r"   r   r   keyvalueurl_rawr   r   r5   s	            r'   r   zMap._get_urls  s    ?Czz|ies~~^gOhe,i 	G^#MM#q1	c KK 	  j  ^&&QXZ[+\&]]^s"   A2A2A88	B-"B((B-c                    g }|j                         D cg c]"  \  }}|j                  d      st        |      $ c}}D ]  }| j                  |      }|rf|j	                  || j                  t        |j                  dd                  | j                  t        |j                  dd                  d       || j                  j                  d|z          |S c c}}w )	Nzbx_triggerzbx_trigger_colorredzbx_trigger_draw_stylebold)	triggeridr   r   zFailed to find trigger '%s'r*   )
rf   r   rh   _get_trigger_idr   r   rg   r   r0   r1   )r"   r   r   r   r   trigger_definitionr   s          r'   r   zMap._get_triggers  s    JN**,"xJCZ]ZhZhivZw=#7"x 		a,,-?@I!*!00txxH[]b?c1de $ < <]488TlntKu=v w!  &&+HL^+_&`		a  #ys
   C C c                 z    d| v r t        | d         j                  dd      }|S d| v rt        | d         }|S |}|S )N	zbx_labelz\n
rO   )rh   replace)r   defaultrO   s      r'   r   zMap._get_label  sW    $!${"34<<UDIE
 	 _!$w-0E  Er(   c                 j    | j                   j                  j                  dd|ii      }|r|d   d   S y )Nfilterr   r   sysmapid)_zapimaprg   )r"   r   	exist_maps      r'   r   zMap._get_sysmap_id  s9    JJNN&&682D'EF	Q<
++r(   c                 j    | j                   j                  j                  dd|ii      }|r|d   d   S y )Nr   r   r   groupid)r   	hostgrouprg   )r"   
group_nameexist_groups      r'   _get_group_idzMap._get_group_id  s;    jj**..6::N/OPq>),,r(   c                 ,    t        | j                        S N)boolr   )r"   s    r'   
map_existszMap.map_exists  s    DKK  r(   c                 &   	 | j                   j                  r| j                   j                  d       | j                  j                  j                  |      }|r|S y # t        $ r)}| j                   j                  d|z         Y d }~y d }~ww xY w)NTchangedzFailed to create map: %sr*   )r0   
check_mode	exit_jsonr   r   creater/   r1   r"   rF   resultr5   s       r'   
create_mapzMap.create_map  s    	G||&&&&t&4ZZ^^**:6F  	GLL""'AA'E"FF	Gs   AA 	B'BBc                    | j                   s| j                  j                  d       	 | j                  j                  r| j                  j	                  d       | j                   |d<   | j
                  j                  j                  |      }|r|S y # t        $ r)}| j                  j                  d|z         Y d }~y d }~ww xY w)NzCFailed to update map: map_id is unknown. Try to create_map instead.r*   Tr   r   zFailed to update map: %s)	r   r0   r1   r   r   r   r   r{   r/   r   s       r'   
update_mapzMap.update_map  s    {{LL""'l"m	G||&&&&t&4%)[[Jz"ZZ^^**:6F  	GLL""'AA'E"FF	Gs   A)B 	CCCc                    | j                   s| j                  j                  d       	 | j                  j                  r| j                  j	                  d       | j
                  j                  j                  | j                   g       y # t        $ r)}| j                  j                  d|z         Y d }~y d }~ww xY w)Nz(Failed to delete map: map_id is unknown.r*   Tr   z#Failed to delete map, Exception: %s)	r   r0   r1   r   r   r   r   deleter/   )r"   r5   s     r'   
delete_mapzMap.delete_map  s    {{LL""'Q"R	R||&&&&t&4JJNN!!4;;-0 	RLL""'Lq'P"QQ	Rs   A"B 	B?B::B?c                 "   | j                   j                  j                  | j                  ddd      }|d   }| j	                  ||      sy| j                  |d   |d         sy| j                  ||       | j                  |d   |d         syy)Nextend)	sysmapidsselectLinksselectSelementsr   Fr9   r:   T)r   r   rg   r   _is_dicts_equal_is_selements_equal_update_ids_is_links_equal)r"   generated_map_configexist_map_configsexist_map_configs       r'   is_exist_map_correctzMap.is_exist_map_correct  s     JJNN..#'0
 
 -Q/##$8:JK''(<[(IK[\gKhi-/?@##$8$ACST[C\]r(   c                     dg}|S )NrO    )r"   keys_to_sorts     r'   r    zMap._get_selements_sort_keys  s    yr(   c                    t        |      t        |      k7  ryt        |t        | j                         }t        |t        | j                         }t	        ||      D ]  \  }}| j                  |j                  dg       |j                  dg             s y| j                  ||dg      s y| j                  |j                  dg       |j                  dg             r y y)NFr   rw   r   r   T)	lenre   r   r!   zip_is_elements_equalrg   r   _is_urls_equal)r"   generated_selementsexist_selementsgenerated_selements_sortedexist_selements_sortedgenerated_selementexist_selements          r'   r   zMap._is_selements_equal  s    "#s?';;%+,?ZQUQiQiEj%k"!'ZIaIa=b!c478RTj4k 	0**+=+A+A*b+QSaSeSefprtSuv''(:N\N[&&'9'='=fb'I>K]K]^dfhKij	 r(   c                     t        |      t        |      k7  ryt        |t        dd            }t        |t        dd            }t        ||      D ]  \  }}| j	                  ||dg      r y y)NFr   r   r   r   Tr   re   r   r   r   )r"   generated_urls
exist_urlsgenerated_urls_sortedexist_urls_sortedgenerated_url	exist_urls          r'   r   zMap._is_urls_equal-  sw    ~#j/1 &~:fe;T U"::fe3LM*-.CEV*W 	&]I''y<.Q	 r(   c                     t        |      t        |      k7  ryt        |d       }t        |d       }t        ||      D ]  \  }}| j                  ||dg      r y y)NFc                 (    | j                         d   S Nr   r   ks    r'   <lambda>z(Map._is_elements_equal.<locals>.<lambda>:  s    QXXZXY] r(   r   c                 (    | j                         d   S r  r  r  s    r'   r  z(Map._is_elements_equal.<locals>.<lambda>;  s    QXXZPQ] r(   r   T)r   re   r   r   )r"   generated_elementsexist_elementsgenerated_elements_sortedexist_elements_sortedgenerated_elementexist_elements          r'   r   zMap._is_elements_equal7  sp    !"c.&99$*+=CZ$[! &~;R S256OQf2g 	.''(9=<.Y	 r(   c                 @   t        |d   t        | j                         }t        |d   t        | j                         }i }t        ||      D ]  \  }}|d   ||d   <    |d   D ]5  }||d      |d<   ||d      |d<   |d   |d   k  s%|d   |d   c|d<   |d<   7 y )Nr9   r   r   r:   r   r   )re   r   r!   r   )	r"   r   r   r   r  
id_mappingr  r  r   s	            r'   r   zMap._update_idsB  s    %+,@,MS]_c_w_wSx%y"!'(8(E:W[WoWoKp!q
478RTj4k 	X07I,7WJ~l34	X$W- 	dD",T--@"AD",T--@"ADM"T-%88;?;NPTUbPc8]#T-%8		dr(   c           	      V   t        |      t        |      k7  ryt        |t        dddd            }t        |t        dddd            }t        ||      D ]P  \  }}| j	                  ||ddg      s y| j                  |j                  dg       |j                  dg             rP y y)	NFr   r   r   r   r   r   T)r   re   r   r   r   _is_triggers_equalrg   )r"   generated_linksexist_linksgenerated_links_sortedexist_links_sortedgenerated_link
exist_links          r'   r   zMap._is_links_equalN  s    3{#33!'ZWdfmoy=z!{#KZ}^egq5rs,/0FHZ,[ 	(^Z''
]TaDbc**>+=+=nb+QS]SaSabprtSuv		
 r(   c                     t        |      t        |      k7  ryt        |t        d            }t        |t        d            }t        ||      D ]  \  }}| j	                  ||      r y y)NFr   r   Tr  )r"   generated_triggersexist_triggersgenerated_triggers_sortedexist_triggers_sortedgenerated_triggerexist_triggers          r'   r  zMap._is_triggers_equalZ  st    !"c.&99$*+=:kCZ$[! &~:k;R S256OQf2g 	.''(9=I	 r(   c                     |g }| j                         D ]Q  }t        | |   t              st        | |   t              r*||v r/||vst	        ||         t	        | |         k7  sQ y y)NFT)keys
isinstancedictr   str)d1d2exclude_keysr   s       r'   r   zMap._is_dicts_equald  sq    L779 	C"S'4(Jr#w,El""}BsGBsG <	 r(   c                 |    | j                   j                  j                  dd|ii      }|rt        |d   d         S y )Nr   ro   r   hostid)r   ro   rg   r/  )r"   hostnamer4  s      r'   _get_host_idzMap._get_host_idr  s@    $$h0B%CDvay*++ r(   c                    	 |j                  dd      \  }}| j                  j
                  j                  did      }|rt        |d   d	         S y # t        $ r,}| j                  j                  d|d|       Y d }~nd }~ww xY w)
Nr   rI   zFailed to parse zbx_trigger='rT   r*   description)ro   r   r   r   )r   r/   r0   r1   r   rq   rg   r/  )r"   r   ro   rq   r5   r   s         r'   r   zMap._get_trigger_idw  s    	i.44S!<MD' JJ&&**w,
 	 y|K011   	iLL""Qcef'g"hh	is   A 	B
"BB
c                 x    | j                   j                  j                  i       }i }|D ]  }|d   ||d   <    |S )Nimageidr   )r   rk   rg   )r"   
icons_listrE   icons       r'   r=   zMap._get_icon_ids  sG    ZZ%%))"-
 	5D%))_HT&\"	5r(   c                 H   | j                   j                  j                  |gdd      }t        |      dkD  r	|d   d   }n| j                  j                  d|z         t        j                  t        t        j                                    }|j                  \  }}||fS )NT)imageidsselect_imager   rk   zFailed to find image with id %sr*   )r   rk   rg   r   r0   r1   r   openr   base64	b64decodesize)r"   icon_idr;  icon_base64rk   
icon_widthicon_heights          r'   r   zMap._get_icon_size  s    ZZ%%)) !	+
 
 z?Q$Q-0KLL""'H7'R"S

76#3#3K#@AB"'**
K;&&r(   c                     i }d| j                   v r|j                  | j                   d          | j                         }|8t        |      }|j	                  d      \  }}t        |      t        |      f|d<   |S )Nr   ,r   )r   r{   get_posrh   r   float)r   attrr   xxyys        r'   _get_node_attributeszMap._get_node_attributes  sn    4==(KKl34lln?$CYYs^FB 9eBi0DKr(   c                     i }|j                         D ]+  }|j                         }|dv r| j                  |      ||<   - |j                         D ]"  }|j	                  | j                  |             $ |S )N)r   rB   r   )	get_nodesget_namerO  get_subgraphsr{   r;   )r"   parentrC   r   	node_namesubgraphs         r'   r;   zMap._get_graph_nodes  s    $$& 	?DI55#88>E)		?
 ,,. 	:HLL..x89	:r(   c                     g }|j                         D ]  }|j                  |        |j                         D ]  }|| j                  |      z  } |S r   )	get_edgesr   rS  r<   )r"   rT  rD   r   rV  s        r'   r<   zMap._get_graph_edges  s]    $$& 	DLL	,,. 	5HT**844E	5r(   c                    t        |j                               }|j                  d      \  }}}}t        |      t        |      k7  r4| j                  | j
                  dz  z
  t        |      t        |      z
  z  nd}t        |      t        |      k7  r4| j                  | j
                  dz  z
  t        |      t        |      z
  z  nd}t        |      t        |      t        |      t        |      t        |      t        |      dS )NrI  rJ   r   )min_xmin_ymax_xmax_yscale_xscale_y)rh   get_bbr   rK  r   r   r   )	r"   rB   bbrZ  r[  r\  r]  r^  r_  s	            r'   r   zMap._get_scales  s    5<<>*%'XXc]"ueUTYZ_T`dijodpTp4::a/E%L5<4OPvwUZ[`UaejkpeqUq4;;q0U5\E%L5PQwx5\5\5\5\W~W~
 	
r(   c                     t        |d   |d   z
  |d   z  |d   dz  z
  | j                  z         t        |d   |d   z
  |d   z   |d   z  |d   dz  z
  | j                  z         d	S )
Nr   rZ  r^  rJ   r]  rI   r[  r_  )xy)r?   r   )r"   r   r   	icon_sizes       r'   r   zMap._convert_coordinates  s    c!fvg.&2CCiPQlUVFVVY]YdYddefWoA.@F9DUUXabcXdghXhhkokvkvvw
 	
r(   c                    |j                  d      r|}n	 t        j                  |      }j                  d      j                         }|S # t        $ r,}| j                  j                  d|d|       Y d }~Qd }~ww xY w)N#z!Failed to get RGB hex for color 'rT   r*   )r   	webcolorsname_to_hexr/   r0   r1   stripupper)r"   
color_name	color_hexr5   s       r'   r   zMap._get_color_hex  s}      %"Ii%11*=	 OOC(..0	  i&&Ycef+g&hhis   A 	B"A<<Bc                     ddddd}	 ||   }|S # t         $ r-}| j                  j                  d|d|       Y d }~S d }~ww xY w)	Nr   rJ   rK   rL   )r   r   dotteddashedz!Failed to find id for draw type 'rT   r*   rU   )r"   
draw_styledraw_style_idsdraw_style_idr5   s        r'   r   zMap._get_link_draw_style_id  sf    	
	e*:6M   	eLL""U_ab'c"dd	es    	A"AA)NNr   )*__name__
__module____qualname__r   r6   rG   r>   rm   r   r@   rA   r   r   staticmethodr   r   r   r   r   r   r   r   r    r   r   r   r   r   r  r   r6  r   r=   r   rO  r;   r<   r   r   r   r   __classcell__)r&   s   @r'   r   r      s    CV&'R F D!$F  !GGR 
d
  ,
2' 	 		

	r(   r   c                 H    | d   | d   k(  r| j                  d      r| dd } | S )Nr   )ry   "rI   )r   )ss    r'   rh   rh     s,    	!"1<<
3aGHr(   c                     t        j                         } | j                  t        t        dddg      t        dddg      t        dd	      t        dd
	      t        ddddg      t        dddg      t        dd	      t        dd	      t        dd	      t        ddg d      
             t	        | d      }t
        s"|j                  t        dd      t               t        s"|j                  t        dd      t               t        s"|j                  t        dd      t               t        |      }|j                  dk(  rT|j                         r1|j!                          |j#                  dd|j$                  z         y |j#                  d       y |j'                         }|j                         rV|j)                  |      r|j#                  d       y |j+                  |       |j#                  dd |j$                  z         y |j-                  |       |j#                  dd!|j$                  z         y )"Nr/  Tr   )typerequiredaliasesFr   r?   i   )r~  r   iX  presentabsent)r~  r   choicesrk   (   r   r   rN   )
r   r   r   r   r   r   r   r   r   r   )argument_specsupports_check_moder,   z#https://pypi.org/project/pydotplus/)r   )r+   	exceptionrh  z#https://pypi.org/project/webcolors/Pillowz https://pypi.org/project/Pillow/zSuccessfully deleted map: %s)r   r   r   zSuccessfully updated map: %szSuccessfully created map: %s)zabbix_utilszabbix_common_argument_specr{   r.  r   HAS_PYDOTPLUSr1   r	   PYDOT_IMP_ERRHAS_WEBCOLORSWEBCOLORS_IMP_ERRHAS_PILPIL_IMP_ERRr   r   r   r   r   r   rG   r   r   r   )r  r#   rp   rF   s       r'   mainr    s    <<>Mutj\BuuzlCs+,y9h:OPyI+6FD1UF<rs  # F
 1+Chi  vC  	D1+Chi  vG  	H1(@bcoz{[F||xT2PSYSbSb2bcU+**,
**:6   /!!*-  6TW]WfWf6f gj)T2PSYSbSb2bcr(   __main__),
__future__r   r   r   r~  __metaclass__DOCUMENTATIONRETURNEXAMPLESrA  	tracebackior   operatorr   ansible.module_utils.basicr   r	   >ansible_collections.community.zabbix.plugins.module_utils.baser
   Aansible_collections.community.zabbix.plugins.module_utils.helpers	communityzabbixpluginsmodule_utilshelpersr  r,   r  r/   r  ImportError
format_excrh  r  r  PILr   r  r  r   rh   r  rt  r   r(   r'   <module>r     s'   A @hT 
JZ     J U X X XMKM
M!
G+K|* |@,d^ zF U  (I((*MM  ,	,,.M  &)&&(KGs6   B B0 $C B-,B-0C
CC)(C)