
    ei01              	          d dl Zd dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZ dedee   fd	Zd
dddZdee   defdZ ej0                  d      Z ej0                  d      ZdedefdZdedefdZdededefdZd&dededeeef   fdZ dededeeeef   fdZ!d'dede	e   dedefdZ"dede	e   defdZ#d'dZ$d  Z%dedee&e	e&   f   fd!Z'd" Z(d# Z)d$e
dee   fd%Z*y)(    N)DictIterableListMatchOptionalTextIOTuple   )Metric)Sample)_is_valid_legacy_metric_name_validate_labelname_validate_metric_nametextreturnc              #   \   K   t        t        j                  |             E d{    y7 w)z]Parse Prometheus text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)r   s    Z/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/prometheus_client/parser.pytext_string_to_metric_familiesr      s!     
 *(*;*;D*ABBBs   ",*,\
")z\\z\nz\"matchc                 2    t         | j                  d         S )Nr   )ESCAPE_SEQUENCESgroup)r   s    r   replace_escape_sequencer      s    EKKN++    z\\[\\n]z\\[\\n"]sc                 6    t         j                  t        |       S N)HELP_ESCAPING_REsubr   r    s    r   _replace_help_escapingr&   $   s     7;;r   c                 6    t         j                  t        |       S r"   )ESCAPING_REr$   r   r%   s    r   _replace_escapingr)   (   s    ??2A66r   charposc                 n    d}||kD  r'| |dz
  |z
     dk(  r|dz  }||kD  r| |dz
  |z
     dk(  r|dz  dk(  S )Nr   r
   r       )r    r*   num_bslashess      r   _is_character_escapedr/   ,   s_    L\!1|+,4 \!1|+,4!q  r   labels_stringopenmetricsc                    i }| j                         }|r|r|d   dk(  rt        d| z         	 |rt        ||      \  }}}|s|rt        d| z         &t        |      \  }}|st	        |      st        d      |r|d   dk7  rt        d}|t        |      k  r6|j                  d|      }t        |d | |      sn|dz  }|t        |      k  r6|dz   }	|	t        |      k7  rt        d| z         t        |      \  }
}|d	k(  rt        |       nt        |       ||v rt        d
| z         |
||<   |r|S # t        $ r t        d| z         w xY w)Nr   ,zleading comma: zempty term in line: zunquoted UTF-8 metric namer   r
   zunexpected text after quote: __name__z$invalid line, duplicate label name: zInvalid labels: )
strip
ValueError
_next_term_unquote_unescaper   lenindexr/   r   r   )r0   r1   labels
sub_labels	name_term
value_term
label_namequoted_namei	quote_endlabel_value_s               r   parse_labelsrE   4   s   F $$&Jzjms&:*]:;;,= 1;:{0S-Iz:$%;m%KLL&7	&B#J'CJ'O !=>> A#!5   Ac*o%$$S!,,Z^Q?Q	 c*o% AIC
O+ !@=!PQQ.z:NKZ'%j1#J/V# !G-!WXX!,F:O P  =+m;<<=s   B!D8 A$D8 6D8 8Ec                 H   | d   dk(  r| dd } | sy| d   dk(  rt        d      t        | d      }|dk\  r"| |   dk(  r| d| }| |dz   d } t        | d	      }nd
}|dk(  rt        |       }| d| }|s|rt        d|      | |d }||j                         |j                         fS )a  Extract the next comma-separated label term from the text. The results
    are stripped terms for the label name, label value, and then the remainder
    of the string including the final , or }.
    
    Raises ValueError if the term is empty and we're in openmetrics mode.
    r   r3   r
   N) rG   rG   zmultiple commasz=,}=z,}r4   zempty term:)r6   _next_unquoted_charr9   r5   )r   r1   splitpos	labelnametermrests         r   r7   r7   j   s     Aw#~ABx7c>.//"4/H1}h3.(O	HqLM"&tT2	2~t9	?DK--	?DdjjlDJJL00r   chsstartidxc                     d}|t         j                  }t        | |d       D ]*  \  }}|dk(  rt        | ||z         s| }|r ||v s%||z   c S  y)zReturn position of next unquoted character in tuple, or -1 if not found.
    
    It is always assumed that the first character being checked is not already
    inside quotes.
    FNr   rI   )string
whitespace	enumerater/   )r   rO   rP   	in_quotesrA   cs         r   rJ   rJ      sl     I
{$xy/* $181$1E%ICx!|#$ r   c                     t        |       dz
  }d}|t        j                  }|dkD  r-| |   dk(  rt        | |      s| }|s	| |   |v r|S |dz  }|dkD  r-y)zGReturn position of last unquoted character in list, or -1 if not found.r
   Fr   r   rI   )r9   rR   rS   r/   )r   rO   rA   rU   s       r   _last_unquoted_charrX      sq    D	AAI
{
a%7c>"7a"@%IAw#~	Q a% r   c                 $   dg}d}|t        |       k  r|t        | ||      }|dk(  r| |d |d<   t        |       }4||k(  r|dz  }?|dkD  rt        |      |kD  r| |d |d<   	 |S | || |d<   |dz   }|j                  d       |t        |       k  r||S )zfSplits on split_ch similarly to strings.split, skipping separators if
    they are inside quotes.
    rG   r   rI   Nr
   )r9   rJ   append)r   	separatormaxsplittokensx	split_poss         r   _split_quotedr`      s    
 TF	A
c$i-'i;	?abF2JD	A >FAa<CK(2abF2J M !I&r
Mb# c$i-$ Mr   c                     | s| dfS d}| j                         } | d   dk(  r(t        |       dk(  s| d   dk7  rt        d      | dd } d}d| v rt        |       } | |fS )	z.Returns the string, and true if it was quoted.Fr   r   r
   rI   zmissing close quoteTr   )r5   r9   r6   r)   )r   quoteds     r   r8   r8      sv    U{F::<DAw#~t9>T"X_233Abzt| &<r   c                 :   | j                         } d}|| vrd}| j                  |      D cg c]#  }|j                         s|j                         % }}|st        |       d fS t	        |d         }t        |      dkD  rt	        |d         dz  nd }||fS c c}w )N 	r   r
   rI   i  )lstripsplitr5   float_parse_valuer9   )r    r[   valuevalues	timestamps        r   _parse_value_and_timestamprm      s    	
AI	)*);Mu{{}ekkmMFMQx~#E58[1_fRj)D0$I) Ns   BBc                     dj                  |       } | | j                         k7  sd| v rt        d|       	 t        |       S # t        $ r t	        |       cY S w xY w)NrG   rD   zInvalid value: )joinr5   r6   intrh   )rj   s    r   ri   ri      s]    GGENE?5)4555z U|s   
A AAc                    d}t        | d      }|dk(  s|| d | v r\t        | d      }| d | j                         }t        |      st        d| z         | |dz   d  }t	        |      \  }}t        |i ||      S | d | j                         }t        | |d  d      |z   }t        | |dz   | d      }	|sd	|	vrt        |	d	   }|	d	= nd	|	v rt        d
      | |dz   d  }t	        |      \  }}t        ||	||      S )Nz # {rI   z 	zinvalid metric name:r
   }Fr4   z$metric name specified more than once)rJ   r5   r   r6   rm   r   rE   )
r   r[   label_startname_endnameremaining_textrj   rl   	label_endr;   s
             r   _parse_samplery      s=   I%dC0KbIl{);;&tU3IX$$&+D13d:;;hlm,5nEydBy11##%D#D$6<{JI${Qy95AFV#j!:	v	?@@)a-.)N1.AE9$y11r   fdc           
   #     K   d}d}d}g }g }dt         dt         dt         dt        t           dt        f
d}| D ]  }|j	                         }|j                  d	      rt        |d
d      }t        |      dk  rBd\  }	}
t        |      dkD  r5|d   dk7  r	|d   dk7  rft        |d         \  }	}
|
st        |	      st        |d   dk(  r@|	|k7  r|dk7  r |||||       |	}d}g }|	g}t        |      dk(  rt        |d         }d}|d   dk(  st        |      dk  rt        |	|k7  r|dk7  r |||||       |	}d}g }|d   }dgdgg dg ddj                  |dg      }|D cg c]  }||z   	 }}C|dk(  rJt        |      }|j                  |vr/|dk7  r |||||       d}d}d}g }g } ||d   |||g       |j                  |        |dk7  r |||||       y
y
c c}w w)zParse Prometheus text format from a file descriptor.

    This is a laxer parser than the main Go parser,
    so successful parsing does not imply that the parsed
    text meets the specification.

    Yields Metric's.
    rG   untypedrv   documentationtypsamplesr   c           	          |dk(  rF| j                  d      r| d d } n/g }|D ](  }|j                  t        |d   dz   g|dd          |}* t        | ||      }||_        |S )Ncounter_totalir   r
   )endswithrZ   r   r   r   )rv   r}   r~   r   new_samplesr    metrics          r   build_metricz0text_fd_to_metric_families.<locals>.build_metric"  s~     )}}X&CRy   *A&&vadXo'F!"'FG)G* mS1 r   #N   r,   )rG   Fr
   TYPEHELP   )_count_sumrG   )r   r   _bucket)r   gaugesummary	histogramr   )strr   r   r   r5   
startswithr`   r9   r8   r   r6   r&   getry   rv   rZ   )rz   rv   r}   r~   r   allowed_namesr   linepartscandidate_namerb   nsamples                r   r   r     sy     DM
CGM3 s  tF| X^   >'zz|??3!$a0E5zA~%."NF5zA~8v%%(f*<):58)D&&B>&R$$Qx6!!T)rz*4WMM)D#C G%3$4Mu:?$:58$DM$&MqV#u:>$$!T)rz*4WMM)D$&M GAh "t T5!>	!
 #cB4.  4A Aa A ARZ"4(F{{-/2:&t]CII " ""6!9mS6(KKv&}>'@ rz4W== ' !Bs   DG7AG7+G27B G7)F)r   )+ior   rerR   typingr   r   r   r   r   r   r	   metrics_corer   r   r   
validationr   r   r   r   r   r   r   compiler#   r(   r&   r)   rp   boolr/   rE   r7   rJ   rX   r`   r8   rh   rm   ri   ry   r   r-   r   r   <module>r      s    	  G G G    
C C&1A C  ,5: ,# , 2::j) bjj%<c <c <7 7 7!S !3 !4 !3= 3=$ 3=4S> 3=l1S 1t 1c3m0D 1Dc   S &c  # "8"
# 
%x0F*G 
2>_>6 _>hv.> _>r   